Attention 기법

Attention 기법

Sequence-to-sequence

  • 우선, Attention 기법이 가장 먼저 적용되었던 모델인 Sequence-to-sequence 모델을 살펴보면서 간략하게 conception적인 것을 살펴보겠다.

  • 아래 그림의 왼쪽 부분은 Encoder 구조로 되어 있어, Input에 번역하고자 하는 문장을 단어 하나씩 받는 형태로 되어있다. 마지막 입력 단어에는 EOS(End-Of-Sequence)라는 특별한 단어(Token)를 받도록 되어있다. 마지막 EOS까지 받은 뒤의 Output을 Context라고 한다. 그렇게 나온 Context를 Decoder 구조에서 넘겨 받으며, 동시에 SOS(Start-Of-Sequence)라는 Token을 처음 Input에서 입력해주면 넘겨 받은 Context로 부터 첫번째 단어를 생성한다. 생성된 단어를 다음 입력으로 넣어주고 또 다음 단어를 생성하고 이런 작업을 EOS Token이 Output으로 나올때까지 반복해준다.

  • Encoder는 결국 Context를 만들기 위해서 RNN으로 동작하는 구조이고, Decoder는 한단어씩 출력하는데, 그 출력된 Output(단어)을 오른쪽으로 Shift해서 입력으로 받은 뒤 새로운 단어를 만들어주는 구조이다.

Sequence-to-sequence

Seq2seq 간단한 모델 구조도

영어 문장의 데이터화

영어 문장의 데이터화

한글 문장의 데이터화

한들 문장의 데이터화

  • Seq2seq 모델같은 경우는 입출력간의 step이 너무 멀리 떨어져 있으면 Gradient Vanishing이 일어나 잘 학습되지 않는다. 예를 들어 아래와 같은 그림에서 처음 입력인 $x_{0}$가 $y_{1}$에 영향을 준다면(영어에서 한글로 번역할시 어순이 반대로 되어있는 경우를 예시로 생각하면 이해하기 쉽다.), BPTT로 펼쳐놓고 봤을때, 기본적으로 Encoder단과 Decoder단이 분리가 되어 있기 때문에, Ecoder단의 앞쪽과 Decoder 뒷쪽과은 거리가 멀다. 그렇다면 아무리 LSTM을 쓰고 GRU를 사용한다고 하더라도 한계가 있다.

RNN에서의  Gradient Vanishing

  • 위에서 언급했던 것과 같이 그렇다면 Gradient Vanishing 문제를 해결할 수 있는 방법이 없을까? 그에 대한 답을 아래의 그림을 통해 설명하겠다. 이전에는 Encoder 부분에서 Context 하나(Feature vector 하나)만 넘겨줘서 그 Context를 통해 Decoder가 출력을 내주었어야 했는데, 직관적으로 볼때 Input들을 통해 만든 마지막 Hidden state인 Feature vector가 Encoder단의 모든 Input들을 많은 부분 커버할 수 없으며, Decoder 부분의 RNN을 통해 지나면서 우리가 원하는 방향대로 넘어갈것이라는 보장 또한 없다. 그래서 이제는 Encoder Hidden state를 모아서 Decoder로 각각 전달시켜 줌으로써 각 출력에 필요한 Context를 새로이 뽑을 수 있는 구조로 변경해주어 기울기 소실 문제를 해결할 수 있을 것이다. 그렇다해서 모든 Encoder단의 모든 Hidden state를 다 concate해서 하나의 긴 Feature vector로 넘겨준다면 좋은 성능을 기대하긴 어렵울 것이다. 왜냐하면 무조건 Feature vector의 데이터량을 늘려 준다면, 그만큼 많은 데이터셋을 통해 데이터셋이 cover를 해주어야 하기 때문이다. (자세히 말하면 학습데이터량은 고정적으로 동일한데, Input vector인 Feature vector의 차원만 늘려주게 된다면 Underfitting 문제가 발생하면서 Sparsity 문제가 발생해서 학습이 제대로 동작하지 않기 때문이다.) 이런 구조를 어떻게 효율적으로 구성할 수 있을까에 대한 답이 Attention 메커니즘이다.

Gradient Vanishing을 해결할 수 있는 방법

