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의 계산
-
Attention Score 계산
Decoder의 현재 hidden state
s_t와 Encoder의 각 hidden stateh_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] -
Softmax → Attention Distribution
위에서 구한 점수 벡터
e_t에 Softmax를 적용해, 합이 1인 확률 분포로 변환함.α_t = softmax(e_t)따라서
α_t에는 Encoder의 각 hidden state에 얼마난 집중해야 할지가 수치로 표현된 상태임. -
가중합 → 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은 매 디코딩 스텝마다 입력 시퀀스 전체를 다시 참조하므로, 시퀀스가 길어져도 정보 손실이 없음.
-
Concatenate
구한
a_t를 Decoder의 hidden states_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_Q ← Decoder에서
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
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로 입력됨.
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-Attention | Long-range dependency & 병렬화 불가 |
| Multi-Head Attention | Fixed-size Context Value (단일 관점의 표현력 한계) |
| Positional Encoding | 순열 불변성 (위치 정보의 부재) |
| Position-wise FFN | Attention 선형성의 한계 |
| Cross-Attention | Encoder → Decoder 간의 정보 전달 병목 |