본문 바로가기
DL/NLP

[DL][NLP] Seq2Seq(Seqence to Sequence) 모델

by 어떻게든 되겠지~ 2024. 10. 28.

RNN에 대해 먼저 알고 보면 더 이해가 쉽습니다 !

 

[DL][RNN] RNN(Recurrent Neural Network, 순환 신경망) 구조

앞선 글에서 RNN에 대해 간략하게 알아보았습니다  [DL][RNN] RNN(Recurrent Neural Network, 순환 신경망) IntroduceRNN(Recurrent Neural Network, 순환 신경망) 이란?RNN이란 시간적으로 연속성이 있는 데이터를 처리

self-objectification.tistory.com

 

1. 전통적인 RNN 기반의 기계 번역 발전 과정

Seq2Seq 모델은 이후에 살펴보겠지만 Input Sequence를 고정된 크기의 Context Vector로 Encoding하여 Output sequence를 생성하는 방식이다. 하지만 고정된 크기의 Context Vector로 인해 긴 문장을 처리할 때 한계를 보이기 때문에 Attention Mechaism을 사용한 모델들로 발전되었다.

Transformer는 Attention Mechaism을 활용하여 병렬처리가 가능하도록 한 모델로 NLP 분야에서 가장 중요한 모델이다.

GPT, BERT는 Transformer를 기반으로 하여 Input Sequence 전체를 고려하여 정보를 추출하는 방향으로 발전한 모델이다.

 

2. 전통적인 RNN 기반의 기계 번역 과정

전통적인 RNN 기반의 기계 번역은 Input과 Output의 크기가 같다고 가정한다.

 

- $h_t = \sigma(W_{xh} x_t + W_{hh} h_{t-1} + b)$
- $y_t = W_{hy}h_t$

 

전통적인 RNN 기반의 언어 모델은 고정된 길이만 출력할 수 있으며, 장기 의존성 문제 때문에 긴 Sequence를 처리하는데 한계가 있었다. 따라서 Encoder가 고정된 크기의 Context Vector를 추출하도록 하고 이 Context Vector를 Decoder가 추론하는 Seq2Seq 모델이 고안되었다.
Encoder의 마지막 Hidden State만을 Context Vector로 사용한다.

3. Seq2Seq(Seqence to Sequence) 모델이란?

Seq2Seq(Sequence to Sequence) 모델은 한 Sequence를 다른 Sequence로 변환하는 작업을 수행하는 모델로, 주로 NLP 분야에서 이용된다. Seq2Seq는 Encoder, Decoder라는 Module을 가지로 있기 때문에 Encoder-Decoder Model이라고도 한다. 
Encoder는 일반적으로 RNN, LSTM, GRU 등의 순환 신경망 구조를 사용하여 Input Sequence를 고정 길이의 벡터로 변환하는 역할을 수행한다. 이러한 구조를 통해 Sequence 데이터를 처리하는데 적합하며, 순차적인 정보를 효과적으로 Encoding 할 수 있다.     
Decoder는 Encoder의 출력인 고정 길이의 벡터(Context Vector)를 기반으로 원하는 출력 Sequence를 생성하는 역할을 수행한다. Decoder 또한 RNN, LSTM, GRU 등의 순환 신경망 구조를 사용한다.

4. RNN 기반의 Seq2Seq(Seqence to Sequence) 모델

 

Encoder에서 Input Sequence의 모든 단어들을 순차적으로 입력받은 뒤 마지막에 이 모든 단어 정보를 압축하여 Context Vector(RNN의 마지막 Hidden State)를 만든다. Context Vector가 만들어 지면 Encoder는 이를 Decoder로 넘겨준다. 
Decoder는 넘겨받은 Context Vector를 Decoder RNN Cell의 첫번째 Hidden State($h_0$)으로 사용하여 번역된 단어를 한 개씩 순차적으로 출력한다.       

