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
- 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 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$$