Formal Algorithms for Transformers 요약

nkw011·2022년 8월 3일
0

주의 사항

  • Transformer를 알고있다는 가정하에 글을 진행합니다.
  • 이 글은 논문에 대한 요약글입니다.
  • 논문 전체 내용 + Reference + Appendix를 함께 공부하시면 좋습니다.

Introduction

본 논문에서는 Transformers에 대한 complete, precise, and compact overview를 제공하는 것을 목적으로 Transformer components의 pseudocode를 소개하고 있습니다.

  • what Transformers are (Section 6)
  • how they are trained (Section 7)
  • what they’re used for (Section 3)
  • their key architureral components (Section 5)
  • tokenization (Section 4)
  • a preview of practical considerations (Section 8)
  • the most preminent models

Encoder-only Transfomer, Decoder-only Transformer에 대한 algorithm과 함께 train, inference에 대한 algorithm도 같이 소개하고 있으니 함께 살펴보셔도 좋을 것 같습니다.

Notations

Notation

논문에서 쓰이는 notation에 대해 소개합니다. Appendix B에 Notation 목록이 포함되어있습니다.

  • [N]{1,2,,N1,N}[N] \coloneqq \{1,2,\dots, N-1, N\}, 1N1\sim N까지 정수를 포함한 집합
  • NVN_V: vocabulary size
  • V[NV]V \cong [N_V]: vocabulary
  • V=l=0VlV^* = \bigcup_{l=0}^{\infty}V^l: vocabuary로 만들 수 있는 모든 sequence를 가지는 집합
  • ll: sequence length
    • lmaxl_{max}: maximum sequence length
  • xx: primary token sequence
    • xnx[1:l]x[1]x[2]x[l]Vx_n \equiv x[1:l] \equiv x[1]x[2]\dots x[l] \in V^*
    • x[t]x[t]: xxtt번째 token
    • Python과 달리 index의 시작이 1 입니다.
    • target이라는 표현을 사용하기도 하지만 여기서는 primary로 표기합니다.
  • zz: context token sequence, xx에 대한 context sequence
    • znz[1:l]z[1]z[2]z[l]Vz_n \equiv z[1:l] \equiv z[1]z[2]\dots z[l] \in V^*
    • z[t]z[t]: zztt번째 token
    • Python과 달리 index의 시작이 1 입니다.
    • source라는 표현을 사용하기도 하지만 여기서는 context로 표기합니다.
  • MRd×dM \in \R^{d \times d^\prime}: matrix
    • M[i,j]M[i,j] : entry MijM_{ij}
    • M[i,:]M[i,:] : MMii번째 row vector
    • M[:,j]M[:,j] : MM의 j번째 column vector
  • NdataN_{data}: data 갯수
  • n[Ndata]n \in [N_{data}]: n번째 data
    • xnx_n, znz_n

Matrix Multiplication

  • DL에서 많이 쓰이는 row vector ×\times matrix 대신 수학에서 자주 쓰이는 matrix ×\times column vector를 사용합니다.
    • 따라서 각각의 component에서 반환되는 vector는 모두 column vector로 표시됩니다.

Final Vocabulary and text representation

  • Tokenization을 통해 만든 vocabulary에 3가지 special token을 추가하여 final vocabulary를 만듭니다.
  • special token을 제외한 나머지 token들에 대해서 {1,2,,NV3}\{1,2,\dots, N_V-3\}의 unique index를 할당합니다.
  • special token은 다음과 같습니다.
    • mask_tokenNV2\text{mask\_token} \coloneqq N_V-2, masked language modelling에 쓰이는 token
    • bos_tokenNV1\text{bos\_token} \coloneqq N_V-1, the beginning of sequence, sequence의 시작을 알리는 token
    • eos_tokenNV\text{eos\_token} \coloneqq N_V, the end of sequence, sequence의 마지막을 알리는 token

Algorithm 1: Token embedding

Input

  • vv: token ID

Output

  • eRdee \in \R^{d_e}: 입력으로 들어온 token ID에 대한 embedding vector 반환.

Parameters

  • WeRde×NVW_e \in \R^{d_e\times N_V}: embedding matrix
    • vocabulary에 존재하는 모든 token에 대해 embedding 값을 반환하기 위해서 column size가 NVN_V가 됩니다.

과정

  • 1번: token ID vv에 대한 vector representation을 반환합니다.

Algorithm 2: Positional embedding

Attention is All You Need에서는 고정된 Positional Encoding 사용하지만 이 논문에서는 Postional Encoding 또한 학습 parameter로 설정하였습니다.

Input

  • ll: position in sequence

Output

  • eRdee \in \R^{d_e}: 입력으로 들어온 postion에 대한 embedding vector 반환.

Parameters

  • WeRde×lmaxW_e \in \R^{d_e\times l_{max}}: positional embedding matrix
    • data에 존재하는 모든 sequence에 대해 positional embedding 값을 반환하야하기 때문에 column size가 lmaxl_{max}가 됩니다.

