logo
Published on

LLM

Authors
  • avatar
    Name
    valery
    Twitter

1. Language Model

주어진 텍스트의 문맥을 기반으로 가장 적절한 다음 단어(next word) 예측하는 확률적 모델

2. LLM(Large Language Model)

대량의 텍스트 데이터로 학습된 파라미터 개수의 매우 많은 언어 모델

주로 트랜스포머(Transformer) 기반의 모델로 구현

LLM 기본 개념

1. 토큰화(tokenization)

  1. 문장을 더 작은 단위인 토큰으로 쪼개는 단계

  2. 분리된 토큰들은 미리 정해진 어휘집에 따라 정수 ID로 매핑

2. 임베딩(embedding)

  1. 개별 토큰을 수백 또는 수천 차원의 수치 벡터 표현으로 변환
    • 유사한 개념들은 벡터상으로 유사한 방향을 가리킨다.
    • 동일 단어도 문맥에 따라 서로 다른 벡터 값을 가진다.

변환 단계: 토큰 > 정수 ID > 어휘집(voca) > 임베딩 벡터

transformer 모델

거대 언어모델의 핵심이 되는 신경망 구조

데이터(토큰의 임베딩 벡터들)를 병렬로 처리하며 문맥을 깊이 있게 이해

문장 전체를 한꺼번에 입력받아 처리하므로 학습 속도가 이전에 비해 크게 개선

다음 토큰(단어, next token)의 확률분포 계산

온도(temperature)

온도는 모델이 단어를 선택하기 전에 단어의 확률을 조정하여 텍스트 생성의 무작위성 제어

고온(≥ 1) : 더욱 다양하고 창의적인 결과물

저온(~0) : 보다 집중적이고 예측 가능한 응답 생성

샘플링(sampling)

  1. Top-K 샘플링

    • 단어 풀(pool) 제한
    • 확률이 가장 큰 상위 K개 중에서 확률적으로 선택
    • 후보 단어 개수 고정, K=5이면 언제나 5개 선별
  2. Top-p 샘플링

    • 누적 확률이 p에 도달할 때까지 동적으로 변화하는 단어 풀에서 단어를 선택
    • 후보 단어 개수 변동, 누적확률 p에 도달할 때까지 후보를 넣음.

3. Transformer 모델

각 토큰의 임베딩 벡터에서 Query, Key, Value라는 세 종류의 벡터를 만들고, 한 토큰의 Query가 모든 토큰의 Key와 얼마나 관련 있는지 계산한 뒤, 그 관련도만큼 Value들을 섞어서 새 벡터를 만든다

Q(Query): 내가 찾고 싶은 정보

K(Key): 나는 이런 정보와 관련이 있다

V(Value): 실제로 넘겨줄 내용

1. 자기주목(self attention) 연산

  1. input1, input2, input3이 들어옴

    예시
    input = [1010, 0202, 1111]
    
  2. 각 input에서 모델 안에 들어있는 학습된 가중치 행렬을 곱해서 query, key, value를 만듦

    예시
    key = [[0,1,1], [4,4,0], [2,3,1]]
    value = [[1,2,3], [2,8,0], [2,6,3]]
    query = [[1,0,2], [2,2,2], [2,1,3]]
    
  3. query1이 모든 key와 비교함(벡터의 내적 계산)

    예시
    query1 = [1, 0, 2]
    
    key1 = [0, 1, 1]
    key2 = [4, 4, 0]
    key3 = [2, 3, 1]
    
    query1 · key1
    = [1, 0, 2] · [0, 1, 1]
    = 1×0 + 0×1 + 2×1
    = 2
    score1 = 2
    
    query1 · key2
    = [1, 0, 2] · [4, 4, 0]
    = 4 + 0 + 0
    = 4
    score2 = 4
    
    query1 · key3
    = [1, 0, 2] · [2, 3, 1]
    = 2 + 0 + 2
    =4
    score3 = 4
    
    score = [2, 4, 4]
    
  4. 비교 결과로 score가 나옴

  5. score를 softmax로 비율로 바꿈

    softmax(scorei)=escoreiescore1+escore2+escore3softmax(score_i) = \frac{e^{score_i}}{e^{score_1}+e^{score_2}+e^{score_3}}
    예시
    score1 = 2
    score2 = 4
    score3 = 4
    
    query1 = [1,0,2]
    
    e^27.389
    e^454.598
    e^454.598
    
    분모 = 7.389 + 54.598 + 54.598 = 116.585
    
    softmax(2) = 7.389 / 116.5850.063
    softmax(4) = 54.598 / 116.5850.468
    softmax(4) = 54.598 / 116.5850.468
    
    softmax([2, 4, 4])[0.063, 0.468, 0.468]
    
  6. 그 비율을 모든 value에 곱함

    예시
    
    multiplication1
    0.063 × value1
    = 0.063 × [1, 2, 3]
    = [0.063, 0.126, 0.189]
    
    multiplication2
    0.468 × value2
    = 0.468 × [2, 8, 0]
    = [0.936, 3.744, 0]
    
    multiplication3
    0.468 × value3
    = 0.468 × [2, 6, 3]
    = [0.936, 2.808, 1.404]
    
  7. 곱한 value들을 더해서 output1을 만듦

    예시
    [0.063, 0.126, 0.189]
    + [0.936, 3.744, 0]
    + [0.936, 2.808, 1.404]
    
    = [1.935, 6.678, 1.593]
    
    output1 ≈ [1.935, 6.678, 1.593]
    
  8. query2, query3도 같은 방식으로 output2, output3을 만듦

