ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LLM 트랜스포머 동작 흐름 (2) Decoding
    Machine Learning 2025. 6. 20. 21:38

    개요

    1. 디코더의 입력
    2. Decoder Self-Attention $(Masked)$
    3. 인코더의 출력과 cross-attention $(encoder-decoder attention)$
    4. FFN
    5. 단어 생성

    먼저 인코더의 출력을 간단하게 정리하면 각 입력 토큰의 문맥이 반영된 벡터들이고, 각 벡터가 특정 차원$(768)$으로 형태로 존재한다.

    1. 디코더의 입력

    디코더의 입력은 디코더의 결과가 다시 입력으로 들어가는 구조이고,

    최초의 입력은 시작 토큰이 들어가게 된다.

    • 학습 시 $(teacher forcing)$: 정답 문장을 한 토큰씩 시프트해서 입력
    • Target: 나는 피자를 좋아해
      디코더 입력: 나는 피자를 ...
      디코더 출력: 나는 피자를 좋아해

    예측은 예측대로 해서 오차 비교해서 파라미터를 학습하고, 다음 토큰의 입력은 모델 예측이 아니라 정답 단어를 사용한다.

    만약 모델이 한 번 실수하고, 그 실수가 다음 입력에도 영향을 미친다면 → 학습이 불안정함

    그래서 학습 중에는 항상 "정답 단어"를 다음 입력으로 넣어서 안정적으로 학습

     

    왜 이렇게 하느냐?

    • 다시 말해 각 입력 위치에서 단어를 예측하고 정답 단어와 비교해서 파라미터를 업데이트 한다.
    • 예:
    • 추론 시 $(inference)$:
      • 첫 입력: $(시작 토큰)$
      • 그 다음: 모델이 생성한 "나는" → 다시 입력
      • 반복하며 생성

    디코더에 입력으로 들어가는 단어(토큰)들은 임베딩 시켜서 고정 차원의 벡터로 변환되어 사용된다.

    예를들어

    • 디코더 입력이 텍스트: "<BOS> 나는 피자를"
    • 이걸 각 단어에 대해 임베딩$(embedding)$ 시켜서 → 고정 차원의 벡터로 변환
    토큰 임베딩 벡터 $(예: 512차원)$
    <BOS> e₁ ∈ ℝ^512
    나는 e₂ ∈ ℝ^512
    피자를 e₃ ∈ ℝ^512

    → 이 e₁, e₂, e₃가 디코더로 들어가고,

    → 이 벡터들이 decoder self-attention 및 encoder-decoder attention에 쓰임

    → 이 어텐션을 수행하고 다음 단어 생성한다.

    2. Decoder Self-Attention $(Masked)$

    디코더 셀프 어텐션은 디코더 입력들끼리 자기 자신에 대한 문맥 파악하기 위한 목적.

    하지만 미래 토큰은 참조 하지 않도록 훈련 시에나 추론 시에 둘 다 마스킹을 한다.

    어텐션은 과정은 인코더에서 설명한 어텐션과 동일함.

    이 셀프 어텐션을 수행하면 디코더에서 생성한 문장의 토큰마다 자기 자신의 문맥이 반영된 임베딩 벡터로 변환됨

    입력 임베딩: [x1, x2, x3] → $(masked self-attention)$ → [h1, h2, h3]

    3. Encoder-Decoder Attention $(Cross-Attention)$

    위에서 얻은 [h1, h2, h3]가 Cross-Attention의 Query로 사용됨

    인코더에서 나온 문맥 벡터들 [c1, c2, ..., cn]는 Key와 Value

    Query = h1, h2, h3 ← 디코더에서 얻은 문맥 벡터들
    Key = c1, c2, ..., cn ← 인코더의 출력 $(입력 문장의 문맥 벡터들)$
    Value = c1, c2, ..., cn ← 인코더의 출력

    → 입력 문장$(인코더 출력)$ 내용에서 지금까지 생성된 문장과 관련 있는 부분을 집중해서 볼 수 있음.

    4. FFN

    인코더와 동일. 표현력 강화하는 목적

    5. LayerNorm + Residual Connection

    각 블록 단계마다 다음을 수행:

    • Add & Norm:
      • output = LayerNorm(x + Sublayer(x))

    목적은 학습 안정화, 정보 손실 방지

    6. 최종 출력

    위 과정을 여러번 반복하게 되고, 마지막 층의 출력은 토큰 수 × d_model 형태가 된다.

    이걸 linear layer + softmax에 넣어 → 다음 단어의 확률 분포를 생성한다.

    최종적으로 생성한 문장들로 다음으로 올 가장 높은 확률의 단어를 생성함.

     

    [나는, 피자를] → [0.1, 0.05, 0.6, 0.25] $(단어 사전 내 확률 분포)$
                                     ↑
                                   "좋아해"가 가장 높은 확률 → 생성

    흐름 도식화

    1. 디코더 입력 $(텍스트 → 임베딩 + 위치인코딩)$
    2. Masked Self-Attention $(디코더 내부 문맥)$
    3. Encoder-Decoder Attention $(인코더 결과 참조)$
    4. Feed-Forward Network
    5. 여러 층 반복
    6. Linear + Softmax → 다음 단어 예측

     

    어텐션 개념만 잘 이해하면 크게 어려운 부분 없이 이해 가능하다 !

    다만 디코더 어텐션 과정에서 미래를 못 보게 Masked 처리한다는 점만 주의.

    인코더와 다른 점은 단어가 생성될 때마다 매번 새로운 어텐션을 계산하는 과정이 들어간다는 점.

    그래서 입력 토큰 비용에 비해 추론 토큰 비용이 생성마다 반복 수행 → 느리고 비싸다.

    'Machine Learning' 카테고리의 다른 글

    LLM 트랜스포머 동작 흐름 (1) Encoding  (0) 2025.05.18
    Back Propagation 오차역전법  (0) 2024.06.08
Designed by Tistory.