해당 논문의 제목은 "Attention is All you Need"로 Transformer가 처음으로 제안된 논문이다.
2017년 NeurIPS에 게재되었고, RNN/CNN 없이 attention만으로 시퀀스 변환(번역)을 하는 Transformer 아키텍처를 제안했다.
https://proceedings.neurips.cc/paper/2017/hash/3f5ee243547dee91fbd053c1c4a845aa-Abstract.html
Attention is All you Need
Requests for name changes in the electronic proceedings will be accepted with no questions asked. However name changes may cause bibliographic tracking issues. Authors are asked to consider this carefully and discuss it with their co-authors prior to reque
proceedings.neurips.cc
아래의 내용 및 이미지는 모두 논문에서 나오는 내용을 사용하였다.
서론
RNN 특히 LSTM/GRU 계열은 언어 모델링과 기계번역 같은 시퀀스 변환 문제에서 오랫동안 표준으로 자리 잡고 있다.
RNN 구조는 입력 시퀀스의 위치 t를 계산 스텝에 그대로 대응시킨다. 즉, t번째 hidden state $h_t$는 이전 상태 $h_{t-1}$과 현재 입력으로 계산된다.
여기서 근본적인 병목이 발생한다. 이 구조는 본질적으로 순차적이라 학습 샘플 내부에서 병렬화가 불가능하다. 시퀀스 길이가 길어질수록 문제가 심각해지는데, 메모리 제약 때문에 여러 샘플을 배치로 묶어 처리하는 것도 제한을 받기 때문이다. fatorization trick, conditional computation 같은 기법들로 효율을 개선하려는 시도는 있었지만, 순차적 계산이라는 근본 제약 자체는 그대로 남아있다.
Attention 메커니즘 자체는 이미 여러 시퀀스 모델링 task에서 사용이 되고 있었다. 입력이나 출력 시퀀스 내에서 거리에 상관없이 의존 관계를 모델링할 수 있다는 장점이 있기 때문이다. 거의 모든 경우 어텐션은 RNN과 함께 사용되었는데, RNN을 보조하는 역할을 수행했다는 것이다.
해당 논문에서는 Recurrence를 완전히 없애고, attention 메커니즘만으로 입력과 출력 사이의 global dependency를 이끌어내는 모델을 제안한다. 이 모델을 통해 병렬화가 가능해지고, 번역 품질 SOTA도 도달했다.
제안하는 모델
전체적인 구조

Transformer는 encoder-decoder 구조를 따르되, 둘 다 stacked self-attention + point-wise fully connected layer로만 구성된다.
Encoder
N=6개의 동일한 레이어를 쌓은 구조를 가진다.
레이어 하나당 sub-layer를 2개씩 가진다.
- Multi-head self-attention
- Position-wise fully connected feed-forward network
각 sub-layer마다 residual connection을 적용한 뒤 layer Normalization을 수행한다. 즉, sub-layer의 출력은 $LayerNorm(x+Sublayer(x))$이 된다.
Residual Connection을 원활하게 하기 위하여 embedding 레이어를 포함한 모든 sub-layer의 출력 차원을 $d_{model}=512$로 통일했다.
Decoder
인코더와 마찬가지로 N=6개의 동일 레이어를 쌓은 구조를 가진다.
다만 encoder와 달리 sub-layer를 3개씩 가진다.
- Masked multi-head self-attention
- Encoder-decoder attention : 인코더 출력에 대해 MHA 수행
- Position-wise feed-forward network
인코더와 동일하게 각 sub-layer에 resiudal connection + layer Normalization을 적용한다.
여기서 핵심은 masking 파트이다. self-attention sub-layer를 수정해서 특정 위치가 자기보다 위에 있는 위치를 보지 못하게 막는다. 출력 임베딩이 한 칸씩 밀려있는 것(offset by one position)과 이 masking이 합쳐져서, position i의 예측이 i보다 앞선 위치의 출력에만 의존하도록 보장하여 auto-regressive 속성을 유지한다.
Attention : Scaled Dot-Product Attention, Multi-Head Attention
Attention 함수는 query와 key-value 쌍 집합을 output으로 매핑하는 함수라고 볼 수 있다.
query, key, value, output은 모두 vector이다.
output은 value들의 가중합으로 계산되는데, 각 value에 곱해지는 가중치는 해당 query와 대응되는 key 사이의 호환성 함수로 결정된다.
Scaled Dot-Product Attention

