Transformer 정리

Updated:

Attention is all you need

  • No more RNN or CNN modules
  • Attention만으로 sequence 입력, 출력이 가능하다.

Bi-Directional RNNs

  • 왼쪽에서 오른쪽으로 흐르는 방식을 Forward라 하면 오른쪽에서 왼쪽으로 흐르는 것을 Backward라 할 수 있다.
  • Forward는 “go”와 왼쪽에 있던 정보까지를 $h_2^f$, Backward는 “go”와 오른쪽에 있던 정보까지를 $h_2^b$라 하자.
  • 인코딩 벡터는 왼쪽에 있던 정보 뿐만 아니라 오른쪽에 있는 정보도 같이 포함할 수 있도록 Forward RNN과 Backward RNN을 병렬적으로 만든다.
  • 예를들어 “go”라는 동일단어에 대해서 Forward RNN, Backward RNN의 히든 스테이스트 벡터를 concat하여 히든 스테이트 벡터의 2배에 해당하는 dimension을 구성하도록 한다.

Transformer: Long-Term Dependency

  • 그림 출처 : http://jalammar.github.io/illustrated-transformer/

  • 각각의 입력 벡터들은 자기자신을 포함하여 나머지 벡터들과의 내적을 통해 유사도를 구하게 된다. 이 유사도를 softmax에 통과시켜 가중치를 얻게 되고 가중 평균을 구하여 해당 입력벡터의 인코딩 벡터로 사용한다.
  • 유사도를 구하게 되는 히든 스테이트 벡터들 간에 구별이 없이 동일한 세트의 벡터들 내에서 적용이 될 수 있다는 측면에서 이를 self-attention module이라 부른다.
  • 입력 벡터들은 각각의 벡터들과의 유사도를 구해서 디코더 히든 스테이트처럼 벡터들 중에 어떤 벡터를 선별적으로 가져올지에 대한 기준이 되는 벡터로 사용이 되는데 이것을 Query라고 표현한다.
  • 쿼리벡터와 내적을 위한 각각의 재료가 되는 벡터들은 Key 벡터라고 표현한다.
  • 각각의 벡터들과의 유사도를 구한 후 softmax를 취하게 되어 나온 가중치를 다시 입력벡터에 적용한 벡터를 Value 벡터라고 표현한다.
    • 또한, query, key, value로 사용될 때에 적용되는 선형변환 매트릭스가 각각 따로 정의되어 있다. 주어진 같은 벡터를 사용할 때 query, key, value로 쓰일 때 다른 벡터로 쓰일 수 있다.
  • 쿼리와 키에 대해 서로 다른 변환이 존재하는 유연한 유사도를 얻어낼 수 있게 된다.
  • 시퀀스 길이가 길다 하더라도 self-attention 모듈을 적용해서 시퀀스 내 각각의 word들을 인코딩벡터로 만들게 되어 멀리있는 정보도 손쉽게 가져올 수 있다. → RNN에서의 한계점(long-term dependency)을 극복
  • 자기 자신과 내적을 했을 때 유사도는 큰 값이 나오면서 큰 가중치를 얻게 된다. 이러한 문제를 개선한 모델이 등장한다.

