본문 바로가기
Deep Learning/논문정리

Attention Is All You Need, NIPS 2017 - Transformer 논문 리뷰

by 대소기 2022. 4. 3.

 

* Attention is all you need 논문을 개인적으로 정리해봤습니다.

* 중요 내용만을 뽑아 기술했으므로 원문의 의도가 본의아니게 왜곡됐을 수도 있습니다. 만약 틀린 부분이 있다면 댓글로 알려주세요.

 

1. Introduction

 

기존의 연구

* RNN, LSTM, GRU 등은 language modeling, 기계번역 등에서 많은 성과를 이뤄냈다.

* 하지만 이러한 Recurrent model은 time에 따라 hidden state를 생성하며 이 때 이전 timestep의 hidden state와 현재 timestep의 input을 활용하기 때문에 문제가 발생한다. 하지만 이러한 sequential한 모델은 큰 문제점이 있다. 이는 아래와 같다.

   문제 1) 훈련 example들을 병렬화하여 처리할 수 없음.

   문제 2) 문제 1번으로 인해 더 긴 sequence를 처리하기 어려워진다. 사용하는 메모리는 한정되어 있기 때문에 batch를 늘리는 것도 한     계가 있기 때문이다.

* 이를 해결하기 위해 다음과 같은 노력들이 있었다.

   1) Factorization trick을 통한 컴퓨팅 효율 향상

   2) conditional computation

* 그럼에도 불구하고 sequential computation의 본질적인 문제는 해결하지 못했다.

 

Attention

* attention machanism은 기존의 sequential model에서 나타난 문제점을 해결했다. 

* attention은 input, output sequence간의 거리와 관계없이 dependency들을 모델링할 수 있다. 즉, input sequence에 들어있는 단어 혹은 문자들간의 의존관계를 시간의 흐름에 따라 모델링하지 않고도 모델링 가능하게 된 것이다.

 

 

본 논문에서 제시하는 모델 - Transformer

* 하지만 attention 출연 이후에도 기존의 recurrent network(RNN계열 모델)와 함께 사용하는 사례들이 종종 있었다. 이러한 사례들은 여전히 reccurent model의 근본적인 제약(fundamental contraint)을 벗어나지 못한다.

* 본 논문에서 제시하는 Transformer는 attention 만 사용하여 input과 output의 dependency를 모델링한다. attention만 사용하기 때문에 더 많은 병렬 처리가 가능했고, 다음과 같은 성과를 이뤄냈다.

    1) SOTA

    2) 더욱 짧은 훈련 시간 - P100 GPU 8개를 이용해 12시간만에 훈련 완료.

 

 

 

2. Background

* sequential computation을 최소화하기 위한 모델로는 Extended  Neural GPU, ByteNet, ConvS2S 등이 있다. 

 

 

 

3. Model Architecture

 

* 대부분의 성능 좋은 neural sequence transduction model들은 encoder-decoder 구조를 포함하고 있다.

 

https://soki.tistory.com/55

 

17.1 효율적인 데이터 표현

AutoEncoder introduction * 위 두 개의 sequence를 완벽하게 외워야 된다고 생각해보자. 얼핏 보기엔 첫 번째 sequence가 더 짧기 때문에 더 외우기 쉬울 것으로 보인다. 하지만 자세히 들여다보면, 두 번째 s

soki.tistory.com

* 위 포스팅에 autoencoder에 대해 아주 간략하게 정리해 놓았으니 참고 바란다.

* encoder-decoder 구조는 이전의 출력을 다시 다음 시점의 입력으로 사용하는 AR(Auto-Regressive) 모델이다.

* Transformer는 이러한 encoder-decoder 구조로 이뤄져 있으며, encoder, decoder에 해당하는 각 구조는 self-attention과 FC layer를 쌓아올린 구조를 띤다. 

 

 

3.1 Encoder and Decoder Stacks

3.1.1 Encoder

 

* encoder는 6개의 동일한 layer들로 구성되어 있다.

