5주차(2) - Sequence to Sequence Learning with Neural Networks

2019. 2. 19. 23:37풀잎스쿨 NLP Bootcamp

논문링크: https://arxiv.org/abs/1409.3215

참고자료: (조원호님 발표자료, Notion문서) https://goo.gl/vH9kcG


Abstract

지난 논문에서 Seq2Seq를 이용한 NMT 방법에 대해 살펴보았다. 하지만 해당 논문에서는 NMT를 Machine Translation의 주요한 방법이 아닌 SMT를 보강하기 위한 하나의 수단으로써 바라본 경향이 있다. 하지만, 이번 논문에서는 Seq2Seq를 이용하여 NMT가 다른 Machine Translation에 비해 더 유효한 수단으로써 새로운 구조를 소개한다. 해당 논문에서는 Multi-layer LSTM 구조의 Encoder & Decoder방식을 이용한 Machine Translation 모델을 제시하며, <EOS>토큰만을 이용하고 있다. 또한 Encoder의 출력을 바로 Input으로 받고있는데, 이는 문장의 길이가 매우 길때 성능이 하락되는 원인이 된다. (추후에 이 문제를 해결하기 위해 Attention/Self-Attention방식이 등장한다.) 또한 이 논문에서는 문장을 순서대로 넣는 방식이 아닌 역순으로 넣어줄 경우, 순서대로 넣는 방식에 비해 더 좋은 성능이 나온다고 주장한다.


Contribution

Machine Translation 종류

  • Rule-based MT: Dictionary/문법 기반의 번역 (Parser, Analyzer, Generator, Tranfer Lexicon)

  • Statistical MT (SMT): 이미 번역된 문서들을 바탕으로 한 통계(또는 Frequency)기반의 번역

  • Hybrid MT: Rule-based MT와 Statistical MT를 같이 사용

  • Neural MT (NMT): Neural Network 모델을 이용한 번역


Model Architecture

우선 구조를 설명하자면, Encoder를 통해 Input Sentence를 하나의 누적된 Cell State로 계산하는 부분과 Encoder에서 Input으로 받은 Cell State를 기반으로 Sequence를 생성하는 Decoder 부분으로 나눠볼 수 있을 것이다.


일단 Encoder부분에서는 위에서 언급했듯이 Input Sentence를 누적된 Cell State로 계산하는 역할을 하는데, 여기서는 Sequence의 길이에 관계없이 <EOS>토큰이 나올때까지 Input을 계속 넣어준다. (하지만 이론과는 다르게 실제로는 Training의 편의성 내지 병렬처리를 위해서는 Fixed Length를 가질 필요가 있을 것이며, 이는 Maximum Length 또는 원하는 길이를 설정해준 후 Padding/Clipping을 해줘야 할 것이다) 이렇게 누적된 상태의 Cell State는 이전 논문에서도 설명했듯이 하나의 Latent Vector로 봐도 무방하다.


Decoder는 Encoder에서 마지막으로 나온 Cell State만을 받아서 Sequence를 생성하게 된다. 이렇게 생성하는 Sequence는 Encoder와 마찬가지로 <EOS>를 생성할때까지 작업을 반복하게 된다. (이전 논문에서도 언급했지만 Sequence 생성의 정확도를 높이기 위해서 Teacher Forcing을 쓰게된다) 문장을 생성할 때에도 두가지 방법으로 접근할 수 있는데, 하나는 <EOS>토큰을 Input Sentence의 끝부분으로 인식하는 방법, 다른 하나는 <BOS>토큰을 Prediction Sentence의 시작으로 보는 방법이다. 하지만 두 방법 모두 위치는 사용하는 위치는 같으므로 용도는 동일할 것이다.


여기서 또 한가지 흥미로운 점은 Encoder부분의 Input의 순서만 역순으로 넣어줄 경우, 순서대로 넣은 결과보다 더 좋은 결과를 보인다는 점이다. 이러한 구조는 Bi-LSTM에서 Backward방향으로 진행되는 LSTM과 유사하며, 조금만 더 생각해보면 Encoder부분에 Bi-LSTM을 사용할 경우 성능 개선을 할수 있지 않을까 하는 생각을 해볼 수도 있다. 하지만 이 논문이 나오는 당시에는 Bi-LSTM이 쓰이기 이전이기 때문에 이러한 구조에 대한 제안은 하지 않고있다.


문장을 생성하는 연산은 위 연산을 따른다. h_t는 Input Sentence를 바탕으로 Latent Vector로서 Cell State를 계산하기 위함이고, y_t는 Encoder에서 나오는 Cell State를 기반으로 Sequence generation을 하기 위한 계산이다. Cell State를 계산할 때는 사실 Sigmoid와 Tanh를 주로 사용하는데, 여기서는 Sigmoid를 Cell State의 activation함수로 사용하고 있다.


또한 Gradient Vanishing 문제를 해결하기 위해서 Vanilla RNN이 아닌 LSTM을 사용하고 있다. 또한 여러층의 LSTM Layer를 구성할 경우 성능이 높아진다고 언급하는데 4-Layer LSTM이 가장 좋다고 언급하고 있다.