Context를 개선하려면?

  • Attention 메커니즘에서는 예를 들어 Encoder 부분과 Decoder 부분의 Layer들이 아래 그림에서 처럼 색깔별로 연관되어 있다고 했을때, 각 연관되어 있는 부분을 알게 해주는 것이 Attention Mechanism의 기본 아이디어이다.

Attention 메커니즘

Attention 신경망

Query, Key-Value

  • Dictionary형태로 이루어져 있다는 점은 순서는 상관 없다는 의미임을 명심하자!

  • 질의-응답이 이루어지는 메커니즘을 살펴보면, query를 날려주게 되면, 우선 key들을 나열하여 동일한 것을 찾아낸다. 그 후에는 key-value쌍에서 동일한 부분의 value를 출력해준다.

Querying

  • Attention mechanism은 key-value 쌍이 있고, query를 날려서 query와 key를 유사한지 비교를 해준뒤, 유사도를 고려한 Value들을 섞어서 Aggregation(합성)을 해준것이 Attention value이다.

Attention mechanism

Seq2seq에 Attention mechanism 적용은?

  • 대부분의 Attention network에서는 key와 value를 같은 값을 사용한다. Seq2seq에서는 Encoder의 Hidden Layer들을 key와 value로 사용한다. 직관적으로 생각을 해보면, Decoder에서 어떤것을 찾고자 한다면, 찾고자 하는 것에 대한 정보는 Encoder에서 찾을 수 있을 것이다. 그렇기에 Key-value가 Encoder의 Hidden Layer가 되는 것이다.

Seq2seq의 Key-Value

  • 또한, Seq2seq에서는 Decoder의 Hidden Layer들을 Query로 사용한다. 주의할 점은, Encoder와 달리 하나 앞선 time-step의 Hidden Layer를 사용한다는 점이다. 왜냐하면 현재의 출력을 내기 위해서는 현재의 출력이 사용될 수는 없기 때문에 즉, 미래(예측)를 가지고 현재 출력을 만들어낼 수는 없기 때문에 하나 앞선 Hidden Layer를 query로 사용하는 것이다.

Seq2seq의 Query

  • Key와 Value는 서로 동일한 Encoder의 Hidden Layer들이 사용되며, Query는 Decoder에 있는 각각의 Hidden Layer들이 될 것이며, i-번째 time step에 대한 Query를 날려서 Encoder에 있는 모든 Key와 유사도를 비교해서 최종적으로는 유사도를 고려한 Aggregation(종합)한 Attention Value를 출력해 준다.

Seq2seq에 Attention mechanism을 적용

  • 이렇게 Attention Value($a_{0}$)를 입력으로 받아 $s_{0}$ Hidden Layer에서 LSTM 구조를 거쳐 $s_{1}$ Hidden Layer가 나올 것이다. 이 새롭게 얻어진 $s_{1}$ Hidden Layer에다가 $s_{0}$를 통해 얻어진 Attention Value($a_{0}$) Concatenate를 해서 출력을 내준다.($v_{1}$) 이전에는 Decoder에서 그대로 Hidden Layer가 나오던 것이 이제는 Encoder의 Hidden Layer들을 비교해서 만들어낸 Attention Value를 같이 출력으로 냄으로써, Encoder 부분의 value들을 잘 가져올 수 있도록 해주었다.

Seq2seq - Application

Attention is all you need - Transformer 모델

Attention is all you need

  • RNN 같은 경우는 입력을 순서대로 넣어주기 때문에 입력된 단어의 위치를 따로 표시하지 않아도 되지만, Transformer 구조 같은 경우에는 병렬적으로 계산을 하기 때문에, 현재 계산하고 있는 단어가 어느 위치에 있는 단어인지를 표현을 해주어야 해서 positional encoding을 사용한다.

네트워크의 특성

  • 우선, Transformer와 Seq2seq 모델을 비교하자면, Seq2seq 모델은 Encoder와 Decoder가 있고 그 사이에 Context가 전달되는 구조를 가지고 있다. Transformer 모델의 경우는 Input쪽(왼쪽의 빨간색 박스)과 Output쪽(왼쪽의 파란색 박스)로 구성되며, Input쪽에서는 Input embedding이 들어가서 Encoding이 일어나고 Context가 전달이 되어 Output쪽의 Decoder부분에서 Decoding이 되서 출력이 나오게 된다. 전체적으로 구조는 비슷해보이지만, Seq2seq 모델은 RNN로 구성되어 있어서 순차적으로 이루어지게 되어있고, Transformer 모델은 병렬적으로 계산되므로 Input쪽이 동시에 계산되고 Output쪽이 동시에 계산되는 형태로 학습이되는 점이 차이점이다.