* 각 layer들은 2개의 sublayer(multi-head self-attention, position-wise FFNN)로 구성된다.

* 두 개의 sub-layer들에는 residual connection이 사용되었고, 그 뒤엔 normalization layer가 존재한다. 즉, input이 x라고 했을 때  각 sublayer는 residual connection에 의해 output이 LayerNorm(x + Sublayer(x)) 가 된다(Sublayer(x)는 input x가 sublayer를 통과한 후의 output을 뜻한다).

* residual connection을 사용하기 위해서는 input과 sublayer를 통과한 output의 크기, embedding layer의 output를 맞춰줘야 한다. 그래야 matrix끼리 더할 수 있게 된다. 논문에서는 $d_{model} = 512$ 로 사용했다.

 

3.1.2 Decoder

 

* decoder도 역시 6개의 동일한 layer들로 구성되어 있다.

* decoder는 기본적으로 encoder의 구조와 흡사하지만, encoder의 출력을 입력으로 사용하는 multi-head attention layer가 존재한다는 점이 encoder와의 차이점이다. 

* 또 한가지 차이점으로는, decoder의 self-attention sublayer는 position i에서의 예측에 대해 i보다 작은 output에 대해서만 참고할 수 있도록 masking을 한다는 점이다. 이를 Masked multi-head attention이라고 한다.

* residual connection과 layer normalization은 동일하다. 

 

3.2 Attention

 

3.2.1 Scaled Dot-Product Attention

* 위 그림에서 볼 수 있다시피, Multi-Head Attention은 여러개의 scaled dot-product attention을 concat(병합)하는 과정을 거친다.

* scaled dot-product attention의 input은 $d_k$ 차원의 query, key 벡터들과 $d_v$ 차원의 value 벡터들로 이뤄져있다. 위 그림에서는 각 벡터들을 Q, K, V로 표현하였다.

* 개괄적으로 보자면 scaled dot-product attention은 아래와 같이 계산된다.

* query는 모든 key vector들(query를 제외한 단어 벡터들에서 추출한 key vector들)과 곱해지고, 각각 $\sqrt{d_k}$ 로 나눠진 다음 softmax를 통해 0~1사이의 값으로 정규화된다.

* 이 과정은 실제로 행렬 연산을 통해 일괄적으로 이뤄진다. query vector들을 Q로, key vector들을 K로, value vector들을 V로 묶어 한 번에 행렬 계산을 통해 Attention을 계산한다. 이를 표현한 식이 위 Attention(Q,K,V) 식이다.

* attention을 계산하는 방법은 위와 같은 dot-product 방식(논문에서 제시한 scaled dot-product와 비교했을 때 scaling과정이 생략되어 있다) 외에도 additive 방식이 있다. additive 방식은 compatibility function을 1개의 hidden layer로 구성된 FFNN을 통해 계산하게 된다. 이론적으로 두 방식 사이의 complexity는 비슷하지만, 프로그램 언어를 사용해 계산할 때는 matrix 곱이 매우 최적화되어 구혀돼있기 때문에 실제 속도는 dot-product 방식이 더 빠르다.

* 반면 scaling factor $\sqrt{d_k}$가 작을 때는 dot-product방식과 additive 방식 둘 다 비슷한 성능을 보였지만, 값이 클 때는 dot-product의 성능이 더 떨어졌다. 연구진들은 이 이유를 dot-product 방식에서는 차원이 큰 input vector들을 사용했을 때 dot product의 값이 커져서 softmax function 값이 gradient가 매우 작은 부분으로 수렴하게 만들기 때문이라고 추측했다. 어쨌든 이를 방지하기 위해 우리는 scaling factor를 사용한다. 더 자세한 내용은 아래 링크에 잘 정리되어 있다. 

 

https://towardsdatascience.com/transformer-networks-a-mathematical-explanation-why-scaling-the-dot-products-leads-to-more-stable-414f87391500

 

Transformer Networks: A mathematical explanation why scaling the dot products leads to more stable…

How a small detail can make a huge difference

towardsdatascience.com

 

 

3.2.2 Multi-Head Attention

 

