Attention 메카니즘
이번 글은 Attention 메카니즘에 대해서 간략하게 설명하는 내용을 담으려고 한다. 글의 내용은 ratsgo blog-어텐션 매커니즘을 보면서 공부한 내용을 다시 작성한 것으로, 해당 블로그의 글을 토대로 공부하면서 다시 정리하며 기록하였다.
참고 동영상 : https://www.youtube.com/watch?v=6aouXD8WMVQ
개요
어텐션(attention) 매커니즘은 딥러닝 모델이 특정 벡터에 주목하게 만들어 모델의 성능을 높이는 기법이다. 기계번역을 위한 sequence-to-sequence(seq2seq) 모델에서 처음 도입되었다. seq2seq 모델은 아래 그림과 같이 연속된 시퀀스 데이터가 입력되어 벡터로 만들고(이 과정을 Encoder라고 함), 이 벡터로부터 시퀀스의 출력하는 과정(이 과정을 Decoder라고 함)으로 구성되어있다. 그런데 이러한 seq2seq 모델은 인코더, 디코더의 길이가 길어질수록 모델의 성능이 나빠지는 경향이 있다. 오래된 시점의 정보를 잊거나 또는 특정 단어 W를 예측할 때 A, B, C 모두에 대해 집중하여 보게 되면 정확도가 떨어질 수 있기 때문이다. 따라서 어텐션 메카니즘은 디코더의 어떤 단어를 예측할 때, 인코더의 정보에서 “현재 상태에서 중요한 부분만을 집중(attention)하게 만들자”가 핵심 아이디어이다.
예를 들어, 인코더의 입력으로 “Ich mochte ein bier”를 디코더에서 “I’d like a beer”로 번역하는 seq2seq 모델을 만든다고 하자. 모델이 인코더의 4번째 단어 “bier”에 대해 예측하고자 할 때, 모델은 인코더에서 주어진 시퀀스 데이터에 대한 embeded된 벡터에서 “bier”에 대해 주목하게 만들고자 하는 것이다. 즉, 어텐션 메카니즘에서의 가정은 인코더가 ‘bier’를 받아서 벡터로 만든 결과(인코더 출력)는 디코더가 ‘맥주’를 예측할 때 쓰는 벡터(디코더 입력)와 유사할 것이라는 것이다.
Encoder 계산 과정
아래 그림은 양방향(bi-directional) 모델을 사용한 seq2seq 모델의 인코더 영역이다. 번째 벡터 가 입력되어 상태벡터(hidden state vecotr) 를 만든 후, 가 번째 열벡터가 되도록 오른쪽과 같이 만들어 이를 행렬 라고 정의한다.
Decoder 계산 과정
어텐션 메커니즘을 통해 “bier”에 해당하는 인코더 출력 벡터와 “beer”에 해당하는 디코더의 입력 벡터의 유사도를 높게 하고자 한다. 는 디코더가 번째 단어를 예측할 때 쓰는 직전 스텝의 히든스테이트 벡터 이 인코더의 번째 열벡터 와 얼마나 유사한지를 나타내는 스코어(스칼라)이다. 이 식에서 는 원 논문에서 alignment model이라 소개된다. 과 간의 유사도를 잘 나타낼수 있다면 다양한 변형이 가능하다. 에 Softmax 함수를 적용하여 합이 1이 되는 확률로 변환한다. 이때 는 디코더 입력 단어의 수를 가리킨다.
디코더가 번째 단어를 예측할 때 쓰이는 attention vector 는 다음과 같이 정의한다.
여기서 는 디코더의 번째 단어를 예측할 때 인코더의 번째 히든스테이트 벡터에 대해 얼마나 집중할 것인가를 나타낸 가중치로 해석가능하다. 디코더가 i번째 단어를 예측할 때 쓰이는 context vector 는 다음과 같이 정의되며, 인코더의 번째 어텐션 확률값으로 가중합을 한 것이라고 볼 수 있다.
Decoder의 계산 예시
디코더에서의 계산 과정은 아래 그림과 같다. alignment model 는 디코더가 2번째 단어 ‘like’를 예측할 때 쓰이는 첫번째 히든스테이트 벡터 과 가장 유사한 인코더의 열벡터가 라고 판단했다. 디코더가 2번째 단어를 예측할 때 쓰이는 attention vector 를 보면 두번째 요소값이 가장 높기 때문이다.
디코더가 2번째 단어를 예측하는데 사용되는 context vector 는 인코더 출력벡터들로 구성된 행렬 에 대해 를 내적하여 계산한다. 디코더 모델은 타겟 단어벡터(I’d)와 를 concat하여 현시점의 히든스테이트 벡터 를 만든다.
요약
기존의 Seq2Seq 문제에서는 입력 Sequence가 인코더에 입력되어 시퀀스의 길이만큼 은닉 상태벡터 가 생성된다. 그리고 마지막 은닉 상태벡터는 다시 디코더의 초기 상태 벡터로 사용되어 출력 시퀀스를 구하게 된다. 이 과정은 은닉 상태에 시퀀스 정보를 함축하여 그 정보로부터 변형된 다른 시퀀스를 출력하는 과정이라고 생각할 수 있다. 하지만 이러한 방식은 인코더, 디코더의 시퀀스 길이가 길어질수록 정보를 소실하는 현상이 발생할 수 있게 되기 때문에