수식을 보면 예측하고자 하는 것이 어떤 것인지 더 명확해진다. T 길이의 Input Sentence가 주어질때 T' 길이의 Output을 생성하고자 하는 것인데 이를 구하기 위해서는 Encoder에서 나온 Cell State인 v와 y_1, ..., y_t-1까지의 Input이 주어졌을때 yt일 확률을 모두 곱하는 방식이다. (여기서 가장 확률이 높은 yt가 Output이 될 것이다)


Training Objective를 수식으로 나타내면 위와 같다. 위 수식을 살펴보자면, T는 Sequence Prediction, S는 Input Sequence, |S|는 Training Dataset을 나타낸다. 즉, Input Sequence가 주어질때의 Sequence Prediction의 확률을 모두 더한 후 평균을 낸 값을 최대화 하고자 하는 것이 목적이다.


학습/훈련이 끝나면 위 식을 기반으로 Translation 결과를 생성한다. 여기서 번역 과정에는 Left-to-Right Beam Search Decoder를 사용한다.


Beam search 알고리즘을 설명하자면, beam size에서 가장 큰 확률을 계속 찾아나가는 식이다.


위 그림들을 살펴보자면, Bean Size가 3이라고 가정할때 Step 1에서 가장 큰 확률을 n개(Beam Size)를 고른다. 그 다음으로 Step 2에서 나온 확률와 Step 1에서 나온 가장 큰 확률 n개와 각각 곱해서 n * (Vocab 갯수)중 가장 높은 확률 n개를 취한다. 이와 같은 방식을 Sequence Prediction이 끝날때 까지 반복하는 방식이다.


학습에 사용된 Hardware스펙도 주목할만하다. 논문에서 제안한 모델을 구현하기 위해 8 GPU를 사용했다고 하며, Encoder/Decoder의 LSTM Layer마다 GPU를 각각 할당했다. 이렇게 구성된 Hardware로 10일간 학습을 진행한다.


Result & Conclusion

Result

결과에서는 Sequence를 Forward방향과 Reverse방향으로 넣은 결과를 보여주는데, Beam size가 클수록, 그리고 Forward 대신 Reverse순서로 넣을때 BLEU Score가 더 높다고 언급한다. 한가지 신기한 점은 특히 문장을 역순으로 넣을때 Minimal Time Lag가 줄어든다는 결과를 보여준다는 점이다. 그리고 여기서는 나와있지 않지만 Perplexity의 개선도 이루어졌다는 언급을 하고 있다. (Perplexity: 5.8 → 4.7)


또한 SMT와의 같이 사용할때의 성능에 대한 비교도 같이 하고 있는데, 가장 좋은 Result를 보이고 있지는 않지만 SMT와 같이 사용할 경우 전반적인 성능이 올라가는 것을 볼 수 있다.


그리고 LSTM에 대한 Hidden state를 PCA로 클러스터링 한 결과도 같이 보여주고 있다. 위 결과를 보면 유사한 문장 사이의 거리가 의미가 전혀 다른 문장과의 거리에 비해 더 가까운 것을 확인할 수 있다. 주목할 점은 단어의 주어/동사별 의미단위로 조밀하게 모여있고, 수/능동태 단위의 영향도는 거의 없음을 확인할 수 있다.


문장의 길이에 따른 결과도 흥미롭다. 전반적으로 LSTM이 Baseline에 비해 높은 성능을 보여주지만 일정 길이(여기서는 35단어 이상의 문장)를 넘기면 LSTM 기반 모델의 성능이 급격하게 감소하는 것을 확인할 수 있다.


Conclusion

해당 논문은 Seq2Seq구조의 Multi-Layer LSTM을 이용한 NMT를 제안한다. 이 모델의 Seq2Seq는 Encoder/Decoder 두 부분으로 구성되어있다. 여기서 아쉬운 점은 문장의 길이가 35개 단어를 넘기는 경우에는 정확도가 급격하게 하락하는 점인데, Abstract에서도 언급했듯이 이러한 점을 보완하기 위해 Attention 개념이 등장하게 된다. 하지만 결과를 분석하는데에서도 알수 있듯이 여전히 SMT에 대한 의존은 남아있는 것으로 보인다.

이렇게 문장의 길이가 길어질 경우 정확도가 급격하게 떨어지는 점 때문에 Character-level이 아닌 Word-level의 Input이 필요했던 것으로 보인다. Character-level로 진행할 시에는 문장의 길이가 조금만 길어도 35글자를 넘기는 경우가 빈번하게 나오기 때문이다.

어쨋든, Seq2Seq 기반 NMT의 기반을 세웠다는 점에서 이 논문이 의미가 있다고 할수 있을 것이다. 개인적으로는 병렬처리가 매우 비효율적인 RNN(LSTM, GRU)방식을 그리 선호하지는 않지만 Sequence 전체에 대한 정보를 모두 가져갈 수 있다는 점은 분명한 장점으로 생각된다.