* 3.1.1의 multi-head attention 그림에서 우리는 이미 scaled dot product attention 여러개를 활용할 것이라는 것을 보았다. 이에 대해 더 자세히 살펴보자.

* $d_{model}$ 차원의 key, value, query 벡터들은 h번의 linear projection을 통해 각각 학습가능한 $d_k, d_v, d_k$ 차원의 벡터들로 변환(같은 key, value query여도 각 projection마다 값이 다 다르다)해서 각 벡터들을 병렬로 처리하고, 각 $d_v$ 차원의 output들을 concat해서 다시 linear projection을 거치게 된다.

* 이렇게 처리하는 것이 큰 차원의 벡터로 scaled dot product attention을 한 번 시행하는 것 보다 효율적이다.

* multi-head attention을 통해 모델은 각기 다른 위치의 다른 representation subspace에서 정보를 결합적으로 사용할 수 있다. 쉽게 설명하면 각기 다른 관점에서 얻은 정보들을 모두 활용할 수 있게 된다.

* 단일 attention을 사용하게 되면 averaging 때문에 이러한 결합적인 정보 사용이 제한된다. 해석해보자면, 각 정보들을 개별 정보로서 활용하는 것이 아니라, 평균을 내어 사용하기 때문에 결합적으로 정보를 사용할 수 없다고 논문에서는 설명하는 것 같다.

 

* Multi-head attention을 수식으로 표현하면 아래와 같다.

* projection에 사용되는 가중치 matrix들은 아래와 같은 차원을 띤다.

* 논문에서는 head 개수를 8개로 설정하였고 각 벡터 $d_{k} = d{v}$들은 64차원으로 설정하였다.

* multi-head attention을 사용했을 때의 계산 속도는 단일 head attention을 사용했을 때의 계산 속도와 비슷했다. 어짜피 각 head의 input vector들의 차원이 줄어들었기 때문이다.

 

 

3.2.3 Application of Attention in our Model

* transformer는 3가지 다른 multi-head attention을 사용한다.

 

1) encoder-decoder attention layer

* decoder의 sublayer 중 두 번째 multi-head attention layer에서는 query를 제외한 key, value vector는 encoder의 output을 사용한다. 이를 통해 decoder의 모든 position에서 input sequence의 모든 위치의 input들을 참고할 수 있게 된다. 이 구조는 전형적인 encoder-decoder attention을 모방한 구조이다.

 

2) encoder의 self-attention layer

* encoder의 sublayer 중 self-attention layer는 첫 번째 sublayer의 경우 단어 embedding을 input으로, 나머지 상위 sublayer들은 이전 sublayer의 출력을 input으로 받고, 이 input으로부터 key, value, query 벡터들을 뽑아내어 사용한다.

 

3) decoder의 self-attention layer

* decoder의 sublayer 중 첫 번째 sublayer인 self-attention layer에서는 decoder의 각 예측 position i가 자기 자신을 포함 이전의 정보들을 참고할 수 있다. 다만, 왼쪽방향의 정보흐름(position i 이후의 정보들)을 참고하는 것은 막아야 하는데, 이는 AR(auto-regressive) 즉, 자기 자신의 예측값들을 활용해 다음 예측값을 산출해내는 모델의 특성을 보존하기 위함이다. 더 쉽게 설명하자면 position i 이후의 정보들을 참고하게 되면, 예측해야 할 값들을 미리 cheating하는 것과 같으므로 막아야 한다는 것이라고 할 수 있을 것 같다. 이와 같은 self-attention 방식을 masked self-attention이라고 명명하였고, 논문에서는 scaled dot product 과정에서 masking value를 $- \infty$로 설정하였다. 이를 통해 softmax에 들어간 $-\infty$ 에 가까운 값들이 모두 0에 매우 가까운 값으로 나타내지기 때문에 무시할 수 있어진다.

 

 

 

3.3 Position-wise Feed-Forward Networks

* input x, 다시 말해 Multi-head attention의 output은 위 식과 같이 두 번의 linear transformation을 거친다.

