그림으로 보는 Transformer 번역 및 정리

2020. 2. 10. 17:39nlp

반응형

https://jalammar.github.io/illustrated-transformer/

 

The Illustrated Transformer

Discussions: Hacker News (65 points, 4 comments), Reddit r/MachineLearning (29 points, 3 comments) Translations: Chinese (Simplified), Korean Watch: MIT’s Deep Learning State of the Art lecture referencing this post In the previous post, we looked at Atten

jalammar.github.io

 

 

 

 

1) Encoder

- 첫번째(맨 아래) Encoder만 word embedding을 input으로 받는다. 그 다음 Encoder들은 전 Encoder의 output을 그대로 input으로 받는다

- 아래 그림에서 녹색 벡터 x1, x2는 embedding vector

 

 

Self-Attention

1단계 : 각 input으로부터 3개의 벡터(q,k,v) 만들기

(ex) "The animal  didn't cross the street because it was too tired.

- 이 문장에서 'it'이 가리키는 것은? 'the animal'

- self-attention을 이용하면 it 과 the animal을 연과지을 수 있다

 

Embedding 차원(길이)는 512 / Q,K,V는 64

 

- Encoder의 각 input vector로부터 3개의 벡터를 만들어냄 

- 3개의 벡터 : Query Vector Key Vector, Value Vector 

- 3개의 벡터 만드는 방법? input vector인 x1을 W_Q, W_K, W_V 행렬과 곱해 q1, k1, v1을 만들고,  x2를 W_Q, W_K, W_V 행렬과 곱해 q2, k2, v2을 만듦 

 

2단계 : score 계산하기 

- 특정 단어와 문장에 사용된 모든 단어와의 점수(연관성) 계산하기 

- 특정단어가 x1 이라면 x1의 Query 벡터를 다른 모든 단어의 Key 벡터와 곱해 계산함

- q1•k1 , q1•k2 , q1•k3 , q1•k4 ...

 

 

 

3단계 : score를 key vector 길이의 제곱근으로 나누고 softmax 함수에 넣기 

- 여기서 key vector 길이 = 64

- 따라서 8로 나눔

 

 

 

4단계 : Softmax의 결과값을 각 input의 value vector와 곱하고, 이렇게 구한 모든 weighted value vector들을 더함

- 여기까지 하면 이 포지션에서 self-attention layer의 output 완성

 

 

그러나 실제 Self-Attention 계산은 행렬 곱으로 이루어짐 (Matrix Calculation)

 

1단계

2-4단계

 

 

 

Multi-headed Attention

- head의 개수만큼 서로 다른 W_Q, W_K, W_V 행렬이 있음 

- 그래서 (같은 포지션/단어라도) head 개수만큼 서로 다른 query, key, value 벡터가 나옴 

 

 

 

- 하지만 feed-forward layer에 이 8개 행렬을 다 넣어줄 수 없음. 1개의 행렬만 input으로 받아들임 

- 따라서 이 8개 행렬을 압축함 

- 압축을 어떻게? W_O 행렬과 곱해서 

 

Multi-headed Attention 요약

 

 

Positional Encoding

- input sentence에서 지금 처리하고 있는 단어가 어떤 순서에 위치하는지 알아야 함 

- 이 정보를 넘겨주는 것이 positional encoding 

- 원래의 input(첫 레이어라면 embedding, 아니라면 전 encoder의 output) + positional encoding 을 입력으로 해서 query/key/value 벡터 등등을 구한다

 

 

 

Add & Normalize

- 사이 사이에 Add & Normalize 도 함 

 

 

 

 

2) Decoder

 

- 맨 위 Encoder의 output은 Key vector와 Value vector로 변형(transformed)되고, 이들이 Decoder의 [encoder-decoder attention] 레이어에 전해진다

- <eos> 나올 때까지 계속 단어 만듦

 

- 맨 아래(첫) Decoder는 맨 위 Encoder 출력의 Key/Value 벡터를 입력으로 받아 첫 단어를 생성

- 그 다음 Decoder는 [맨 위 Encoder 출력의 Key/Value 벡터] + [그 전에 Decoder가 생성한 단어들]을 입력으로 받아 다음 단어 생성

* [그 전에 Decoder가 생성한 단어들] : 얘네도 Encoder에서와 마찬가지로 embedding + positional encoding을 거쳐 Decoder에 입력됨

- Encoder와 다른점 : Decoder의 [Encoder-Decoder Attention] 레이어는 해당 time-stamp 이후의 단어는 참조 X, 이전 단어만 참조

 

 

3) Linear and Softmax Layer

 

 

반응형