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 |