* activation function은 ReLU를 사용하고, input size, output size는 $d_{model} = 512$, hidden size는 2048이다.

* 이 FFN의 가중치는 각 layer(1st, 2nd, 3rd, ... , 6th layer)마다 다르게 학습된다.

 

 

3.4 Embeddings and Softmax

* embedding의 차원은 $d_{model}$과 동일하다.

* embedding layer의 가중치와 softmax layer전에 있는 linear transformation layer의 가중치를 공유한다.

* embedding layer에서는 다만 이 가중치를 $\sqrt{d_{model}}$로 나누어 사용한다.

 

 

3.5 Positional Encoding

* model에서 recurrence나 convolution을 사용하지 않기 때문에 sequence가 모델에 입력될 때 각 단어들의 순서를 알려줄 수 있는 수단이 필요하다. 이를 psoitional encoding방식으로 구현하였다.

* $d_{model}$ 차원의 벡터를 사용하기 때문에 embedding에 더할 수 있고, 더한 값을 input으로서 multi-head attention layer에 집어넣는다.

* 위 식은 positional encoding 식이다. 

https://wikidocs.net/31379

* pos는 embedding vector의 position을 나타내며, i는 차원의 index를 나타낸다.

* 위 식을 통해 짝수 index는 sin함수, 홀수 index는 cosine함수 값을 사용하여 위치를 나타낸다.

* $2 \pi ~10000* \2pi$ 까지의 geometric progression으로 각 위치가 표현된다.

* 이러한 positional encoding 방식을 사용함으로서 어떤 offset k라도 $PE_{pos+k}$의 linear function으로 나타낼 수 있기 때문에 논문에서는 이러한 방식을 사용하였다.

* positional encoding 방식 외에도 positional embedding 방식도 연구자들은 사용해 보았는데, 성능은 비슷하나 훈련에서 사용했던 것 보다 더 긴 sequence에 대한 추론에 있어서는 positional encoding 방식이 더 효율적이기 때문에 positional encoding 방식을 채택하게 되었다.

 

4. Why Self-Attention

* 가변길이 시퀀스(variable-length sequence)를 d차원의 고정길이 시퀀스(equal-length sequence)로 변환하는 방법으로는 기존에도 recurrent, convolutional layer 등의 방법이 있었다.

* 하지만 이 논문에서 self-attention을 사용한 이유는 다음 3가지이다.

1) layer의 계산 복잡도

* complexity per Layer를 보면 일단 convolution이 가장 복잡도가 높다. 또한 self-attention이 recurrent보다 복잡도가 낮다. n은 seuqence length이고 d는 representation의 차원인데 word-piece, byte-pair등의 당시 sota였던 모델들을 참고했을 때 n이 d보다 더 작았기 때문이다.

* self-attention의 restricted version은 긴 sequence를 처리할 때 복잡도를 낮추기 위해 해당 position의 r-neighborhood만 고려하는 방법을 사용했는데, 이 대 maximum path length가 n/r로 증가하였다. 때문에 restricted version을 사용하지는 않은 것 같다.

 

2) 병렬화 가능한 계산량

* 병렬화 가능한 계산량은 필요한 최소한의 sequential operation에 의해 측정된다.

* sequential operation은 self-attention, convolution이 가장 낮았다.

 

3) 긴 길이의 dependency 학습 용이성

* 아주 긴 길이의 seuqence에 대한 dependency를 학습하는 것은 매우 어렵다.

* 얼마나 긴 길이의 seuqence를 학습하기 용이한지는 forward, backward signal들이 network를 가로지르는 경로의 길이에 따라 결정된다.

* self-attention이 가장 maximum path length가 낮았다.

 

4) 부수적인 이익

* self-attention을 사용했을 때 multi-head attention의 각 head들이 어느 부분에 집중하고 있는지를 시각화 할 수 있다는 장점도 있다.

 

 

 

5. Traning

 

5.1 training Data anda Baching

 

* WMT 2014 English-German dataset  - 4.5 million sentence pairs

