논문

하루에도 수만개의 글자를 읽고 있습니다. 하루에도 수백장의 종이를 들춰 읽습니다.
이것은 그 읽기에 대한 일기입니다.

Attention Is All You Need

Problem

최근 sequence modeling과 transduction 문제를 풀기 위해 recurrent neural network, long short-term memory, gated recurrent neural networks와 같은 방법들이 제안되면서 많은 발전을 이루었다. Recurrent 모델은 보통 입력, 출력 sequence의 심볼 위치에 따라 쪼개서 계산하는 방법을 사용한다. 즉 위치에 따라 이동하면서 이전의 hidden stateh_{t-1}의 현재 위치t를 이용한 함수의 결과로서 현재의 hidden stateh_t를 생성한다. 이는 학습 시 병렬화를 힘들게 하여 긴 길이의 sequence에서의 성능을 약화시킨다.

한편 Attention mechanism은 sequence modeling과 transduction model에서 필수적인 부분으로 인식되고 있다. 이를 이용하면 sequence들 사이의 거리에 무관한 dependency를 갖는 모델링이 가능해진다.

Essence

이 논문에서 제안하는 Transformer는 recurrence를 사용한 모델링을 하지 않고, 입력과 출력간의 global dependency를 찾도록 하는 attention mechanism만을 사용하였다. Transformer를 이용하여 더 많은 병렬화가 가능하여 학습 시간을 줄일 수 있었다.

Detail

Neural sequence transduction 모델에서 주로 쓰이는 구조는 encoder-decoder 구조이다. Encoder는 symbol representation의 입력 sequence(x_1, \cdots, x_n)를 continuous representation\mathbf{z} = (z_1, \cdots, z_n)으로 매핑한다.\mathbf{z}가 주어지면 decoder는 다시 symbol들의 sequence(y_1, \cdots, y_m)으로 한번에 한개씩 변환한다. 각 변환마다 auto-regressive한 모델을 사용하기 때문에 이전에 생성된 symbol들은 다음 생성 시에 입력으로 사용된다.

Transformer는 encoder와 decoder에 stacked self-attention, point-wise, fully connected layer 구조들을 사용하였다.

Encoder

Encoder는 동일한 레이어를N=6개 쌓은 구조로 되어있다. 각 레이어는 2개의 서브레이어로 구성되는데 첫번째는 multi-head self-attention mechanism이고 두번째는 position-wise fully connected feed-forward network이다. 두 서브 레이어에 residual connection을 추가하고 다음 layer normalization을 적용하였다. 즉 각 서브레이어의 출력은\text{LayerNorm}(x + \text{Sublayer}(x))이라고 할 수 있다. 이러한 residual connection을 적용하기 위하여 모든 레이어의 출력은d_{\text{model}} = 512 크기를 갖는다.

Decoder

Decoder 또한 동일한 레이어를N=6개 쌓은 구조로 이루어진다. 각 레이어에 1개의 서브 레이어를 더 추가하였는데 encoder stack의 출력에 대한 multi-head attention을 수행한다. Encoder와 마찬가지로 residual connection과 layer normalization을 추가하였다. 또한 self-attention 서브레이어를 수정하여 다음 위치들의 정보가 현재 위치에 관여하는 것을 막도록 하였다.

Attention

Attention function은 주어진 query와 key-value 페어에 대한 output으로의 맵핑으로 설명할 수 있는데, 여기서 query, key, value, output은 모두 벡터이다. Output은 value들의 weight sum으로 계산되며, weight의 각 값들은는 query와 그에 대응하는 key간의 compatibility function으로 계산된다.

Scaled Dot-Product Attention

먼저 간단한 구조인 Scaled Dot-Product Attention에 대해 설명하고자 한다.

입력은 크기d_k를 갖는 query들과 key들, 그리고 크기d_v를 갖는 values들로 구성된다. 한 query와 모든 key들의 dot product를 계산하고\sqrt{d_k}로 나눈 뒤 softmax function을 적용하면 key에 해당하는 각 value들에 대한 weight를 얻을 수 있다.

실제 계산 시에는 모든 query들에 대한 attention function을 계산하여야 하기 때문에 query들과 key들, value들을 matrix의 형태로 묶어Q,K,V를 만든 뒤 matrix 형태의 출력을 내도록 하였다.

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

Multi-Head Attention

