[NLP] Transformer implement 정리

Encoder part

1. input data

1.1. data

  • sequential data
    • eg. [나, 는, 학, 교, 에, 간, 다] -> [1, 2, 3, 4, 5, 6, 7]
    • sequence length 정하고 padding처리
    • sequence length보다 길면 버리거나, truncate

1.2. embedding

  • input data word embedding:
    • shape: [batch_size, seq_len, emb_dim]
  • input data positional embedding
    • $PE(pos, 2i) = sin(\frac{pos}{1E+4^{2i / d_{model}}}),$
    • $PE(pos, 2i+1) = cos(\frac{pos}{1E+4^{2i / d_{model}}}),$
      • i: embbedding weight matrix의 dim 중 i th idx
      • pos: sentence에서 해당 단어의 position
    • 즉, 각 pos에 대응하는 embedding weight matrix.
    • word embedding weight matrix가 vocab idx에 따른 look-up table 역할을 하듯이, pos에 따른 look-up table 역할.
    • 아래그림에서 row: pos
  • input data = input data’로 완성

2. attention layer

2.1. key, query, value vector

  • key, query, value vector는 위의 input data’에 $W_k, W_q, W_v$를 matrix multiply하여 구함
  • 기존 attention model에서 key, query, value와 비교
    • 기존 attention 모델은(paper), decoder time step t의 hidden stateencoder의 모든 time step의 hidden state간의 score를 산출.
    • 그리고 그 score를 다시 encoder의 hidden state에 곱하여 weight를 주고, 합산하여 context vector를 산출.
    • 위 context vector는, time step t의 hidden state와 concat.
    • concat된 vector는 feedforward 통과하여 time step t의 출력값
    • 이를 transformer와 비교해보자면, score은 value(but value vector 따로 있음), decoder의 hidden state는 query, encoder의 hidden state는 key에 해당.
    • attention model에 대한 더 자세한 설명은 jalammmar의 블로그를 참조
  • k, q, v vector
    • shape: [seq_len, hidden_dim]

2.2. scaled dot product attention

2.3. attention head #1 output

  • score vector = $Q \times K^T = \text{[seq_len, hidden_d] * [hidden_d, seq_len]}$
  • score vector *= $\dfrac{1}{\sqrt{dk}}$
  • score vector = softmax(score vector)
    • shape: [seq_len, seq_len]
  • attention head #1의 최종 output
    • score vector * value vector = [seq_len, seq_len] * [seq_len, hidden_dim]
      • shape: [seq_len, hidden_dim]
    • score vector에 value vector를 곱해 필요여부에 따라 가중치가 조절됨
    • 예를 들어 output의 matrix의 (row=1, col1=1)은, query 1(row=1)과 key 1, …, n의 score에, 각 key 1, …, n의 value vector 1 feature(col=1)을 곱하고 합산한 결과.

2.3. multi head attention

  • 각 attn head에서 나온 결과물을 concat
    • shape: [seq_len, n_head * hidden_dim]
  • encoder output
    • 상기 concat(multi head attn output)(shape:[seq_len, n_head * hidden_dim])을 $W_0$(shape: [n_head * hidden_dim, hidden_n])과 mat+mul -> 초기 input 값과 같은 형태로 만듦
    • shape: [seq_len, hidden_n] = [seq_len, n_head * hidden_dim] * [n_head * hidden_dim, hidden_n]

Decoder part

  • Decoder의 1st attention은 self attention
    • 다음 단어 볼 수 없도록 triangular mask
  • 2nd attention layer(encoder-decoder attention layer)는, Encoder의 output을 key, value로 사용
  • 마지막 output에는 Feed Forward 적용
    • $ReLU(xW_1 + b_1) W_2 + b_2$
< !-- add by yurixu 替换Google的jquery并且添加判断逻辑 -->