이전 RNN, LSTM, GRU에 대한 글을 보려면 아래 참조
2021.05.20 - [Study/NLP] - [NLP/자연어처리] 순환신경망 (Recurrent Neural Network, RNN)
2021.05.21 - [Study/NLP] - [NLP/자연어처리] LSTM(Long Short-Term Memory), GRU(Gated Recurrent Unit)
해당 포스팅은 "딥러닝을 이용한 자연어 처리 입문" 의 내용을 정리한 것입니다. 또한 설명에 활용되는 시각적 자료는 Jay-Alammar 자료를 사용했습니다.
시퀀스 투 시퀀스(Sequence to Sequence, Seq2Seq) 는 입력된 시퀀스로부터 다른 도메인의 시퀀스를 출력하는 다양한 분야에서 사용되는 모델이다. 대표적으로 챗봇, 기계번역이 대표적인 예인데, 입력 시퀀스와 출력 시퀀스를 각각 질문과 대답으로 구성하면 챗봇을 만들고, 입력 시퀀스와 출력 시퀀스를 각각 입력 문장과 번역 문장으로 만들면 번역기로 만들 수 있다. 외에도 요약, STT 등에서 사용된다.
1. Sequence to Secuence 구조
seq2seq는 번역기와 같은 곳에서 많이 사용되는 모델이다. 기계번역의 경우에 대해서 본다면, 입력은 일련의 단어로 이루어진 시퀀스이며, 맨 앞 단어부터 차례대로 모델에서 처리된다. 그리고 출력으로 비슷한 형태의 다른 언어로의 단어 sequence가 나오게 된다.
위 모델의 안을 자세히 들여다보면, Seq2Seq 모델은 하나의 Encoder와 Decoder로 이루어져 있다.
Encodersms 입력 문장의 모든 단어들을 순차적으로 처리해서 거기서 정보를 추출한 후에 하나의 벡터로 만든다(이것을 context vector라고 부른다.) 입력 문장의 정보가 하나의 context vector로 압축되면 인코더는 컨텍스트 벡터를 디코더로 전송한다. 디코더는 컨텍스트 벡터를 받아 번역된 단어를 순차적으로 출력한다.
context vector는 float으로 이루어진 하나의 벡터다.
인코더와 디코더 내부를 좀 더 확대하면 위와 같다.(동영상과 번역 순서가 바뀜) 인코더 아키텍처와 디코더 아키택처의 내부는 두개의 RNN 아키텍처로 이루어져 있는데, 입력받는 셀을 인코더, 출력하는 셀을 디코더라고 부른다.
2. Seq2Seq의 구조
Seq2Seq의 구조 및 방법에 대한 동영상이 아래와 같이 간단하게 나와있다.
인코더에 각 단어를 순차적으로 입력하고 나온 hidden state, 마지막으로 나온 hidden state를 디코더에 넣는다. 동영상에는 나와있지 않지만, 디코더는 초기 입력으로 문장의 시작을 의미하는 심볼 <sos>가 들어간다. 디코더에 <sos>와 context vector가 입력되면, 다음에 등장할 확률이 높은 단어를 예측한다. je suis étudiant 의 단어들이 입력되어 context vector가 만들어진 후 첫번째 디코더 RNN 셀은 예측된 단어 I를 다음 시점의 RNN 셀에 입력으로 입력한다. 그리고 두번째 시점에 디코더 RNN 셀은 입력된 단어 I로부터 다시 다음에 올 단어인 am을 예측하고 다시 다음 시점의 RNN셀의 입력으로 보낸다.
seq2seq의 훈련과정과 테스트 과정은 작동방식이 조금 다르다. 디코더의 훈련 방식은 <sos> I am a student를 입력받아 I am a student <eos>가 출력되어야 한다고 훈련한다. 이를 교사 강요(teacher forcing)라고 하는데 이는 조금 나중에 설명하도록 하자.
디코더의 테스트 과정은 컨텍스트 벡터와 <sos>입력하면 그 다음에 올 단어를 예측하고 그것이 다음 시점의 RNN셀에 들어가는 식으로 반복되어 최종 결과를 내뱉게 된다.
2.1 교사 강요(teacher forcing)
훈련 과정에서는 이전 시점의 디코더 셀을 현재 시점의 디코더 셀의 입력으로 넣어주지 않고 이전 시점의 실제값을 현재 시점의 디코더 셀의 입력값으로 넣어줄 것이다. 이 이유는 이전 시점의 디코더 셀의 예측이 틀렸을 경우, 이를 현재 시점의 디코더 셀의 입력으로 사용한다면 현재 시점의 디코더 셀의 예측까지 잘못될 수 있기 때문이다. 이는 연쇄작용으로 디코더 전체의 모델 성능에 영향을 미친다. 이와 같이 RNN의 모든 시점에 대해 이전 시점의 예측값 대신 실제값을 입력으로 주는 과정을 교사 강요라고 한다.
실습에 대한 내용은 torchtext의 튜토리얼에 상세하게 나와있으니 따라하며 해보아도 좋을 듯 하다.
https://pytorch.org/tutorials/beginner/torchtext_translation_tutorial.html
'Study > NLP' 카테고리의 다른 글
[NLP/자연어처리] Seq2Seq(3) - 트랜스포머(Transformer)_Encoder (0) | 2021.05.26 |
---|---|
[NLP/자연어처리] Seq2Seq(2) - 어텐션 매커니즘(Attention Mechanism) (0) | 2021.05.24 |
[NLP/자연어처리] LSTM(Long Short-Term Memory), GRU(Gated Recurrent Unit) (0) | 2021.05.21 |
[NLP/자연어처리] 순환신경망 (Recurrent Neural Network, RNN) (0) | 2021.05.20 |
[NLP/자연어처리] 단어의 표현(2) - 카운트 기반의 단어 표현 (0) | 2021.05.18 |