입력 : query와 key(차원 : $d_k$), value(차원 $d_v$)
계산 과정
- query와 모든 key의 내적(dot product)을 구함
- 그 값을 $\sqrt d_k$로 나눔 (스케일링)
- softmax를 적용해서 value에 대한 가중치를 얻음
$Attention(Q, K, V) = softmax(QK^T / \sqrt{d_k})V$
additive attention과 이론적 복잡도는 비슷하지만, dot-product는 행렬곱 최적화 코드로 구현 가능해서 훨씬 빠르고 공간 효율적이다.
그리고 $\sqrt d_k$를 해주는 이유는 $d_k$가 크면 내적 값 자체가 커지는데, softmax가 극도로 작은 기울기 영역으로 밀려난다. 이를 막기 위해 $1/\sqrt d_k$로 나눠서 값 크기를 조정해준다.
MHA : Multi-Head Attention

$MultiHead(Q, K, V) = Concat(head_1, ..., head_h)W^O$
$head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)$
$d_{model}$ 차원으로 attention을 한 번 하는 대신, Q/K/V를 h개의 서로 다른 학습된 linear projection으로 각각 $d_k, d_k, d_v$ 차원에 투영한 뒤, h개를 병렬로 attention 계산을 수행한다.
그 이유는 단일 Head는 평균을 내는 과정에서 정보가 뭉개질 수 있고, multi-head는 서로 다른 표현 부분 공간, 서로 다른 위치의 정보를 동시에 attend 가능하기 때문이다.
본 논문에서는 $h = 8, d_k=d_v=d_{model}/h = 64$로 설정하여 head를 늘리는 대신 각 head 차원을 줄여서, 전체 연산량은 단일 head + full dimension일 때와 비슷하도록 한다.
모델 내 Attention 활용 3가지 방식
1. Encoder-Decoder Attention
Query는 이전 디코더 레이어에서, Key/Value는 인코더의 출력에서 나온다.
디코더의 모든 위치가 입력 시퀀스의 모든 위치를 attend할 수 있게 해준다. 기존 sequence-to-sequence 모델에서 흔히 쓰이던 인코더-디코더 어텐션 메커니즘을 그대로 모방한 것이다.
2. Encoder Self-Attention
Query/Key/Value 모두 인코더의 이전 레이어 출력에서 나온 것을 사용한다.
인코더 안의 각 위치가 이전 레이어의 모든 위치를 attend할 수 있다. self-attention이라서 Q/K/V가 다 같은 시퀀스에서 나온다는게 핵심이다.
3. Decoder Self-Attention (Masked)
Query, Key, Value 모두 디코더 이전 레이어에서 나온다.
디코더의 각 위치가 자기 자신을 포함해 그 이전 위치까지만 attend 가능하다. masking이 필요한 이유는 디코더는 auto-regressive 특성을 유지해야 하기 때문에, 미래 위치의 정보가 새어 들어가면 안되기 때문이다.
scaled dot-product attention 내부에서, softmax에 들어가기 전에 미래 위치에 해당하는 값들을 전부 $-\infty$로 마스킹 처리한다.
Position-wise Feed-Forward Networks
encoder와 decoder의 각 레이어는 attention sub-layer 외에도, fully connected feed-forward network를 하나씩 포함한다.
이 FFN은 각 위치마다 개별적으로, 동일하게 적용한다. 즉 시퀀스 내 모든 토큰 위치에 같은 FFN을 독립적으로 통과시키는 것이다.
$FFN(x) = max(0, xW_1 + b_1)W_2 + b_2$
linear tranformation 자체는 위치마다 동일하지만, 레이어마다는 파라미터가 다르다. 다르게 표현하면, 커널 크기 1인 conv를 두 번 적용하는 것과 같다는 것이다.
차원은 $d_{model}$ = 512, 중간 hidden layer는 $d_{ff}$=2048로 설정한다. (한번 확장했다가 축소)
Embeddings and Softmax
다른 시퀀스 변환 모델처럼, 학습된 임베딩을 사용해 입력/출력 토큰을 $d_{model}$ 차원 벡터로 변환한다.
docoder 출력을 다음 토큰 확률로 바꿀 때도 학습된 linear transformation + softmax를 사용한다.
두 임베딩 레이어와 pre-softmax linear transformation이 동일한 가중치 행렬을 공유한다. 임베딩 레이어에서는 가중치에 $\sqrt d_{model}$을 곱해준다.

