콘텐츠로 이동

트랜스포머 아키텍처 (Transformer Architecture)

개요

Transformer는 Vaswani et al. (2017)이 "Attention Is All You Need"에서 제안한 아키텍처로, 순환(recurrence) 없이 어텐션 메커니즘만으로 시퀀스를 처리한다. RNN의 순차적 처리 한계를 극복하고 완전한 병렬화를 가능하게 하여, 현재 NLP, 컴퓨터 비전, 오디오 등 거의 모든 도메인에서 지배적인 아키텍처가 되었다.


핵심 개념

1. 전체 아키텍처

graph TD
    subgraph Encoder["인코더 (×N)"]
        E_input["입력 임베딩 + 위치 인코딩"]
        E_SA["Multi-Head Self-Attention"]
        E_AN1["Add & Norm"]
        E_FFN["Feed-Forward Network"]
        E_AN2["Add & Norm"]

        E_input --> E_SA
        E_SA --> E_AN1
        E_AN1 --> E_FFN
        E_FFN --> E_AN2
    end

    subgraph Decoder["디코더 (×N)"]
        D_input["출력 임베딩 + 위치 인코딩"]
        D_MSA["Masked Multi-Head Self-Attention"]
        D_AN1["Add & Norm"]
        D_CA["Multi-Head Cross-Attention"]
        D_AN2["Add & Norm"]
        D_FFN["Feed-Forward Network"]
        D_AN3["Add & Norm"]

        D_input --> D_MSA
        D_MSA --> D_AN1
        D_AN1 --> D_CA
        E_AN2 --> D_CA
        D_CA --> D_AN2
        D_AN2 --> D_FFN
        D_FFN --> D_AN3
    end

    D_AN3 --> Linear["Linear + Softmax"]
    Linear --> Output["출력 확률"]

인코더: N개의 동일한 층으로 구성. 각 층은 Self-Attention + FFN
디코더: N개의 동일한 층으로 구성. 각 층은 Masked Self-Attention + Cross-Attention + FFN
각 Sub-layer: Residual Connection + Layer Normalization

\[\text{output} = \text{LayerNorm}(x + \text{SubLayer}(x))\]

2. 위치 인코딩 (Positional Encoding)

Self-attention은 순서 불변(permutation invariant) 이므로, 위치 정보를 별도로 주입해야 한다.

Sinusoidal Encoding (원래 Transformer)

\[PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right)$$ $$PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right)\]
  • 임의 길이로 일반화 가능
  • 상대적 위치 관계를 선형 변환으로 표현 가능

기타 위치 인코딩

방법 핵심 아이디어 사용 모델
Learned Positional Embedding 위치별 학습 가능 벡터 BERT, GPT
Relative Positional Encoding 절대 위치 대신 상대 거리 T5, Shaw et al.
RoPE (Rotary) 회전 행렬 기반, 내적이 상대 위치의 함수 LLaMA, Qwen
ALiBi attention score에 거리 기반 bias 추가 BLOOM

RoPE는 현재 대부분의 최신 LLM에서 사용되며, 학습 시 본 적 없는 긴 시퀀스에도 비교적 잘 일반화된다.

3. Feed-Forward Network (FFN)

각 위치에 독립적으로 적용되는 2층 신경망이다.

기본 구조: $\(\text{FFN}(x) = W_2 \cdot \text{GELU}(W_1 x + b_1) + b_2\)$

차원: \(d_{model} \to d_{ff}(= 4 \times d_{model}) \to d_{model}\)

GLU 변형 (SwiGLU, LLaMA에서 사용): $\(\text{FFN}(x) = (W_1 x \odot \text{Swish}(W_g x)) W_2\)$

직관: Attention이 "어디를 볼지" 결정하고, FFN이 "무엇을 할지" 결정한다.

4. Transformer가 RNN을 대체한 이유

특성 RNN Transformer
병렬화 불가 (순차 처리) 가능 (전체 동시 처리)
장거리 의존성 \(O(n)\) 경로 길이 \(O(1)\) 경로 길이
GPU 활용도 낮음 높음
학습 속도 느림 빠름
메모리 \(O(n)\) \(O(n^2)\)
귀납적 편향 시간적 근접성 거의 없음 (더 많은 데이터 필요)

