Summary
자난 강의 RNN에서 다루었던 Seq-to-Seq에 대해 자세히 다룬다.먼저 첫 Encoder
에서는 input sequence를 입력받아 를 업데이트하고, 최종적으로 계산한 를 사용하여 Decoder
의 initial hidden state 와 Context vector 를 만든다.
Context vector
input sequence를 요약한 것으로
Decoder
의 매 step마다 넣어준다. Encoded sequence와 Decoded sequence 사이에서 정보전달의 역할을 한다.
Ddecoder
에서는 와 input token인 [START]를 가지고 을 계산한다.
그 다음부터는 과 이전 step의 output, 그리고 context vector 를 받아 를 계산하기를 반복하고 [STOP] token을 출력할때까지 반복한다.
그러나 만약 Sequence가 1000 길이만큼 또는 책 한권일만큼 길어진다면 문제가 발생한다. 이렇게 긴 sequence를 그저 하나의 Single Context vector 로 요약하기에는 부족하다. 즉, 정보손실이 발생한다. 강의에서는 Input sequence bottlenecked through fixed-sized vector. What if T=1000?이라고 문제점을 소개하고 있다.
use new context vector at each step of decoder!
Single Context vector을 사용하지 않고 매 step마다 새로운 context vector을 사용하거나 생성한다.
Encoder
부분은 기존과 비슷하지만, alignment score
이라는 개념을 도입하였다.
fully connected network로, decoder
의 현재 시점에서 encoder
의 어떤 시점에 집중해야하는지에 대한 score이다.
위 예시에서는 initial state 와 encoder
의 각 hidden state를 대응하여 decoder
에서 hidden state 에 대한 output을 생성할 때 encoder
의 어떤 hidden state가 중요한 역할을 하는지에 대한 점수를 계산한다.
그리고 alignment scores를 softmax함수에 통과시며 확률분포로 만든다. 이렇게 생성된 값들 는 각각 0 ~ 1 값을 가지며 모두 더하면 1이 된다. 이들을 attention weights
라고 하고 encoder
의 각 hidden state를 얼마나 반영할지에 대한 weights로 작용한다.그리고 Attention weights
와 hidden states
를 weighted sum하여 시점의 new context vector 를 계산한다.
이는 미분가능하기 때문에 네트워크가 스스로 어떤 부분에 집중해야하는지 학습할 수 있다. 어떤 부분에 집중해야하는지 supervise할 필요가 없다.
이후 과정은 아래 그림들과 같다.
영어 프랑스어 번역 시 attention weights를 나타낸 것이다. 각 시점별로 어떤 state에 집중하고 있는지 볼 수 있다.
위에서 설명했던 attention 매커니즘은 사실 input sequence와는 상관이 없다. 그저 decoder
이 input의 어느 state에 집중할 것인지를 계산하기 때문에 정렬되어있을 필요가 없다.
이 때문에 input이 sequence가 아닌 다른 종류의 이더라도 이 attention 매커니즘을 사용할 수 있다.
문장 변역과 같은 방식이다. CNN을 통과시켜서 나온 이미지 feature map의 각 spatial features와 decoder
의 hidden states를 대응하여 alignment scores
를 계산하고 softmax를 통과시켜 attention weights
를 계산한다. 그리고 이들과 feature map을 weighted sum하여 context vector을 계산한다. 과정은 아래와 같다.
Attention 매커니즘을 더욱 많은 task에 적용하기 위해 일반화를 시킨다.기존에 살펴본 attention 매커니즘을 조금 일반적으로 정의하고 있다.
decoder
의 hidden state로, 을 나타낸다.encoder
의 각 hidden states의 collection으로 이다.이전에는 라는 similarity MLP를 사용하였지만, 그저 둘 사이의 dot product를 사용하는 것이 더 효율적이고 잘 수행된다는 것이 밝혀졌다.이후에는 scaled dot product를 사용하여 similarity를 계산하였다. dot product를 진행하고 query vector과 input vectors의 dimension인 로 나누어준다.
어떤 시점에서의 alignment score 가 매우 크면, softmax를 통과하고 난 뒤의 distribution을 보았을 때 매우 뾰족하고 나머지는 매우 완만한 그래프가 될 것이다. 즉 뾰족한 지점을 제외하면 gradient가 0에 가까워져 vanishing gradient가 나타난다.
그리고 만약 두 벡터가 high dimension을 가지면 dot product를 했을 때 매우 큰 값을 가지므로 이를 scaling시켜주기 위해 로 나누어준다.
기존과 같이 single query vector 을 받아서 계산하는 것이 아니라 query vectors set 를 input으로 받아서 모든 similarity scores(alignment scores)를 scaled dot product 계산 한번으로 계산한다. output vectors는 모든 weighted sum을 한번에 출력한다.
이거 행렬 사이즈랑 방식이 잘 이해 안됨
기존에 input vectors 는 similarity scores를 계산하면서 query vectors와 dot product를 진행할 때 사용되고, 또 weighted sum(output 꼐산)을 진행할 때 또다시 같은 input vectors가 사용되었다.
같은 input vectors를 두 번 사용하는 것을 막기 위해 input vectors를 learnable한 key matrix
와 value matrix
로 나누었다. 그리고 이 둘을 사용하여 input vectors 를 key vectors
와 value vectors
로 transform시켰다.
key vectors
는 simiarity scores를 계산할 때 사용되어, 각 query vector와 각 key vector을 비교한다.
value vectors
는 output을 계산할 때 사용된다. 계산 과정은 아래 그림과 같다.
이를 사용함으로써 모델이 input data를 사용함에 있어서 flexibility를 더 갖는다고 한다.(?)
query vector은 모델이 "I want to search for this thing and then hopefully it needs to get back information which is different from the already knew" 라고 생각한다고..
Attention layer은 매우 일반화된 layer으로, 하나는 query이고 다른 하나는 input이라고 생각되는 두개의 데이터셋을 갖고 있다면 이 layer을 사용하여 계산할 수 있다.
Attention layer의 특별한 case로, query없이 input vectors 만 입력으로 받아서 input vectors 끼리 비교한다.input vectors를 key matrix
와 value matrix
를 사용하여 transform한 것과 같이 query 가 없는 이 상황에서 query를 만들어주기 위해 learnable한 query matrix
를 사용한다. 이를 사용하여 input vectors를 query vectors로 만들어준다.
만약 위와 같이 input vectors의 순서를 바꾸면 어떻게 될까?위 그림과 같이 queries
, keys
, similarities
, attention weights
, values
, outputs
는 모두 같은 값이지만 바뀐 input vectors의 순서에 맞게 값들의 순서가 바뀔 것이다.
결국 self-attention매커니즘은 Permutation Equivariant하다.
즉, permutaion을 , self-attention을 라고 했을 때,
이다. permutaion을 하고 self-attention을 하나, self-attention을 하고 permutation을 하나 서로 같다는 뜻이다.
self-attention은 input 순서에 영향받지 않는다.
self attention doesn't "know" the order of the vectors it is processing!
기본적으로 모델은 input의 순서를 모르기 때문에 순서가 중요한 task에서는 우리가 순서를 알려주어야한다.
이때, positional encoding
을 통해 input vector에 position정보를 주어 순서를 알려준다.
Attention is All you need 논문에서는 아래와 같은 positional encoding을 사용한다.
Language modeling과 같이 과거의 states만 보고 싶은 경우에 해당한다. 기본적으로 self-attention은 input vector와 다른 모든 states간에 비교를 진행한다. 그러나 우리는 input vector이전의 states에만 집중하고 싶다.
이때, model이 과거의 정보만 볼 수 있도록 집중하지 않아야 할 부분에 값을 부여하여 softmax를 통과한 attention weights가 0이 되도록 하고 해당 position을 참고할 수 없도록 한다.
H개의 독립된 self-attention layer을 병렬로 처리한다.
여기 더 공부해봐야할듯
self-attention을 CNN에 적용하면 어떨까?CNN으로 feature vectors를 계산하고, 이들을 1x1 Conv를 통해 Queries
, Keys
, Values
로 transform해준다.Queries
와 Keys
를 inner product한 뒤, softmax를 통과시켜 attention weights를 계산한다. 그리고 Values
와 weighted sum을 하여 새로운 feature vector()을 생성한다.
그리고 input features와 채널수를 맞추기 위해 1x1 Conv를 사용한다.위와 같이 Residual Connection을 적용하기도 한다. 이는 하나의 모듈로써 neural network를 만들 때 하나의 layer로 사용할 수 있다.
1. Recurrent Neural Network
LSTM
과 같은 모델은 매우 긴 sequence를 잘 다룰 수 있다.2. 1D Convolution
RNN
처럼 많은 input sequences에 영향을 받기 힘들다. 그러기 위해서는 1D conv를 여러 층 쌓아야 하고 이는 long term sequences에 좋지 않다. *3. Self-Attention
Attention is all you need논문에서는 self-attention만을 사용한 새로운 primitive block type인 transformer block
을 제시하였다.우선 input sequences를 입력받아 self-attention을 거친다. 이를 통해 모든 vectors는 각각의 다른 vectors와 interact할 수 있다. 그리고 gradient flow의 향상을 위해 residual connection을 적용한다.그리고 Layer Normalization
을 거치는데, 이는 self-attention이 적용된 모든 vectors를 한번에 normalize하는 것이 아니라 vector들 각각 normalize하여 scale을 조정한다.
그리고 이들을 독립적으로 MLP에 통과시키고 residual connection을 적용하여 Layer Normalization
을 한다.
Layer Normalization
은 위 그림에서처럼 각 vectors에 대해 독립적으로 normalize한다.
이를 Transformer Block
이라고 하며, vectors의 sequences를 다루는 커다란 모델을 만드는 데 기본 블록으로써 사용된다. # input vectors = # output vectors 이지만 dimension이 다르게 할 수 있다.
vectors 간의 interaction은 self-attention에서만 이루어지고 나머지 과정은 독립적이므로 병렬적으로 계산할 수 있다.Transformer blocks를 쌓아서 Transformer model을 만들 수 있다.
hyperparameter : (depth, block수), (self-attention에서.)
Transformer은 NLP에서 Vision에서와 같이 pre-train의 개념을 쉽게 도입할 수 있게 하였다.(Vision에서 ImageNet으로 pre-train하고 우리의 task에서 fine-tune시키는 것 처럼.)
매우 많은 text를 다운받아서 매우 큰 transformer
model을 pre-train시킨다. 그리고 우리가 하고싶은 task(QA, translation 등)에 적용하여 fine-tune시킨다.Transformer
model을 기반으로 최근 많은 거대한 모델들이 등장했다. 모두 비슷한 구조로 되어있지만 layer의 수, query dimension, bigger multi-head, # parameters 등에서 다르며 train에 사용한 데이터의 수도 매우 거대한 것을 볼 수 있다.
잘 보고가요~