2. 위치 임베딩((positional embedding)) 벡터

Self-Attention은 토큰들 사이의 관계를 계산한다.

그런데 순서 정보가 없으면 문장 의미가 무너진다.

그래서 각 토큰 임베딩에 위치 임베딩을 더한다.

그 결과 Transformer는 “단어 의미 + 위치”를 함께 입력받는다.

토큰 임베딩과 같은 차원으로 만들어야 한다.

3. Transformer 블록의 구성

Self-Attention

각 토큰이 문장 안의 다른 토큰들을 얼마나 참고할지 계산

FFN(Feed Forward Network) 또는 MLP

Self-Attention이 “토큰들 사이의 관계”를 처리했다면, FFN은 각 토큰 벡터를 따로 받아서 한 번 더 변환

보통 선형층, 활성화 함수, 선형층으로 구성

Skip Connection(지름길 층)

self attention결과 + 원래 입력

이전 레이어 정보를 보존하고 학습을 안정적으로 만들어준다

LayerNorm(정규화 층)

벡터 값들이 너무 커지거나 들쭉날쭉해지는 걸 정리해주는 정규화.

계산이 계속 쌓이면 값의 분포가 흔들릴 수 있으니까, 각 층마다 안정적으로 맞춰주는 역할

흐름

입력 벡터(토큰 임베딩 + 위치 임베딩)
Self-Attention
Skip Connection + LayerNorm
Feed Forward Network
Skip Connection + LayerNorm
출력 벡터
  1. 입력 벡터가 들어온다

  2. Self-Attention으로 토큰 간 관계를 반영한다

  3. 원래 입력을 더한다 = Skip Connection

  4. 값을 정리한다 = LayerNorm

  5. FFN으로 각 토큰 벡터를 한 번 더 가공한다

  6. 다시 원래 값을 더한다 = Skip Connection

  7. 다시 정규화한다 = LayerNorm

  8. 다음 Transformer 블록으로 넘긴다

4. mulit-head attention(멀티헤드 주목)

Self-attention 방식에서는 한 종류의 관계만 강하게 볼 수 있기 때문에 나온 개념.

  • 선형사영
    • 벡터에 가중치 행렬을 곱해서, 다른 벡터 공간으로 바꾸는 것
    • 차원을 줄일 수도 있고, 늘릴 수도 있고, 같은 차원 안에서 방향만 바꿀 수도 있다.
입력 X
head 1Q1, K1, V1 생성
head 2Q2, K2, V2 생성
head 3Q3, K3, V3 생성
...
각 head에서 self-attention 따로 수행
head 출력들을 이어붙임 concatenation
다시 선형 변환
multi-head attention output

5. 인코더와 디코더

인코더는 입력 문장을 읽어서 의미 벡터들을 만들고, 디코더는 출력 문장을 만들 때 그 인코더의 마지막 층을 참고

이떄의 참고 방식: 교차 주목(Cross-Attention)

Cross-Attention

인코더 마지막 층 출력 = 입력 문장을 다 읽고 정리한 벡터들

디코더의 Query = 지금 출력하려는 위치에서 필요한 정보 요청

인코더의 Key = 각 입력 토큰이 어떤 정보인지 나타내는 검색 태그

인코더의 Value = 실제로 디코더에게 넘겨줄 입력 정보

Cross-Attention = 디코더 Query로 인코더 Key를 검색하고, 맞는 Value를 가져오는 과정

인코더 디코더의 추론

주어진 입력에 대한 인코더의 출력으로 부터 key와 value 벡터 생성

4. Transformer를 이용한 모델

1. BERT(Bi-directional Encoder Representations from Transformers)

Transformer Encoder 기반 모델

두개의 문장을 입력으로 사용 - 문장 A와 문장 B를 넣고, 두 문장이 이어지는 관계인지 판단하는 방식.

잘 학습된 BERT 언어모델에 classification layer(분류층)를 붙여서 다양한 NLP task(자연어 처리 작업)를 수행

