Attention in RNN-Encoder-Decoder
Attention 모델이란?
앞서 배웠던 Encoder-Decoder 구조를 살펴보자.
일단 Encode, Decode란 말부터 이해해보자.
먼저, Encode란 말은 '암호(code)화 하는 행위' 라고 할 수 있고, Decode는 당연히 암호(code)를 푸는 행위다.
그럼 RNN에서 Encode, Decode는 무슨 의미를 가질까?
위 그림에서 'I love you'의 입력은 RNN을 거치면서 암호화 된다. 이 암호화된 벡터를 RNN에서는 Context Vector(혹은 thought vector)라 한다. 그리고 Decoder는 Context vector를 보고 '나는 널 사랑해'의 형태로 암호를 풀어야 하는 입장이다.
이렇게 Encode-Decode 과정으로 문장을 번역했을 때 2가지 문제가 발생한다.
- 어찌됐든 1개의 벡터로 문장을 표현하기 때문에 정보의 손실이 발생한다.
(CNN에서 convolution을 통해 down sampling 되는 것과 비슷한 느낌)
- LSTM에서 어느정도 해결했다곤 하지만, RNN의 고질적인 문제인 vanishing gradient는 여전히 존재한다.
Attention의 기본 아이디어는 decoder에서 단어를 출력할 때 마다 입력 sequence를 한번씩 참고하는 것이다. 예를 들면 위 그림에서는 '너'를 예측하기 위해 'I', 'love', 'you'를 한번씩 참고하면서 연관성이 있는 단어가 있는지 집중(attention)하는 방법이다. 그 원리를 한번 살펴보자.
Attention의 원리
일반적인 Encoder-Decoder RNN의 context vector는 마지막 hidden state가 그대로 Decoder에 입력됐었다. Attention 기법은 context vector를 encoder 각 state의 convex sum로 표현한 것이 핵심이다.
위 그림을 바탕으로 Attention 기법의 원리를 살펴보자.
- Encoder의 hidden state h1, h2, h3...를 구해둔다.
- Decoder의 hidden state와 Encoder의 hidden state의 Attention score α를 구한다.
※ α가 크다는 것은 Decoder이 hidden state와 Encoder의 hidden state와이 관계가 강하다는 뜻이다.
※ α들의 합은 1이 되도록 softmax 취한다.
- Encoder의 hidden state와 Attention score를 곱하여 Context vector를 계산한다.
- 여기까지 과정으로 각 Context vector를 구했다면 이제 Decoder에서 활용할 일만 남았다.
- y_t를 예측하기 위해 s_t-1, y_t-1, c_t가 필요하다.
- 여기서 c_t는 s_t-1과 h_t간의 amount of well matched의 벡터라고 할 수 있다.
- 즉, st는 yt를 예측하기 위해 ht'에 얼마나 주목(attention)할 것인가를 반영한다는 뜻이다.
위 같은 특징 덕분에 Attention 기법은 다소 긴 문장이더라도, attention score를 통해 잘 예측할 수 있는 성능을 보인다.
Visual Attention
위 사례들을 살펴보면 단어를 예측하기 위해 어떤 input을 참고했는지를 알 수 있다. 즉, RNN 예측 결과를 설명할 수 있는 부가적인 효과가 발생한다. (이런 분야를 explainable AI라 하기도 한다.)
이 효과를 CNN과 같은 컴퓨터 비전 문제에 적용하면 재미있는 결과가 나온다.
사실 "Deep learning은 성능은 좋지만 해석이 불가능한 모델이다." 라는 것이 일반적이다. 하지만 Attention 기법을 사용한다면 어느정도 예측 근거를 가시화 할 수 있다.위 그림은 이미지를 문장으로 출력하거나 분류(classification)했을 때, 어떤 pixel을 참고 하였는지를 가시화 한 사례이다.
※ Encoder는 이미지를 입력받아 feature map을 출력하는 CNN이 적용되었고,
feature map들의 convex vector를 Attention하는 RNN이 Decoder인 사례이다.
0 댓글