5. Transformer 변형

graph TD
    T["Transformer"] --> EO["Encoder-only"]
    T --> DO["Decoder-only"]
    T --> ED["Encoder-Decoder"]
    T --> V["Vision"]

    EO --> BERT["BERT<br>양방향 문맥 이해<br>분류, NER"]
    DO --> GPT["GPT 계열<br>자기회귀 생성<br>현재 LLM 주류"]
    ED --> T5["T5, BART<br>번역, 요약"]
    V --> ViT["ViT<br>이미지 패치 → Transformer"]
변형 어텐션 방향 주요 과제 대표 모델
Encoder-only 양방향 분류, NER, 질의응답 BERT, RoBERTa
Decoder-only 단방향 (causal) 생성, 추론 GPT, LLaMA, Claude
Encoder-Decoder 양방향 + 단방향 번역, 요약 T5, BART
Vision 이미지 패치 이미지 분류, 탐지 ViT, DeiT, Swin

상세 내용

Pre-LN vs Post-LN

Post-LN (원래 Transformer): $\(x' = \text{LayerNorm}(x + \text{SubLayer}(x))\)$

Pre-LN (현재 표준): $\(x' = x + \text{SubLayer}(\text{LayerNorm}(x))\)$

Pre-LN이 학습 안정성이 더 좋아, warmup이 짧아도 되고, 더 깊은 모델을 학습할 수 있다.

KV-Cache

자기회귀 생성 시, 이미 계산한 Key와 Value를 캐시하여 재계산을 방지한다.

  • 없이: 토큰 \(t\)를 생성할 때 \(1 \sim t-1\)의 K, V를 매번 재계산 → \(O(n^2)\)
  • 있으면: 이전 K, V를 저장하고 새 토큰의 K, V만 추가 → \(O(n)\)

대규모 배치나 긴 시퀀스에서 KV-Cache는 메모리 병목이 될 수 있다. 이를 위해 GQA(Grouped-Query Attention), MQA(Multi-Query Attention) 등이 제안되었다.

Vision Transformer (ViT)

이미지를 고정 크기 패치로 분할하여 "토큰"으로 취급한다.

  1. 이미지를 \(P \times P\) 패치로 분할
  2. 각 패치를 선형 투영으로 임베딩
  3. 위치 인코딩 추가
  4. 표준 Transformer 인코더 적용
  5. [CLS] 토큰 또는 GAP으로 분류

대규모 데이터(JFT-300M 등)에서 학습하면 CNN을 능가하지만, 적은 데이터에서는 CNN의 귀납적 편향(이동 등변성, 지역성)이 유리하다.


언제 사용하는가

과제 추천 변형 비고
텍스트 분류, NER Encoder-only (BERT) 양방향 문맥이 중요
텍스트 생성 Decoder-only (GPT) 자기회귀 생성
번역, 요약 Encoder-Decoder (T5) 입출력이 다른 시퀀스
이미지 분류 ViT 또는 CNN 데이터 양에 따라 선택
멀티모달 Cross-Attention 활용 텍스트-이미지 등

흔한 오해와 함정

  1. "Transformer는 항상 RNN보다 좋다": Transformer는 데이터가 충분하고 시퀀스가 매우 길지 않을 때 우수하다. 매우 제한된 데이터나 실시간 스트리밍에서는 RNN이 적합할 수 있다.

  2. Attention mask 설정 오류: 가장 흔한 버그. Padding mask(패딩 토큰 무시)와 Causal mask(미래 토큰 방지)를 정확히 설정해야 한다. 두 mask를 올바르게 결합하는 것도 중요하다.

  3. Warmup 없이 학습: Transformer는 학습 초기에 attention weight가 불안정하므로, learning rate warmup이 사실상 필수적이다. 특히 Post-LN에서는 더욱 중요하다.

  4. 위치 인코딩 누락: Self-attention은 순서를 모르므로, 위치 인코딩 없이는 "bag of tokens"처럼 동작한다.

  5. \(O(n^2)\) 메모리를 무시: 시퀀스 길이가 늘어나면 attention 행렬의 메모리가 이차적으로 증가한다. Flash Attention이나 sparse attention을 고려해야 한다.


다른 주제와의 연결