rueki

Attention과 Transformer 까지 정리 본문

DL

Attention과 Transformer 까지 정리

륵기 2020. 9. 10. 17:47
728x90
반응형

Attention의 등장은 Seq2Seq의 문제점을 해결하려고 나온 것으로 볼 수가 있는데,

먼저 Seq2Seq(Sequence to Sequence) 구조를 알아보자.

 

Seq2Seq은 크게 Encoder와 Decoder의 구조를 가지는데 이 구조는 RNN의 구조로 구성을 한 것이다.

인코더의 Input으로 영어문장을 넣으면 디코더에서 번역을 한 다른 언어의 문장이 나오는 예시인데,

인코더에 넣은 영어 문장의 정보들을 하나의 context vector로 만들어서 디코더에 전달을 하게 된다.

그러나 여기서의 문제점은 문장의 길이가 점점 길어지면 어떻게 될 것인가라는 점이다.

T가 위의 예시로는 4이지만 이것이 100이되고, 1000, 10000이 된다면?

전체의 문장을 하나의 context vector(고정길이를 가짐)로 만들어서 전달을 한다는 것은 상당히 unreasonable 하며, rnn이 가지고 있는 기존의 문제점인 Sequence가 길어질수록 정보 손실이 일어날 수 있다는 점이다.

이러한 단점을 보완하고자 등장한 것이 Attention 메커니즘이다.

 

먼저 인코더 부분부터 살펴보자. e (alignment scores)가 있는 것을 볼 수가 있는데 이 score는 두 개의 input 값, Decoder의 현재 hidden state값과 Encoder hidden state(각 time step에 맞는)를 가진다. 이는 Encoder와 Encoder Sequence에 대한 score로 볼 수가 있고 이제 이를 softmax를 취해서 확률 값을 가지게 된다. 이를 Attention Weights라고 하며 총합은 1이 된다.

 

위의 단계는 첫번째 context vector를 만드는 과정이며, 이전의 과정에서 만든 attention weights를 가지고 각 time step의 인코더 hidden state와 선형 결합 연산을 통해서 디코더에 전달할 context vector를 만들고 디코더 input과 같이 input값으로 들어가게 된다.

 

Decoder의 첫 번째 출력 값인 estamos가 we are이라고 할 때, a11와 a12는 0.45의 확률 값을 갖고 나머지는 0.05씩 갖는

데, 이는 context vector가 input sequence의 관련 있는 부분만 담당한다고 볼 수가 있다.

 

Seq2Seq에 Attention 메커니즘을 적용한 전체 프로세스는 아래와 같다.

 

 

Attention에는 key, query, value 개념이 도입이 되는데, 이를 알아보기 위해 하니씩 짚고 넘어가보자.

RNN에서 attention을 적용했을 때 energy score를 얻으려면 두 개의 input을 가져야했는데, 이는 이전 state와 현재 hidden state의 값을 이용했는데 attention layer에서는 이제 Query vector와 input vector를 입력으로 받게 되며 이에 대한 similarity 계산은 두 개 벡터의 내적으로 구하게 된다. 즉 e = q * X 로 구서오디게 되며 shape은 q는 D차원, X는 N by D가 되고, e는 결과적으로 N차원이 되게 된다. 이렇게 구한 e를 통해 a = softamx(e) 를 구할 수 있고 N차원이 되며, output Y는 aX의 전체 합으로 D차원이 된다.

 

그러나 여기서 한단계 더 발전해서, 유사도 function을 dot product에서 Scaled Dot product로 바뀌고, 유사도 계산은 결국 " e = q * X / sqrt(Dq) (=> 쿼리의 차원) "이 되는데 이를 통해서 유사도가 크면 softmax값이 포화되고 기울기가 vanishing되는 문제를 해결할 수 있었다. 여기까지의 과정은 query가 single query vector인 경우이고 이제  Query의 차원이 다차원인 경우를 적용하면 이제 아래와 같게 계산이 진행된다.

여기까지 다른점이라함은 Multiple query vector가 등장했다는 것인데 이제 이를 key query value 개념을 적용해서 Attention layer를 구성했다는 것이다. Multiple Query Vector를 Key가 존재하고 Input Vector를 Key 와 Value로 분리하는데, K=XW(k) , V = XW(v) 값을 갖게된다. 이는 Input X와 key와 Value 가중치 matrix를 곱한 것이 된다.

 

 

위의 연산을 이용해서 Attention layer를 전체적 구조로 나타내면 아래와 같다.

위에서 설명한 대로, Input  X에서 key와 Value로 분리해서 사용되는 과정을 알 수가 있다. 여기서 이제 Query가 input X에서 또 분리되어서 사용한 구조를 Self - Attention이라고 한다.

Self - Attention

Self - Attention은 입력 순서에 크게 신경을 쓰지 않는데, 이유는 Attention layer가 실제로는 Vector의 순서를 인지하지는 못 하기 때문이다. 그래서 Sequential data의 순서를 알아야 하기 위해서, Positional Encoding을 추가로 넣는데 이 개념은 Transformer의 구조에서 볼 수가 있다. Transformer는 Attention으로만 Sequential data를 다룰 수 있고 무엇보다 RNN을 사용하지 않아도 된다.

 

 

 

왼쪽의 구조에서 검은색 블록이 하나의 transformer 블록이다. 이것의 장점으로 병렬 연산이 가능하다는 점과 Scale 측면에서도 뛰어난 성능을 가지고 있

다. 그리고 각 연산은 다 독립적으로 작동이 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

Attention is all you need 에서 소개된 Transformer Model 구조이며

인코더, 디코더 형태로 설계과 되어있다.

앞서 설명한 Positional Encoding이 입력값이 들어갈 때 들어가는 것을 알 수가 있고, 앞서 소개한 transformer block이 사용된 것을 볼 수가 있다. 그리고 Multi - head Attention은 Attention 계산이 여러 차원으로 사용되는 것으로 이해하면 될 것 같다.

논문에서는 6개의 head, 12개의 transformer block, Query의 차원은 512로 소개를 한다.

728x90
반응형
Comments