Decoder는 기본적으로 RNNLM(RNN Language Model)이다.
Decoder는 초기 입력으로 문장의 시작을 의미하는 Symbol <sos>가 들어가고, 다음에 등장할 확률이 높은 단어를 예측한다.        
첫번째 시점에서 예측된 단어 $y_1$ ("good")을 다음 시점의 RNN 셀의 입력으로 입력한다. 그리고 두번째 시점의 Decoder RNN Cell은 입력된 단어 "good"으로부터 다시 다음에 올 단어인 "evening"을 예측하고, 또 다시 이것을 다음 시점의 RNN Cell의 입력으로 보낸다.       
위의 과정을 문장의 끝을 의미하는 Symbol인 <eos>가 다음 단어로 예측될 때까지 반복한다.
이 과정은 Test 과정 동안의 동작 방식이다.        

Teacher Forcing

위의 Seq2Seq 동작 과정을 Test 동안의 동작 방식이라고 언급하였는데, Seq2Seq는 Train 과정과 Test 과정의 작동 방식이 조금 다르다.    
Train 과정에서는 **Decoder에게 Encoder가 보낸 Context Vector**와 **실제 정답인 <sos>good evening**를 입력 받았을 때, "good evening<eos>"가 나와야 된다고 정답을 알려주면서 Train한다.
반면 Test 과정에서는 앞서 설명한 과정과 같이 Decoder는 오직 Context Vector와 <sos>만을 입력으로 받은 후에 다음에 올 단어를 예측하고, 그 단어를 다음 시저의 RNN 셀의 입력으로 넣는 동작을 반복한다. 즉, 앞서 설명한 과정과 그림은 Test 과정에 해당한다       

 

5. RNN Cell에서의 동작과정

 

 

 

하나의 RNN Cell은 각 시점마다 두 개의 입력(입력 벡터($x_t$), 이전 은닉 상태(h_{t-1}) )을 받는다
현재 시점을 t라고 할 때, RNN Cell은 t-1에서의 Hidden State($h_{t-1}$)와 t에서의 입력 벡터($x_t$)를 입력으로 받고, t시점에서의 Hidden State($h_t$)를 만든다.     
이때 t에서의 Hidden State는 바로 위에 또 다른 은닉층이나 출력층이 존재할 경우 위의 Layer로 보내거나, 필요없으면 값을 무시할 수 있다.      
그리고 RNN Cell은 다음 시점에 해당하는 RNN Cell의 입력으로 현재 t에서의 Hidden State를 입력으로 보낸다.      

이런 구조에서 현재 시점 t에서의 Hidden State는 과거 시점의 동일한 RNN Cell에서의 모든 Hidden State 값들의 영향을 받아 누적해온 값이다. 그렇기 때문에 Seq2Seq의 Context Vector는 사실 Encoder에서의 마지막 RNN Cell의 Hidden State를 말하며, 이는 Input Sequence의 모든 단어 토큰들의 정보를 요약해서 담고있다고 할 수 있다.        

Decoder는 Encoder의 마지막 RNN Cell의 Hidden State인 Context Vector를 첫번째 Hidden State로 사용한다. Decoder의 RNN Cell은 첫번째 Hidden State의 값과, 현재 t에서의 입력값인 <sos>로부터, 다음에 등장할 단어를 예측한다.        
그리고 이 예측된 단어는 다음 시점인 t+1에서 RNN Cell의 입력값이 되고, 이 t+1에서의 RNN 또한 이 입력값과 t에서의 Hidden State로부터 t+1에서의 출력 벡터. 즉, 또 다시 다음에 등장할 단어를 예측한다.
출력값은 Softmax 함수를 통해 선택될 수 있는 모든 단어들로부터 하나의 단어를 골라 예측한다. 

 

※ 참고 자료

- [딥러닝 기계 번역] Seq2Seq: Sequence to Sequence Learning with Neural Networks (꼼꼼한 딥러닝 논문 리뷰와 코드 실습)

- 14-01 시퀀스-투-시퀀스(Sequence-to-Sequence, seq2seq) - 딥 러닝을 이용한 자연어 처리 입문

 

 

반응형