본문 바로가기
Deep Learning

Attention Is All You Need 리뷰 (공학 설계 프로젝트 기획 논문 3)

by Jun_N 2019. 7. 27.

논문 : https://arxiv.org/abs/1706.03762

 

Attention Is All You Need

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new

arxiv.org

 

RNN, 특히 LSTM은 sequence model과 machine translation에서 주요하게 사용되고 있다.

 

RNN모델은 순서대로 계산을 해야 했기 때문에 병렬 처리를 할 수 없었고 계산 속도가 느렸다. 이는 문장의 길이가 길어진 경우 batch로써 풀고자 할때 큰 문제가 된다. 

 

이를 해결 하기 위한 attention mechanism은 input, output 문장의 길이에 관계없이 dependency를 모델링할 수 있게 해줌으로써 seq modeling에 필수적인 요소가 되었다. 그러나 대부분 이 방법은 아직 rnn과 결합되는 형태로 쓰이고 있다.

 

따라서 RNN을 사용하지 않은 Transformer는  attention mechanism에 전적으로 기반한다. Transformer에서는 학습 시  병렬 처리가 가능하게 된다. 

 

Transformer 는 Attention is All You Need이라는 논문을 통해 처음 발표 되었다. 이 모델의 구현은 현재 pytorch package에서 확인할 수 있다. 본 글에서는 Transformer와 번역 과정에 대해서 알아보도록 하겠다.

 

Transformer 구조

개괄적인 번역 과정

 

Input -> Encoders -> Decoders -> Output

 

모델은 어떤 한 언어로 된 Input을 입력받아 다른 언어로 된 번역을 출력한다. (ex) 핀란드어-> 영어

Encoder, Decoder는 여러개의 층을 쌓을 수 있는데 이 논문에서는 6개를 사용하였다.

 

