본문 바로가기

문돌이 존버/데이터 분석

시퀀스-투-시퀀스(sequence-to-sequence) 간단히 이해하기

반응형
본 글은 "딥 러닝을 이용한 자연어 처리 입문"을 학습하며 작성한 것입니다. 중간중간 제가 이해한 내용을 좀 더 풀어서 썼습니다.

시퀀스-투-시퀀스(이하 seq2seq)는 입력된 시퀀스로부터 다른 도메인의 시퀀스를 출력하는 다양한 분야에서 사용되는 모델입니다.

1. 챗봇
- 입력 시퀀스: 질문
- 출력 시퀀스: 대답

2. 기계 번역
- 입력 시퀀스: 입력 문장
- 출력 시퀀스: 출력 문장

기타: 내용 요약, STT(Speech to Text)

seq2seq 모델의 내부 모습은 아래와 같으며 크게 2개의 아키텍처(인코더, 디코더)로 구성됩니다.

<출처: 딥 러닝을 이용한 자연어 처리 입문>

1) 인코더는 입력 문장의 모든 단어들을 순차적으로 입력받은 뒤에 마지막에 이 모든 단어 정보들을 압축해 하나의 벡터로 만듭니다. 이를 컨텍스트 벡터(context vector)라고 부릅니다. 2) 입력 문장의 정보가 하나의 컨텍스트 벡터로 모두 압축되면 인코더는 컨텍스트 벡터를 디코더로 전송합니다. 3) 디코더는 컨텍스트 벡터를 받아 번역된 단어를 한 개씩 순차적으로 출력합니다.

<출처: 딥 러닝을 이용한 자연어 처리 입문>

인코더를 살펴보면 입력 문장은 단어 토큰화를 통해 단어 단위로 쪼개지고, 단어 토큰 각각은 RNN 셀(LSTM, GRU 포함)의 각 시점의 입력이 됩니다. 인코더 RNN 셀은 모든 단어를 입력받은 뒤 인코더 RNN 셀의 마지막 시점의 은닉 상태(hidden layer)를 디코더 RNN 셀로 넘겨주는데, 이를 컨텍스트 벡터라고 합니다. 컨텍스트 벡터는 디코더 RNN 셀의 첫 번째 은닉 상태로 사용됩니다.

디코더는 문장의 시작을 의미하는 심볼 <sos>가 들어갑니다. 이것이 입력되면 다음에 등장할 확률이 높은 단어를 예측합니다. 이렇게 다음에 올 단어를 예측하고 그 예측한 단어를 다음 시점의 RNN 셀의 입력으로 넣는 행위를 반복합니다. 문장의 끝을 의미하는 심볼인 <eos>가 다음 단어로 예측될 때까지 반복됩니다. 현재 이야기하는 것은 테스트 과정 동안의 내용입니다.

seq2seq는 훈련 과정과 테스트 과정의 작동 방식이 조금 다릅니다. 훈련 과정에선 컨텍스트 벡터와 실제 정답인 상황을 입력 받으면서 원하는 정답이 나오도록 알려주면서 훈련합니다. 이는 교사 강요(teacher forcing)라고 하는 것인데 뒤에서 또 설명하겠습니다. 

반면, 테스트 과정에서는 디코더가 오직 컨텍스트 벡터와 <sos>만을 입력으로 받아 다음에 올 단어를 예측하고, 그 단어를 다음 시점의 RNN 셀의 입력으로 넣는 작업을 반복합니다.

입, 출력에 쓰이는 단어 토큰들이 있는 부분을 확대하면 아래 그림과 같습니다. 모델에 단어 그대로를 입력하는 것이 아니라 숫자형으로 변환하는, 즉 텍스트를 벡터로 바꾸는 작업이 필요합니다.

<출처: 딥 러닝을 이용한 자연어 처리 입문>

seq2seq에서 사용되는 모든 단어들은 워드 임베딩을 통해 임베딩 벡터로서 표현된 벡터입니다.

<출처: 딥 러닝을 이용한 자연어 처리 입문>

위에선 임베딩 벡터 사이즈를 4로 했지만, 실제로는 수백 개의 차원을 가질 수 있습니다.


실습으로 글자 레벨 기계 번역기(Character-Level Neural Machine Translation)를 구현해보겠습니다. 필요한 프랑스-영어 병렬 코퍼스인 fra-eng.zip 파일을 사용하며 해당 파일은 아래 링크에서 다운로드할 수 있습니다.

http://www.manythings.org/anki

병렬 코퍼스는 쌍을 이루긴 하지만 길이가 같지 않을 수 있습니다. "나는 학생이다"를 번역하면 "I am a student"가 나오는 것처럼 seq2seq는 기본적으로 입력 시퀀스와 출력 시퀀스의 길이가 다를 수 있다고 가정합니다. 

실습 관련 코드는 코랩(Colab) 파일로 대체하겠습니다. 셀이 많아져 해당 글에 올리면 가독성에 떨어질 것 같아 공유 링크를 남겨놓도록 하겠습니다. 눈여겨 봐야 할 부분은 다른 모델링과 다르게 교사 강요가 사용되기 때문에 모델 빌드 과정이 크게 2번으로 나뉩니다. 1) seq2seq 기계 번역기를 훈련하는 것과 2) seq2seq 기계 번역기를 실제로 동작시키는 것입니다. 

 

seq2seq 실습.ipynb

Colaboratory notebook

colab.research.google.com

 

728x90
반응형