Positional Encoding
Transformer는 recurrence도 없고 Conv도 없다. 그래서 시퀀스의 순서 정보를 모델이 활용하려면 별도로 위치 정보를 주입해줘야 된다.
이를 위해 인코더와 디코더 스택 맨 아래에서, 입력 임베딩에 "positional encoding"을 더해준다.
Positional Encoding은 임베딩과 동일한 차원을 가지기 때문에 그냥 더할 수 있고, 위치 인코딩 방식은 학습 되는 것과 고정된 것 둘 다 존재한다.
해당 논문에서는 sine, cosine 함수를 사용한다.
$PE(pos, 2i) = sin( pos / 10000^{2i/d_model} )$
$PE(pos, 2i+1) = cos( pos / 10000^{2i/d_model} )$
pos = 위치, i = 차원 인덱스를 나타낸다.
positional encoding은 각 차원마다 서로 다른 주파수를 가진 sinusoid가 대응된다. 파장은 $2\pi$부터 $10000 \cdot 2\pi$까지 등비수열을 이룬다.
sin/cos를 사용하는 이유
1. 상대 위치 학습 용이성
임의의 고정 offset k에 대해, PE(pos+k)는 PE(pos)의 선형 함수로 표현 가능하다.
이는 모델이 상대적인 위치 관계를 attention을 통해 쉽게 학습할 수 있을거라 가정하는 것이다.
2. 길이 외삽(extrapolation)
학습 때 본 시퀀스보다 더 긴 시퀀스에도 대응할 것이라고 기대하기 때문이다.
실험 결과

Transformer가 번역 외 다른 task에도 잘 일반화하는지 수행하기 위해서 영어 구문 해석을 수행했고, 데이터셋은 4-layer Transformer, $d_{model}$=1024를 WSJ(Wall Street Journal)을 사용했다.
두 가지 학습 조건
WSJ only
약 4만 문장으로 소량의 데이터로 구성되어있다. 기존 최고 모델인 Dyer et al.의 91.7%보다는 0.4%정도 낮긴하지만, 다른 모델들에서는 기존 모델을 뛰어 넘는 성능을 보인다.
즉, task-specific 튜닝 없이도 소량 데이터 환경에서 거의 SOTA급 성능을 보인다.
Semi-supervised
약 1700만 문장으로 BerkleyParser sorpus 등이 추가되었다.
기존 다른 모델의 성능을 모두 뛰어 넘는 F1 score 92.7%를 달성하였다.
semi-supervised 조건에서는 이 표의 discriminative/semi-supervised 모델 중 최고 성능을 보인다.
이 실험의 목적은 번역 특화 모델이 아니라 범용 아키텍처임을 증명하는 것이다.
구문 분석은 출력이 강한 구조적 제약을 받고 입력보다 훨씬 긴 특성이 있어, RNN이나 seq2seq 모델은 소량 데이터에서 SOTA를 달성하지 못했던 task였다. 하지만 transformer는 task-specific 튜닝을 거의 안했음에도 소량/대량 데이터 양쪽에서 경쟁력 있는 성능을 보여 범용성을 입증하였다.