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는 입력으로 들어간 문장의 요약 정보라 할 수 있다. 

 

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

\[ \text{h}_t = \text{EncoderRNN}(\text{e}(x_t), \text{h}_{t-1}) \]

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

 

입력 문장 $X$의 집합을 $X=\{x_1, x_2, ..., x_T\}$라고 하자. 그럼 $x_1 $= <sos>이고, $x_T$는 <eos>가 될 것이다. $x_T$를 입력으로 사용하면 $ \text{h}_t = \text{EncoderRNN}(\text{e}(x_t), \text{h}_{t-1})$ 가 출력이 되는데, $\text{h}_t$는 Decoder의 입력값인 $z$로 사용되며 이 값을 Context Vector라 부른다. 

\[ \text{s}_t = \text{DecoderRNN}(\text{d}(y_t), \text{s}_{t-1}) \]

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

 

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

\[ \hat{y}_t = f(s_t)\]

예측 값은 집합 $\hat{Y} = \{\hat{y}_1, \hat{y}_2,...,\hat{y}_T\}$로 표현하며, 정답 집합 $Y = \{y_1, y_2, ..., y_T\}$ 과 비교해 손실을 최소화 하는 방향으로 진행한다. 

 

 

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

'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