[Lecture6-Notes] Seq2Seq intro

[Lecture6-Notes] Seq2Seq intro

Neural Machine Translation with Seq2Seq

요새는 구글 번역기, 네이버 번역기의 성능이 꽤 좋다고 생각한다. 내가 알고 싶은 한국어를 치고 번역을 누르면 100프로 매끄러운지는 모르겠지만, 어쨌든 그럴싸한 순서를 가진 문장이 번역되어 나온다. 물론 소설 번역은 번역가의 역할이 아직 매우 크고 기계 번역이 이를 따라갈 수 있을지 잘 모르겠지만, 뉴스 기사나 논문 같은 비문학의 번역에는 크게 이용될 수 있다고 본다.

항상 어떻게 이런 문장이 번역되어 나오는지 궁금했는데, Lecture 6에서는 이런 숨은 원리에 대해 소개하고 있어 굉장히 흥미로웠다.

지금까지 강의 노트에서 본 언어 모델은 NER label 붙이기라던지, 이전 몇 개의 문장에 대해서 다음 단어 예측하기 등등 단 하나의 output에 대해서만 예측하는 모델이었다.
하지만 자연어 처리 분야가 당면한 과제에는 다양한 길이의 output의 시퀀스가 중요할 때가 많다. 예를 들어 번역이라던지, 대화라던지, 아니면 본문 요약같은.

위 예제는 output이 단어 한 개만 나오면 끝이 아니라 “문장”, 즉 단어들의 시퀀스가 튀어 나와 줘야 평가가 가능한 과제들이다.

이를 위해 이번 포스팅에서는 Seq2Seq라 불리는 모델들을 살펴볼 것이다. 이러한 모델들은 나온지 3년이 채 안되었지만 기계 번역 분야에 있어서 표준이 되어가고 있다!

Brief Note on historical approches

Seq2Seq의 장점은 이 모델이 사용하는 LSTM과의 연관성으로 인해 나오게 되는데, 과거의 구문 베이스의 번역 시스템이 long-term dependency를 해결하기 어려운 구조였던 것에 비해 Seq2Seq는 전체 input을 훑어본 뒤에 임의의 어떤 시퀀스를 출력할 수 있으며, 효율적인 번역을 위해 input의 특정 부분만을 집중하여 살펴볼 수도 있다.

Sequence-to-sequence Basics

Seq2Seq는 2014년 당시 불어-영어 번역을 위해 처음 사용되었으며 새로운 패러다임의 등장이다. Seq2Seq는 2개의 RNN모델을 합쳐 놓은 것으로서, encoder, decoder로 이루어져있다.

Alt text
.
.

  • encoder에서는 기본적으로 모델의 input 시퀀스로부터 고정된 사이즈의 context vector을 만들고,
  • decoder에서는 이 context vector를 다시 input으로 하여 번역된 output 시퀀스를 만든다.

이러한 구조 때문에 Seq2Seq는 종종 “encoder decoder model”이라고 불린다.

Seq2Seq architecture - encoder

Alt text
.
.
인코더의 역할은 그림에서 보다시피 input 시퀀스를 하나의 context vector C로 만드는 일이다. 이렇게 input 단어를 한 개씩 읽기 위해서 인코더는 RNN 중 LSTM을 주로 활용한다.

이 때, input 시퀀스의 길이가 그 때 그 때 바뀌지만 항상 일정한 길이의 C로 시퀀스를 압축해야 한다는 어려움이 있기 때문에 인코더는 대부분 그림처럼 stacked LSTM으로 구성한다. 이 LSTM layer들은 이전 layer의 output을 다음 layer로 전달하면서 input 시퀀스를 성공적으로 압축하는데 사용된다.

여기에서 일어나는 일 상세

  • input의 one-hot 벡터 4개 준비
  • 단어 임베딩하여 벡터로 표현
  • stacked LSTM 네트워크에 input을 거꾸로 입력
  • 네트워크가 input을 C로 인코딩

참고로 그림에서 자세히 나와있지만, “name your is what” 순서로 시퀀스를 뒤집어서 입력하게 되는데, 이는 첫 단어를 마지막으로 입력함으로서, 후에 decoder가 첫 단어인 what 부터 잘 번역할 수 있도록 하려는 의도이다. decoder는 일단 what이 잘 번역되면 뒷 단어들도 이의 영향으로 차례로 잘 번역될 수 있도록 설계되어 있다.

Seq2Seq architecture - decoder

Alt text
.
.
디코더의 구조를 살펴보면 인코더와 마찬가지로 stacked LSTM구조를 사용하는 것은 동일하다.
하지만 그림과 같이

  • 이 네트워크를 인코딩 완료된 context vector로 초기화 한다는 점과,
  • stacked LSTM의 마지막 레이어로부터 나온 output word를 다시 다음 input에 사용한다는 점

이 인코더와의 큰 차이점이다.

여기서 궁금한 점이 생기는데 input과 output에 활용되는 시퀀스의 길이가 각각 다를텐데 어떻게 이렇게 다른 길이의 output이 가능할까? 이 것은 아래 그림을 보면 더 쉽게 이해할 수 있는데, 인코더와 디코더에서 라는 토큰을 사용하여 문장의 입력과 출력이 끝남을 네트워크에 전달한다.

Alt text

.
.
여기서 또 주목할만한 점은 인코더와 디코더가 동시에 학습된다는 점이다. 위와 같이 긴 옆으로 긴 인코더, 디코더가 한꺼번에 forward-propagate되었다가 loss function에 근거한 back-propagation을 통해 이 네트워크에 사용되는 모든 파라미터가 1번 업데이트 된다.

Recap & Basic NMT Example

Seq2Seq의 한계
시퀀스의 입력과 출력 길이에 어떠한 제약도 없다는 것은 사실이지만, Seq2Seq 모델은 LSTM의 한계때문에 입력 문장이 매우 길면 효율적으로 학습하지 못한다는 사실이 알려져 있다.

Bidirectional RNNs

지난 포스팅에서 RNN을 공부하면서,
문장 안에 있는 의존 관계는 그저 한 쪽 방향으로 학습을 진행해서는 제대로 학습이 되지 않는다는 사실을 공부한 바 있다.
위에서 설명한 Seq2Seq 네트워크는 양 방향 RNN을 반영하지 못하고 한 쪽 방향으로만 진행되고 있는 형태이다. 인코더를 어떻게 개선하여 Seq2Seq를 개선할 수 있을까?

Bidirectional RNN은 입력 시퀀스가 양방향으로 입력될 수 있게 아래와 같은 구조를 고안했다.

Alt text

여기서 최종 hidden state은 정방향, 역방향으로 학습된 두 개의 벡터를 이어 붙인 형태로 계산된다.

'Machine Learning > cs224n' 카테고리의 다른 글

[Lecture6-Notes] Attention Mechanism  (0) 2017.10.07
[Lecture6-Notes] Sequence model decoders  (0) 2017.10.07
[Lecture6-Notes] Seq2Seq intro  (0) 2017.09.26
[Assignment2] RNN 4  (0) 2017.09.21
[Assignment2] RNN 3  (0) 2017.09.21
[Assignment2] RNN 2  (0) 2017.09.21

+ Recent posts