기존 RNN의 문제를 많이 해결하고 기계 번역 성능 향상에 큰 기여를 한 Sequence to Sequence 모델도 한계를 가지고 있다. Sequence to Sequence가 무엇인지는 아래 글에서 확인하기 바란다.
Sequence to Sequence의 핵심은 source sentence를 고정된 크기의 벡터로 표현하고, 이를 디코더에 사용한다는 것이다. 물론 이 덕분에 RNN보다는 성능이 개선되었으나 하나의 벡터가 source sentence 전체에 대한 정보를 압축하다보니 병목 현상이 발생할 수 있다. 사실 이는 RNN의 고질적인 vanishing gradient problem과도 일맥상통한다. 입력 시퀀스가 길어질수록 출력 시퀀스의 정확도가 떨어지는 문제를 해결하기 위해 제안된 것이 바로 어텐션(attention)이라는 매커니즘이다.
어텐션의 핵심은 1) 디코더에서 출력 단어를 예측하는 시점(time step)마다 인코더에서의 source sentence 전체를 다시 참고한다는 점과, 2)해당 시점에서 예측해야 할 단어에 영향을 주는 source sentence 토큰 각각의 중요도를 고려한다는 점이다. 단순히 하나의 context vector만 디코더에 넘겨주는 것이 아니라, 하나의 출력을 낼 때 source sentence 각 토큰의 중요도를 함께 넘겨주기 때문에 attention을 사용한 Sequence to Sequence 모델의 성능이 개선될 수 있다.
attention: an interface between the encoder and decoder that provides the decoder with information from every encoder hidden state. The model can selectively focus on useful parts of the input sentence and learn alignment between them.
이제 어텐션이 어떻게 작동하는지 구체적으로 알아보자. 어텐션은 기본적으로 6단계로 이루어진다.
1. Prepare hidden states
가장 먼저 인코더의 hidden state를 준비해야 한다. 위 그림에서 초록색에 해당하는 것이 바로 source sentence 각 토큰들의 hidden state이다.
2. Obtain a score for every encoder hidden state
그 후 벡터값인 hidden state를 특정한 score function을 이용해 하나의 스칼라값(score)으로 만들어준다. 이때 사용할 수 있는 score function의 종류는 아래 그림과 같이 다양하며, 본 글에서는 스칼라곱(Dot product)을 선택하기로 한다.
encoder hidden state가 [0, 1, 1], [5, 0, 1], [1, 1, 0], [0, 5, 1]이고 첫번째 decoder hidden state가 [10, 5, 10]이라고 하자. 이때 encoder hidden state들은 스칼라곱을 통해 하나의 스칼라값으로 만들어준다. 즉 15, 60, 15, 35라는 값으로 바뀌게 되는 것이다. 여기서 60으로 가장 큰 score를 갖는 두 번째 토큰은 다음 출력을 낼 때 큰 영향력을 행사하게 된다.
3. Run all the scores through a softmax layer
스칼라곱을 통해 얻어진 각각의 score는 소프트맥스 함수를 통해 모든 수의 합이 1이 되는 0~1 사이의 값으로 만들어준다. 이 값들의 분포를 attention distribution이라고 한다.
각 score값을 소프트맥스 함수에 통과시키면 0~1 사이의 값이 되어야 하지만, 해당 예시에서는 편의를 위해 0 또는 1로 바꾸어 표현했다.
4. Multiply each encoder hidden state by its softmaxed score
그 다음에는 소프트맥스 함수에 통과시킨 score를 encoder hidden state와 곱해준다. 그렇게 나온 결과 벡터를 alignment vector 또는 annotation vector라고 한다.
예를 들어 첫 번째 encoder hidden vector [0, 1, 1]의 경우, 소프트맥스 함수에 통과시킨 score가 0이므로 alignment는 [0, 0, 0]이 되고, 두 번째 encoder hidden vector [5, 0, 1]은 소프트맥스 함수에 통과시킨 score가 1이므로 alignment는 [5, 0, 1]이 된다.
5. Sum up the alignment vectors
다음 단계는 구해진 alignment vector들을 모두 더하는 것이다. 모두 같은 크기의 벡터이기 때문에 쉽게 더할 수 있다. 그렇게 얻어진 것이 바로 context vector가 된다.
4번 단계에서 구해진 alignment vector가 [0, 0, 0], [5, 0, 1], [0, 0, 0], [0, 0, 0]이기 때문에 이들을 모두 더한 [5, 0, 1]이 context vector가 된다.
6. Feed the context vector into the decoder
앞선 단계들을 통해 구한 context vector는 디코더에서 다음 출력을 내보낼 때 사용된다.
여기까지가 어텐션의 기본적인 매커니즘이다. 이해를 위해 어텐션의 과정이 잘 드러나는 그림을 하나 첨부하고 설명을 마친다.
(출처) https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3