과정

  • 1번: position ll에 대한 vector representation가 됩니다.

최종적으로 sequence xxtt번째 token에 대한 embedding vector는 다음과 같습니다.

  • e=We[:,x[t]]+Wp[:,t]e = W_e[:,x[t]] + W_p[:,t]

Algorithm 3: Basic single-query attention

Attention is all You Need 논문에 소개된 single query attention 과정인 A(q,K,V)=iexp(qki)jexp(qkj)viA(q,K,V) = \sum\limits_i \frac{exp(q \cdot k_i)}{\sum_j exp(q \cdot k_j)} v_i 을 그대로 적용합니다.

Input

  • eRdine\in\R^{d_{in}}: 현재 token에 대한 vector representation
  • context sequence에 존재하는 모든 token에 대한 vector representation
    • etRdine_t\in\R^{d_{in}}: context sequence의 tt번째 token에 대한 vector representation

Output

  • 현재 token과 context 정보를 결합한 vector representation 반환
    • v~Rdout\tilde{v} \in \R^{d_{out}}
  • 실제 Transformer에서는 attention 이후 residual connection을 하기 때문에 이 점에 유의해서 doutd_{out}dind_{in}를 설정해주어야합니다.

Parameters

  • WeRdattn×dinW_e \in \R^{d_{attn}\times d_{in}}: query linear projection
    • beRdattnb_e \in \R^{d_{attn}}: bias term
  • WkRdattn×dinW_k \in \R^{d_{attn}\times d_{in}}: key linear projection
    • bkRdattnb_k \in \R^{d_{attn}}: bias term
  • WvRdout×dinW_v \in \R^{d_{out}\times d_{in}}: value linear projection
    • bvRdoutb_v \in \R^{d_{out}}: bias term

과정

  • 1번: 현재 token을 query vector로 변환합니다.
  • 2번: context sequence에 존재하는 모든 token을 key vectors로 변환합니다.
  • 3번: context sequence에 존재하는 모든 token을 value vectors로 변환합니다.
  • 4번: query vector와 key vectors 사이에 attention distribution을 계산합니다.
  • 5번: attention distribution을 가중치로 사용하여 value vector의 가중합 벡터를 반환합니다.

Algorithm 4: Attention

single query attention이 하나의 token에 대한 attention 과정이었다면 algorithm 4번의 attention은 이를 확장시켜 sequence에 존재하는 모든 token에 대해 attention을 진행하는 과정입니다.

