본문 바로가기
  • 공부 기록 인생 기록
Python/NLP

시퀀스-투-시퀀스(seq2seq)

by 티권 2023. 4. 11.

시퀀스-투-시퀀스(Sequence-to-Sequence, seq2seq) 

- 입력된 시퀀스를 다른 시퀀스로 변환하는 작업을 수행하는 딥러닝 모델

- 주로 자연어 처리(NLP) 분야에서 활용

- ex) 챗봇, 기계 번역, 요약, STT

 

아래 그림은 seq2seq 모델을 간략하게 표현한 그림

 

ex)

- 'I am a student'라는 영어 문장을 입력

- 'je suis étudiant'라는 프랑스 문장을 출력


seq2seq 구조

-> 인코더디코더로 구성됨

 

인코더

- 입력 문장의 모든 단어들을 순차적으로 입력받음

- 입력받은 뒤에 마지막에 모든 단어 정보들을 압축해서 하나의 벡터로 만듦 -> 컨텍스트 벡터(context vector)

 

디코더

- 컨텍스트 벡터를 받아서 번역된 단어를 한 개씩 순차적으로 출력

 

인코더 -> RNN 구조를 사용하여 입력 시퀀스를 컨텍스트 벡터로 변환하는 역할

디코더 -> RNN 구조를 사용하여 컨텍스트 벡터를 기반으로 원하는 출력 시퀀스를 생성하는 역할

 

위 사진은 인코더와 디코더 내부를 확대한 사진

 

인코더와 디코더는 RNN 구조로 이루어진 RNN 아키텍처임

그림에서는 LSTM이지만, GRU와 바닐라 RNN도 사용 가능

 

문장이 인코더에 입력되면

- 단어 단위로 토큰화

- 단어 토큰 각각은 RNN 셀의 각 시점의 입력

- 인코더 RNN 셀의 마지막 시점의 은닉 상태 : 컨텍스트 벡터 -> 디코더 RNN 셀의 첫번째 은닉 상태

 

컨텍스트 벡터

- 인코더에서의 마지막 RNN 셀의 은닉 상태

- 입력 문장의 모든 단어 토큰들의 정보를 요약해서 담고 있음

 

컨텍스트 벡터가 디코더에 입력되면

- 초기 입력으로 심볼 <sos>가 함께 입력됨

- 디코더는 <sos>가 입력되면 다음에 등장할 확률이 높은 단어를 예측

 

ex)

첫번째 시점의 디코더 RNN 셀은 다음에 등장할 단어로 je 예측 -> je를 다음 시점의 입력으로 사용

두번째 시점의 디코더 RNN 셀은 다음에 등장할 단어로 suis 예측 -> suis를 다음 시점의 입력으로 사용

...

문장의 끝을 의미하는 심볼인 <eos>가 다음 단어로 예측될 때까지 반복

-> 테스트 과정

 

아래 사진은 테스트 과정이 이루어지는 디코더 부분, 전체 과정

 

 

 

seq2seq는 선택 가능한 모든 단어들로부터 하나의 단어를 예측해야함

-> 소프트맥스 함수 사용

-> 각 시점의 RNN 셀에서 출력 벡터가 나오면, 소프트맥스 함수를 통해 각 단어별 확률값을 반환


교사 강요(teacher forcing)

- 훈련 과정 : 컨텍스트 벡터와 실제 정답인 <sos> je suis étudiant 을 입력 받았을 때,  je suis étudiant <eos>가 나와야 된다고 정답을 알려주면서 훈련

- 테스트 과정 : 디코더는 오직 컨텍스트 벡터와 <sos>만을 입력으로 받은 후에 다음에 올 단어를 예측하고, 그 단어를 다음 시점의 RNN 셀의 입력으로 넣는 행위를 반복

 

교사 강요에 대한 자세한 설명은 아래 글 참고

https://tgwon.tistory.com/46

 

RNN 언어 모델(RNNLM)

피드 포워드 신경망 언어 모델(NNLM) (tistory.com) 피드 포워드 신경망 언어 모델(NNLM) 피드 포워드 신경망 언어 모델(Feed Forward Neural Network Language Model) - 신경망 언어 모델의 시초 피드 포워드 신경망(

tgwon.tistory.com


한계점

- 고정된 길이의 컨텍스트 벡터로 압축하는 과정에서 정보 손실이 발생할 수 있음

  -> 시퀀스 길이가 길수록 정보 손실 위험

- RNN의 고질적인 문제인 기울기 소실 or 폭발 문제 존재

 

-> 이를 극복하기 위해 제안된 방법이 어텐션 매커니즘