그림 출처 (https://nlpinkorean.github.io/illustrated-transformer/)

<Encoder>

input ->Self-Attention -> Feed Forward Neural Network

 

<Decoder>

Self-Attention -> Encoder-Decoder Attention -> Feed Forward

 

 

Encoding 벡터

 

 

각 단어들은 크기가 512의 벡터 하나로 embed 된다. 모든 encoder들은 크기 512의 벡터의 리스트를 입력으로 받는다.

가장 밑에있는 encoder는 word embedding이 되고 그 다음 encoder들은 전의 encoder의 출력값을 입력으로 받는다.

그림 출처 (https://nlpinkorean.github.io/illustrated-transformer/)

각 위치의 단어들은 각각 다른 self-encoding 과정을 거치고 같은 feed-forward 신경망을 거친다.

 

 

 

Self-Attention

 

 

만약 어떤 문장을 번역할 때, 'it'이라는 단어가 같은 단어라도 다르게 해석될 수 있고 문장이 위치함에 따라 뜻이 달라질 수 있다.

모델이 입력 문장 내의 각 단어를 처리할 때 self-attention을 통해 입력 문장 내의 다른 위치에 있는 단어들을 보고 거기서 힌트를 받아 현재 타켓 위치의 단어를 잘 encoding 할 수 있다. 이를 통해 성능을 향상시킬 수 있다.

 

우리는 각 단어에 대해 (각 단어의 embedding 벡터) Query, Key, Value 벡터를 생성한다. 그리고 이 벡터들은 입력 벡터에 대해 세 개의 합습 가능한 행렬들을 곱합으로 만들어 진다.

 

 

x1를 weight 행렬인 WQ로 곱하는 것으로 q1을 생성한다. 같은 방법으로 query, key, value 벡터를 만든다.

 

 

 

 

 

self-attention 계산을 해야 하는데 'Thinking"에 대해서 계산하겠다.

먼저 현재 단어의 query와 점수를 매기려 하는 다른 위치에 있는 단어의 key를 내적으로 계산한다. (q1*k1)

 

그리고 key 벡터의 사이즈 (64)의 제곱근 8만큼 나눈다. 그 후 이 값을 softmax에 통과시켜 모든 점수를 양수로 만들고 그 합을 1로 만들어 준다. 이 softmax는 현재 위치의 단어의 encoding에 있어서 각 단어들의 표현이 들어갈 것인지 결정하며 높은 점수를 가지는 부분이 많이 차지한다. 

 

다음으로 softmax값에 각 단어들의 value 벡터를 곱함으로 우리가 집중하고 싶은 단어들만 남겨두고 , 관련이 없는 단어들은 0.001과 같은 작은 숫자를 곱해 없애기 위함이다.

 

마지막으로 이 점수로 곱해진 weighted value 벡터들을 합한다. 이 값이 z로 즉 self-attention layer의 출력값이다.

 

이 출력값은 feed-forward 신경망으로 보내지며 빠른 계산을 위해 모든 과정들이 벡터가 아닌 행렬의 형태로 진행된다.

 

 

Multi-head attention

 

 

self-attention layer에다 multi-head attention이라는 메카니즘을 더해서 성능을 더 개선한다.

본 논문에서는 8개의 attention head를 가지고 각각 다른 query, key, value weight 행렬들을 모델에 가진다.

즉 8개의 서로 다른 Z 행렬을 가지게 되고 한 위치에 집중되어 계산되는것을 방지할 수 있다.

 

하지만 이 8개의 행렬을 바로 feed-forward layer로 보낼 수 없다. feed-forward layer는 한 위치에 한 개의 행렬만 input으로 받기 때문에 8개의 행렬을 하나의 행렬로 합쳐야 한다.

 

 

8개의 행렬을 모두 이어 붙인 다음에 weight 행렬인 W0을 곱하면 된다.

 

multi-head attention의 모든 과정을 하나로 표현한다면 위의 그림처럼 표현할 수 있다.

 

 

Positional Encoding

 

 

지금까지 설명한 Transformer 모델에서는 입력 문장에서 단어들의 순서를 고려하지 않았다. 따라서 각각의 입력 embedding에 'positional encoding'이라는 벡터를 추가함으로 순서를 고려하였다.

 

이 벡터들은 모델이 학습하는 특정한 패턴을 따르는데, 모델이 각 단어의 위치와 문장 내의 다른 단어 간의 위치 사이에 대한 정보를 알 수 있게 해준다. 

 

sin, cos 함수를 사용한 positional encoding 벡터를 기존 단어의 embedding과 더함으로 만든다.

 

 

The Residuals

 

 

encoder 내의 sub-layer는 residual connection으로 연결되어 있고 그 후에 layer-normalization 과정을 거친다.

Residual connection은 input을 output으로 그대로 전달하는 것을 말한다. 이때 sub-layer의 output 차원을 embedding 차원을 맞춰 준다. x+Sublayer(x)x+Sublayer(x)를 하기 위해서, 즉 residual connection을 하기 위해서는 두 값의 차원을 맞춰줄 필요가 있다. 그 후에 layer normalization을 적용합니다.

위의 과정을 시각화해서 표현한다면 아래와 같이 표현할 수 있다.

 

 

 

Decoder 내에 있는 sub-layer도 동일하게 적용된다. 따라서 전체를 표현하면 아래와 같이 표현할 수 있다.

 

 

Decoder

 

기본적으로 encoder와 비슷한 구조를 갖고 있다.

 

encder가 먼저 input 문장을 처리하기 시작하고 가장 윗단 encoder, 즉 마지막 encoder의 Output이 attention 벡터 K, V로 변형이 된다. 

이 벡터들은 decoder의 encoder-decoder attetion layer에서 가장 적절한 장소에 attention 할 수 있게 사용된다.

 

 

Decoding은 마지막 문장인 <end of sentene>를 출력할때까지 반복된다. 각 스텝마다 출력된 단어는 다음 스텝의 가장 밑단의 decoder에 들어가고 encoder와 마찬가지로 6개의 decoder를 거친다. encoder의 입력에 했던 것과 동일하게 embed를 거친 후 positional encoding을 추가하여 decoder에 각 단어의 위치 정보를 더해준다.

 

 

 

 

Decoder에서는 encoder와 달리 순차적으로 결과를 만들어내야 하기 때문에, self-attention을 변형헤야 한다.

Masking을 통해, 현재 position의 후에 있는 position에 attention을 주지 못하게 한다.

즉, position에 대한 예측은 미리 알고 있는 output들에만 의존을 하게 한다.

 

 

위의 예시를 보면 a를 예측할 때는 a 이후에 있는 b,c에는 attention을 주지 않고 b를 예측할 때는 a, b에 attention을 주고 c는 attention을 주지 않는다.

 

 

마지막 Linear Layer, Softmax layer

 

여러 개의 decoder를 거치고 난 후에는 소수로 이루어진 벡터 하나가 남는다. 이 벡터를 단어로 바꿔야 하는데 linear layer와 softmax layer를 사용한다.

 

Linear layer는 fully-connected 신경망으로 decoder가 마지막으로 출력한 벡터를 그보다 더 큰 벡터인 logits 벡터로 투영시킨다.

 

예를 들어 모델이 training 데이터에서 총 10만개의 영어 단어를 학습했을 때 logits vector 크기는 10만개가 된다. 

 

그 다음에 나오는 softmax layer를 통해 이 점수들을 확률로 변환해 준다. 이 확률은 모두 양수 값을 가지며 다 더하면 1이 된다. 가장 높은 확률 값을 가지는 단어가 최종 결과물로 출력된다.

 

 

 

위의 그림을 보면 5번이 가장 확률이 높게 나오고 이 5번에 해당되는 사전에서 단어를 출력한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<참고 블로그 링크>

 https://pozalabs.github.io/transformer/

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

 

The Illustrated Transformer

저번 글에서 다뤘던 attention seq2seq 모델에 이어, attention 을 활용한 또 다른 모델인 Transformer 모델에 대해 얘기해보려 합니다. 2017 NIPS에서 Google이 소개했던 Transformer는 NLP 학계에서 정말 큰 주목을 끌었는데요, 어떻게 보면 기존의 CNN 과 RNN 이 주를 이뤘던 연구들에서 벗어나 아예 새로운 모델을 제안했기 때문이지 않을까 싶습니다. 실제로 적용했을 때 최근 연구에 비해 큰 성능 향상을

nlpinkorean.github.io

 

Attention is all you need paper 뽀개기

Transformer paper review

pozalabs.github.io

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