Transformer vs Seq2seq

  • Input을 먼저 보면, 아래의 노란색 Matrix 형태로 되어 있으며, 일반적으로는 입력 단어의 가짓수와 출력 단어의 가짓수는 동일할 것이다. 만약 기계번역처럼 2개의 언어가 다르다면, 다를 것이다! Output은 원래 Seq2seq의 구조에서 보았듯이 shift 시킨 입력을 넣어주었었던 것과 같이 SOS를 넣어주고 EOS를 빼준 형태로 Outputs에 넣어준다.

Inputs & Output

  • One-hot encoding으로 되어있던 것들을 Embedding해서 각각의 Embedding에 넣어준다.

Word Embedding

  • Positional Encoding은 시간적으로 위치가 따르때마다 고유의 코드를 생성해서 Input Embedding에 더해주는 형태로 구성되어있다. 이렇게 해줌으로써, 전체 Sequence의 길이 중 상대적 위치에 따라서 고유의 벡터를 생성하여 Embedding된 벡터에 더해주게 된다. 예를들면, 보통 Embedding된 벡터들은 0를 기준으로 분포가되어있는데 Input Embedding에 sin과 cosine을 조합해서 만들어진 feature 벡터를 더해주는 것이라고 보면된다. 위에서 말했듯, Embedding들은 0을 기준으로 분포하므로 여기에 sin과 cosine을 조합해 만든 Feature 벡터를 더해준다해도 크게 손상이 가지 않기 때문에 걱정하지 않아도된다.

Embedding의 분포 및 Positional Encoding의 원리

Positional Encoding

  • Dot-Product는 우리가 알고있는 내적과 동일하다. 그리고 Mask를 이용해서 Illegal connection의 Attention을 금지한다는 의미는 self-attention에 대한 이야기인데, 일반적인 Attention 구조는 Decoder쪽에 Hidden Layer를 통해 Output을 내려면 Encoder 쪽에 Hidden Layer 전체와 비교해서 산출을해야하므로 이런 경우는 괜찮지만, Self-attention에서는 Decoder를 똑같은 Decoder 자기 자신과 Attention을 할 수가 있는데 여기서 Decoder 부분의 해당 Hidden Layer를 산출하려면 순차적으로 출력이 나온다고 했을때 해당 부분의 Decoder보다 이후 시점은 아직 결과가 산출되지 않았기 때문에 그보다 앞선 시점의 Decoder부분에서의 Hidden Layer들만을 사용할 수 있다는 이야기이다. 여기서 비교할 때 사용할 수 없는 Hidden Layer들을 Illegal connection이라고 한다. 이런 Illegal connection은 Mask를 통해 -inf로 보내버리면 Softmax에서 값이 0이되는 것을 이용하여 attention이 안되도록 구현하고 있다.

Scaled Dot-Product Attention

Self Attention의 원리

  • Multi-Head Attention은 쉽게 말해 Scaled Dot-Product Attention을 h개를 모아서 병렬적으로 연산을 할 수 있게끔하는 것이다. h개를 사용함으로써 같은 입력에 대해서 더 풍부한 출력이 나타날 수 있다. 또한, 여기서 처음 Linear 연산(Matrix Mult)을 하는 것은 Query, Key, Value 각각 중 특정 차원만을 보겠다는 이야기이며, 차원을 줄여주어 병렬에 유리한 구조를 만드는 역할도 있다. 그러므로 이 연산을 한 후에 h가지로 병렬처리함으로써 풍부한 출력을 얻을 수 있는 것을 이해할 수 있다.

  • 제일 아래 단계의 Linear연산을 통해Q,K,V의 차원을 감소(h개로 나눠짐)시킨다는 것이 중요하다. 또한 아래 수식에서 가중치 $W_{V,i}, W_{K,i}, W_{Q,i}$의 각각의 Dimension보다 더 작은 값으로 모델의 Dimension($d_{model}$)을 해준다. 이는 value, key, query의 차원을 모델에 사용하는 차원으로 차원을 변환시켜주는 의미이기도 하다.