* byte-pair encoding 사용

* WMT 2014 English-French dataset - 36 million sentences

* sentence pair들은 근사한 sequence 길이로 batched

* 각 training마다 batch는 25000개의 source token과 25000개의 target token로 이뤄진 sentence pair로 구성됨.

 

5.2 Hardware and Schedule

* 8개의 NVIDIA P100 GPU

* Base model(논문에서 설명한) - 각 training step은 0.4초 소요, 100,000 step을 12시간동안 학습.

* Big model - 각 training step은 1초 소요, 300,000 step을 3.5일동안 학습.

 

5.3 Optimizer

* Adam 사용, hyperparameter : $\beta_1 = 0.9, \beta_2 = 0.98, \epsilon = 10^{-9}$

* learning rate는 위와 같이 train이 진행됨에 따라 변화한다.

* warmup_steps에서는 learning rate가 선형적으로 증가하고, 이후에는 step number의 square root, 즉 위 식에서 $step_num^{-0.5}$ 만큼 감소한다.

* 논문에서는 warmup_steps를 4000으로 잡았다.

 

 

5.4 Regularization

* 3가지 regularization 기법을 사용하였다.

 

1) Residual Dropout

* sublayer의 output에 residual connection 및 normalization 과정에 들어가기 이전 dropout을 실시하였다.

* encoder, decoder의 embedding들의 sum과 positional encoding의 sum에도 dropout을 실시하였다.

* base model에서 dropout은 $P_{drop} = 0.1$ 로 설정하였다.

* transformer의 BLEU score는 아래와 같이 측정되었다.

 

https://wikidocs.net/31695

 

3) BLEU Score(Bilingual Evaluation Understudy Score)

앞서 언어 모델(Language Model)의 성능 측정을 위한 평가 방법으로 펄플렉서티(perplexity, PPL)를 소개한 바 있습니다. 기계 번역기에도 PPL을 평가 ...

wikidocs.net

* BLEU score에 대한 자세한 설명은 위에 나와있다.

 

2) label smoothing

https://data-newbie.tistory.com/370

 

What is Label Smoothing? - 리뷰 (Overconfidence)

Lable Smoothing - Neural Netowork 모델 덜 과신하게 만드는 기술 딥러닝 문제로 분류 문제에 사용할 때, 보통 다음과 같은 문제에 직면하게 된다. ( Overfitting, overconfidence )  Overfitting은 많이 연구..

data-newbie.tistory.com

* training 동안, label smoothing을 시행했다.

* $\epsilon_{ls} = 0.1$

* label smoothing은 perplexity를 감소시켰지만, 정확도와 BLUE score는 개선하였다.

 

 

6. Results

 

6.1 Machine Translation

* EN-FR task에서 Transformer Big model은 $P_{drop} = 0.1$로 설정.

* base model : 마지막 5개의 checkpoint들을 평균한 model

* Big model : 마지막 20개의 checkpoint들을 평균한 model

* beam search를 사용했으며, beam size는 4, length penalty $alpha = 0.6$으로 설정했다.

 

 

6.2 Model Variations

 

 

7. Conclusion

* Translation task : recurrent, convolution보다 더 빠르게 학습 가능. sota 달성

 

 

 

참고자료

https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf

 

https://velog.io/@changdaeoh/Transformer-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0

 

Transformer 논문리뷰 (Attention Is All You Need, NIPS 2017)

본 논문 Attention Is All You Need의 Training과 Result를 제외한 나머지 부분을 모두 정리(번역..?)했습니다.오류 지적이나 질문 너무너무 환영입니다 :)

velog.io

https://kubig-2021-2.tistory.com/55

 

[NLP 스터디] Attention Is All You Need 논문 리뷰

딥러닝 기반 모델 발전 최신 고성능 모델들은 Transformer 아키텍처를 기반으로 하고 있다. GPT : Transformer의 디코더(Decoder) 활용 BERT : Transformer의 인코더(Encoder) 활용 0. Abstract 이전까지는..

kubig-2021-2.tistory.com