아이공의 AI 공부 도전기

[논문 Summary] 2017 NIPS (Transformer) "Attention is all you need" (Transformer) Summary

 

     

1. 동기

근래 Vision 관련 Top 학회에서 transformer와 결합된 많은 논문들이 각광을 받고 있습니다. 저 역시 attention에 관심을 기울이며 공부를 해왔습니다만 정확하게 transformer에 대해 논문을 읽고 다지는 시간이 필요하다 생각되어 이 논문을 summary 하게 되었습니다. 물론 NLP에서도 BERT, GPT 역시 이를 활용하는 것은 두말할 나위 없이 중요하기 때문에 배울 가치는 충분합니다.

 

그럼 이제 NLP에서 처음 사용된 Transformer의 논문 "Attention is all you need"에 대해 Summary하도록 하겠습니다.

 

우선 Baseline은 논문을 기반으로 설명되며 필요에 따라 각 사이트들을 참조하여 구성하였습니다. 자세한 내용은 Reference를 참조하시길 바랍니다. 물론 저보다 잘 설명된 곳이 많기 때문에 다양하게 많은 곳들을 참조하셔서 읽기 바랍니다.

 

"Attention is all you need" - 2017 NIPS  - 2021년 8월 29일 기준 26042회의 citations

 

https://papers.nips.cc/paper/2017/hash/3f5ee243547dee91fbd053c1c4a845aa-Abstract.html

 

Attention is All you Need

Attention is All you Need Part of Advances in Neural Information Processing Systems 30 (NIPS 2017) Authors Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin Abstract The dominant seque

papers.nips.cc

 

2. Transformer Overview

 

Transformer 논문 Figure 1

 

2-1) Overview

Transformer의 구조는 위 구조가 전부라고 보시면 됩니다. 빨간색으로 된 Encoder가 존재하고 그 output이 Decoder의 attention module 한 부분으로 들어간다. 다만 모듈들 간 특징들이 존재하는데 그 부분들을 자세히 살펴야 하는 것이 문제일 뿐입니다.

 

제가 생각하기에 Transformer가 다른 NLP 특성과 다른 3가지를 뽑으라면 다음과 같습니다.

1) Positional Encoding

2) Multi-Head Attention

3) Encoder-Decoder 구조 with Parallelization(병렬화)

 

물론 그 외에 Feed Forward Neural Network(FFNN, 논문에서는 Position-wise Feed-Forward Networks라고 표현), layer normalization, residual connection 등이 있습니다만 위에 3개보다는 덜 중요하다고 판단됩니다. (물론 뒤에서 다룰 예정)

 

다시 본론으로 돌아와 위 특성들에 대해 하나씩 살펴보며 내용을 정리하겠습니다.

 

그러나 그 전에 기존의 방식들이 어떻게 발전되어 왔는지 먼저 살펴보도록 하겠습니다.

 

2-2) 기존 방식들

 

dProgrammer lopez

 

위 이미지는 공부를 해온 사람이라면 딱 봐도 아 이놈이었지 하는 느낌이 팍! 드실 것입니다. 많은 곳들에서 활용하는 쉬운 구조적 그림이기 때문이죠. RNN, LSTM, GRU 모두 순차적인 계산을 처리하는 방법들로 잘 작동하였습니다. 그러나 Input의 길이가 길어질수록 gradient가 작아지는 문제가 생겼고 이에 따라 중요도 반영이 어려운 상황이 만들어졌습니다. 조금 어려운 말로 Long-term dependency, gradient vanishing / exploding problem. 물론 LSTM 자체가 RNN의 위 문제들을 해결하기 위해 나왔고 GRU 또한 이 문제를 해결하기 위해 더 진화된 방식으로 나왔지만 아직 문제가 해결된 것은 아니었죠. 조금 개선될 뿐

 

이때 등장한 것이 Encoder-Decoder 구조입니다. 

이를 토대로 우리는 더 깊게 쌓아 더 복잡하고 더 큰 데이터 처리가 가능했습니다.

 

https://wikidocs.net/24996

 

"Sequence-to-Sequence" - NIPS 2014 - 2021년 8월 29일 기준 15928회의 citations

https://papers.nips.cc/paper/2014/file/a14ac55a4f27472c5d894ec1c3c743d2-Paper.pdf

그러나 고정된 Input 크기에 벡터의 정보를 넣으려는 것으로 인한 손실 또한 문제로 보이죠.

 

이후에 나온 것이 바로 Attention. 

https://wikidocs.net/22893