Multi-Head Attention

  • Mask는 RNN의 Decoder단을 생각해보았을때, context가 앞에서 뒤로 넘어가면서 이미 구한 것들만 참조를 할 수 있는데, Transformer구조에서는 병렬적으로 계산을 하기 때문에 self-attention을 할 경우에는 시간적으로 앞에서 일어난 것들에 대해서만 영향을 받게해주어야 RNN과 동일한 구조가 되기 때문에 Mask를 이용해서 예측하고자 하는 시점을 포함한 미래값들을 가려준다.

Masked Multi-Head Attention

  • Multi-Head Attention이 Transformer에 어떻게 적용되어 있는지 살펴보자. Self-Attention은 Decoder와 동일한 Decoder를 참조하므로 Key와 Query와 Value는 모두 같은 것이다. Encoding 같은 경우에는 causual system일 필요가 딱히 없기 때문에 Mask 없이 Key, Value, Query가 그대로 사용될 수 있지만, Decoder 부분같은 경우에는 현재 Query하려고 하는 것이 Key와 value가 Query보다 더 앞서서 나올수 없기 때문에 Mask를 활용한 Masked Multi-Head Attention을 사용한다. 이렇게 Encoder단의 Self-Attention을 통해서 Attention이 강조되어 있는 Feature들을 추출을 해주고 Decoder단에서는 Output Embedding(or 이전의 출력값)이 들어왔을 때 이것을 통해 Masked Multi-Head Attention을 통해 Feature 추출을 해주고, 그 다음에 붉은 색 박스 부분에서는 이 Decoder를 통해 추출된 Feature가 Query로 들어가고, 나머지 Key, Value는 Encoder를 통해 만들어진 출력을 가지고 입력을 받게된다. 결국에는 이런 구조는 Seq2seq 모델의 Attention과 동일한 구조가 되게 될 것이다.

  • 실제로는 Multi-Head Attention이 병렬적으로 계산됨으로써 self-attention이 RNN을 대체해서 들어간다고 볼 수 있다.

Transformer에 적용된 Multi-Head Attention

  • Position-wise Feed-Forward는 특별한 것은 아니고 앞서서 말했던 것과 같이 아래 초록색 박스는 가로가 문장의 길이, 세로가 One-hot vector를 크기로 갖는 행렬인데 병렬적을 처리되는 input 단어 하나마다 동일한 구조의 activation이 ReLu인 FC Layer층을 공유해서 사용하여 출력을 내보낸다는 의미이다. 이를 통해 병렬적으로 계산하지만 기존의 FeedForward propagation을 구현할 수 있다.

Position-wise Feed-Forward

  • Feed-Forward가 일어난 다음이나 Self-Attention이 일어난 다음에는 이전의 것(Skip connection)을 가져와서 더 해준 뒤 Layer Normalization을 수행해서 사용하고 있다. Layer Normalization은 Batch의 영향을 받지 않는 Normalization이라고 생각하면된다.

Add & Norm

  • 마지막 Feed-Forward에 의해서 마지막 Feature 출력이 나오게 되면 Linear 연산(Matrix Mult)을 사용해서 출력 단어 종류의 수에 맞추게 One-hot vector로 만들어준다. 그런 다음 Softmax를 이용해서 어떤 단어인지 classification을 한다.

Output Softmax

Attention is really all you need

Attention 신경망의 수식적 이해

  • Attention mechanism은 Key와 Query를 비교하는 Comparison을 통해 그에 따른 유사도를 가중치처럼 사용하여 Key에 맞는 value들의 조합으로 Aggregation(가중합)을 통하여 Attention value를 만들어 주는 구조가 Attention mechanism이었다. 그러므로 결국 Query와 비슷하면 비슷할 수록 높은 가중치를 주어 출력을 주는 것이다.

  • compare 함수로는 Dot-Product가 많이 쓰이며, 저기서 k와 q가 각각 벡터의 norm이 1이라면 결국 코사인 유사도를 구하는 것과 동일해 질 것이다. 그러나 길이가 1이 아닐 경우를 생각해서 Dot-product이후에 softmax를 사용하여 전체의 합을 1로 만들어 주게끔하여 각각의 가중치들을 하나의 확률로 사용할 수 있게끔 변환해 주어 사용한다.

