0. Abstract
시퀀스 데이터(예: 시간에 따라 변화하는 데이터, 텍스트 데이터 등)를 다루는 기존의 모델은 대부분 encoder와 decoder를 가지는 RNN(Recurrent Neural Network, 순환 신경망)나 CNN(Convolutional Neural Network, 합성곱 신경망)이었다. 그리고 성능이 좋은 모델들은 Attention 기법을 사용해서 encodder와 decoder를 연결시켰다. 이 논문에서는 RNN과 CNN과는 달리, 순수하게 Attention 기법만을 사용한 새로운 아키텍쳐 Transformer를 소개한다.
1. Introduction
Sequence modeling이나 특정 데이터셋 안에서 학습하는 Transductive 문제(언어 모델, 번역 )에 대해서는 RNN, LSTM(Long Short-term memory), GRU(Gated Recurrent Unit)과 같은 접근이 SOTA (State of the Art) 모델의 대부분이었다. RNN이 작동하는 방식은 input과 output의 순서를 고려해서 연산하는 것이다. t번째 상태(hidden state) $h_{t}$를 구하기 위해서 이전의 상태인 $h_{t-1}$과 t번째 위치의 input을 고려하는 함수를 생성한다. 이러한 RNN 방식의 고질적인 문제는 순서를 고려하기 때문에 병렬 연산을 할 수 없어서 긴 데이터가 들어온다면 제한된 메모리로는 좋은 성능을 내기에 제약이 있다는 것이다.
Attention 기법은 다양한 문제에 적용할 수 있고, input과 output의 순서에 따라 생기는 거리에 영향을 받지 않고 각 위치의 요소들의 상관 관계를 파악할 수 있다는 장점이 있다. 제안된 Transformer 모델은 전적으로 attention 기법에 의존해서, 병렬성과 성능 면에서 새로운 SOTA 모델에 도달한다.
2. Background
여러 모델에서 sequential한 연산을 줄이고자 하는 시도를 했지만, position에 따라서 거리가 멀어지면 연산량이 증가해서( $O(\log(n))$ 또는 $O(n)$ 복잡도)상관관계를 학습하기는 어려웠다. 주어지는 시퀀스 데이터의 길이가 커질수록, 각 토큰의 정보는 작아지면서 기울기 소실 문제도 발생했다. 하지만 Transformer는 self attention을 통해서 하나의 시퀀스 안에 있는 다른 위치의 모든 토큰들을 한번에 보기 때문에 연산량을 상수($O(1)$ 복잡도)로 줄일 수 있었다. 추후에 서술될 Multi-Head Attention으로 인해 연산이 조금 늘어나지만, 연산량이 상수이기 때문에 기존에 존재하던 모델들보다 더욱 효율적임을 알 수 있다.
3. Model Architecture
트랜스포머의 전체적인 아키텍쳐는 다음과 같은 구조를 가진다.
3.1 Encoder and Decoder Stacks
전체적인 구조에서 왼쪽은 Encoder에 해당하고 오른쪽은 Decoder에 해당한다. Encoder와 Decoder 모두 $N = 6$개의 동일한 layer들이 쌓아져 있는 구조이다.
Encoder의 각 layer는 2개의 sub-layer, Multi-Head Attention과 Feed Forward를 가지고 있다. sub-layer마다 residual connection과 layer normalization을 진행하는데, residual connection을 가능하게 하기 위해서 모든 layer의 input과 output의 차원은 $d_{model} = 512$으로 고정한다.
Decoder는 하나의 layer에 총 3개의 sub-layer가 있다. Encoder에 존재하는 Multi-Head Attention과 Feed Forward 2개의 sub-layer에다가 Masked Multi-Head Attention을 추가한다. 마스킹이 필요한 이유는 i번째 위치에서 예측을 할 때, i 이상의 output들은 참고하지 않게 하기 위해서이다. i 이전의 값들만을 바탕으로 i번째 위치에서 예측을 하지 않으면 이미 정해진 답지를 보고 예측을 하는 것이므로 의미가 없어지기 때문이다.
3.2 Attention
Attention 기법은 Query와 Key-Value 쌍을 대응시키는 함수를 찾는 것이다. Key와 Value는 딕셔너리처럼 대응되어 있고, 각 Query마다 Key와의 유사도를 weight처럼 사용해서 가장 적합한 Value를 찾는 과정이다.
여러 개의 Key들이 화살표로 존재하고 각 화살표에 Value라는 값이 타고 있을 때, 주어진 하나의 Query 화살표가 가장 유사한 Key 화살표 하나를 선택하게 되면 저장되어 있는 Value 값을 불러온다고 생각할 수 있다. (실제로는 Query, Key, Value 모두 벡터임을 주의!)
3.2.1 Scaled Dot-Product Attention
Query 벡터와 Key 벡터의 유사도를 내적으로 구한 뒤에, $\sqrt{d_{k}}$로 나눈 값에 softmax 함수를 취해서 weight를 구한다(attention map). 각 weight는 Value에 곱해서 최종 결과 값을 만들어 낸다. $d_{k}$로 나누는 이유는, $d_{k}$가 커질 수록 내적 값이 너무 커져서 scaling 없이 바로 softmax 함수를 취하게 되면 gradient가 매우 작아지기 때문이다.
* $d_{k}$ = Query와 Key의 차원값
이 과정은 수식적으로는 다음과 같이 표현된다.
$$Attention(Q, K, V) = softmax(\frac{QK^{T}}{\sqrt{d_{k}}})V$$
각 벡터를 시각적으로 표현한 이미지는 다음과 같다.
3.2.2 Multi-Head Attention
Attention 함수를 $d_{model}$ 차원의 query, key, value에 한번 적용하는 것보다 query, key, value를 나눠서 h번 진행하는 것이 더 성능이 좋게 나오게 된다. 병렬적으로 Attention 값을 연산함으로써 각 head마다 다른 관점으로 정보를 바라보면서, 각 subspace마다 더 다양한 표현을 볼 수 있게 된다. Multi-Head로 얻어낸 값들은 합쳐짐으로써 최종 결과값을 얻어낸다.
해당 논문에서는 8개의 head를 사용해서 $d_{model} / h = 64$차원의 값에 대해서 연산을 한다.
3.2.3 Applications of Attention in our Model
- Transformer의 아키텍쳐를 자세히 보면 "encoder-decoder attention" layer에서의 Query는 이전 decoder에서 나온 것을 사용하고, Key와 Value는 Encoder에서 나온 결과를 사용한 것을 알 수 있다.
- Encoder의 self-attention layer에서 query, key, value는 모두 이전 layer의 output 값으로부터 만들어진다. (Self-Attention)
- Decoder의 self-attention layer에서도 query, key, value는 모두 이전 layer의 output 값으로부터 만들어진다. 하지만 Decoder의 경우, 순서에 대한 정보를 잃지 않기 위해서 현재 위치 이후에 있는 정보들은 모두 $-\infty$로 설정하여 마스킹을 수행한다.
3.3 Position-wise Feed-Forward Networks
2개의 sub-layer 외에도 각 layer에는 Fully Connected Feed-Forward Network가 붙어있다. 각 포지션들의 정보를 모두 연결하며, ReLU 활성화 함수를 사용한다. input과 output이 $d_{model} = 512$이고, inner-layer는 $d_{f f} = 2048$인 kernel 크기가 1인 두개의 CNN으로도 이해할 수 있다.
3.4 Embeddings and Softmax
embedding을 통해 $d_{model}$에 맞게 padding이 추가된 토큰들을 벡터로 표현을 할 수 있다. Softmax 함수를 통해서는 decoder의 output을 다음 토큰의 예측 값으로 바꿀 수 있다.
3.5 Positional Encoding
Transformer는 모델 특징 상 CNN이나 RNN과 달리 토큰의 순서에 제약을 받지 않기 때문에, 오히려 순서 정보를 포함해주어야 실제 시퀀스의 토큰들에 대해서 더 정확한 작업을 수행할 수 있다. 위치 정보는 상대적인 위치이거나 절대적인 위치일 수 있으며, encoder와 decoder 스택 밑에 넣어줘야 하기 때문에 차원도 $d_{model} = 512$로 맞춰줘야 한다.
positional encoding을 위해서 다음과 같이 sine, cosine 함수를 사용한다.
$$P E_{(pos,2i)} = sin(pos/10000^{2i/d_{model}})$$
$$P E_{(pos,2i+1)} = cos(pos/10000^{2i/d_{model}})$$
* $pos$ = 포지션
** $i$ = 차원 값
4. Why Self-Attention
Self-Attention을 사용하는 것에는 크게 3가지의 장점이 있다.
1) Layer마다 연산 복잡도를 크게 감소 가능
2) 병렬적(parallel)으로 연산 가능
3) 멀리 떨어져 있는 토큰들 간의 관계도 더 효율적으로 잡아낼 수 있음
- 긴 시퀀스를 다룰 때 정확도를 위해서 볼 수 있는 neighborhood size를 r로 제한하게 되면, 모든 데이터를 보기 위한 step 수는 $O(n / r)$로 증가한다.
- input과 output을 모두 연결해야 할 때, CNN보다 더 복잡도가 낮다. 복잡도를 낮추기 위해 시도한 separable CNN과 비교했을 때야 Transformer 모델과 복잡도가 동일해진다.
+ 여러 개의 attention head를 가지고 있기 때문에 모델이 특정 부분에 대해서 어떻게 행동했는지 더 자세하게 알 수 있다.
5. Training
표준 WMT 2014 영어-독일어와 영어-프랑스어 데이터셋을 사용해서 학습되었다.
정규화를 위해서는 드롭아웃(base 모델은 $P_{drop} = 0.1$ 사용)과 라벨 스무딩($\epsilon_{l s} = 0.1$ 사용) 두가지 기법을 사용했다. 기존 SOTA 모델들보다 BLEU 점수가 더 높게 측정된 것을 확인할 수 있다.
* BLEU (Bilingual Evaluation Understudy) : 기계 번역된 텍스트의 품질을 평가하는 알고리즘
(드롭아웃과 라벨 스무딩에 대한 내용은 다음 글들을 참고)
6. Results
Machine Translation(기계 번역)과 English Constituency Parsing(영어 구문 분석)에서 뛰어난 성능을 보여줬다.
Model Variation 부분에서는 모델을 여러가지 방법으로 변형하면서 성능의 변화를 주는 요인을 분석했다. Attention Head는 일정 부분 증가시킬수록 성능이 좋아졌지만, 너무 많은 Head를 사용하면 차원이 너무 많이 쪼개져서 성능이 저하되었다. Attention key size $d_{k}$를 줄이면 성능이 저하되었다. 모델의 크기가 크면 클수록 성능은 좋아졌고, 드롭아웃의 유무도 성능에서의 차이를 보여줬다.
7. Conclusion
Transformer 모델은 처음으로 Self-Attention 기법만을 사용한 sequence transduction 모델로, 기존의 recurrent layer를 모두 Multi-Head Attention으로 대체했다. 번역 Task에 대해서 SOTA 모델에 도달하였고, 이미지나 영상과 같이 큰 input과 output에 대해서도 많이 활용되고 있다.
논문 링크:
Attention Is All You Need