Transformer가 뭐길래!

문득 … 생각나서 오랜만에 캐글에 들어가봤는데,
n년 전에 🔥핫🔥해서 꾸역꾸역 모델 포팅까지 하며 적용했던 Transformer가 아직도 SOTA길래 이런 제목으로 복기를 해봤다.

인간이 간사하게도, 또 오랜만에 논문 읽으니까 꽤나 재밌었음. 지겨워서 떠났건만.

* Transformer - Attention is All You Need

- Introduction

RNN(Recurrent Neural Network) 계열의 모델은 이전 layer의 출력이 다음 layer의 입력이 되기에 다음과 같은 구조적 한계를 지님.

  • 장기 의존성(Long-range dependency)

    시퀀스가 길어질수록, 초반 정보가 소실됨.

  • 순차적 계산 의존성 (seq2seq)

    언급한대로 t 시점의 hidden state가 t-1 에 의존하기 때문에 GPU 병렬 연산의 활용이 불가함.

의 한계를 가짐.

RNN의 순차 계산을 줄이려는 시도로는 아래와 같은 것들이 있었음.

  • Extended Neural GPU, ByteNet, ConvS2S

    CNN을 기반으로 병렬 연산을 구현함. 단, 두 임의 위치 간 신호 경로 길이가 ConvS2S는 선형(O(n)), ByteNet은 로그(O(log n))로 늘어남. 여전히 먼 위치 간 의존성 학습이 어려움.

  • Transformer

    두 임의 위치 간 경로가 항상 O(1)로 고정됨. 단, Attention-weighted position들의 평균화로 유효 해상도가 줄어드는 문제가 생기는데, 이를 Multi-Head Attention으로 상쇄함.

Attention

Attention 메커니즘은 이미 Bahdanau et al. (2014)에서 제안됨. Attention 모듈의 핵심은 “어떤 노드를 attention할지”를 수치로 계산하는 것임.

Attention(Q, K, V) = Attention Value // Q: Query, K: Key, V: Value

Attention의 계산

  1. Attention Score 계산

    Decoder의 현재 hidden state s_t와 Encoder의 각 hidden state h_i가 얼마나 유사한지를 내적(Dot-Product)으로 계산함.

    score(s_t, h_i) = s_t^T · h_i
    

    따라서 Encoder의 모든 시점에 대해 계산하면

    e_t = [s_t^T·h_1, s_t^T·h_2, ..., s_t^T·h_N]
    
  2. Softmax → Attention Distribution

    위에서 구한 점수 벡터 e_t에 Softmax를 적용해, 합이 1인 확률 분포로 변환함.

    α_t = softmax(e_t)
    

    따라서 α_t 에는 Encoder의 각 hidden state에 얼마난 집중해야 할지가 수치로 표현된 상태임.

  3. 가중합 → Attention value

    Attention Weight와 Encoder의 hidden state를 가중합하여 최종 Attention Value a_t를 계산함.

    a_t = Σ α_i^t · h_i
    

    따라서 α_t 는 Encoder의 전체 맥락을 담은 벡터가 되며, Context Vector라고도 불림.

    기존의 seq2seq(RNN)가 Encoder의 마지막 hidden state 하나만을 fixed-size context vector로 쓴 것과 달리, Attention은 매 디코딩 스텝마다 입력 시퀀스 전체를 다시 참조하므로, 시퀀스가 길어져도 정보 손실이 없음.

  4. Concatenate

    구한 a_t를 Decoder의 hidden state s_t와 이어붙이고(concatenate), 추가 연산 후 최종 예측 단어를 뽑아냄.

Self-Attention

위에서 언급한 Attention(Cross-Attention)은 Decoder가 Encoder를 참조하는 구조로, Decoder가 Encoder의 어느 노드를 attention할지를 판단하기 때문에 Q가 Decoder에서, K·V가 Encoder에서 왔음. 그러나 여전히 RNN에 붙어서 사용되었고, 여전히 long-range dependency가 존재함.

반면 Self-Attention이란, 자기 자신의 시퀀스 내에서 Q, K, V를 만들어내어, Decoder의 각 노드가 다른 노드들과 얼마나 연관이 있는지를 판단하는 메커니즘임.

따라서 Q, K, V의 생성방식에도 차이가 있는데, Self-Attention에서는 Q, K, V 모두 동일한 입력 시퀀스 X에서 출발하되, 학습된 별도의 가중치 행렬로 선형 변환함. 계산 과정에서는 기존의 Attention에 스케일 조정이 추가되었다는 점에서 차이가 있음.

// Self-Attention
Q = X @ W_Q  ┐
K = X @ W_K  ├── 전부 같은 X에서 출발
V = X @ W_V// Cross-Attention
Q = X_decoder @ W_QDecoder에서
K = X_encoder @ W_K  ┐
V = X_encoder @ W_V  ┘← Encoder에서

Self-Attention은 시퀀스 내 모든 토큰 쌍을 한 번에 직접 연결하기 때문에, 거리가 멀어도 의존성 학습이 용이함. → Transformer가 RNN을 대체할 수 있었던 이유

Transformer

이 논문은 CNN이나 RNN을 완전히 제거하고 Attention만으로 시퀀스를 처리하는 최초의 모델을 제안함.

