transformer 간단요약2 - encoder, attention, positional encoding, decoder

1. encoder

 

encoder는 self attention 구조와 feed forward Neural Network 구조의 두개의 sub layer로 구성되어 있다

 

 

 

단어 입력의 경우에는 먼저 embedding vector로 변환하는 것이 기본이다.

 

 

 

당연하지만 word embedding은 맨 밑단 첫 입력에서만 일어남

 

벡터 크기는 hyperparameter로 적절하게 정한다고 한다.

 

embedding된 벡터 각각은 자기만의 경로를 따라 encoder를 지나간다

 

 

 

 

위에서 보면 첫 통과 layer로 self attention을 지나가는데 도대체 무슨 일이 일어날까?

 

예를 들어보면 ‘The animal didn’t cross the street because it was too tired.’을 생각해보자.

 

이 문장을 정확히 이해하려면 먼저 it의 의미를 알아야한다.

 

it의 의미는 어떻게 아는가? 문장 내 단어들 사이의 맥락을 통해서 이해하겠지.

 

이러한 아이디어에 착안하여 self attention을 통과하면 the animal과 it이 연관성이 높을 것이다라고 예측하는 것이다.

 

모델이 입력 문장 내 단어를 처리할 때 문장 내 다른 위치에 있는 단어들에 힌트를 받아 현재 위치의 단어를 더욱 encoding을 잘하게 해줌

 

 

 

self-attention을 지나가면 현재 위치의 단어에 대한 처리에 다른 단어들이 영향을 준다.

 

물론 feed forward Network는 그냥 독립적으로 그대로 흘러간다

 

 

2. self-attention은 어떻게 가능한가

 

embedding된 thinking와 machine가 encoder를 지나간다고 해보자.

 

그러면 self attention layer는 각 단어에 대해 3개의 vector를 각각 만드는데, Query, Key, Value vector를 만든다.

 

 

 

 

embedding된 x1에 query를 만드는 가중치행렬 $W^{Q}$를 곱하면 x1의 query vector이 나온다.

 

나머지 key는 $W^{K}$를 곱해서 만들어지고 value는 $W^{V}$를 곱해서 만들어진다.

 

다음으로 Self attention은 각 vector에 대해 score를 계산한다.

 

self attention이 다른 단어들과의 연관성을 계산해준다고 했기 때문에 단어와 문장 내 모든 단어들과의 연관성 점수를 계산하고자 한다.

 

현재 위치의 이 단어를 encoding 할때 얼마나 다른 단어에 집중해야하는지 알려준다.

 

이 score은 예를 들면 x1의 query vector와 문장 내 모든 단어 x1,x2,x3,...의 key vector의 내적으로 계산된다. <자기 자신인 x1도 포함된다는 점에 주목>

 

내적을 하는 이유는 내적이 두 벡터의 연관성의 측도라서 그렇다.

 

 

 

 

이 내적값들의 모임이 각 단어의 score vector< (112,96)이 thinking의 score vector >이다.

 

이것을 normalize하는데 key vector의 크기의 제곱근으로 나눠준다.

 

normalize 하는 이유는 안정적인 gradient를 가지게 해줘서 그렇단다

 

참고로 key vector의 크기는 보통 hyperparameter?? embedding 벡터 크기를 우리가 정할 수 있으니까 그렇다.

 

그 다음에 softmax연산을 통해 문장 내 단어들과의 연관성 정도를 보여주는 attention weight vector를 계산한다.

 

이것은 각 원소가 0과 1사이, 합이 1인 연관이 가장 높을 확률정도로 해석하게 만들어줄 수 있다. (당연하지만 자기 자신이 가장 높을 것이다.)

 

다음 단계로 각각의 softmax score에 각 단어의 value vector의 element wise product를 한다.

 

첫번째 softmax score에 첫번째 단어의 value vector를 곱하고

 

두번째 softmax score에 두번째 단어의 value vector를 곱한다.

 

가중치<연관성>가 높은 value에 더 집중을 하고 그렇지 않은 곳에는 적은 가중치를 두어 없애버리고 싶어서 그렇다.

 

