attention 구조는 왜 등장했을까? -attention의 근본 아이디어-

seq2seq 논문에서는 attention구조를 alignment라고 칭하였다.

 

1. bottleneck problem

 

물건이 순차적으로 전달되는데 어느 순간 막혀서 전달되는 양이 점점 적어지는 현상.

 

RNN에서 hidden state vector가 step이 지날수록 점점 정보량이 줄어드는 현상이 이와 비슷해서 이름 붙여짐

 

https://en.wikipedia.org/wiki/Bottleneck_(production)

bottleneck problem을 그림으로 표현

 

RNN구조는 그 특징이 앞에서부터 읽어들인 정보를 순차적으로 hidden state vector로 쌓아간다.

 

심지어 모든 모듈은 공유되어있어서 모든 hidden state vector의 차원이 동일하다.

 

sequence가 길수록 정보를 멀리 보내면서 많은 정보가 쌓이지만 동일한 차원에 압축해야 하기때문에

 

필연적으로 정보의 손실이 발생할 수 밖에 없다.

 

LSTM이 Vanilla RNN의 long term dependency를 어느정도 해결했다고 하더라도

 

한정된 차원의 hidden state vector에 압축정보를 완벽하게 담기는 쉽지 않다.

 

 

RNN 구조상 첫 단어부터 차례대로 읽어서 정보를 압축하면서 마지막까지 쌓아가는 형태

 

당연히 초반 정보일수록 정보의 손실이 클 것이고 첫 단어를 제대로 생성하지 못하는 문제로 이어졌다. 번역품질이 떨어진다는거지

 

예시그림이 좀 아쉽긴한데 긴 sequence일수록 더 그렇다.

 

 

2. Bidirectional RNN

 

근데 이제 연구자들은 이것의 차선책으로 첫 단어의 정보를 조금이라도 더 잘 전달해보자는 뜻에서 home go i의 역순으로 학습하는 과정을 생각했다.

 

i go home으로 나온 hidden vector와 home go i순으로 나온 hidden vector의 concat? average? sum?을 한 hidden vector를 decoder로 보내서 더욱 첫 단어를 잘 예측하길 원했다.

 

concat을 했다면 차원이 커질테니 선형변환과정을 거쳤을 것

 

출처:https://dalpo0814.tistory.com/43

bidirectional RNN의 한 예시

 

 

3. Attention구조의 기본 아이디어

 

encoder의 최종 hidden state vector만 쓰지말고 encoder의 각 step마다 나오는 모든 hidden state vector를 쓰자.

 

 

핵심 아이디어는 모든 step의 hidden vector를 적절하게 활용하자.

 

decoder는 언어를 생성하는 각 step마다 그때 그때 필요로하는 hidden vector를 선별적으로 활용하도록 가중벡터를 쓰겠다는거겠지?

 

https://google.github.io/seq2seq/

attention의 예시

TAGS.

Comments