Transformer: Scaled Dot-Product Attention

  • inputs : 하나의 쿼리벡터 $q$, key-value의 쌍 $(k, v)$
  • output : value 벡터들의 가중 평균
  • 각각의 가중치는 value벡터와 대응하는 key와의 내적값을 통해서 구한다.
  • query와 key는 내적연산이 가능해야 하기 때문에 같은 dimension $d_k$을 가져야 하고 value 벡터의 경우 꼭 같은 dimension을 가지지 않아도 된다.
    • 왜냐하면 value 벡터는 상수배를 적용하여 가중평균을 내기 때문에 꼭 같지 않아도 실행되는데 문제 없다. 그래서 value의 dimension은 $d_v$를 가지게 된다.
    • $A(q,K,V) = \sum_i{\frac{exp(q\cdot k_i)}{\sum_j exp(q \cdot k_j)}}v_i$
    • Becomes:
      • $A(Q,K,V) = softmax(QK^T)V$
      • $(|Q| \times d_k) \times (d_k \times |K|) \times (|V| \times d_v)= (|Q| \times d_v)$
  • Example from illustrated transformer

  • 그림 출처 : http://jalammar.github.io/illustrated-transformer/

  • 입력 벡터가 2개 → Q, K, V 모두 2개의 벡터로 이루어짐
  • Problem
    • $d_k$가 매우 커서 $q^Tk$의 분산이 매우 커진다.
    • 벡터의 특정 원소의 값이 매우 커서 softmax를 취하면 그 값 또한 매우 커진다. 이런 문제는 gradient를 작게 한다. → gradient vanishing problem
    • 예를들어 2차원 벡터의 query와 key가 있다고 가정하자. 그리고 query와 key의 element는 평균 0과 분산 1 을 가지고 있다고 가정하자.
    • 이때 query와 key의 내적값의 평균이 0이고 내적에 참여하는 곱의 분산은 1로 같게 된다. 따라서 내적의 평균은 0, 분산은 $d_k$가 된다.
    • 이처럼 내적한 값이 분산에 휘둘리는 형태가 되므로 내적 값의 분산을 일정하게 유지시키기 위해 표준편차 $\sqrt{d_k}$로 나누어준다.
    • softmax의 output을 적절한 정도의 범위로 조절하는 것이 학습에 도움이 된다.

Transformer: Multi-Head Attention

  • Head $h$ : number of low-dimensional spaces via $W$ matrices
  • h개의 Attention들은 모두 병렬로 작동하며 각각 attention을 적용하고 나온 output들을 concat하고 linear layer로 보낸다.
    • MultiHead($Q,K,V$) = Concat($head_1, …., head_h$)$W^O$
    • where $head_i$ = Attention($QW_i^Q, KW_i^K, VW_i^V$)
  • 각각의 input은 head에 들어가 Query, Key, Value를 생성하고 거기서 계산된 output들을 Concat한다.

  • 마지막으로 linear trasform을 수행하여 최종 output을 얻어낸다.
  • 한눈에 보기 쉽게 설명된 이미지이다.

  • 그림 출처 : http://jalammar.github.io/illustrated-transformer/

  • 다른 모델과의 complexity를 계산하여 비교한 표이다.
    • $n$ : sequence lengh
    • $d$ : dimension of representation → hyper parameter
    • $k$ : kernel size of convolutions
    • $r$ : size of the neighborhood in restriced self-attention

  • Self-Attention
    • $softmax(\frac{QK^T}{\sqrt{d}})$이므로 $(n \times d) \times (d \times n)$이다. $n \times n$을 $d$만큼 수행해야 하므로 $O(n^2\cdot d)$의 복잡도를 가지게 된다.
    • 또한, 자원이 무한하다는 가정하에 모든 값을 메모리에 올리면 한번에 연산이 가능하므로 Sequencial Operations(병렬연산)가 $O(1)$이 된다.
  • Recurrent
    • 이전 히든 스테이트 벡터가 다음 타임스텝의 히든 스테이트 벡터 계산에 참여한다. 이전 히든 스테이트 벡터의 dimension이 $d$라 할때, $h_{t-1}$과 곱해지는 $W_{hh}$는 $(d, d)$의 크기를 가지고 있다. 이 과정을 $n$번만큼 계산하므로 $O(n\cdot d^2)$의 복잡도를 가지게 된다.
    • RNN이 Self-Attention보다 적은 메모리를 요구한다. 왜냐하면 $n$이 입력의 길이이므로 Self-Attention은 $n$의 제곱에 해당하는 메모리를 모두 저장하고 있어야 하기 때문이다.
    • 하지만 RNN은 이전 히든 스테이트를 기다려야 하므로 병렬연산이 불가능하다. 따라서 $O(n)$이다.
  • Maximum Path Length는 Long-term dependency와 직접적으로 관련이 된다.
    • RNN은 첫 번째 단어가 마지막까지 영향을 주려면 $n$ 길이만큼 정보가 전달되어야 한다.
    • Self-Attention은 모든 단어를 $Q$, $K$, $V$로 이용해서 정보를 전달하므로 $O(1)$이 된다.

