Attention Is All You Need
Ashish Vaswani et al., 2017
논문: https://arxiv.org/abs/1706.03762
Github : https://github.com/jadore801120/attention-is-all-you-need-pytorch
※혹시나 포스팅에 문제가 있을 시 댓글 남겨주세요!
Introduction
논문이 쓰일 당시에 sequence transduction model에서는 encoder-decoder 구조를 포함한 RNN 혹은 CNN 기반 모델이 대세였다고 한다. 또한 input과 output 사이의 거리에 관계없이 서로를 참조하여 중요한 가중치에 더 집중(attention)하고 그렇지 않은 가중치는 낮추어 re-weigting 해주는 attention mechanism으로 encoder와 decoder를 연결한 network도 많이 쓰였다고 한다.
하지만 input과 output 간 거리에 상관없이 모든 위치의 데이터를 참조하여 학습에 더 중요한 가중치에 집중하는 attention module의 철학을 고려해보면, 아래 그림처럼 sequential 하게 데이터를 처리하는 RNN 기반 모델(RNN, LSTM, GRU,...)은 parallel 하게 훈련이 불가능하여 데이터 크기가 커지게 되면 메모리에 제약이 생기는 등의 약점을 보인다.
이러한 sequentual computation을 줄이려는 시도로써, CNN을 활용하여 parallel 하게 hidden representations를 학습하려고 했다고 한다. 하지만 input과 output의 거리가 증가함에 따라 필요한 연산량도 증가하여 학습을 어렵게 만든다고 한다.
따라서 본 논문에서는 attention에만 기반을 두어 input과 output의 representation을 학습하는 transformer라는 새로운 네트워크 아키텍처를 제시한다. machine translation task의 성능도 좋고 더 많이 parallelizable 해서 학습 시간도 감소했다고 한다.
Model Architecture
[Encoder-Decoder]
모델은 기본적 encoder-decoder 구조를 따르고 있다. 왼쪽이 encoder, 오른쪽이 decoder에 해당한다. 아래쪽의 input embedding과 output embedding은 각각 input tokens와 output tokens는 sequence of symbol representations x, y로 변환시켜준다. encoder는 input sequence x를 sequence of continuous representations z로 매핑시켜준다. decoder는 z를 이용하여 output sequence y를 생성하게 된다.
Encoder는 6개의 동일한 layer로 구성된다. 각 layer는 두 개의 sub-layer로 구성되는데, 첫 번째는 multi-head self-attention이며 두 번째는 position-wise fully connected feed-forward network이다. 또한 각 sub-layer에 대하여 residual connection을
더해주고 후에 layer normalization을 적용한다.
Decoder 역시 6개의 동일한 layer로 구성된다. 각 layer는 세 개의 sub-layer로 구성되는데, encoder에서 self-attention과 feed-forward 사이에 cross-attention module이 추가되었다. 또한 decoder는 encoder와 달리 sequential 한 결과를 생성하기 때문에 self-attention module에서 이전의 output 값에만 의존해서 다음 output을 예측하도록 수정하였다. 자세한 내용은 뒤에서 차차 살펴보자.
[Positional Encoding]
Embedding 이후에는 positional encoding이란 걸 추가적으로 해준다. 본 네트워크는 recurrence / convolution 연산을 전혀 하지 않기 때문에 sequence 내의 순서 정보를 사용하기 위해서는 각 token의 위치에 대한 정보를 네트워크에 같이 넣어줘야 한다. 다른 transformer 모델에서는 position을 학습하는 논문도 본 기억이 있는데, 여기서는 사인 함수와 코사인 함수를 이용하여 token의 상대적인 위치를 encoding 한다.
여기서 pos는 sequence내에서 단어의 위치를, i는 dimension을 의미한다. PEpos와 고정된 offset k가 주어졌을 때 PE(pos+k)는 삼각함수 법칙에 의해 PEpos의 linear function으로 표현될 수 있기 때문에 모델이 상대적인 위치로부터 수월하게 학습을 진행할 수 있다는 가정 하게 sinusoid 함수를 positional encoding에 사용했다고 한다.
Attention
[Scaled Dot-Product Attention]
Attention function 자체는 query가 주어졌을 때, 학습에 가장 중요한 정보에는 집중(attention)하고, 그렇지 않은 정보에는 덜 집중하도록 하여 모델이 해당 task를 더 잘 수행하도록 하는 것이 목적이다. 예를 들어, 영어를 한글로 번역시켜주는 모델을 학습시킨다고 하자. 이때 Query로 chocolate이 들어왔고, Key = (초코, 딸기, 바나나)가 있었다고 하자. Value는 이전의 가중치 값으로 (0.33, 0.33, 0.33)로 설정했다고 하자. 이전까지의 모델의 학습 결과 chocolate이란 영어단어는 초코라는 한글 단어와 비슷한 유사도를 가졌었다. 이때 유사도를 판단하는 기준으로는 내적을 이용한 cosine similarity를 사용한다. Query와 Key를 내적해서 0부터 1 사이의 값을 반환하는 softmax함수를 취했더니 그 결과로 (0.90, 0.05, 0.05)가 나왔다. 이를 원래의 Value와 내적 해주면 새로운 가중치 (0.30, 0.02, 0.02)가 나온다. 즉, 이전에는 (초코, 딸기, 바나나)를 동일한 중요도로 학습시켰었는데, chocolate이란 단어가 들어왔을 때 초코라는 단어에 더 많은 가중치를 주어 학습시키게 된다. 이 과정이 아래의 식에 녹아들어 있다.
여기서 Query와 Key의 dimension의 제곱근으로 나눠주는 연산을 추가하는데, 이는 아래 그림과 같이 softmax 함수의 값이 너무 커지게 되면 gradient가 거의 0에 수렴하기 때문에 이를 방지하기 위함이다. 또한, 앞에서 decoder의 self-attention에서 이전의 output 값에만 의존해서 다음 output을 예측하도록 했다고 언급했는데, i번째 position에 대한 attention을 계산할 때 i+1번째 이후의 값은 softmax function의 input을 -∞로 설정하여 gradient=0으로 만드는 mask를 적용해서 i번째 position에 영향을 주지 못하게 했다.
[Multi-Head Attention]
앞서 살펴본 Scaled Dot-Product Attention을 하나만 사용하는 대신 query, key, value를 h개의 head에 독립적으로 projection 시켜서 학습시켰고, 이를 나중에 합쳐주는 방식을 사용하였다(본 논문에서는 h = 8).
Position-wise Feed-Forward Networks
encoder, decoder 각각의 마지막 단에는 fully connected feed-forward network를 추가하였다. 두 개의 linear transformation 사이에는 relu function을 추가하여 모델의 non-linearity를 증가시켰다.
Experimental Results
Self-attention을 쓰게 되면 다음과 같은 장점이 있으며 아래의 표로 요약할 수 있다. 표에서 restricted는 input sequence의 주변 r개의 이웃만 참조하도록 제한한 self-attention module에 해당한다.
1) total computational per layer
2) amount of computation that can be parallelized
3) path length between long-range dependencies(짧을수록 좋음)
아래 표에서는 다른 모델에 비해 적은 training cost로도 더 나은 성능을 보이고 있음을 알 수 있다. 여기서 BLEU는 BiLingual Evaluation Understudy의 약자로 machine translation의 성능 지표로 쓰이며 값이 클수록 성능이 좋다.