RNN에 기반한 seq2seq 모델에는 크게 두 가지 문제가 있습니다.
첫째, 하나의 고정된 크기의 벡터에 모든 정보를 압축하려고 하니까 정보 손실이 발생합니다.
둘째, RNN의 고질적인 문제인 기울기 소실(vanishing gradient) 문제가 존재합니다.
<Encoder의 Hidden State들을 활용하지 않는다>
어텐션(Attention)의 기본 아이디어는 디코더에서 출력 단어를 예측하는 매 시점(time step)마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고한다는 점입니다. 단, 전체 입력 문장을 전부 다 동일한 비율로 참고하는 것이 아니라, 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(attention)해서 보게 됩니다.
이 말은 어텐션 메커니즘의 아이디어는 고정된 크기의 벡터(컨텍스트 벡터) 하나에 입력 시퀸스의 모든 정보를 다 담아야 한다는 인코더의 부담을 덜어 주기 위해, 디코더에서 다음 단어 예측을 위해 인코더의 마지막 은닉 상태(컨텍스트 벡터)뿐만 아니라 인코더의 매 시점 은닉 상태들을 모두 사용하자는 것이라고 할 수 있습니다.
위 그림은 디코더의 세 번째 RNN 셀에서 출력 단어를 예측할 때, 어텐션 매커니즘을 사용하는 모습입니다.
그럼 어텐션 매커니즘이 어떻게 적용되는지를 살펴봅시다.
1) 어텐션 스코어 (Attention Score)를 구한다.
2) 소프트맥스(softmax) 함수를 통해 어텐션 분포(Attention Distribution)를 구한다.
3) 각 인코더의 어텐션 가중치와 은닉 상태를 가중합하여 어텐션 값(Attention Value)을 구한다.
4) 어텐션 값과 디코더의 t 시점의 은닉 상태를 연결한다.(Concatenate)
5) 출력층 연산의 입력이 되는 를 계산한다
6) 를 출력층의 입력으로 사용한다.
어텐션 매커니즘은 디코더에서 출력 결과를 예측할 때, 인코더의 Hidden State들을 다시 한 번 참고해주는 방법이라고 했습니다.
이 때 어느 인코더의 Hidden State를 얼마나 참고할지를 결정해야 합니다.
이 때, 현재 예측에 필요한 정도라고 판단되는 점수를
어텐션 스코어 (Attention Score)라고 합니다.
이러한 어텐션 스코어를 구하기 위해, 현 시점의 디코더의 Hidden State와 인코더의 모든 Hidden State들과 각각 내적을 수행합니다.
앞에서 각 인코더와 디코더의 현재 Hidden State를 내적한 값은
스칼라로 나오기 때문에 이를 소프트맥스 함수를 적용해서 어텐션 분포를 구합니다.
※ 소프트맥스 함수는 입력받는 값을 모두 0 ~ 1 사이의 값으로 정규화하며 총합은 항상 1이 된다 ※
이렇게 구한 어텐션 분포(Attention Distribution)는 각 인코더 Hidden State의 중요도라고 볼 수 있습니다.
Ex) e0 : 10%, e0 : 20%, e0 : 50%, e0 : 15%, e0 : 5%
이제 지금까지 준비해온 정보들을 하나로 합치는 단계입니다.
어텐션의 최종 결과값을 얻기 위해서 각 인코더의 은닉 상태와 어텐션 가중치값들을 곱하고, 최종적으로 모두 더합니다.
요약하면 가중합(Weighted Sum)을 진행합니다.
아래는 어텐션의 최종 결과. 즉, 어텐션 함수의 출력값인 어텐션 값(Attention Value) 에 대한 식을 보여줍니다.
이러한 어텐션 값 은 종종 인코더의 문맥을 포함하고 있다고 하여, 컨텍스트 벡터(context vector)라고도 불립니다. 앞서 배운 가장 기본적인 seq2seq에서는 인코더의 마지막 은닉 상태를 컨텍스트 벡터라고 부르는 것과 대조됩니다.
이렇게 얻은 벡터를 인코더의 문맥을 포함하고 있다하여 컨텍스트 벡터(Context Vector)라고도 부릅니다.
기본적인 Seq2seq에서 Encoder의 마지막 Hidden State를 컨텍스트 벡터라고 부른 것과 대조됩니다.
그렇게 구한 컨텍스트 벡터와 현 시점의 디코더 셀의 Hidden State와 연결해줍니다.
(concatenate라는 방법을 사용했지만 평균을 내서 사용하는 방법도 있습니다)
그리고 이렇게 구한 벡터를 이용해서 최종 예측 값을 구하게 됩니다.
여기까지 Dot-Product Attention의 설명입니다.
어텐션 스코어를 구할 때 Dot-Product를 한다고 해서 Dot-Product Attention이라고 합니다.
유익한 글이었습니다.