(self-attention layer는 encoder가 하나의 특정한 단어를 encode 하기 위해서 입력 내의 모든 다른 단어들과의 관계를 살핌)
- 입력이 self-attention 층을 통과하여 나온 출력은 다시 feed-forward 신경망으로 들어간다.
(똑같은 feed-forward 신경망이 각 위치의 단어마다 독립적으로 적용되어 출력)
decoder에는 encoder-decoder attention 이 포함
- decoder 또한 encoder에 있는 두 layer 모두를 가지고 있다
- 두 층 사이에 encoder-decoder attention 이 포함
➜decoder가 입력 문장 중에서 각 타임 스텝에서 가장 관련 있는 부분에 집중할 수 있도록 함
Transformer : 벡터 기준으로 보기
'I am a student' 의 프랑스어
- 각 단어들은 워드 임베딩을 통해 벡터로 변환
- 각 단어들은 크기 512의 벡터
- 워드 임베딩은 encoder에서 발생
- 모든 encoder는 크기 512의 벡터 리스트를 입력으로 받음 (벡터 리스트 사이즈는 하이퍼 파라미터)
(학습 데이터 셋에서 가장 긴 문장 길이로 설정 가능)
- 입력 문장들의 단어들을 임베딩한 후,
- 각 단어에 해당하는 벡터들은 encoder 내의 두 개의 서브 레이어로 들어감
- 이 리스트를 먼저 self-attention layer에, 그다음으로 feed-forward 신경망에 통과
- 그 결과물을 그다음 encoder에게 전달
각 위치의 단어들은 각각 다른 self-encoding 과정을 거친다
- Z들은 모두 context vector
* 참조
Input Vector의 형태
여기서는 인풋 사이즈가 512
문장의 길이는 그렇게 길지 않기 때문에
문장 끝에 eos라는 문장의 끝을 알리는 스페셜 토큰 이후로는 모두 패딩 처리
Transformer – Architecture
Encoder 구조
- 동일한 구조를 갖는 N개 layer로 구성
- 각 layer는 두 개의 sub-layer로 구성
① Multi-Head Self-Attention
② Feed Forward Network
- Positional Encoding
• 단어의 위치 정보를 인코딩
Decoder 구조
- 동일한 구조를 갖는 N개 layer로 구성
- 각 layer는 세 개의 sub-layer로 구성
① (Masked) Multi-Head Self-Attention masking을 통해, 현재 단어보다 이후에 있는 단어에 대해 attention 안 줌
② Encoder-Decoder Attention
③ Feed Forward Network
* Masked Multi-Head Attention 단어 a를 예측할 때는 a 이후에 있는 b, c에는 attention이 주어지지 않는다. b를 예측할 때는 b 이전에 있는 a에만 attention이 주어지고, 이후에 있는 c에는 attention이 주어지지 않는다. 출처 : https://pozalabs.github.io/transformer/
Self-Attention
The animal didn't cross the street because it was too tired
위 문장을 번역하고자 한다.
이때 위 문장에서 밑줄 친 'it'의 의미는 무엇일까?
사람에게는 너무나도 간단한 질문이지만 신경망 모델에게는 간단한 문제가 아니다.
이때 모델은 self-attention을 이용하여 'it'과 'animal'을 연결지을 수 있다.
모델이 입력 문장 내의 각 단어를 처리해 나감에 따라,
self-attention은 입력 문장 내의 다른 위치에 있는 단어들을 보고
거기서 힌트를 받아 현재 타겟 위치의 단어를 더 잘 인코딩할 수 있다.
= Transformer에게는 이 self-attention이 현재 처리 중인 단어에 다른 연관 있는 단어들의 맥락을 불어 넣어주는 method
Scaled Dot-Product Attention
- 현재의 단어(Query)가 어떤 단어와 관련성이 있는지 알기 위해 한 문장 내 모든 단어(Key)들과 dot-product 연산을 한다.
(dot-product 연산 = 서로 벡터를 곱한다)
Transformer에서 Attention은 위 수식으로 계산
- query 단어와 key 단어를 dot-product한 뒤 softmax를 한다. • 하나의 query와 모든 key들 간의 연관성(유사성)을 계산한 뒤 그 값들을 softmax를 통해 확률 값으로 만든다. • 따라서 query 단어가 어떤 key 단어와 높은 연관성을 갖는지 알게 된다. • softmax를 거친 값을 value에 곱하면 query와 유사한 단어일수록, 즉 중요한 단어일수록 더 높은 값을 가지게 된다.
- Dimension의 루트 값으로 나눈다 (Scaled) • dimension이 커질수록 dot-product 값이 커지는 것을 방지하는 효과
두 단어간 유사도는 cosine similarity로 계산 = 현재 처리 중인 단어 (query)가 어떤 단어와 가장 관련성이 큰지 알 수 있다.
Self-Attention – Matrix Calculation (in detail)
행렬 X 의 각 행은 입력 문장의 각 단어에 해당, 우측은 행렬 형태로 표현한 self-attention 계산
- 행렬 X는 동일한 단어
- 가장 먼저, 입력 문장에 대해 Query, Key, Value 행렬들을 계산한다.
- 이를 위해 우리의 입력 벡터들 (혹은 embedding 벡터들)을 하나의 행렬 X로 쌓아 올리고
- 그것을 학습할 weight 행렬들인 WQ, WK, WV 로 곱한다.
(W은 쿼리, 키, 밸류를 각각 만들어내는 가중치)
(이 가중치들이 학습의 대상이고, 학습을 하는 과정에서 이러한 가중치들이 옵티마이저를 통해 조정됨)
우측 그림에서 self-attention 계산 단계를 표현한 것을 볼 수 있음
Multi-Head Attention
self-attention layer에다 “multi-headed” attention이라는 메커니즘을 더해 더욱더 개선한다.
multi-headed attention의 효과
1. 모델이 다른 위치에 집중하는 능력을 확장.
2. attention layer 가 여러 개의 “representation 공간”을 가지게 해줌.
multi-headed attention을 이용함으로써 여러 개의 query / key / value weight 행렬들을 가지게 된다.
이 각각의 query / key / value set은 랜덤으로 초기화되어 학습된다.
학습이 된 후 각각의 세트는 입력 벡터들에 곱해져 벡터들을 각 목적에 맞게 투영시키게 되는데,
이러한 세트가 여러개 있다는 것은 각 벡터들을 각각 다른 representation 공간으로 나타낸 다는 것을 의미한다..
입력 벡터들의 모음인 행렬 X를 WQ/WK/WV 행렬들로 곱해 각 head에 대한 Q/K/V 행렬들을 생성
self-attention 계산 과정을 8개의 다른 weight 행렬들에 대해 8번 거치게 되면, 8개의 서로 다른 Z 행렬이 나온다.
= 8개의 서로 다른 가중치 행렬이 존재
서로 다른 8개의 연산과, 서로 다른 8개의 가중치 행렬
Multi-Head Attention –concatenate & multiply
단, 이때 이 8개의 행렬을 바로 feed-forward layer으로 보낼 수 없다
(feed-forward layer 은 한 위치에 대해 오직 한 개의 행렬만을 input으로 받을 수 있음)
➜ 8개의 행렬을 하나의 행렬로 합쳐야 함
일단 모두 이어 붙여서 하나의 행렬로 만들어버리고, 그다음 하나의 또 다른 weight 행렬인 W0을 곱해버린다.
위에서 본 문장 "The animal didn't cross the street because it was too tired" 에서
it을 encode할 때, 주황색의 attention head 는 “그 동물”에 가장 집중하고, 초록색의 head는 “피곤”이라는 단어에 집중한다.
= 모델은 이 두 개의 attention head를 이용하여
“동물”과 “피곤” 두 단어 모두에 대한 representation 을 “it"의 representation에 포함시킬 수 있다.
Multi-Head Attention 총정리
multi-headed self-attention의 모든 과정 요약
1) 입력 문장이 들어옴 ("Thinking Machine")
2) 워드임베딩
3) 멀티헤드
4) 연산결과, 쿼리 키 밸류 벡터가 나옴
5) 각각 가중치행렬 연산을 하여 나온 z행렬들을 모두 합침
= Z를 얻음
Positional Encoding
= 시퀀스의 순서 나타내기
Transfomer모델은 어떻게 입력 문장들의 순서를 파악할까
- Transformer 모델은 각각의 입력 embedding에 “positional encoding”이라고 불리는 하나의 벡터를 추가한다.
- 이 벡터들은 모델이 학습하는 특정한 패턴을 따르는데,
- 이러한 패턴은 모델이 각 단어의 위치와 시퀀스 내의 다른 단어 간의 위치 차이에 대한 정보를 알 수 있게 한다
모델에게 순서정보를 주기 위하여, 위치 별로 특정한 패턴을 따르는 positional encoding 벡터들을 추가
= 같은 단어라도 단어가 위치한 자리에 따라 임베딩 값이 달라진다는 것이 핵심
Architecture - Residual Connection
각 encoder 내의 sub-layer 가 residual connection으로 연결되어 있으며, 그 후에는 layer-normalization과정을 거친다
positional encoding이 결합되어 들어간다.
Residual Connection - 서브레이어의 결과값에 기존 입력값을 더해주는 방법 (Add) - 레이어를 거칠수록 gradient가 소멸되는 vanishing gradient 문제를 완화하여 심층 신경망 학습에 도움
이어서 Layer Normalization을 수행 - gradient가 exploding하거나 vanishing하는 문제를 완화 - gradient가 안정적인 값을 가지게 되어 더 빨리 학습
- 이들은 각 decoder의 “encoder-decoder attention” layer에서 decoder가 입력시퀀스에서 적절한 장소에 집중하게 한다.
디코더 작동과정.gif
- encoding 단계가 끝나면 이제 decoding 단계가 시작된다
- decoding 단계의 각 스텝은 출력 시퀀스의 한 element를 출력
- 디코딩 스텝은 decoder가 출력을 완료했다는 special 기호인<end of sentence>를 출력할 때까지 반복
- 각 스텝마다의 출력된 단어는 다음 스텝의 가장 밑단의 decoder에 들어가고
encoder와 마찬가지로 여러 개의 decoder를 거쳐 올라간다.
- encoder의 입력에 했던 것과 동일하게 embed를 한다
- positional encoding을 추가하여 decoder에게 각 단어의 위치 정보를 더해준다.
<작동과정 2-5>
- “Encoder-Decoder Attention” layer 은 multi-head self-attention 과 한 가지를 제외하고는 똑같은 방법으로 작동
- 차이점은 Query행렬들을 그 밑의 layer에서 가져오고 Key와 Value 행렬들을 encoder의 출력에서 가져온다는 점
Key와 Value 행렬들을 encoder의 출력에서 가져온다
추가)
도대체 Query, Key, Value란 무엇인가?
Thinking과 Machine이라는 단어는 가중치 행렬들을 만나 각각의 쿼리, 키, 밸류 행렬을 생성한다.
Thinking이 쿼리일 때, 각각 단어들의 키들과 attention 연산을 수행한다
(이때, 임베딩된 단어가 직접 연산되는 것이 아닌, 분신과도 같은 쿼리와 키들이 연산이 된다)
연산결과, 값들이 너무 커지지 않도록 스케일링을 진행한다.
(ex. 8로 나눈다)
그 후 softmax 연산을 통해 확률 연산을 한다.
그리고 이전에 구해놓았던 밸류 벡터와 softmax 결과 나온 확률값을 연산한다.
그 결과 context vector가 나온다.
Linear Layer과 Softmax Layer
여러 개의 decoder를 거치고 난 후에는 소수로 이루어진 벡터 하나가 남게 된다
어떻게 이 하나의 벡터를 단어로 바꿀 수 있을까?
= Linear layer, Softmax layer
<Linear layer>
= fully-connected 신경망으로 decoder가 마지막으로 출력한 벡터를 훨씬 더 큰 사이즈의 벡터인 logits 벡터로 투영시킨다.
어떤 모델이 training 데이터에서 총 10,000개의 영어 단어를 학습하였다고 가정
(이를 모델의 “output vocabulary”라고 부른다).
그렇다면 이 경우에 logits vector의 크기는 10,000이 될 것이다 – 벡터의 각 셀은 그에 대응하는 각 단어에 대한 점수가 됨.이렇게 되면 Linear layer의 결과로서 나오는 출력에 대해서 해석을 할 수 있게 된다.
<softmax layer>
그다음에 나오는softmax layer softmax layer는 이 점수들을 확률로 변환해주는 역할을 한다..
(셀들의 변환된 확률 값들은 모두 양수 값을 가지며 다 더하게 되면 1이 됨)
가장 높은 확률 값을 가지는 셀에 해당하는 단어가 해당 스텝의 최종 결과물로서 출력되게 됩니다.
decoder에서 나온 출력은 Linear layer 와 softmax layer를 통과하여 최종 출력 단어로 변환
학습 과정
• 기계번역을 위한 학습을 할 때, source language 문장과 target language 문장의 쌍이 학습데이터임
“오늘은 목요일입니다”, “Today is Thursday” “merci” , “thanks” “Je suis étudiant” , “I am a student
one-hot encoding으로 단어 표현
output vocabulary 가 6개의 단어만
((“a”, “am”, “i”, “thanks”, “student”, and “<eos>” (‘end of sentence’의 줄임말))) 포함하고 있다고 가정
단어 ‘am’에 대한 one-hot encoding 벡터
정답 문장(번역문)을 벡터로 표현한 예시
(각 단어에 대한 one-hot encoding)
모델을 큰 사이즈의 데이터 셋에서 충분히 학습을 시키고 나면,
트랜스포머 모델로 학습한 결과로 생성되는 확률 분포들은 다음과 같다.
학습된 모델의 결과
여기서 특이한 점은, 학습의 목표로 하는 벡터들과는 달리,
모델의 출력값은 비록 다른 단어들이 최종 출력이 될 가능성이 거의 없다 해도
모든 단어가 0보다는 조금씩 더 큰 확률을 가진다는 점.
➜학습 과정을 도와주는 softmax layer의 매우 유용한 성질
+
모델은 한 타임 스텝 당 하나의 벡터를 출력하기 때문에 우리는 모델이 가장 높은 확률을 가지는 하나의 단어만 저장하고 나머지는 버린다고 생각하기 쉽다.
그러나 그것은 greedy decoding이라고 부르는 한가지 방법일 뿐이며 다른 방법들도 존재한다.
예를 들어 가장 확률이 높은 두 개의 단어를 저장할 수 있다 (위의 예시에서는 ‘I’와 ‘student’).
그렇다면 모델을 두 번 돌리게 된다. 한 번은 첫 번째 출력이 ‘I’이라고 가정하고 다른 한 번은 ‘student’라고 가정하고 두 번째 출력을 생성해보는 것.
이렇게 나온 결과에서 첫 번째와 두 번째 출력 단어를 동시에 고려했을 때, 더 낮은 에러를 보이는 결과의 첫 번째 단어가 실제 출력으로 선택된다.
이 과정을 두 번째, 세 번째, 그리고 마지막 타임 스텝까지 반복해 나가는데, 이렇게 출력을 결정하는 방법을 “beam search”라고 부르며,
고려하는 단어의 수를 beam size, 고려하는 미래 출력 개수를 top_beams라고 한다.
위에서는 두개의 단어를 저장 했으므로 beam size가 2이며, 첫 번째 출력을 위해 두 번째 스텝의 출력까지 고려했으므로 top_beams 또한 2인 beam search를 한 것. ( beam size 와 top_beams 는 모두 학습전에 미리 정하고 실험해볼 수 있는 hyperparameter들이다.)