마지막으로 weighted value vector v1,v2를 전부 합해버리면 한 단어의 self attention 출력이 된다 <벡터합이니까 벡터로 나오네>

 

self attention output을 만드는 과정

 

 

여기서 주목할 점은 query와 key는 내적해야하므로 차원이 같아야한다.

 

그러나 value vector는 차원이 달라도 된다 .. 편의상 같게 설정은 한다고 하는데?

 

단어 embedding vector 여러개를 하나의 행렬로 묶고 계산해보면 이 과정이 간단해진다.

 

 

 

 

행렬 연산으로 아주 간단하게 하나의 식으로 구할 수 있다

 

 

3. self attention은 왜 잘 동작하는가

 

MLP와 CNN은 고정된 네트워크에서 input이 고정되어있으면 output이 반드시 고정되어있다.

 

transformer은 고정된 네트워크에서 input 한 단어는 고정되어 있더라도 input 내 다른 단어가 변하면 output이 다르다.

 

MLP보다 더 유연하면서 더 많은 것을 표현한다, 더 많은 것을 계산한다.

 

그런데 단점도 있다.

 

예를 들어 RNN은 1000개 sequence를 넣으면 1000번 돌리는데 시간이 좀 걸리더라도 1번당 계산은 꽤 간단한 편이다.

 

그런데 transformer은 1000개 단어를 넣으면 matrix로 계산하니까 cost가 $O(n^{2})$이 되어 n이 커지면 굉장히 비효율적이 된다.

 

기본적으로 메모리를 많이 잡아먹지만 그럼에도 불구하고 표현력의 증가를 얻으니 쓰게된다.

 

 

4. multi headed attention

 

하나의 embedding vector에 대해 여러개의 attention을 작동하여 Q,K,V를 각각 n개나 만드는 것이다.

 

모델이 단어의 다른 위치들에 더욱 집중하게 해준다.

 

하나만 했을 경우 다른 단어들의 encoding을 조금은 포함했겠지만 사실 자기 자신에게 너무 큰 점수를 준 경우도 분명 많을 것이기 때문이다.

 

그런데 말로는 서로 다른 headed attention에 들어가는듯 말하는데

 

코딩으로 실제로 구현할 때는 처음 나온 Q,K,V를 split한다고한다. 편의상?

 

예를 들어 8개의 각각 서로 다른 q,k,v 가중치 행렬을 가지는 headed attention을 만들었다면 당연히 8개의 다른 Z행렬(weighted sum of value)을 얻는다

 

 

 

그런데 이 결과를 다음 layer인 feed forward layer로 바로 보낼 순 없다.

 

왜냐하면 하나의 위치에 하나의 행렬만 보낼 수 있는데 하나의 input에 8개의 output이 나와버렸으니까 그렇다.

 

그래서 이 8개의 Z행렬을 하나로 합치는 방법이란,

 

일단 8개의 z행렬을 concatenation하고 차원을 줄이는 output에 대한 가중치행렬 $W^{O}$를 곱해서 하나의 작은 행렬로 만든다.

 

그러면 input X의 dimension과 만들어진 작은 행렬의 dimension이 같게 된다.

 

multi headed attention에서 output을 만드는 방법

 

 

concatenation을 하고 차원을 줄이는 행렬을 곱해 하나의 작은 행렬을 만든다

 

 

5. Positional encoding

 

지금까지 transformer이 완벽해보였지만 한가지 놓친 점은 입력으로 들어온 sequence의 순서를 전혀 고려하고 있지 않았다.

 

예를 들어 attention layer의 동작 방식만 생각해보자.

 

a,b,c,d로 들어가나 b,c,a,d로 들어가나 a에 영향 주는 b,c,d에 대해 attention output 계산되는건 동일하다.

 

상식적으로는 문장 내 단어의 배열은 매우 중요하여 다른 값이 나와야 맞다.

 

예를 들어 개가 사람을 물었다와 사람이 개를 물었다는 엄청난 차이다.

 

