크게 생각하고, 목표를 높게 잡고, 대담하게 행동하라.

“언젠가는 목표에 이를지도 모르는 단계를 밟는 것으로는 언제나 실패한다. 모든 단계가 그 자체로 목표인 동시에 목표로 이르는 단계여야한다.” - 괴테

AI/자연어 처리

[자연어처리] 간단한 시퀀스-투-시퀀스(Sequence-to-Sequence, seq2seq)

o_onn5 2023. 2. 17. 21:01
728x90

seq2seq

seq2seq는 대표적으로 번역기 또는 챗봇에서 사용되는 모델이다.

RNN의 구조를 어떻게 만들었냐에 따라서 seq2seq이 만들어지는데 아래 그림을 보면서 이해해보자.

영어 문장을 입력 받고  seq2seq을 통과하여 프랑스어로 출력하는 모습을 볼 수 있다.

크게 인코더와 디코더로 구성이 되어있고 인코더에서 입력받은 문장을 압축하여 CONTEXT라는 하나의 벡터가 되고, 이 벡터는 디코더의 입력벡터로 들어가게 된다.

즉, 입력문장 ->인코더 -> 컨텍스트 벡터 -> 디코더 -> 출력문장으로 진행이 된다.

 

 

인코더와 디코더의 내부에 대해 조금 자세히 알아보자.

인코더

위 사진을 보면 입력 문장이 단어 단위로 토큰화가 진행된 것을 확인할 수 있다.

각 단어 토큰은 RNN 셀의 각 시점이 된다(실제로는 성능을 위해 lstm이나 gru를 사용한다고 한다.)

 

우선 입력 문장에서 쪼개지는 단어 토큰은 각 RNN 셀에 시점이 입력된다.

그리고 인코더의 RNN 셀은 모든 단어를 입력받은 뒤에 인코더 RNN 셀의 마지막 시점의 은닉 상태를 디코더로 넘겨주는데 이를 컨텍스트 벡터라고 한다. 즉, 컨텍스트 벡터는 디코더 RNN 셀의 첫번째 은닉 상태라고 할 수 있다. 

 

아래 사진을 보면 이해가 더 쉽다.

1. time step이 t-1에서의 은닉 상태와 현재 time step이 t인 입력 벡터, 이 두 가지를 입력으로 받는다.

2. time step t에서의 은닉 상태를 생성한다.

3. time step t에서의 은닉 상태를 time step t+1인 RNN 셀로 보낸다.

 

seq2seq은 이러한 구조를 가졌기에 RNN 셀에서의 모든 은닉 상태의 값들의 영향을 누적해서 받았다고 할 수 있다.

그렇기에 컨텍스트 벡터는 인코더의 마지막 은닉상태를 입력받기 때문에 입력 문장의 모든 정보를 압축하였다고 할 수 있는 것이다.

 

디코더

 

디코더는 첫번째 셀의 은닉 상태로 컨텍스트 벡터를 받는다.

디코더 첫번째 RNN 셀은 은닉 상태의 값과 문장의 시작을 의미하는 심볼 <sos>의 입력으로 다음에 올 단어를 예측한다.

예측은 softmax 함수를 사용함으로써 가장 확률이 높은 단어를 선택한다.

 

 

첫번째 시점으로 나올 단어를 je로 예측한 것을 확인할 수 있다. 그리고 다음 RNN 셀에 je를 입력으로 보내고 이를 반복하며 진행된다. 그리고 이는 문자으이 끝을 의미하는 심볼인 <eos>가 다음 단어로 예측될 때까지 반복된다.

이는 테스트 과정이며 seq2seq2은 훈련 과정과 테스트 과정의 작동 방식이 조금 다르다는 것을 기억하자.

 

 

출처: https://wikidocs.net/24996

728x90