[논문 정리] Attention Is All You Need
[논문 정리] Attention Is All You Need — Transformer와 Self-Attention의 핵심 알고리즘/수식 정리
들어가며
Attention Is All You Need는 RNN이나 CNN 없이도, attention만으로 sequence transduction을 수행할 수 있음을 보인 논문이다.
이 논문에서 제안한 Transformer는 이후 자연어처리 모델 설계의 기준점이 되었고, 특히 self-attention, multi-head attention, positional encoding이라는 핵심 아이디어를 명확한 수식으로 정리했다.
이 글에서는 논문의 핵심을 다음 순서로 정리한다.
- 왜 기존 RNN/CNN 구조를 넘어서려 했는가
- Transformer 전체 구조
- Scaled Dot-Product Attention
- Multi-Head Attention
- Encoder / Decoder 내부 동작
- Positional Encoding
- 왜 Self-Attention이 강력한가
- 학습 전략과 성능 결과
- 이 논문이 남긴 핵심 메시지
1. 문제의식: 왜 RNN이 아니라 Attention인가
기존 sequence model, 특히 RNN/LSTM 기반 모델은 입력을 시간축 순서대로 처리한다.
즉, 현재 hidden state는 이전 hidden state에 의존한다.
이 구조의 문제는 명확하다.
- 병렬화가 어렵다
- 시퀀스가 길어질수록 학습이 느려진다
- 먼 거리의 토큰 간 관계를 학습하기 어렵다
- 정보가 여러 단계를 거치며 전달되므로 long-range dependency가 약해질 수 있다
논문은 이 지점을 정면으로 겨냥한다.
“시퀀스 순서대로 계산해야 한다”는 가정 자체를 버리고,
각 토큰이 다른 모든 토큰을 직접 참조하게 만들면 어떨까?
그 결과가 바로 Self-Attention 기반 Transformer다.
2. Transformer 전체 구조
Transformer는 기본적으로 Encoder-Decoder 구조를 따른다.
- Encoder: 입력 문장을 받아 문맥 표현(sequence representation)으로 변환
- Decoder: encoder 출력을 참고하면서 출력 문장을 한 토큰씩 생성
논문에서 사용한 기본 설정은 다음과 같다.
- Encoder layer 수:
N = 6 - Decoder layer 수:
N = 6 - 모델 차원:
d_model = 512 - FFN 내부 차원:
d_ff = 2048 - Head 수:
h = 8
2.1 Encoder layer
각 encoder layer는 두 개의 sub-layer로 구성된다.
- Multi-Head Self-Attention
- Position-wise Feed-Forward Network
그리고 각 sub-layer 바깥에는 다음 연산이 있다.
- Residual connection
- Layer Normalization
논문은 이를 다음과 같이 표현한다.
\[\text{LayerNorm}(x + \text{Sublayer}(x))\]즉, sub-layer 출력만 쓰는 것이 아니라 원래 입력 x를 더한 뒤 정규화한다.
2.2 Decoder layer
decoder layer는 encoder보다 한 단계 더 복잡하다.
세 개의 sub-layer를 가진다.
- Masked Multi-Head Self-Attention
- Encoder-Decoder Attention
- Position-wise Feed-Forward Network
여기서 핵심은 masked self-attention이다.
decoder는 미래 토큰을 보면 안 되므로,
현재 위치 i의 예측은 오직 1 ~ i 위치까지만 참고할 수 있어야 한다.
즉, decoder self-attention에서는 미래 위치를 softmax 전에 마스킹한다.
3. Attention의 기본 아이디어
Attention은 다음을 입력으로 받는다.
- Query (Q)
- Key (K)
- Value (V)
직관적으로 보면,
- Query: 지금 내가 찾고 싶은 정보
- Key: 각 토큰이 가진 “검색용 표지”
- Value: 실제로 가져갈 정보
현재 토큰의 query가 모든 key와 얼마나 잘 맞는지 계산하고, 그 점수를 바탕으로 value들을 가중합하면 attention output이 된다.
4. Scaled Dot-Product Attention
논문의 가장 핵심적인 수식은 이것이다.
\[\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V\]이 식을 단계별로 해석해보자.
4.1 1단계: 유사도 계산
먼저 Query와 Key의 내적을 계산한다.
\[QK^T\]이 연산은 각 query가 각 key와 얼마나 잘 맞는지를 나타내는 score matrix를 만든다.
예를 들어 입력 길이가 n이면,
self-attention에서는 보통 다음과 같은 shape를 생각할 수 있다.
- \[Q \in \mathbb{R}^{n \times d_k}\]
- \[K \in \mathbb{R}^{n \times d_k}\]
- \[V \in \mathbb{R}^{n \times d_v}\]
그러면
\[QK^T \in \mathbb{R}^{n \times n}\]이 된다.
즉, 각 토큰이 다른 모든 토큰을 얼마나 참조할지를 한 번에 계산한다.
4.2 2단계: 왜 (\sqrt{d_k})로 나누는가
논문은 score를 그냥 softmax에 넣지 않고 다음처럼 scaling한다.
\[\frac{QK^T}{\sqrt{d_k}}\]이유는 d_k가 커질수록 dot product 값의 분산이 커져서,
softmax가 지나치게 뾰족해지고 gradient가 매우 작아질 수 있기 때문이다.
논문은 이를 직관적으로 설명한다.
q와k의 각 성분이 평균 0, 분산 1이라면- 내적
q \cdot k의 분산은d_k
즉, 차원이 클수록 score 값이 커지고, softmax가 saturation 영역으로 가기 쉽다.
그래서
\[\sqrt{d_k}\]로 나눠서 score의 스케일을 안정화한다.
이것이 Scaled Dot-Product Attention의 핵심이다.
4.3 3단계: softmax로 attention weight 생성
이제 각 score 행에 softmax를 적용한다.
\[A = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)\]그러면 각 row는 “현재 토큰이 어떤 토큰을 얼마나 볼 것인가”를 뜻하는 확률 분포가 된다.
- 값이 크면 많이 참고
- 값이 작으면 거의 무시
4.4 4단계: Value의 가중합
마지막으로 attention weight를 V에 곱한다.
즉,
\[\text{Attention}(Q, K, V) = A V\]이 결과는 각 토큰이 전체 문맥을 반영한 새로운 표현이다.
5. Self-Attention은 정확히 무엇인가
self-attention은 Q, K, V가 모두 같은 시퀀스에서 나오는 attention이다.
즉, 입력 X가 있을 때
처럼 같은 입력으로부터 세 표현을 만든다.
이 의미는 다음과 같다.
각 토큰이 자기 자신을 포함한 전체 문장 토큰을 참고하여
“문맥이 반영된 표현”으로 다시 변환된다.
예를 들어 문장 안에 어떤 단어가 있을 때,
그 단어의 representation은 더 이상 단독 의미만 가지지 않는다.
주어, 목적어, 수식어, 먼 거리의 의존 관계까지 반영할 수 있다.
6. Multi-Head Attention
논문은 single attention보다 multi-head attention이 더 좋다고 말한다.
수식은 다음과 같다.
\[\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W^O\]각 head는 다음처럼 계산된다.
\[\text{head}_i = \text{Attention}(QW_i^Q,\; KW_i^K,\; VW_i^V)\]즉, 핵심 아이디어는 다음과 같다.
- Q, K, V를 한 번만 쓰지 않는다
- 서로 다른 projection matrix로 여러 개의 표현 공간(subspace)으로 보낸다
- 각 공간에서 attention을 병렬로 계산한다
- 결과를 concat한 뒤 다시 projection한다
6.1 왜 여러 head가 필요한가
single-head attention만 쓰면 결국 한 종류의 관계에 집중하기 쉽다.
반면 multi-head attention은
- 어떤 head는 주어-동사 관계
- 어떤 head는 수식어 관계
- 어떤 head는 멀리 떨어진 dependency
- 어떤 head는 coreference
처럼 서로 다른 관계를 병렬로 포착할 수 있다.
논문 뒤쪽 attention visualization에서도 실제로
서로 다른 head가 서로 다른 문법적/의미적 역할을 학습하는 예가 제시된다.
6.2 논문의 기본 설정
논문 base model에서는
h = 8d_model = 512d_k = d_v = d_model / h = 64
를 사용한다.
즉, 512차원 전체 공간을 한 번에 보는 대신,
8개의 64차원 subspace에서 병렬 attention을 수행한다.
중요한 점은 각 head의 차원을 줄였기 때문에
전체 계산량이 single full-dimensional attention과 크게 다르지 않다는 것이다.
7. Transformer 안에서 Attention이 쓰이는 3가지 방식
논문은 multi-head attention을 세 곳에 사용한다.
7.1 Encoder Self-Attention
- Q, K, V가 모두 encoder의 같은 입력에서 생성
- 각 입력 토큰이 다른 모든 입력 토큰을 본다
즉, 입력 문장 내부의 관계를 학습한다.
7.2 Decoder Masked Self-Attention
- Q, K, V가 decoder 내부에서 생성
- 단, 미래 토큰은 마스킹
즉, 출력 생성 시 자기보다 오른쪽 토큰을 보지 못하게 한다.
수식적으로는 softmax 전에 illegal connection 위치를 -\infty로 두는 방식이다.
예를 들면 score matrix가 다음처럼 생겼다고 하자.
\[\begin{bmatrix} s_{11} & -\infty & -\infty \\ s_{21} & s_{22} & -\infty \\ s_{31} & s_{32} & s_{33} \end{bmatrix}\]이 상태에서 row-wise softmax를 하면, 첫 번째 토큰은 첫 번째 위치만, 두 번째 토큰은 첫째/둘째 위치만, 세 번째 토큰은 첫째~셋째 위치만 볼 수 있다.
7.3 Encoder-Decoder Attention
- Query는 decoder에서 옴
- Key, Value는 encoder output에서 옴
즉, decoder가 다음 단어를 생성할 때
입력 문장의 어떤 위치를 참고할지 결정하는 단계다.
이것은 기존 seq2seq attention과 역할이 유사하지만, Transformer에서는 이 역시 multi-head attention으로 처리된다.
8. Position-wise Feed-Forward Network (FFN)
attention만으로 끝나지 않는다.
각 layer에는 토큰별로 독립적으로 적용되는 FFN이 있다.
논문 수식은 다음과 같다.
\[\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2\]즉,
- 선형변환
- ReLU
- 다시 선형변환
의 구조다.
논문 기본 설정에서는
- 입력/출력 차원:
d_model = 512 - 내부 차원:
d_ff = 2048
이다.
중요한 해석
이 FFN은 각 위치마다 동일하게 적용되지만,
각 위치가 서로 정보를 섞는 연산은 아니다.
- 토큰 간 상호작용: attention이 담당
- 각 토큰 표현의 비선형 변환: FFN이 담당
즉, attention이 “문맥 섞기”라면, FFN은 “각 토큰 표현을 깊게 가공하기”에 가깝다.
9. Embedding과 Softmax
입력 토큰과 출력 토큰은 먼저 embedding을 통해 d_model 차원 벡터가 된다.
또한 decoder 마지막 출력은 linear + softmax를 거쳐
다음 토큰의 확률 분포가 된다.
논문에서 흥미로운 점은 다음이다.
- 입력 embedding
- 출력 embedding
- pre-softmax linear transformation
이들 사이에 weight sharing을 사용한다.
그리고 embedding에는 가중치에
\[\sqrt{d_{model}}\]를 곱한다.
이 부분은 파라미터 효율성과 표현 학습 측면에서 의미가 크다.
10. Positional Encoding: 순서 정보는 어떻게 넣는가
Transformer에는 RNN처럼 시간축 recurrence가 없고, CNN처럼 local convolution도 없다.
즉, attention만 두면 단어 순서 정보가 사라진다.
그래서 논문은 입력 embedding에 positional encoding을 더한다.
10.1 sinusoidal positional encoding 수식
논문이 사용한 수식은 다음과 같다.
\[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)\]여기서
pos: 토큰 위치i: 차원 index
이다.
짝수 차원은 sine, 홀수 차원은 cosine을 사용한다.
10.2 왜 이런 형태를 쓰는가
이 positional encoding은 차원마다 서로 다른 주파수의 사인/코사인 파형을 갖는다.
장점은 다음과 같다.
- 절대 위치 정보를 넣을 수 있다
- 서로 다른 위치가 서로 다른 패턴을 갖는다
- 상대 거리
k에 대해
PE_{pos+k}를PE_{pos}의 선형 함수처럼 다룰 수 있으리라는 가설이 있다 - 학습 때 보지 못한 더 긴 길이에도 어느 정도 일반화할 가능성이 있다
논문은 learned positional embedding도 실험했지만, sinusoidal encoding과 거의 비슷한 성능을 보였다고 보고한다.
11. 왜 Self-Attention이 강력한가
논문은 self-attention을 RNN, CNN과 비교하면서 세 가지 기준을 든다.
- 층당 계산 복잡도
- 순차 연산 수
- 장거리 dependency 사이의 경로 길이
11.1 복잡도 비교
논문 Table 1의 핵심은 다음과 같다.
- Self-Attention
- Complexity per layer: (O(n^2 d))
- Sequential operations: (O(1))
- Maximum path length: (O(1))
- Recurrent
- Complexity per layer: (O(nd^2))
- Sequential operations: (O(n))
- Maximum path length: (O(n))
- Convolutional
- Complexity per layer: (O(knd^2))
- Sequential operations: (O(1))
- Maximum path length: (O(\log_k n))
11.2 가장 중요한 직관: path length
RNN은 멀리 떨어진 두 토큰이 상호작용하려면 여러 step을 거쳐야 한다.
예를 들어 첫 단어와 마지막 단어의 관계를 반영하려면
중간 상태를 계속 통과해야 한다.
하지만 self-attention에서는 한 번의 attention layer만으로
모든 토큰 쌍이 직접 연결된다.
즉, 두 토큰 사이의 path length가 짧다.
이것이 장거리 의존성 학습에 매우 유리하다는 것이 논문의 주장이다.
11.3 병렬화 관점의 장점
RNN은 시간축 순서대로 계산해야 해서 GPU 병렬화에 제약이 크다.
반면 self-attention은
\[QK^T\]같은 대규모 matrix multiplication으로 구현되므로
GPU에 매우 잘 맞는다.
즉, 이 논문은 “표현력”뿐 아니라
현실적인 학습 효율성까지 함께 얻었다.
12. Attention Visualization이 보여주는 것
논문 후반의 시각화 예시는 단순한 성능 보고를 넘어서 중요한 메시지를 준다.
- 어떤 head는 먼 거리 dependency를 따라간다
- 어떤 head는 anaphora/coreference처럼 보이는 패턴을 잡는다
- head마다 역할이 다르게 분화되는 모습이 나타난다
즉, multi-head attention은 단순한 중복이 아니라
정말로 서로 다른 정보 패턴을 분담하고 있다는 해석이 가능하다.
13. 학습 전략
논문은 구조뿐 아니라 학습 스케줄도 매우 중요하게 제시한다.
13.1 Optimizer
Adam optimizer를 사용한다.
- (\beta_1 = 0.9)
- (\beta_2 = 0.98)
- (\epsilon = 10^{-9})
13.2 Learning Rate Schedule
가장 유명한 식 중 하나가 바로 이것이다.
\[\text{lrate} = d_{model}^{-0.5} \cdot \min\left( step\_num^{-0.5}, \; step\_num \cdot warmup\_steps^{-1.5} \right)\]그리고
\[warmup\_steps = 4000\]을 사용한다.
13.3 이 식의 의미
이 스케줄은 두 구간으로 나뉜다.
(1) Warmup 구간
초기에는 learning rate를 선형 증가시킨다.
이유:
- 초반부터 너무 큰 lr로 시작하면 학습이 불안정할 수 있음
- attention 기반 깊은 모델에서 초기 최적화를 안정화하는 데 도움
(2) Warmup 이후
그 다음에는
\[step^{-0.5}\]에 비례하여 감소한다.
이유:
- 학습이 진행될수록 더 정교한 파라미터 조정이 필요함
즉, 이 식은 초반 안정화 + 후반 완만한 감소를 동시에 만족시키는 설계다.
14. Regularization
논문은 세 가지 regularization을 언급한다.
14.1 Residual Dropout
각 sub-layer 출력에 dropout을 적용한 뒤 residual add & norm을 수행한다.
또한 embedding과 positional encoding의 합에도 dropout을 적용한다.
base model에서는
\[P_{drop} = 0.1\]이다.
14.2 Label Smoothing
논문은
\[\epsilon_{ls} = 0.1\]의 label smoothing을 사용한다.
이 방법은 모델이 정답 클래스에 과도하게 확신하는 것을 막는다.
흥미로운 점은 논문이 다음을 명시한다는 것이다.
- perplexity는 나빠질 수 있음
- 하지만 accuracy와 BLEU는 좋아질 수 있음
즉, “더 덜 확신하는 모델”이 오히려 일반화에는 유리할 수 있다.
15. 성능 결과
논문이 보고한 대표 결과는 다음과 같다.
- WMT 2014 English-to-German
- Transformer (big): 28.4 BLEU
- WMT 2014 English-to-French
- Transformer (big): 41.8 BLEU
또한 논문은 Transformer가 이전 최고 성능 모델들보다 더 적은 학습 비용으로 더 좋은 성능을 냈다고 보고한다.
특히 big model은 8개의 NVIDIA P100 GPU에서 3.5일 학습으로 strong result를 달성했다.
16. 이 논문의 핵심 기여를 한 문장씩 정리하면
16.1 RNN/CNN 없이도 sequence transduction이 가능하다
Transformer는 attention만으로 입력과 출력을 연결했다.
16.2 Self-Attention을 중심 연산으로 끌어올렸다
이전에도 attention은 있었지만, 보조 장치인 경우가 많았다.
이 논문은 attention을 주연산으로 만들었다.
16.3 Scaled Dot-Product Attention을 정식화했다
단순 dot-product attention에 scaling을 넣어
학습 안정성을 개선했다.
16.4 Multi-Head Attention으로 표현 공간을 분할했다
서로 다른 하위 공간에서 병렬로 관계를 학습하게 만들었다.
16.5 Positional Encoding으로 순서 정보를 주입했다
recurrence 없이도 순서 정보를 다룰 수 있게 했다.
16.6 병렬화와 장거리 의존성 학습을 동시에 잡았다
이론적 장점뿐 아니라 실제 학습 속도와 성능 개선까지 보여주었다.
17. 개인적인 이해 포인트: Transformer를 이렇게 보면 쉽다
Transformer layer 하나를 아주 단순화해서 보면 다음 두 단계다.
Step 1. Attention으로 문맥을 섞는다
각 토큰이 다른 토큰들을 참고해 새로운 표현을 만든다.
Step 2. FFN으로 각 토큰 표현을 깊게 변환한다
문맥이 반영된 표현을 position-wise MLP로 가공한다.
즉, 한 층은 사실상
- 토큰 간 정보 교환
- 토큰별 비선형 변환
으로 이해할 수 있다.
이 구조를 여러 층 쌓으면서 표현이 점점 더 고차원적인 의미를 갖게 된다.
18. 마무리
Attention Is All You Need의 본질은 단순하다.
“시퀀스를 반드시 순서대로 처리할 필요가 있는가?”
라는 질문에 대해
“아니, 전체를 한 번에 보고 관계를 직접 계산하면 된다”
라고 답한 논문이다.
그리고 그 답을 다음 요소들로 완성했다.
- Scaled Dot-Product Attention
- Multi-Head Attention
- Encoder-Decoder 구조
- Residual + LayerNorm
- Position-wise FFN
- Sinusoidal Positional Encoding
- Warmup 기반 Learning Rate Schedule
Transformer를 공부할 때 가장 중요한 것은
세부 구현을 외우는 것보다도,
“각 토큰이 전체 문맥과 직접 연결된다”는 구조적 전환을 이해하는 것이다.
Reference
- Vaswani, A., Shazeer, N., Parmar, N., et al. Attention Is All You Need. NeurIPS 2017.
Leave a comment