Transformer: Block-Based Model

  • 각 블록은 두 개의 sub-layer로 이루어져 있다.
    • Multi-head attention
    • TWo-layer feed-forward NN (with ReLU)
  • sub-layer들은 residual connection을 가지고 있다.
    • residual connection은 입력 벡터와 인코딩 벡터의 차이값만을 이용하는 방법인데 gradient vanishing 문제를 해결할 수 있고 학습도 좀 더 안정화 시킬 수 있다.
    • residual connection을 사용하려면 입력 벡터의 차원과 아웃풋 벡터의 차원이 일치해야 한다.
  • Transformer: Layer Normalization
    • Layer normalization은 들어온 입력들의 정보를 버리고 평균 0, 분산 1인 정보로 정규화해주는 것을 말한다. 다음 각 레이어 마다 Affine transformation을 수행한다.

Transformer: Positional Encoding

  • RNN은 순서대로 입력이 되기 때문에 순서 정보를 넣을 필요가 없다. 그러나 Transformer는 순서 정보를 넣을 수 없기 때문에 Positional Encoding을 넣어준다.
  • Positional Encoding은 입력들의 순서정보를 기록해주는 것이다. 이때 주기함수를 사용하여 위치를 표현한다.
    • $PE_{(pos,2i)} = sin(pos/10000^{2i/d_{model}})$
    • $PE_{(pos,2i+1)} = cos(pos/10000^{2i/d_{model}})$

  • 그림 출처 : http://nlp.seas.harvard.edu/2018/04/03/attention

  • 각 dimension별로 sin 혹은 cos 함수를 사용하여 dimension 개수만큼 그래프가 생성된다. 위 그림에서는 4번째 dimension에서는 sin, 5번째 dimension에서는 cos함수를 사용한다.
  • 첫 번째 위치(0번)를 zero base의 인덱스로 삼아서 0번에서의 position encoding vector 즉, 입력 벡터에 더해주는 첫 번째 위치를 나타내는 4번째 dimension에서는 파란색 그래프, 5번째 그래프에서는 주황색 그래프로 표현한다.

Transformer: Warm-up Learning Rate Scheduler

  • 하이퍼 파라미터인 learning rate를 학습중에 스케줄러를 통해 적절히 변경하여 학습이 잘되도록 한다.
    • 학습이 되지 않으면 learning rate를 줄이는 방법
  • learning rate = $ d_{model}^{-0.5} \cdot min(step^{-0.5}, step \cdot \text{wramup_steps}^{-1.5}) $

Transformer: Decoder

  • 디코더에 [SOS] 토큰을 넣어주면 Masked Multi-Head Attention을 거쳐 Query를 생성하고 인코더에서 생성된 output을 key와 value로 해서 다시 Multi-Head Attention에 넣어준다.
  • 이후 나온 값을 Feedforward layer에 넣어 softmax를 취한 값이 출력이 되며 이 출력을 다시 디코더에 삽입하여 다음 단어를 예측하게 한다.
  • 디코더 안 sub-layer들도 모두 residual connection을 가지고 있다.

Transformer: Masked Self-Attention

  • Query, Key를 내적하고 softmax를 취한 가중치값은 한 단어와 다른 단어에 대해 어느정도의 유사도를 지니는지를 나타내게 된다.
  • 하지만 한 단어 뒤의 단어를 예측하는 것은 미래 단어 정보가 필요하지 않다. 그래서 현재 단어에 대해 미래 단어들에 대한 유사도 값을 0으로 만들어주는 후처리과정이 필요하다. 이후 row별로 합이 1이 되도록 normalizing을 진행한다.
  • masking이라는 것은 attention을 모두가 볼 수 있도록 허용한 후 보지 말아야 되는 단어들에 대한 가중치를 0으로 만들어 다시 normalization 하는 후처리 방식을 말한다.

Transformer: Experimental Results

Comments