그래서 input에 positional encoding을 위한 어떠한 값을 더하여 이러한 순서 요인도 고려하고자 했음

 

첫 input에만 positional encoding이 들어간다는 것을 보여주는 그림

 

 

positional encoding의 하나의 예시

 

 

다음에 이제 encoder는 각 내부 구조가 residual connection으로 이루어져있고 layer normalization을 한다는 등 아무튼 그럼

 

ResNet에서 사용한 Residual learning의 원리로 학습성능을 향상시키고자함

 

 

 

 

학습성능 향상을 위해 residual learning을 이용함

 

layer normalization을 사용했다고함

 

 

6. decoder

 

decoder 내부 구조는 encoder와 기본적으로 동일하다.

 

그런데 encoder가 끝나고 decoder로 어떻게 넘어가는지가 중요하다.

 

encoder가 입력 시퀀스를 처리하면서 최상층에 도달하면

 

<encoder의 최상층의 출력이 decoder의 multi headed attention layer의 key,value attention으로 변형되어 넘어간다>

 

그리고 첫 decoder에만 들어가는 것이 아니고 모든 decoder에 들어감

 

encoder 최상층의 출력은 input sequence에서 얻은 맥락정보

 

그러니까 헷갈려서는 안되는게 이 맥락정보만 decoder가 받아서 input sequence의 단어들이 각각 어떤 단어가 되는지 딱 나오는 것이 아니라

 

이미 가지고 있는 output의 단어사전도 decoder에 넣어서 가장 확률이 높은 곳에 적절하게 매치해주는거임

 

도대체 encoder에서 decoder로 무엇이 넘어가느냐 논란의 그림

 

 

decoder는 특이하게 첫 layer에서는 masked multi headed attention을 한다

 

 

 

 

decoder에 들어가는 vocab에서 아직 출력되지 않은 단어들에 attention하지 않도록 방지

 

masked multi headed attention의 원문

 

 

마지막으로 이전 decoder는 다음 decoder로 query 행렬을 보내고

 

든 decoder는 encoder의 최상층이 보내는 attention key,value를 사용한다.

 

 

 

 

decoder의 계속되는 연산으로 decoder output이 나오면 linear layer와 softmax layer를 거쳐 단어의 확률분포를 구해준다.

 

 

가장 확률이 높은 단어를 그 위치에서 생성해낸다.

 

 

 

 

 

linear layer는 decoder가 끝난 벡터를 더 큰 벡터로 뽑아준다

 

decoding이 끝난 decoding의 output sequence(번역하고자하는 언어로의 단어사전)와 동일한 차원으로 맞춰준다.

 

 

 

linear layer의 의미 근데 확률값으로 보기 어려우니 softmax를 취하는것.

 

 

최종 결과는 단어사전의 확률분포

 

근데 이제 확률이 가장 높은 단어를 뽑으면 되겠지

 

 

 

7. vision transformer

 

transformer이 단어 문제를 해결하는데 사용했지만 이 구조의 원리(self attention)가 다른 문제에서도 폭넓게 활용되고 있다.

 

vision transformer의 예시

 

 

한 이미지를 부분 영역으로 나눠서 sequence처럼 input으로 넣어 transformer encoding을 해서 번역함

 

그런데 decoding이 없네 있을 필요가 없지

 

attention 구조가 활용된 것이 중요함

 

 

8. DALL-E

 

문장을 보고 문장에 맞는 이미지를 여러개 뽑아내는 획기적인 기술?

 

아직 자세한 설명이 공개가 안됨

 

transformer로 generation을 했다는 것이 인상적이다

 

 

 

 

 

 

 

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

 

The Illustrated Transformer

저번 글에서 다뤘던 attention seq2seq 모델에 이어, attention 을 활용한 또 다른 모델인 Transformer 모델에 대해 얘기해보려 합니다. 2017 NIPS에서 Google이 소개했던 Transformer는 NLP 학계에서 정말 큰 주목을

nlpinkorean.github.io

 

 

 

 

https://www.youtube.com/watch?v=AA621UofTUA&feature=youtu.be

 

 

 

TAGS.

Comments