문장 분류, 감정 분석, 다음 문장 예측 같은 작업

  1. 다음 문장 예측(Next Sentence Prediction)
  2. 자동인코딩(Autoencoding)학습: 가려진 Masked 토큰 복원
    • 나는 [MASK]을 먹었다
    • MASK된 부분을 문맥을 보고 판단

2. GPT(Generative Pre-trained Transformer)

Transformer Decoder 기반 모델

자기회귀 모델(auto-regressive): 이전 출력 결과를 바탕으로 다음 토큰을 생성

대부분의 LLM에서 사용하는 구조

GPT 동작 흐름

입력 단어
단어를 임베딩 벡터로 변환
트랜스포머 디코더가 처리
다음 단어 예측
예측한 단어를 다시 입력해 포함해 반복 생성

5. LLM의 학습

1. 사전학습(pre-training)

대규모 말뭉치, 즉 수조 개 토큰 수준의 텍스트로 다음 토큰 예측을 학습하는 단계(세계 지식 압축)

  1. 이전 단어들로 부터 다음 단어 예측하도록 학습

    • 다음 토큰(next token)을 예측하는 단순한 과제 하나로 모든 것 학습
    • 레이블이 데이터 자체에 내재되어 있어 자기지도학습(self-supervised)
  2. 인터넷 전체를 압축해 파라미터에 녹여 넣는 것

  3. 이 단계에서 언어 구조, 사실 지식, 추론 능력의 기반 획득

  4. 데이터 품질 필터링이 결정적

  5. 고품질 데이터셋은 중복 제거, 음란물 필터, 언어 감지, 품질 분류기 통과

  • 이 단계를 마친 모델은 Base Model이라 함
  • 지식은 있지만 지시에 응답하는 방법을 잘 모는 상태 > SFT 필요

2. SFT(supervised fine-tuning, 지도 상세학습)

질문과 이상적인 응답 쌍을 보고, 모델이 지시를 받았을 때 어떤 형식과 태도로 답해야 하는지 배우는 단계(형식-태도 학습)

  • 데이터 수집 방법

    1. 인간 작성: 전문 어노테이터가 (질문, 이상적 응답) 쌍을 직접 작성. 품질 최고, 비용 최고.
    2. 모델 생성 + 인간 검수: GPT-4로 초안 생성 → 인간이 수정. InstructGPT, Alpaca 방식.
    3. Self-Instruct: 모델이 스스로 다양한 지시와 응답을 생성. 품질 편차 큼
  • SFT 이후 모델의 특성: 지시를 따르게 됐지만 유해한 요청도 그대로 따를 수 있음 > RLHF 필요

3. RLHF (reinforcement learning with human feedback, 사용자 피드백 반영 강화학습)

사람이 더 선호하는 답변을 기준으로 모델을 조정(인간 선호 정렬)

  • 데이터 수집
    • 동일한 질문에 대해 여러 응답을 생성하고 인간 평가자가 쌍비교(pairwise comparison)로 선호 표시
    • OpenAI의 InstructGPT 용 평가자 인터페이스

모델의 강화학습

  • 원래 모델에서 너무 멀어지지 않으면서, 인간의 선호도가 높은 결과가 나오도록 학습

6. Multimodal LLM

텍스트뿐만 아니라 이미지, 음성, 비디오 같은 여러 형식의 데이터를 하나의 모델에서 이해하고 생성하는 모델

  • 모달리티: 데이터 형식(텍스트, 음성, 이미지, 비디오)
  • 프로젝션 레이어: 이미지나 음성 같은 다른 모달리티를 인코더로 벡터화한 다음, 그 벡터를 LLM이 받을 수 있는 형태로 맞춰주는 중간 변환층
  • 거대 언어모델을 기반(backbone)으로 하여, 다른 모달리티의 데이터는 별도의 인코더를 사용하여 벡터화하여 거대 언어모델에 입력
  • 상세조정(fine-tuning) 학습 필요

이미지 먹이는 방법

  1. 픽셀덩어리를 ViT같은 이미지 인코더로 이미지 임베딩 벡터로 바꾼다

방법 1. 이미지 벡터를 입력 토큰처럼 LLM에 넣기

[이미지 토큰들] [이] [사진을] [설명해줘]

이미지 정보도 일종의 입력 토큰처럼 보고, 뒤의 텍스트 질문과 같이 처리

Molmo 모델이 이 방식 사용

방법 2. Cross-Attention으로 참고

NVLM 모델이 이 방식 사용

VLM(Vision Language Model)

  • 이미지나 영상 같은 시각 정보와 자연어(텍스트)를 동시에 이해하고 처리할 수 있도록 설계된 모델
  • '눈'을 가진 것처럼 이미지를 보고 설명하거나 질문에 답하는 다각적인 추론 능력 제공
  • 이미지를 LLM이 읽을 수 있는 토큰으로 번역