[Contents]
1) Sequence to Sequence with Attention
Sequence to Sequence with Attention
- Sequence를 Encoding와 Decoding할 수 있는 sequence to sequence에 대해 알아본다
- Sequence to sequence는 encoder와 decoder로 이루어져 있는 framework으로 대표적인 자연어 처리 architecture 중 하나이다
- Encoder와 Decoder로는 다양한 알고리즘이 사용될 수 있지만 여기서는 RNN과 Attention을 결합한 sequence to sequence 모델을 학습한다
- RNN 모델이 갖고 있는 단점을 보완하고자 Attention(논문에서는 alignment로 표현되고 있습니다) 기법이 처음 등장
- 다양한 Attention의 종류와 이를 활용한 translation task에 대해서 알아본다
Further Readings
Seq2Seq Model
- encoder의 마지막 단어까지 읽어들인 후 나오는 hidden state vector 즉, encoder의 마지막 time step의 hidden state vector는 decoder RNN의 h0 즉, 첫번째 time step의 입력으로 주어지는 그 이전 time step의 hidden state vector의 역할을 한다
- 단어별로 문장을 생성하는 task에서 첫번째 단어에 특수 문자 SOS 토큰을 넣어준다
- 이러한 특수한 단어를 vocab 상에 정의해두고 이를 가장 처음에 decoder time step에 넣어주므로써 실질적으로 생성되는 첫번째 단어부터 예측을 수행한다
- 문장이 끝나는 시점에는 다른 특수문자인 EOS 토큰을 넣어준다
- 이 토큰이 나올때까지 decoder RNN을 구동하고
- 이 토큰이 생성되면 그 시점까지가 최종적인 출력으로써 더이상 단어를 생성하지 않는다
Seq2Seq Model with Attention
- Attention provides a solution to the bottleneck problem
- Core idea : At each time step of the decoder, focus on a particular part of the source sequence
- Attention 모듈의 motivation
- LSTM, GRU 로 long term dependency 문제를 해결했다 해도 문장이 굉장히 길어지면 앞에 나온 단어에 대한 정보는 LSTM, GRU 구조를 지나가면서 정보가 변질 혹은 소실될수 있다
- Attention을 사용하게 되면 decoder에서는 encoder의 마지막 time step에서 나온 hidden state vector 에만 의존하는 것이 아니라 encoder의 입력문장에서 주어졌던 각각의 단어들을 순차적으로 encoding하는 과정에서 나온 encoder hidden state vector hte 들을 전체적으로 사용한다
- decoder에서는 각 time step에서 단어를 생성할때 그 time step에 맞는 즉, 필요한 encoder hidden state vector를 선별적으로 가져가서 예측에서 도움을 주는 형태로 활용한다
Attention 모듈의 동작 과정
- use the attention distribution to take a weighted sum of the encoder hidden states
- the attention output mostly contains information the hidden states that received high attention
- 동작 과정
- decoder의 첫번째 입력으로 h0와 SOS 토큰의 word embedding 벡터가 주어지고 이 둘을 입력으로 받아서 decoder RNN이 decoder hidden state vector즉 h1d 가 생성된다
- 계산된 decoder의 첫번째 time step의 hidden state vector를 가지고 다음 단어의 예측을 수행하는데 사용할 뿐만 아니라 이 벡터를 통해 encoder에서 주어진 hidden state vectors 중 현재 어떤 hidden state vector들을 필요로 하는지를 선정하는 역할을 수행한다
- decoder hidden state vector가 encoder hidden state vector 각각과 내적의 연산을 수행하게 된다
- 아래 그림의 예시로 내적값이 각각 7, 1, -1, -2 로 계산이 됬다면 decoder hidden state vector와 각 encoder hidden state vector 간의 내적에 기반한 유사도라고 생각할수 있다
- 이 값들을 softmax를 통과시켜서 즉, 이 값들이 각각의 encoder hidden state의 대응하는 확률값을 계산해줄수 있는 입력벡터 혹은 logit 벡터로 생각을 하면
- 그 확률값이 가령 0.85, 0.08, 0.04, 0.03 로 계산이 되면 이 값들은 encoder hidden state vector의 부여되는 가중치로써 사용되고
- encoder hidden state vector에 대해서 가중치세트를 적용해서 가중 평균을 구할수 있고 가중평균으로써 나오는 하나의 encoding vector를 구할수 있다
- 즉, 이것이 바로 decoder hidden state vector를 사용해서 그 time step에 필요로 하는 정보는 첫번째 time step encoding hidden state vector를 85% 필요로하고, h2e 는 8%, h3e 는 4%, h4e 는 3% 의 정보를 필요로한다고 의미한다
- 그러면 이를 통해 나오는 Attention 모듈의 output이라 볼수 있는 encoder hidden state vector의 가중평균된 벡터는 context vector라고도 부른다
- 정의 하자면 Attention모듈의 입력으로 decoder hidden state vector 하나와 encoder hidden state vectors 세트이고 출력으로 나오는 것은 encoder hidden state vector의 가중평균된 vector 한개가 output 으로 나온다
- 이렇게 만들어진 context vector(attention 모듈의 output vector)는 앞서 계산한 decoder hidden state vector와 concate이 되어서 output layer의 입력으로 들어가고
- 그로부터 다음에 나오는 단어를 예측하게 된다
- 결국 output layer는 현재 decoder hidden state vector와 선별적으로 정보를 뽑아온 가중평균된 context vector와 함께 사용되어서 decoder의 특정 time step의 예측값을 반환한다
- 첫번째 단어를 예측한 이후 두 번째 time step의 입력은 전 time step의 예측단어의 word embedding과 전 time step의 decoder hidden state vector이다
- 이를 통해 두 번째 decoder hidden state vector가 생성되고 동일하게 이를 이용해서 encoder hidden state vectors들과 각각 내적을 하여Attention output 을 생성한다
- 이를 통해 나오는 유사도 값은 앞선 time step과는 다르게 나올 것이다
- 합이 1인 형태의 상대적인 가중치로 나오는 softmax layer의 ouput 을 attention vector라 부른다
- Attention distribution 부분
- EOS 토큰이 나올때 까지 위과정을 수행하게 된다
- 이런 방식으로 decoder에서 각 time step별로 단어를 순차적으로 예측하는 과정에서의 decoder hidden state vector의 역할 =
- decoder hidden state vector가 해당 time step에서의 output layer(다음에 등장해야할 단어) 에 들어가는 입력으로 사용됨과 동시에
- encoder hidden state vector 들중 어떤 단어 벡터를 중점적으로 가져와야할 지 즉, attention 가중치를 결정해주는 역할 또한 해준다
- 따라서 다음 단어를 예측하는데 있어서 encoder hidden state vector 들을 잘못 가져온 경우 attention 가중치를 적절히 원하는 정보가 선택될수 있도록 hidden state vector가 backpropagation에 의한 학습과정이 진행된다
- 아래 그림에서 보라색 arrow = backpropagation, green arrow = 순전파
- decoder에서 각 time step에서 실제로 다음에 등장하는 단어들은 각 time step마다 ground truth의 단어들을 입력으로 넣어준다
- 학습 초반이나 decoder의 각 time step에서 예측을 잘못한 경우 즉, SOS 토큰 이후 첫번째 단어가 the 가 아니라 a 라는 단어로 예측을 하더라도 ground truth 에서의 단어를 입력으로 넣어준다
- 하지만 모델을 다 학습한 후 실제 예측 혹은 inference에 이 모델을 사용하는 방식을 생각해보면 첫번째 단어에서 a라는 단어가 예측이 됬다하면 이 단어를 다음 time step에 입력으로 넣어준다
- 학습때는 decoder 매 time step마다 예측되는 값이 그 다음 time step에 입력으로 쓰이지 않고 ground truth 를 입력으로 주게 되는 방식을 Teacher Forcing 이라 부른다
- Teacher Forcing 을 쓴 경우에는 실제 ground truth를 넣는 것이기 때문에 학습이 더 빠르고 용이하게 진행되지만 실제로 이 모델을 사용할때는 예측값들이 실제와는 괴리감이 있는 경우가 있는데 이를 해결하기 위해 Teacher Forcing 을 사용하지 않는 방식과 사용하는 방식을 적절히 결합한 한습방식이 존재한다
- 처음에는 teacher forcing만으로 모든 배치를 구성해서 학습을 진행하다가
- 모델이 어느정도 예측이 정확해지면 학습 후반부에는 teacher force를 사용하지 않고 실제로 예측값을 다음 time step에 입력으로 주어서 학습한다
Different Attention Mechanisms
-
Luong attention : they get the decoder hidden state at time t1 then calculate attention scores, and from that get the context vector which will be concatenated with hidden state of the decoder and then predict the output
- score(ht,hˉs)=⎩⎪⎪⎨⎪⎪⎧htThˉshtTWahˉsvaTtanh(Wa[ht;hˉs]),dotgeneralconcat
- ht = decoder 에서 주어지는 hidden state vector
- hˉs = encoder에서 각 단어별의 hidden state vectors
- score(ht,hˉs) = 두 벡터 간의 유사도를 구하는 연산에는 dot(내적), general(generalized dot product), concat 이 3가지 연산이 있다
- general
- Wa 행렬 :
- 모든 서로 다른 dimension 간의 곱해진 값들의 각각 부여되는 가중치를 가지는 행렬
- attention 모듈에서의 유사도를 결정해주는 학습가능한 parameter
- concat
- decoder와 encoder의 hidden state vector가 있을때 둘의 내적 혹은 확장된 generalized dot product 과는 방식을 달리
- 입력으로 주어지는 decoder hidden state vector 와 이와 유사도를 구해야하는 또 다른 벡터은 encoder hidden state vectors가 입력으로 주어졌을때 이 두 벡터간의 유사도를 구하는 그래서 최족적으로는 scalar값이 나오도록 하는 추가적인 학습 가능한 MLP(multi layer neural net)을 만든다
- 두 벡터를 concat 해서 fully connected layer 하나를 두어서 유사도를 나타내는 최종 스칼라값을 반환
- 혹은 layer를 더 쌓아서 hidden layer에서 non linear layer를 적용하고 마지막에 선형변환을 통해 유사돌르 나타내는 최종적인 스칼라값을 반환
- concat = vaTtanh(Wa[ht;hˉs])
- Wa = W1
- vaT = W2
- vaT 가 행렬이 아닌 벡터로 표현된 이유:
- W2와 내적되는 column vector의 결과값은 두 입력벡터(encoder와 decoder의 hidden state vector)의 유사도를 나타내는 scalar값을 반환해야하기 때문에 W2는 row vector가 되야한다 따라서 vaT 로 나타난다
- dot(내적)연산을 채택했을때는 학습 가능한 parameter가 포함되 있지 않았다면 general, concat 연산을 사용할 경우 학습이 가능한 parameter 즉, 학습이 필요로 하는 그래서 최적화가 필요로하는 attention 모듈로 바뀐다
- 그렇게 되면 backpropagation의 과정을 통해서 유사도를 구하는 선형변환 행렬들이 학습하게 된다
-
Bahdanau attention : At time t, we consider the hidden state of the decoder at time t-1. Then we calculate the alignment, context vectors as above. But then we concatenate this context with hidden state of the decoder at time t-1. So before the softmax, this concatenated vector goes inside a LSTM unit.
-
Luong has different types of alignments. Bahdanau has only a concat-score alignment model
Attention is Great
- Attention significantly improves NMT(Neural Machine Translation (기계번역)) performance
- It is useful to allow the decoder to focus on particular parts of the source
- Attention solves the bottleneck problem (encoder의 마지막 hidden state vector 만을 사용해서 번역을 수행했어야 한다는 그래서 필연적으로 긴 문장에 대해서는 번역이 잘 이루어지기 어려운 문제를 해결)
- Attention allows the decoder to look directly at source; bypass the bottleneck
- Attention helps with vanishing gradient problem
- Attention 을 사용하게 되면서 encoder의 모든 time step의 단어들과 연결되있는 path 가 존재하기 때문에 backpropagation 을 수행할때 원하는 encoder 특정 time step에 hidden state vector까지 gradient를 큰 변질없이 빠르게 전달해줄 수 있게 됬다
- Provides a shortcut to far-away states
- Attention provides some interpretability
- By inspecting attention distribution, we can see what the decoder was focusing on
- The network just learned alignment by itself