본문 바로가기
NLP

[keras, NLP] Seq2Seq로 번역 모델 구현하기

by 방구석 몽상가 2019. 2. 2.
2019-02-02-seq2seq_translation

seq2seq 모델로 번역 모델을 만들어보자.

 

1. 데이터 전처리

seq2seq 모델을 번역 모델로 학습하기 위해서는 세 가지 종류의 데이터가 필요하다.

  1. 인코더의 입력으로써 넣을 원 언어의 텍스트 데이터
  2. 디코더의 입력으로써 넣을 타겟 언어의 텍스트 데이터
  3. Teacher forcing을 위한 타겟 언어의 텍스트 데이터

학습에는 영어 텍스와 이에 대해 프랑스어로 변역된 텍스트의 모임인 코퍼스 데이터를 사용할 것이다.

Data download
http://www.manythings.org/anki/fra-eng.zip

이 데이터는 각 줄에 하나의 (영어, 프랑스어) 텍스트 쌍이 있고 이는 Tab으로 구분된다. 이를 다음과 같이 source 텍스트와 target 텍스트로 나눈다.

target 텍스트는 정답의 시작과 끝을 알리는 용도로 Tab 문자와 개행 문자를 사용했다.

이제, 학습 모델에 넣어줄 수 있도록 one-hot 벡터로 벡터화 해야한다.

각 데이터의 형태는 (텍스트 개수, 최대 문장 길이, 사용되는 토큰 수) 이 될 것이다. 여기서 사용되는 토큰 수 라는 건 텍스트를 이루는 문자 개수, 영어에서는 알파벳 수 정도로 생각하면 된다.

 

2. 모델 구축

img

학습 시 데이터의 주입 형태는 위 그림과 동일하다. 내부적으로는 인코더와 디코더로 이루어져 있고 각 모듈은 LSTM을 사용했다. 디코더는 인코더의 최종 hidden state와 cell state 값을 받아 초기 상태를 초기화하고 teacher forcing 과정을 진행하며 학습한다.

학습이 조금 더 빠르게 되기 위해 Dense 레이어 전에 Batch normalization 레이어를 추가했다.

 

3. 학습하기

one-hot 벡터를 사용하여 다음에 어떤 글자가 나타날지 예측하는 것이기 때문에 손실 함수는 당연히 categorical cross entropy를 사용한다.

validation_split 인수는 총 데이터의 몇 퍼센트를 검증 데이터셋으로 사용할지를 결정한다. 만약 0.2로 값을 설정한다면, 총 데이터의 20%를 검증 데이터셋으로 사용한다. 이 검증 데이터셋은 학습 동안에 셔플되지 않는다.

 

4. 모델 사용

만들고자 하는 것은 번역 모델이므로, 이 모델에 영어 텍스트를 주입하여 프랑스어로 번역된 텍스트를 얻을 수 있어야 한다. 따라서 타겟 데이터를 하나씩 만들어서 다음 문자들을 하나씩 예측하는 형태로 번역된 텍스트를 얻는 방법을 사용하여 번역 모델을 완성시켜보겠다.

인코더 모델과 디코더 모델을 따로 구분하여 다시 정의하는 이유는 인코더로부터 얻은 상태를 decoder의 초기 상태로 한 다음, 처음 시작 문자\t로 시작하여 디코더가 예측한 문자로 타겟 입력을 계속 바꾸어 다음 문자를 예측할 수 있게 하기 위함이다. 이 때 종료 문자 \n이 예측되면 번역이 완료된 것이다.

 

여기서 decoded_sequence 함수의 입력 형태는 (1, 최대 문장 길이, 사용된 토큰 개수)를 맞춰주어야 한다.

 

모듈화된 전체 코드는 여기에서 확인할 수 있다.

댓글