Attention mechanism

  • Seq2seq 모델은 Encoder구조를 통해 Feature들을 만들게 되고 최종적으로는 출력으로 Context를 생성하여 이 Context 하나에 의지해서 Decoder는 SOS(Start Of Sequence)를 시작으로 출력으로는 단어를 하나씩 내어주는 모델이다.

Seq2seq

  • Key-value쌍은 기존의 Context만을 보며 출력을 내주었던 것과 다르게 Decoder부분의 Hidden Layer에 대한 출력을 낼때, Encoder 부분에 중간중간 부분을 알게하기 위해서 사용되어진다.

Seq2seq - Key-Value

  • Query는 Decoder의 Hidden Layer들을 사용하는데, 해당 출력을 해야하는 RNN구조의 하나 이전의 time-step의 Hidden Layer를 Query로 사용한다는 점을 기억하자! 아래 그림에서는 $s_{0}, s_{1}, s_{2}$가 해당한다.

Seq2seq - Query

  • i-th query가 들어오게되면 각각 Key와 비교를 하게되고, 앞에서 말한것과 같이 내적한 뒤 Softmax를 해줘 가중치로 만든뒤에 각각에 해당하는 Value와 곱해 가중합을 한 것을 Attention value로 산출한다.

Seq2seq - Attention mechanism

  • 아래 그림에서 출력과 RNN 구조사이에 실제로는 FC Layer가 하나 존재해서 출력을 One-hot vector로 만들어준다.

Seq2seq -  Application

Attention의 구현

  • $X\in R^{BXLXN}$에서 B:Batch size, L:문장의 길이, N:One-hot vetor나 embedding Feature의 길이를 의미하며, 여기서 Decode 쪽으로 Context를 넘길때는 LSTM이라면 Hidden State와 Cell State 둘다 넘겨주어야 하기에 Batch_size X Hidden state의 Feature 갯수인 M을 사이즈로 갖는 tensor를 넘겨줄 것이다.

Encoder 입출력

Decoder 입출력(학습 단계)

  • Encoder의 Hidden State인 H가 Attention mechanism에 Key와 Value로 입력이 되고, Query에는 Decoder의 한 step 앞선 Hidden State를 사용하게 된다.

Output w/ Attention(학습 단계)

Attention is all you need

  • 만약에 Input의 언어와 Output의 언어가 다르다면, 단어의 가짓수나 길이가 달라질 수있다는 점을 주의하자!

Input & Output

  • sin법칙과 cosine법칙에 의해 각각 분리해서 쓸수 있는데 결국 덧셈과 뺄셈으로 이 Positional Encoding이 달라지기 때문에 FC Layer에서 학습하는데 용이하게 될 것이다.

Positional Encoding

  • 전체적인 구조는 Attention mechanism을 적용한 Seq2seq 모델과 유사하지만 Scale이 되는 부분과 Mask를 사용하는 부분이 다르다. 또한, 가장 중요한 점은 아래 수식 중 Query와 key, value 부분을 모아서 하나의 metrics로 만들어 줌으로써 우리가 처음 배웠던 shallow NN과 같이 병렬적으로 처리할 수 있게끔 해주었다는 것이 가장 큰 Transformer 모델의 요소일 것이다. scale 처리를 해줌으로써 내적의 값이 너무 커져서 saturation되서 Softmax값이 차이가 많이나는 것을 방지할 수 있다.

Scaled Dot-Product Attention

  • 제일 아래 단계의 Linear연산을 통해Q,K,V의 차원을 감소(h개로 나눠짐)시킨다는 것이 중요하다. 또한 아래 수식에서 가중치 $W_{V,i}, W_{K,i}, W_{Q,i}$의 각각의 Dimension보다 더 작은 값으로 모델의 Dimension($d_{model}$)을 해준다. 이는 value, key, query의 차원을 모델에 사용하는 차원으로 차원을 변환시켜주는 의미이기도 하다.

Multi-Head Attention

Transformer Model Review