연구/논문 리뷰

[NIPS 2017] Attention Is All You Need

xeskin 2020. 10. 24. 16:02
반응형

Introduction

- Reccurent model은 input/output sequence의 심볼 포지션에 따라서 계산을 나눈다. 즉, sequence를 처리하기 위해 t번째 input에 대한 output을 만들기 위해, t번째 input과 (t-1)번째 hidden state를 사용한다.

- 이는 학습 시 t번째 hidden state를 얻기 위해 (t-1)번째 hidden state가 필요함을 뜻한다. 즉, 순서대로 계산해야 하는데 이때문에 병렬 처리에 제한이 생긴다.

- 더불어 한 sequence 내에서 단어가 멀 경우, 서로간의 정보를 이용하지 못하는 'long-term dependency problem'이 발생한다. 입력 sequence가 짧은 경우 문제가 되지 않지만 긴 sequence를 처리해야 할 때는 정보가 소실되는 문제를 야기한다.

- Attention mechanism을 적용하면 다양한 태스크에서 input/output sequence의 거리에 관계없이 서로간의 dependency를 잘 학습할 수 있었다.

 

Model Arhitecture

The Transformer - model architecture

- sequence data를 처리하는 많은 모델들이 인코더-디코더 구조를 갖고 있는 것과 같이 트랜스포머도 이를 차용했다.

- 트랜스포머에서 인코더는 input sequence $\textbf{x}$가 주어졌을 때 다음과 같은 매핑을 갖는다.

$$ \textbf{x} = (x_1, \cdots, x_n) \rightarrow \textbf{z}=(z_1,\cdots,z_n)$$

- 이때 디코더는 $\textbf{z}$가 주어졌을 때 다음과 같은 매핑을 통해 output sequence를 내놓는다.

$$ \textbf{z}=(z_1,\cdots,z_n) \rightarrow \textbf{y}=(y_1,\cdots,y_m)$$

- 다음 심볼을 생성시킬 때 이전에 생성된 심볼을 추가적인 input으로 사용하는데 이러한 특성때문에 트랜스포머가 'auto-regressive'하다고 한다.

ex) '나는 토마토야.'라는 문장에서 '토마토야'를 만들 때 '나는'이라는 이전 스텝에서 생성된 심볼을 추가적인 input으로 사용하는 걸 말한다.

- 트랜스포머는 인코더와 인코더 둘 다 self-attention 쌓은 것과 position-wise fully connected layer를 사용한 아키텍쳐를 갖는다. (즉, transformer = position-wise mlp + attention)

 

Encoder and Decoder Stacks

Encoder: 인코더는 동일한 레이어를 $N=6$개 만큼 쌓았다. 각 레이어는 두개의 서브레이어를 갖고 있고 각 서브레이어는 residual connection을 갖고 있다.

- 첫 번째는 multi-head self attention mechanism을 갖고 있는 레이어

- 두 번째는 position-wise fully-connected feed-forward network

- 각 서브레이어는 residual connection을 갖고 있으며, 이를 지난 이후에는 layer-normalization을 적용해준다.

- 즉, 각 서브레이어의 output은 $LayerNorm(x+Sublayer(x))$가 된다.

- residual connection을 사용하려면 모델의 모든 서브레이어뿐만 아니라 임베딩 레이어가 동일한 차원을 갖고 있어야 하는데 이때 차원은 512로 맞춰주었다고 한다.

 

Decoder: 디코더는 동일한 레이어를 $N=6$개 쌓았다. 인코더에 있는 서브레이어 두개에 다른 서브레이어를 하나 더 넣었는데 이는 인코더 스택의 output에 대해 multi-head attention을 수행하는 서브레이어다.

- 서브레이어 두개는 인코더와 동일하다.

- 다른 한 레이어는 인코더 스택의 output에 대해 multi-head attention을 수행하는 서브레이어다.

- 인코더처럼 각 서브레이어에는 residula connection을 두었고 이후에 layer normalization을 적용했다.

- 디코더 스택에서 self-attention 서브레이어를 변형에서 위치가 후속 위치에 집중하지 않도록 했다. (디코더는 인코더와 달리 '순차적으로' 결과를 만들어야 하기 때문에 self-attention을 변형했다고 한다. 'masking'을 해주었다는 것. 이를 통해서 position i보다 이후에 있는 position에는 attention을 주지 못하게끔 만들었다. 즉, position i에 대한 예측은 미리 알고 있는 output에 디펜드하게 된다.)

 

Attention

Attention Mechanism

- attention function은 query와 key-value pair를 output에 매핑하는 것으로 설명할 수 있다. 여기서 query, key, value, output은 모두 벡터다.

- 여기서 output은 value의 weighted sum으로 계산되는데 각 벡터에 할당된 가중치는 key에 대응되는 query의 compatiblity function으로 계산된다.

(파일철이 있으면 파일철의 내용물이 value, 파일철 각 장마다 붙어있는 포스터잇이 key, 뭐뭐 찾아라 하는 것이 query로 비유할 수 있다.)

 

 

Scaled Dot-Product Attention

Input

- queries and key of dimension $d_k$

- values of dimension $d_v$

 

- query와 모든 key들에 내적을 계산하고 이를 $sqrt{d_k}$로 나눠준다. 그리고 여기에 softmax를 적용해서 각 value에 대한 가중치를 얻는다.

- 실제로는 모든 query에 대한 attention function을 동시에 계산해줬는데 이는 다음과 같다.

$$Attention(Q, K, V)=softmax(\frac{QK^{T}}{\sqrt{d_k}}V$$

 

반응형