Deep Learning/Natural Language Processing

Sequence-to-Sequence (Seq2Seq)

언킴 2022. 5. 12. 14:15
반응형

Sequence-to-Sequence (Seq2Seq)는 문장을 입력으로 받고 문장을 출력하는 구조를 가지고 있다. 이는 한국어를 영어로 번역하는 것과 같은 기계번역 문제에 주로 사용된다. 또한, 문서를 입력으로 받고 요약하는 형태로도 사용된다. [논문]

 

Seq2Seq에 가장 많이 쓰이는 모델 구조는 RNN이다. 문장의 임베딩 값을 입력으로 사용하여 Encoder를 구성한다. Encoder는 하나의 Context라는 정보를 출력하고 이는 Decoder의 초기값으로 사용된다. Context Vector는 입력으로 들어간 문장의 요약 정보라 할 수 있다. 

 

입력의 시작은 x0이며 일반적으로 <sos> 토큰을 사용한다. <sos> 토큰은 문장을 시작을 알려주는 토큰이며, 문장의 끝을 알려주는 토큰으로는 <eos>를 사용한다. <eos> 토큰을 맨 뒤에 넣어주면 모델이 명시적으로 문장이 끝났다는 정보를 얻을 수 있어서 결과가 더 좋다는 이야기가 있다. 

ht=EncoderRNN(e(xt),ht1)

e(xt)는 입력 단어 xt의 임베딩 값을 의미하고, ht1은 이전 time-step의 hidden state를 의미하며, Encoder의 h0은 0으로 설정하고 시작한다. Seq2Seq를 구축할 때 기본으로 RNN을 사용하지만, LSTM, GRU를 사용해서 구축해도 무방하다. 

 

입력 문장 X의 집합을 X={x1,x2,...,xT}라고 하자. 그럼 x1= <sos>이고, xT는 <eos>가 될 것이다. xT를 입력으로 사용하면 ht=EncoderRNN(e(xt),ht1) 가 출력이 되는데, ht는 Decoder의 입력값인 z로 사용되며 이 값을 Context Vector라 부른다. 

st=DecoderRNN(d(yt),st1)

d(yt)는 Decoder로 사용되는 입력의 임베딩 값이다. st1은 이전 time-step의 hidden state를 의미하고, Encoder와는 달리 초기치는 0이 아니라 z가 된다. 즉, s0=z가 된다. 

 

이렇게 출력된 st는 Dense Layer 즉, Linear Layer를 거쳐 단어 yt를 예측하게 된다. 

y^t=f(st)

예측 값은 집합 Y^={y^1,y^2,...,y^T}로 표현하며, 정답 집합 Y={y1,y2,...,yT} 과 비교해 손실을 최소화 하는 방향으로 진행한다. 

 

 

이에 관련된 코드는 여기를 참고하면 된다.

'Deep Learning > Natural Language Processing' 카테고리의 다른 글

[NLP] Pointwise Mutual Information (PMI)  (0) 2023.04.03
[NLP] BERT의 종류  (2) 2022.08.15
[NLP] Stemming and Lemmatization  (0) 2022.01.18
[NLP] Tokenization  (0) 2022.01.18
[NLP] Transformer  (0) 2021.10.21