크기d_{\text{model}}을 갖는 각 key, value, query들에 대해 하나의 attention function을 적용하는 것보다 query, key, value들에 서로 다른 linear projection을 적용한 뒤 attention을 계산하면 더 효과적이다. 이렇게 하면 각각의 projected된 query, key, value에 대해서 attention function들의 output을 병렬적으로 계산할 수 있다. 계산된 output은 concatenate한 후 다시 한번 projection된다.

Multi-head attention은 서로 다른 representation subspace에서의 정보를 jointly modeling할 수 있도록 해 준다.

\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \cdots, \text{head}_h) W^O

\text{where}, \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)

여기서W_i^Q \in \mathbb{R}^{ d_{model} \times d_k },W_i^K \in \mathbb{R}^{d_{model} \times d_k},W_i^V \in \mathbb{R}^{d_{model} \times d_v}는 projection에 사용되는 파라미터들이다.

논문에서는h=8을 사용하였기에 나머지 크기들은d_k = d_v = d_{\text{model}} / 64 = 8로 사용되었다. 각 헤드의 차원 수가 줄어들었으므로 전체 계산량은 single-head attention과 비슷한 수준이다.

Applications of Attention in our Model

Transformer는 multi-head attention을 3가지 방법으로 사용하고 있다.

  1. Encoder-decoder attention: 이전 decoder 레이어에서 오는 query들과 encoder의 출력으로 나오는 memory key, value들과의 attention이다. 이는 decoder의 모든 위치에서 input sequence의 모든 위치를 참조할 수 있도록 한다.
  2. Self-attention in encoder: self-attention layer에서 모든 key, value, query 입력들은 한 곳에서 나오는 것을 사용하는데, 여기에서는 이전 encoder 레이어의 출력이다. Encoder의 각 위치들은 이전 레이어의 모든 위치들을 참조할 수 있다.
  3. Self-attention in decoder: decoder의 각 위치들은 decoder 내의 다른 위치들을 참조할 수 있는데, 이전 부터 자신 위치까지만을 참조하도록 하였다. auto-regressive 성질을 살리면서도 정보가 잘못 흐르는 것을 막기 위해서 scaled dot-product attention 내의 softmax에 입력되는 값들 중에서 자기 위치 다음 위치들에 대한 연결들에 대해서는 모두-\infty로 masking 처리를 해주었다.

Position-wise Feed-Forward Networks

각 레이어들에는 fully connected feed-forward network가 들어있다. 이는 2개의 linear transformation과 ReLU로 구성된다.

\text{FNN}(x) = \max(0, xW_1 + b_1) W_2 + b_2

이는 각 위치에 대해 동일한 연산을 개별적으로 적용하고, 레이어 별로 다른 파라미터를 갖는다. 따라서 한 레이어 내에서 kernel size 1을 갖는 2개의 convolution으로 구현하였다. 각 레이어의 입력, 출력 차원은d_{\text{model}} = 512이며 레이어 내부에서는d_{ff} = 2048 차원이 사용되었다.

Embeddings and Softmax

다른 모델들과 마찬가지로 입력 토큰과 출력 토큰을d_{\text{model}} 크기 벡터로 변환하는데에 미리 학습된 embedding을 사용하였다. 또한 미리 학습된 linear transformation과 softmax function을 통해 decoder의 output을 다음 토큰의 확률 값들을 prediction하였다.

Positional Encoding

이 모델은 recurrence나 convolution이 없기 때문에 모델이 sequence의 순서 정보를 활용하도록 하기 위해서 위치 정보를 추가로 넣어주어야 한다. 이를 위하여 "positional encoding"을 encoder와 decoder stack의 아래쪽에서 입력 embedding에 추가하였다. 이 positional encoding은 embedding과 같은 차원인d_{\text{model}}을 갖기 때문에 이 두 벡터를 더해서 사용하였다.

Positional encoding은 다음과 같이 구현하였다.

PE_{(pos, 2i)} = \sin(pos/10000^{2i/d_{\text{model}}})

PE_{(pos, 2i+1)} = \cos(pos/10000^{2i/d_{\text{model}}})

여기서pos는 position을 의미하고i는 dimension을 의미한다.

Why Self-Attention

Self-attention을 이용하여 얻고자 했던 것은 아래 3가지이다.

  1. 더 적은 레이어별 계산 복잡도
  2. 계산의 병렬화 가능
  3. long-range dependency들의 간의 path-length 간소화


Add a Comment Trackback