기존의 RNN에서 병렬 처리가 불가했던 이유는 t 시점의 연산이 반드시 t-1 시점의 결과를 필요로 하기 때문임. GPU는 독립적인 연산을 동시에 처리하는 데 특화되어 있는데, RNN은 이전 결과에 순차적으로 의존하는 구조라 병렬화가 원천적으로 불가함.

Transformer는 Self-Attention을 통해 시퀀스 내 모든 토큰 쌍의 관계를 행렬 연산 한 번으로 동시에 계산하므로, GPU 병렬 연산을 온전히 활용할 수 있음.

Model Architecture

ml-transformer-02.svg

Scaled Dot-Product Attention

쿼리(Q)와 모든 키(K)의 내적을 계산한 뒤 √d_k로 나누고, Softmax를 통해 가중치를 얻어 Value(V)에 가중합하는 방식.

Attention(Q, K, V) = softmax(QKᵀ / √d_k) · V

d_k가 클수록 내적값 분산이 커져 Softmax가 포화되고, Gradiant가 소실되기 때문에 √d_k로 나눠 정규화하는 역할임.

Multi-Head Attention

단일 Attention Head은 한 번에 하나의 관점으로만 토큰 간의 관계를 바라봄.

단일 Attention 함수를 d_model 차원에서 수행하는 대신, Q, K, V를 각각 h번 다른 선형 투영으로 변환한 뒤 병렬로 Attention을 수행하고, 결과를 Concat하여 다시 선형 투영함.

MultiHead(Q, K, V) = Concat(head_1, ..., head_h) · W_O
where head_i = Attention(Q·W_Q_i, K·W_K_i, V·W_V_i)

이를 통해 여러 관점을 병렬로 학습하는 것이 가능해짐.

Position-wise Feed-Forward Networks

각 Attention 서브레이어 이후, 각 위치에 독립적으로 동일한 FFN을 적용함.

FFN(x) = max(0, xW_1 + b_1) · W_2 + b_2

이를 통해 Self-Attention으로 토큰 간의 교환한 정보들을 어떻게 변환할지를 처리함.

Positional Embedding

Self-Attention은 순열 불변(Permutation Invariant)임. 따라서,

“내 이름은 헤일리”
”이름은 내 헤일리”
”헤일리 이름은 내”

Self-Attention의 수식 softmax(QKᵀ / √d_k) · V 은 토큰 순서를 전혀 고려하지 않음. 따라서 세 문장을 입력하면 동일한 Attention Score가 출력됨. 따라서 이를 보완하기 위해 임베딩에 Positional Encoding을 더하는 방식을 사용함.

즉, Self-Attention이 잃어버린 순서 정보를 복원하는 역할을 수행함.

Encoder & Decoder

Encoder의 최종 출력이 Decoder 각 layerdml Cross Attention에 K, V로 입력됨.

ml-transformer-02.svg

Q는 Decoder 자신에서, K·V는 Encoder 출력에서 나옴.

Encoder

  • Multi-Head Self-Attention (← Self-Attention)
  • Feed-Forward

로 구성된 레이어를 6개 쌓은 구조

각 서브레이어마다 Residual Connection + Layer Normalization 적용함.

LayerNorm(x + Sublayer(x))

Decoder

  • Masked Multi-Head Self-Attention (← Self-Attention)

    위치 i의 예측이 i 미만의 출력에만 의존하도록 미래 위치를 마스킹함.

  • Multi-Head Cross-Attention (← Cross-Attention)

    Encoder의 최종 출력이 각 레이어의 Cross-Attention에 K, V로 입력됨.

    이를 통해 seq2seq의 fixed-size context vector 병목을 해결

  • Feed-Forward

로 구성된 레이어를 6개 쌓은 구조

- Conclusion

Transformersms RNN이나 CNN없이 오직 Attention만으로 동작하는 최초의 Sequence Transduction 모델임.

논문이 강조하는 결론은 세 가지임.

  • 기계 번역(EN→DE, EN→FR) 두 태스크 모두에서 기존 앙상블 모델을 단일 모델로 능가함.
  • 학습 속도가 현저히 빠름. 8개 P100 GPU 기준 EN→FR은 3.5일, EN→DE는 12시간 만에 SOTA 달성.
  • 기계 번역 외 English Constituency Parsing에도 적용하여 일반화 성능을 검증함. 태스크 특화 튜닝 없이 RNN 기반 파서들과 경쟁하거나 이를 능가함.

저자들은 이미 논문 내에서 Transformer가 텍스트를 넘어 이미지, 오디오, 비디오 등 다양한 모달리티로 확장될 수 있음을 예견했음. 이후 ViT(이미지), Whisper(음성), AcT(로봇 행동)가 이를 실제로 증명하게 됨.

컴포넌트문제
Self-AttentionLong-range dependency & 병렬화 불가
Multi-Head AttentionFixed-size Context Value (단일 관점의 표현력 한계)
Positional Encoding순열 불변성 (위치 정보의 부재)
Position-wise FFNAttention 선형성의 한계
Cross-AttentionEncoder → Decoder 간의 정보 전달 병목