입력 시퀀스가 길어지면 정확도가 떨어지는 것을 보정하고 연관 있는 단어에 가중치를 더 주는 attention이 효과를 보기 시작합니다. 그러나 여기에서도 병렬 처리는 불가능합니다. (계산이 늘고, 연산 시간도 향상)

attention 결과 (출처는 까먹음....)

 

여기서 등장한 것이 짜잔! 

 

Transformer입니다.

 

Recurrent 또는 CNN을 사용하지 않고 오로지 attention만을 여러번의 반복하여 encoder, decoder를 구현하였고 이를 통해 뛰어난 성능을 보였던 것입니다. 뿐 아니라 병렬 처리함으로써 많은 메모리 절약은 물론 속도 또한 빠르게 설정할 수 있습니다.

 

https://jalammar.github.io/illustrated-transformer/

 

Encoder가 여러개 쌓이고 그 output이 각 Decoder에 들어가는 방향을 생각하시면 됩니다. 논문에서는 Encoder와 Decoder의 layer 개수를 6개씩으로 설정하였습니다.

 

이제 요소요소 하나씩 살펴보겠습니다.

 

3. Positional Encoding

 

논문에서도 Multi-head attention을 먼저 설명하고 다른 곳들 또한 그렇게 설명하지만 저는 그냥 입력 순서대로 설명하기 위해 Positional Encoding부터 설명하겠습니다.

 

https://wikidocs.net/31379

Transformer는 RNN이나 CNN을 전혀 쓰지 않습니다. 즉, 위치 정보를 포함하고 있는 Embedding을 넣는 일반적인 input vector 혹은 matrix와 달리 우리는 attention만 쓰므로 단어의 위치 정보 자체가 없습니다. 즉, 위치 정보는 매우 중요하므로 우리는 input vector에 positional encoding을 통해 위치 정보를 넣어줘야 합니다. (논문에서는 3.5 Positional Encoding에서 설명) 

 

$$ Encoding\ Input\ =\ Input\ Embedding\ +\ Positional\ Encoding$$ 

논문 3.5 Equation

위 식을 통해 우리는 각 단어별 상대적 혹은 절대적 위치 정보를 줍니다. pos는 position을 의미하며 i는 dimension을 의미한다고 하지만 제가 생각하기에 i는 각 pos의 index를 의미한다고 봅니다. $d_{model}=512\$ 출력 차원을 의미합니다.

https://wikidocs.net/31379

논문 구절에서 설명하는 sin파형을 선택한 이유는 더 긴 sequence를 추론하는 것이 가능할 것이라 봤기 때문이라고 합니다. (주기를 보면 이해가 될 듯. 참고로 코드 짤 때 i 주의해야 할 듯, )

 

We chose the sinusoidal version because it may allow the model to extrapolate to sequence lengths longer than the ones encountered during training.
https://jalammar.github.io/illustrated-transformer/

official github : position_embedding 코드

https://github.com/tensorflow/models/blob/master/official/nlp/modeling/layers/position_embedding.py

 

GitHub - tensorflow/models: Models and examples built with TensorFlow

Models and examples built with TensorFlow. Contribute to tensorflow/models development by creating an account on GitHub.

github.com

4. Multi-Head Attention

맨 위 Figure 1의 그림을 잘 확인하면 Multi-Head Attention은 크게 3번 들어갑니다. 즉, 이 모델의 핵심이 바로 이곳에 집중되어 있다고 보시면 됩니다. 논문에서도 가장 많은 페이지를 통해 이를 설명하고자 하고 있습니다.

 

Multi-Head Attention을 한 문장으로 억지로 요약하면 다음과 같습니다. (물론 이것은 저의 생각...)

 

차원을 줄인 병렬화된 입력의 다중 Scaled Dot-Product Attention의 Concatenation

 

왜 제가 이렇게 생각했는지 Encoder에 대해 우선 살펴봅시다.

 

4-1) Encoding Multi-Head Attention

Self-Attention은 Attention이지만 Query, Key, Value가 모두 같은 input 즉, 자기 자신으로 구성된 것을 의미합니다. 

Query = Key = Value

원래라면 해당 input을 그대로 input으로 사용합니다만 여기서는 weight matrix를 곱해야 합니다.

 