Attention is All You Need에 소개된 A(Q,K,V)=softmax(QKTdk)VA(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V을 그대로 적용합니다.

Input

  • XRdX×lXX\in\R^{d_X \times l_X}: primary sequence
  • ZRdZ×lZZ\in\R^{d_Z \times l_Z}: primary sequence에 대한 context sequence

Output

  • V~Rdout×lX\tilde{V}\in\R^{d_{out} \times l_X}: context 정보와 결합한 XX에 존재하는 모든 token에 대한 vector represenations 반환
    • v~Rdout\tilde{v} \in \R^{d_{out}}
  • 실제 Transformer에서는 attention 이후 residual connection을 하기 때문에 이 점에 유의해서 doutd_{out}dind_{in}를 설정해주어야합니다.

Parameters

  • WeRdattn×dXW_e \in \R^{d_{attn}\times d_{X}}: query linear projection
    • beRdattnb_e \in \R^{d_{attn}}: bias term
  • WkRdattn×dZW_k \in \R^{d_{attn}\times d_{Z}}: key linear projection
    • bkRdattnb_k \in \R^{d_{attn}}: bias term
  • WvRdout×dZW_v \in \R^{d_{out}\times d_{Z}}: value linear projection
    • bvRdoutb_v \in \R^{d_{out}}: bias term

Hyperparameters

  • Mask{0,1}lz×lx\text{Mask} \in \{0,1\}^{l_z \times l_x}

과정

  • 1~ 4번: single query attention에서 1 ~ 3번 과정을 행렬로 확장시킨 것입니다.
  • 5번: 계산된 score에 mask를 사용하는 부분이 등장합니다.
    • mask값이 0인 부분에 아주 작은 값을 할당해서 softmax를 통과할 때 0에 가까운 값이 반환되도록 합니다.
  • 6번: single query attention에서 4 ~5번 과정을 행렬로 확장시킨 것입니다.

self-attention

self-attention은 자기자신만을 사용하여 attention을 계산합니다. 따라서 Z=XZ =X인 Attention 입니다.

Bidirectional / unmasked self-attention

bidirectional / unmasked self-attention의 경우 sequence에 존재하는 모든 token에 대해 attention을 계산합니다. 따라서 Mask1\text{Mask} \equiv 1 이면서 Z=XZ=X인 Attention입니다.

Unidirectional / masked self-attention

Unidirectional / masked self-attention의 경우 이전 token들을 context로 사용하여 각 token에 대해 attention을 계산합니다.

현재 token 다음에 나오는 token들은 maksed out되기 때문에 Mask[[tztx]]\text{Mask} \coloneqq [[t_z \le t_x]]이면서 Z=XZ = X인 Attention 입니다.

Cross-attention

primary sequence와 context sequence가 다른 attention입니다. self-attention에 반대되는 경우라고 볼 수 있기 때문에 ZXZ \ne X입니다. cross-attention은 또한 mask를 적용하지 않기 때문에 mask1\text{mask} \equiv 1인 Attention 입니다.

Algorithm 5: MHAttention

Input

  • XRdX×lXX\in\R^{d_X \times l_X}: primary sequence
  • ZRdZ×lZZ\in\R^{d_Z \times l_Z}: primary sequence에 대한 context sequence

Output

  • V~Rdout×lX\tilde{V}\in\R^{d_{out} \times l_X}: context 정보와 결합하여 XX에 존재하는 모든 token에 대한 vector represenations 반환
    • v~Rdout\tilde{v} \in \R^{d_{out}}
  • 실제 Transformer에서는 attention 이후 residual connection을 하기 때문에 이 점에 유의해서 doutd_{out}dind_{in}를 설정해주어야합니다.

Parameters

  • HH: head 수
  • h[H]h \in [H]에 대해서,
    • WehRdattn×dXW_e^h \in \R^{d_{attn}\times d_{X}}: query linear projection
      • behRdattnb_e^h \in \R^{d_{attn}}beRdattnb_e \in \R^{d_{attn}}: bias term
    • WkhRdattn×dZW_k^h \in \R^{d_{attn}\times d_{Z}}: key linear projection
      • bkhRdattnb_k^h \in \R^{d_{attn}}: bias term
    • WvhRdmid×dZW_v^h \in \R^{d_{mid} \times d_{Z}}: value linear projection
      • bvhRdmidb_v^h \in \R^{d_{mid}}: bias term
  • WoRdout×HdmidW_o \in \R^{d_{out} \times Hd_{mid}}
    • boRdoutb_o \in \R^{d_{out}}

Hyperparameters

  • Mask{0,1}lz×lx\text{Mask} \in \{0,1\}^{l_z \times l_x}

과정

  • 1 ~ 2번: Algorithm 4에 나오는 Attention을 hh번 적용한다.
  • 3번: h개의 attention output을 모두 concatenation한다.
  • 4번: linear projection을 적용하여 Rdout\R^{d_{out}} vector로 변환한다.

Algorithm 6. layer_norm

Input

  • eRdee \in \R^{d_e}: neural network activations
    • attention, position-wise feed forward의 output이 layer_norm의 input으로 들어갑니다.

Output

  • e^Rde\hat{e} \in \R^{d_e}: normalized activations

Parameters

  • γ,βRde\gamma, \beta \in \R^{d_e}: element-wise scale(γ\gamma)and offset(β\beta)

과정

  • 1번: mean을 계산합니다.
  • 2번: variance를 계산합니다.
  • 3번: ee를 standard normalization으로 바꾼 이후에 element-wise scaling과 offset을 적용해줍니다.
    • e^(0,12)\hat{e} \sim (0,1^2)e^(0,γ2)\hat{e} \sim (0,\gamma^2)e^(β,γ2)\hat{e} \sim (\beta,\gamma^2) 로 변화된다.
    • 데이터가 가지는 확률 분포를 학습하기 위해 standard normalization으로 바꾼 이후 mean, variance를 찾는 과정이라고 생각할 수 있다.

Algorithm 7. Unembedding

Input

  • eRdee \in \R^{d_e}: a token encoding
    • encoding된 token을 의미한다.

Output

  • pΔ(V)p \in \Delta(V): a probability distibution over the vocabulary
    • vocabulary에 등장하는 token에 대한 확률을 의미한다.

Parameters

  • WuRNV×deW_u \in \R^{N_V\times d_e}: the embedding matrix

과정

  • 1번: encoding된 token의 dimension을 NVN_V로 변환합니다. 이후 softmax를 이용해 vocabulary에서 각 token이 등장할 확률을 계산합니다.
    • NVN_V로 변환된 dimension의 각 index는 결국 vocabulary의 각 token들을 가리킵니다. 만약 softmax를 통과한 1번 index의 값이 0.9라면 1번 token이 등장할 확률이 0.9라는 뜻이 됩니다.

그 외

  • Algorithm 1~7번을 바탕으로 Algorithm 8 ~ 15번에는Transformers 모델 구조, train 방법, inference 방법에 대한 pseudocode를 제시하고 있습니다.
    • Algorithm 8 ~ 15번에 소개되는 pseudocode에 대해서도 같이 살펴볼 수 있으면 좋겠습니다.
  • Section 6번부터는 Encoder-Decoder, Encoder-only, Decoder-only Transformer에 대한 preview를 같이 제공하고 있습니다.
  • Transformer를 이용하여 독일어를 영어로 번역하는 실습을 간단하게 여기서 해볼 수 있습니다.
profile
Deep Dive into Development (GitHub Blog: https://nkw011.github.io/)

0개의 댓글