2020. 2. 10. 17:39ㆍnlp
https://jalammar.github.io/illustrated-transformer/
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을 연과지을 수 있다
- 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
'nlp' 카테고리의 다른 글
그림으로 보는 BERT 번역 및 정리 (0) | 2020.02.11 |
---|---|
Seq2seq pay Attention to Self Attention Part 1-2 번역 및 정리 (0) | 2020.02.10 |
[seq2seq + Attention] 불어-영어 번역 모델 PyTorch로 구현하기 (0) | 2020.02.10 |
Attention Model 번역 및 정리 (0) | 2020.02.10 |
seq2seq 모델 PyTorch로 구현하기 번역 및 정리 (9) | 2020.02.09 |