논문에서는 위와 같은 그림으로 설명하고 있습니다. Q와 K가 Matmul 즉, 행렬 곱을 진행하고 Scale을 진행한 후 decoder에서 사용하는 mask냐에 따라 masking을 사용하고 이후 Softmax 그것을 다시 Value와 행렬 곱을 진행한 것을 Scaled Dot-Product Attention이라 설명하고 있습니다. Dot-Product는 보통 내적을 의미하며 벡터들 간 유사성을 구하기 위해 사용합니다. 잘 생각해보면 행렬 곱은 각 위치별 내적이라 보실 수 있습니다. 특히나 Self-Attention이라면 더더욱 이해하기 쉽죠. 가령 예를 들어 vector1 = [x1, x2, ... xn]이라면 이를 Q, K, V라고 가정하고 계산할 때 $x_1\ \cdot$ Vector 1은 $[x_1^2, x_1x_2, \cdots ,x_1x_n]$이 되고 이는 $x1$에 대한 각 위치별 유사성들을 모두 구해서 계산한 것을 의미하겠지요. 이를 행렬로 구한다면 한 번에 dot product가 되겠지요.

논문에서는 훨씬 빠르고 메모리 효율성이 높다고 합니다.

 

While the two are similar in theoretical complexity, dot-product attention is much faster and more space-efficient in practice, since it can be implemented using highly optimized matrix multiplication code.
https://wikidocs.net/31379

Input을 matrix로 쌓아서 사용하면 우리가 원하는 병렬화를 의미하게 되는 것입니다. 보이시는 바와 같이 W의 열 차원이 줄어들다보니 Q, K, V가 작아지는 것을 확인할 수 있습니다. 이를 활용한 Scaled Dot-Product는 행 차원 x행 차원이 되고 이를 다시 V와 곱하면 처음 Q, K, V와 같은 dimension을 가집니다.

이 결과 Attention Value Matrix를 head라 칭하며 이를 여러개 구하는 것이 바로 논문 오른쪽에서 보이는 Scaled DOt-Product Attention h개를 의미합니다. 논문에서 h=8로 설정되어 있습니다. 

https://wikidocs.net/31379

보이시는 바와 같이 나온 결과를 concat하는 것을 확인할 수 있습니다. 

https://jalammar.github.io/illustrated-transformer/

이제 우리는 배운 것을 한 번에 봅시다.  Input으로 x를 넣을 것이고 이 x보다 적은 차원을 위해 weight matix를 곱할 것입니다. 이후 나온 head를 concat하고 마지막으로 $W^O$를 곱해 우리가 원하는 attention matrix Z를 구할 것입니다. 이는 우리의 input과 matrix 사이즈가 같습니다.

 

위 내용을 이해하셨다면 이제 논문에서 제시하는 식을 봅시다.

그림을 본 후 식을 보니 조금 더 이해하기 쉬울 것입니다. $W_i^Q, W_i^K, W_i^V$를 각각 곱한 $Q, K, V$를 Attention의 Input으로 사용하고 이를 우리는 head라 칭합니다. 이 Head를 여러 개 concat하고 난 후 $W^O$를 곱해 최종적으로 우리가 input으로 사용했던 matrix와 같게 만듭니다. 이때 $h=8,\ d_k=d_v=d_{model} / h = 512/8=64$

 

NIPS 논문에는 없지만 arxiv에는 있는 그림을 봅시다.

 

서로 다른 head에서 문장의 attention head가 서로 관련성 있는 단어들끼리를 표시하고 있습니다.

Self Attention을 하는 이유

4-2) Scaling하는 이유

큰 $d_k$ 값에 대하여 softmax가 작은 gradient로 가지는 지역으로 훈련될 것을 우려하여 우리는 scaling을 한다고 설명하고 있습니다.

While for small values of $d_k$ the two mechanisms perform similarly, additive attention outperforms dot product attention without scaling for larger values of $d_k$. We suspect that for large values of $d_k$, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients. To counteract this effect, we scale the dot products by $\frac{1}{\sqrt{d_k}}$.

 

4-3) Mask Multi-Head Attention

Decoder 시작 Input에 Mask Multi-Head Attention을 확인할 수 있습니다. 여기서 Multi-Head Attention은 위와 동일합니다. 다만 차이는 Mask입니다. Mask는 무언가를 가리기 위한 것이고 여기서 Mask는 미래 단어를 무시하게 하기 위해서입니다. 코드적으로는 $-e^{9}$ 정도를 masking할 위치와 곱하고 이것이 softmax를 통과하면 0에 가까운 값이 나오도록 합니다. 이렇게 하는 이유는 위에 적어놓은 것처럼 미래 token vector를 바라봄으로써 예측 훈련에 있어 문제가 되는 것을 방지하기 위해서입니다.

https://towardsdatascience.com/illustrated-guide-to-transformers-step-by-step-explanation-f74876522bc0
A depiction of Decoder’s first Multi-headed Attention scaled attention scores. The word “am”, should not any values for the word “fine”. This is true for all other words.
https://jalammar.github.io/illustrated-transformer/

