Transformers
- Transformer Network Intuition
- Self-Attention
- Multi-Head Attention
- Transformer Network
Transformer Network Intuition
오늘날 가장 성능이 좋은 NLP 모델들은 거의 다 Transformer를 기반으로 하고 있다.
기본적인 RNN은 time step이 길어질수록 Vanishing gradient 현상이 있었고, 이를 보완하기 위해 GRU, LSTM 등의 더 복잡한 구조가 나왔다.
또한 위의 세 구조는 모두다 sequential model 들이다. 이러한 구조는 마지막 unit의 결과를 얻으려면 그 전 unit들의 결과를 모두 계산해야 하기 때문에 각 unit이 모델의 bottleneck이 된다고 생각할 수 있다.
Transformer는 Attention + CNN 의 방식을 통해 전체 문장을 한번에 입력받고, 전체 sequence에 대한 많은 계산을 동시에 평행하게 할 수 있게 해준다.
Self Attention
Attention을 CNN의 구조 처럼사용하려면, 입력받은 문장의 각 단어를 attention기반으로 표현하는 self-attention을 계산해야 한다.
self attention representation 는 A(q,K,V) 의 구성을 가지며, 다음과 같은 과정으로 구한다.
이전의 프랑스어 예제 "Jane visite I'Afrique on Septembre" 라는 문장 중 x^<3>인 I'Afrique를 Self attention으로 표현한다고 가정해보자.
먼저 해야 할 일은 I'Afrique가 여행 목적지로 쓰였는지, 세계에서 두번째로 큰 대륙으로 쓰였는지 등 context를 파악하는 것이다.
식을 보면 RNN 에서의 Attention처럼 기본적으로 softmax를 포함하고 있으며, q(query),k(key),v(value)를 사용해 계산한다.
x<3>인 l'Afrique에 대한 A(q,K,V)를 구한다고 해보자.
먼저 각 learning parameter W와 word의 embedding 을 내적해 q,k,v를 계산한다.
q와 k에 대해 개념적인 아이디어를 설명하자면 , q는 간단히 말해 해당 단어에 어떤 일이 일어났냐? 라는 query 질문이라고 생각할 수 있다. k는 해당 단어의 카테고리 정도로 생각할 수 있고, q와 k의 내적은 어떤 일이 일어났는지에 대해 얼마나 잘 설명할 수 있냐의 수치로 생각할 수 있다.
(Q = interesting questions about the words in a sentence, K = qualities of words given a Q, V = specific representations of words given a Q)
q<3>와 다른 모든 단어의 k값을 내적해보면 action을 나타내는 visite와의 내적 값이 제일 높을 것이라고 추측할 수 있다.
그리고 구한 각각의 내적값에 v를 곱해주고 모두 더하여 최종적으로 A를 계산한다.
이렇게 모든 input word에 대한 A를 구하고, 이 A들을 전체적으로 묶어 vectorization한 표현은 다음과 같다.
(dk는 내적값이 발산하지 않게 scaling하기 위한 값이다. scaled dot product attention dmodel / numheads )
self attention의 핵심적인 이점은 word가 고정된 word embedding을 갖지 않는다는 것이다. 문맥의 다른 단어들을 참고하여 훨씬 더 새롭고, 풍부한 representation을 만들어낼 수 있다는 것이다.
Multi Head Attention
Multi Head Attention은 기본적으로 Self attention의 큰 반복과정이다.
Head 는 self-attention을 계산하는 매 과정을 가르킨다. 따라서 Multi- head attention은 self attention 계산을 여러번 진행하는 과정이라고 할 수 있다.
앞의 과정에서 각각의 input word에 대한 q,k,v를 계산해서 얻었었다. multi head attention에서는 각 단어의 q,k,v set를 그대로 가져와 WQ1, WK1, WV_1 곱해준다. self attention을 구한것처럼 A를 구해주며, 이것을 하나의 Head라고 부른다.
핵심은 WQ1, WQ2, ... , WQ8 등등은 모두 다른 weight들이고, 각자 주목을 하는 목표가 다르다. 예를들어 W1은 어떤 일 이일어났는지에 대해 집중하고 W2언제, W3은 어디서 에 집중하는 등이 될 수 있다.
각 Head는 모두 다른 W를 사용하므로 병렬으로 동시에 계산이 가능하다. 모든 Head의 계산을 마치면 각 Head를 더한 뒤 W_o를 곱해 최종적으로 MultiHead(Q,K,V) 를 만들어준다.
Transformer Network
Transformer의 '기본적인' 구조는 아래와 같다.
Encoder는 앞서 설명했던 것처럼 입력 문장으로 부터 Multi Head Attention을 계산하고 그 결과값을 Feed Forward Network로 넘겨준다. Encoder 또한 여러개로 구성되어있으며 Google의 "Attention is all you need "에서는 6개를 사용했다.
Decoder에는 Multi Head Attention이 2개의 층으로 쌓여있는데, 첫번째 층은 Decoder가 예측해내는 단어들로부터 계산한 Q 를 2번째 Multi Head Attention layer에 올려준다. 2번째 layer에서는 Q는 decoder로부터, K,V 는 Encoder로부터 전달받아 결과를 계산한다.(따라서 Self attention이 아니다.)
더 나은 결과를 위해 추가적으로 고려해야 할 요소는 바로 '단어의 순서'이다. 실제로 단어가 문장의 어디에 나오는지는 번역에 큰 영향을 미친다. RNN과 달리 Transformer는 data를 한꺼번에 처리하기 때문에 우리는 Embedding Matrix에 Positional Encoding Matrix를 더해준다.
d_model은 embedding matrix와 positional encoding matrix의 dimension이다.
pos는 입력 문장의 임베딩 벡터 위치를 나타내고, i는 그 임베딩 벡터에서의 index를 나타낸다.
i가 짝수일 때는 sin을, 홀수일 때는 cos의 값을 사용한다. 이를 사용하면 문장의 순서 정보가 보존될 뿐 만 아니라 같은 단어라도 위치에 따라 값이 달라지며, -1~1의 범위이기 때문에 처음 Matrix의 값과 크게 차이가나지 않는다.
Decoder의 첫번째 Multi Head Attention는 Masked Multi head attention 층이다.
RNN에서와 마찬가지로, Transformer는 Training을 할 때 Decoder의 입력으로 < sos >만 주는 것이 아니라 해당 문장에 대한 정답을 전부 제공한다. 이 경우 Decoder가 다음 예측을 하는 의미가 없어지기 때문에, 문장의 일부를 가려 현재 시점보다 뒤에 있는 단어들을 참고하지 못하게 하는 역할을 한다.
이때까지의 요소들을 모두 합하면 아래와 같은 구조를 가진 Transformer를 구현할 수 있다.
padding mask