1. Sequence to Sequence with Attention
1) Seq2Seq Model

- sequence(word 단위의 문장)를 입력으로 받아 sequence를 출력하는 모델을 Seq2Seq라고 한다. 앞서 배운 RNN모델 중 many-to-many에 해당한다.
- 입력 문장을 읽는 RNN 모델을 Encoder, 출력 문장을 생성하는 RNN 모델을 Decoder라고 한다. 인코더끼리, 디코더끼리 동일한 파라미터를 공유하며 인코터와 디코더 간에는 파라미터를 공유하지 않는다. 위 그림에서는 RNN 모델에 LSTM을 사용했다.
- 인코더의 마지막 hidden state는 디코더의 첫 번째 hidden state 역할을 한다. 디코더는 시작을 의미하는 <sos> 토큰이 등장하면 인코더의 마지막 hidden state를 사용해 다음 단어를 예측하고, <eos> 토큰이 나올 때 까지 수행한다. <sos>, <eos> 토큰은 vocab에 미리 정의해 사용한다.
Seq2Seq 모델의 한계
- Seq2Seq는 순차적으로 입력 sequence를 읽어 고정된 크기의 context vector(hidden state)에 입력 문장의 정보를 압축해 저장한다. → RNN과 비교해 LSTM에서 long-term dependency를 개선했지만 여러 layer를 거치면 앞쪽에 등장한 정보는 손실될 수 있으며, 긴 문장 예측이 어려운 단점이 있다.
- 앞쪽에 나타난 정보를 잃지 않기 위해 입력 sequence를 거꾸로 모델에 feed하는 테크닉도 제안되었지만, 문제를 완전히 해결하지는 못한다.
- Seq2Seq with Attention: 마지막 hidden state인 h4만 사용하는 Seq2Seq와 다르게, 모든 hidden state를 사용해보자!
2) Seq2Seq Model with Attention

- 인코더는 time step마다 hidden state $h^{(e)}_k$를 만들고 마지막 hidden state $h^{(e)}_n$을 디코더에게 $h_0$으로 전달한다.
- 위의 그림에서 단어 4개로 이루어진 입력 sequence는 인코더를 거치면 4차원의 hidden state $h^{(e)}_1, h^{(e)}_2, h^{(e)}_3, h^{(e)}_4$로 표현할 수 있다.
- 디코더는 첫번째 입력 임베딩 $x_1$(여기서는 <sos> 토큰)과 입력 hidden state $h_0$을 받아 첫번째 hidden state $h^{(d)}_1$를 만든다.
- 이렇게 만들어진 디코더의 hidden state $h^{(d)}_1$는 인코더의 모든 hidden state $h^{(e)}_k$와의 내적 연산을 통해 어떤 hidden state $h^{(e)}_k$가 필요한지 attention score를 계산한다.
- 인코더와 디코더 hidden state간의 유사도인 내적값을 softmax에 넣으면 확률값이자 가중치로 계산할 수 있다. 이를 attention vector라고 한다.
- attention vector를 가중치로 사용해 각 인코더 hidden state와 결합해 가중 평균된 하나의 vector를 만든다. 출력된 최종 vector를 context vector라고 한다.