5. Position-wise Feed-Forward Networs & 기타 사항

논문에서는 다음과 같이 간단한 수식으로만 적혀있습니다

이를 조금 풀어쓰면 다음과 같이 됩니다.

Linear Transformation 1 - ReLU - Linear Transformation 2

 

Add는 Residual Connection을 의미하며 Norm은 Layer Normalization을 의미합니다.

 

Layer Normalization

https://arxiv.org/pdf/1607.06450.pdf

 

6. Training

6-1 Training Data

표준 WMT 2014 English-German dataset (4.5 million sentence pairs)

Larger WMT 2014 English-French dataset (36M sentences,  split tokens into 32000 word-piece vocabulary)

 

각 Training batch는 25000 source token, 25000 target token으로 구성된 sentence pair가 들어감

 

6-2 Hardward

8 NVIDIA P100 GPUs

https://www.nvidia.com/en-us/data-center/tesla-p100/

 

NVIDIA Tesla P100: The Most Advanced Data Center Accelerator

The most advanced data center accelerator ever built for near-infinite compute challenges in HPC and deep learning.

www.nvidia.com

만약 이게 맞다면 각 GPU당 메모리는 대략 16G. 12G도 있다던데 우선은 16G로 계산

16*8 = 128G GPU memory

 

base model 기준 

각 training step은 0.4s

100,000 step은 12 hours

 

big model 기준

step time은 1초

300,000 step 훈련 (3.5 days)

 

6-3) Optimizer

Adam Optimizer with $\beta_1=0.9,\ \beta_2=0.98,\ \epsilon=10^{-9},\ warmup_steps=4000$ 

 

6-4) Regularization (Residual Dropout, Label Smoothing)

Residual Dropout

각 sub-layer의 결과 도출 후 사용. 즉, Add & Normalize 이전

$P_{drop}=0.1$

 

Label Smoothing

$\epsilon_{ls}=0.1$

 

7. Results

 

다른 모델들과 비교했을 때 높은 BLEU와 더 적은 Training Cost를 확인할 수 있습니다.

 

다양한 실험을 통한 결과를 위 표에서 확인할 수 있습니다.

Big model이라고 적혀있는 부분이 훨씬 좋은 결과임을 확인할 수 있습니다. 비록... parameter는 많지만....

8. Reference

1. Wikidocs

https://wikidocs.net/31379

 

1) 트랜스포머(Transformer)

* 이번 챕터는 앞서 설명한 어텐션 메커니즘 챕터에 대한 사전 이해가 필요합니다. 트랜스포머(Transformer)는 2017년 구글이 발표한 논문인

wikidocs.net

 

2. jalammar 블로그

https://jalammar.github.io/illustrated-transformer/

 

The Illustrated Transformer

Discussions: Hacker News (65 points, 4 comments), Reddit r/MachineLearning (29 points, 3 comments) Translations: Chinese (Simplified), French, Japanese, Korean, Russian, Spanish, Vietnamese Watch: MIT’s Deep Learning State of the Art lecture referencing

jalammar.github.io

한글 버전 : https://nlpinkorean.github.io/illustrated-transformer/

 

The Illustrated Transformer

저번 글에서 다뤘던 attention seq2seq 모델에 이어, attention 을 활용한 또 다른 모델인 Transformer 모델에 대해 얘기해보려 합니다. 2017 NIPS에서 Google이 소개했던 Transformer는 NLP 학계에서 정말 큰 주목을

nlpinkorean.github.io

 

3. 나동빈님의 설명

https://www.youtube.com/watch?v=AA621UofTUA&t=4146s&ab_channel=%EB%8F%99%EB%B9%88%EB%82%98 

 

4. Official

https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html

 

Transformer: A Novel Neural Network Architecture for Language Understanding

Posted by Jakob Uszkoreit, Software Engineer, Natural Language Understanding Neural networks, in particular recurrent neural networks (RN...

ai.googleblog.com

 

5. Tensorflow Transformer 코드

https://www.tensorflow.org/text/tutorials/transformer

 

언어 이해를위한 변환기 모델  |  Text  |  TensorFlow

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 언어 이해를위한 변환기 모델 이 튜토리얼 기차는 변압기 모델 번역하는 포르투갈어 영어로 데이터 집합을 . 이 지식 가정 고

www.tensorflow.org

 

6. Positional Encoding 이유

https://towardsdatascience.com/master-positional-encoding-part-i-63c05d90a0c3

 

Master Positional Encoding: Part I

We present a “derivation” of the fixed positional encoding that powers Transformers, helping you get a full intuitive understanding.

towardsdatascience.com

 

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading