image.png

그렇다면 encoder와 decoder가 어떻게 이어지게, 즉 encoder의 결과를 어떻게 decoder로 전달 해줘야할까요? 결론부터 말하자면 encoder의 맨 마지막 hidden state h4를 decoder의 initial hidden state s1로 사용하여 encoder의 정보를 전달해줍니다. 즉 h4가 encoder input 문장을 representation 하는 것이지요.

그러면 encoder의 output과 decoder input은 어떻게 넣어주면서 학습을 해줘야할까요? Decoder의 input은 Language Modeling (LM)을 하기 위해서 넣어줍니다. 즉 encoder를 통해 encoding 된 input 문장의 representation의 hidden state를 decoder로 넣어주는 동시에 [SOS] (start-of-string) 토큰을 넣어주어 다음 단어를 예측하게끔 학습을 하는 것입니다. 그리고 이러한 학습 방법을 통해 학습된 모델을 autoregressive model이라고 합니다.

image.png

위의 모델의 loss 계산을 하는 방법을 좀 더 자세히 살펴보겠습니다. 위의 모델을 구성하였다면 loss를 계산하면서 모델의 가중치를 업데이트 해야 합니다. 즉 loss는 decoder의 input의 [I, am, a, student]과 decoder output의 [I, am, a, student]의 위치에 해당하는 결과 값을 비교하여 계산됩니다. 여기서 주의깊게 봐야할 부분은, input의 2번째 토큰부터 끝까지, ouput의 1번째 토큰부터 맨 마지막에서 2번째 토큰 위치의 결과를 추출하여 계산하는 것을 알아야 합니다.

그리고 이렇게 ground-truth의 input 토큰을 이용하여 decoder의 output과 loss를 계산하는 방식을 교사 강요(teacher forcing)라고 합니다. 즉 decoder의 output 값을 input 값과 동일하게 하도록 강요한다고 하여 붙여진 이름입니다. 그리고 이 기법은 아래의 1989년에 나온 RNN 논문에 처음 소개 되었습니다.

훈련은 teacher forcing으로 진행한다면 decoder의 input이 없는 추론 단계에서는 어떻게 해야할까요? 처음에는 [SOS]를 넣어주고 나온 결과를 다음 input 토큰으로 넣어줍니다. 그리고 이렇게 해서 나온 결과를 또 그 다음 input 토큰으로 넣어주고 이 과정을 [EOS] (end-of-string) 토큰이 나올 때까지 반복합니다.

https://tutorials.pytorch.kr/intermediate/seq2seq_translation_tutorial.html

https://ljm565.github.io/contents/RNN4.html#google_vignette