Attention은 transformer 논문을 보면서 들었다.
이번에 포스팅으로 정리하면서 왜 attention이라고 부르는 지 궁금했는다.
RNN기반의 모델에 비해 각 단어들의 hidden vector들과 연산을 통해 무엇을 선별적으로 선택할 지를 말해주는 vector를 만들어서 무엇을 attention할 지를 말해주기 때문이라고 생각했다.
RNN기반의 모델들은 hidden state vector의 dimension이 정해져있어서, 짧은 문장이든 긴 문장이든 마지막 타임스텝인 hidden state vector(주황색)에 앞서 나온 정보들을 모두 넣어야한다.
-> 매우 긴 문장이면 매우 압축된 형태, 앞부분 정보들이 많이 소실될 수 있다.
만약
I go home
을 모델에 넣는다면, I에 대한 정보가 유실될 수 있다. 그러면 주어에 대한 정보를 잃는 것이기 때문에 성능에 치명적인 영향을 준다.
=> 연구자들은 문장 순서를
home go I
식으로 바꾸는 방법을 제안하기도 하였다.
위의 문제를 해결하기 위해 attention 모델을 사용한다.
-> 중간 attention distribution벡터를 attention vector라고 부른다.
그때마다 서로 다른 가중치를 인코더 hidden state vector에 적용해서 나오는 가중평균된 벡터를 각 output layer에 입력으로 사용하여 예측 성능을 높인다.
디코더 hidden state 역활: attention 가중치 결정과 단어 예측을 위한 output layer의 입력
학습 할 때는 이전 예측된 결과를 학습에 쓰지 않고,
ground truth값을 넣어 잘못 학습되지 않도록 막는다.
-> 그러나 이 방식은 실제 test할 때의 상황과는 다르다.
그래서 초반에는 teacher forcing 방식을 이용하다가 어느 지점 이후에서는 사용하지 않는 방식도 존재한다.
Attention Score를 구하는 데는 3가지 방식이 있다.
1) Dot은 말 그대로 dot product로 연산하는 것
2) general은 가운데 를 두어 가중치 역할을 하도록 한다.
3) concat은 디코더 hidden state와 인코더 벡터를 concat하고 fully connected layer 하나를 두어 최종 스카라 값을 구한다. 이는 여러 layer로 확장할 수 있다.
기존 연산만을 통해 구해졌던 attention score가 학습 가능한 가중치 연산이 추가되었다.
sequence modeling 발전의 역사를 보자면
1. 단일 LSTM을 이용한 seq2seq
2. Bi-directional seq2seq
3. ELMO
4. BERT
정방향 -> 양방향 -> 모든 관계 요런식으로 발전 했었습니다.
한 방향으로만 데이터를 볼 경우 정방향 + 양방향을 한다고 하더라도 제일 처음에 있는 단어와 제일 끝에 있는 단어의 관계를 파악할 수가 없었습니다.
그래서 attention is all you need 에서는 한 단어와 다른 모든 단어들의 관계를 보기 시작했습니다.
이러면서 계산해야 할 연산량이 많아지게 되었습니다!