7주차(2) - Neural Machine Translation in Linear Time

2019. 3. 7. 13:38풀잎스쿨 NLP Bootcamp

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

참고자료: (김동현님 발표자료) https://tinyurl.com/y3l98x8w (Google Slide)

참고자료2: (Kakalab) https://tinyurl.com/y22kw2l2


Abstract

우리는 지난 몇주간 Encoder-Decoder방식을 통한 Neural Machine Translation구조를 살펴봤다. 그중에는 RNN을 통해 Fixed Length Vector를 사용한 구조도 있었고, Stacked-LSTM에 Reversed Input을 사용한 방식도 있었다. 그리고 Attention을 사용한 방식도 존재했다. 이런 모든 구조들의 공통점은 바로 LSTM과 같은 RNN Architecture가 주를 이뤘다는 사실이다.

RNN과 같은 Sequential Model은 Input에 대한 모든 정보를 감안할 수 있다는 장점을 가진다. 이와 같은 장점은 Encoder-Decoder 구조를 제시하는데 중요한 역할을 했다. 하지만 Computation Cost의 시점으로 바라보자. Sequential Model의 가장 큰 단점을 하나 꼽으라면 역시 학습을 Parallel하게 진행하기 힘들다는 점이다. 이러한 점은 예측 속도에도 영향을 끼치게 된다. 특히 이번주 첫번째 논문인 Effective Approaches to Attention-based Neural Machine Translation에서도 언급했듯이 처리해야하는 Sequence의 길이가 길어지면 연산량이 급증하게 되는 현상이 발생한다.

그렇다면 Parallel하게 학습하기에 용이한 구조를 가진 ConvNet은 어떨까? ConvNet은 분명 병렬처리에 용이한 구조를 가지고 있고, 때문에 학습이 RNN과 같은 Sequential Model에 비해 훨씬 빠르게 이루어 질 수 있다는 장점을 가진다. 하지만 ConvNet은 Filter Size만큼씩 학습하는, 그러니까 Input 전체에 대한 정보를 고려하지 않고 일부분에 대한 정보만을 감안한다는 단점을 가진다. 바로 이러한 단점때문에 지금까지 나왔던 논문들은 RNN과 같은 Sequential Model을 사용하는 것이다.

이 논문에서는 RNN에서 가지고 있는 단점인 Sequence의 길이에 따른 연산량 급증에 대한 문제와 ConvNet에서 가지고 있는 단점인 Filter Size만큼에 대한 정보만을 가지는 점을 Dilated Convolution(또는 Atrous Convolution이라고도 불림)을 사용하여 해결하고자 한다.

Contribution

ByteNet Architecture

일단 Abstract에서도 언급했지만 RNN에서는 Sequence의 길이에 따라 연산량이 급증한다. 이 부분을 자세히 풀어보면, Source Sequence와 Target Sequence로 나눌 수 있는데, Encoder-Decoder의 구조상 모델에서는 이 두 부분에 대한 연산이 모두 들어간다. 따라서 모델의 연산량은 Source Sequence 뿐만이 아닌 Target Sequence에도 영향을 받는데, 이 두 부분중 어느 부분이라도 Sequence의 길이가 길어지면 연산량이 급증하게 된다. 즉, 논문의 표현을 빌리자면 'Super-Linear'하게 증가하게 되는 것이다.

따라서 우리는 Neural Translation Model인 ByteNet과 Neural Language Model인 ByteNet Decoder라는 구조를 통해서 이와 같은 문제를 해결하고자 하는 것이다.

일단 ByteNet의 구조를 살펴보자. ByteNet은 크게 다음 4가지로 구성된다.

  1. FCN (1D CNN): ByteNet내 Encoder/Decoder가 구성하고 있는 방법

  2. Enc-Dec Stacking: 두 Representation의 Bandwidth를 최소화 하기 위해 Encoder위에 Decoder를 쌓아놓은 구조

  3. Dynamic Unfolding: 다양한 길이의 Source/Target Sequence를 다루기 위함

  4. Masking: Decoder CNN에서 Target Sequence의 향후 토큰들을 보는 것을 막기 위함

여기서 Masking에 대해 조금 더 이야기해보자. Decoder를 잘 살펴보면 Encoder와는 달리 하위 Layer에서도 t+1의 토큰에 대해 Masking이 되어있는 것을 알 수 있다. 이는 WaveNet(https://deepmind.com/blog/wavenet-generative-model-raw-audio/) 구조와 유사한 구조이며, Recurrent하게 Prediction을 내기 위함이다.

Dynamic Unfolding


Dynamic Unfolding에 대해 조금 더 살펴보자. 우리는 모든 언어에 대해 Source Sequence와 Target Sequence의 길이가 동일할 것이라고 이야기 할 수 없다. 그도 그럴것이 언어마다 동일한 정보를 표현하기 위해 사용되는 문장의 길이는 언어의 특성을 따를 것이기 때문이다. 따라서 서로 다른 Sequence의 길이를 처리할 수 있어야 하는데, 이를 위해 사용되는 개념이 Dynamic Unfolding이다.


Dynamic Unfolding은 바로 위 수식을 사용하여 각 Sequence에 대한 길이를 미리 추정하게 된다. 여기서 |s|는 Source Sequence의 길이, |t_hat|은 Target Sequence의 예측/추정 길이, 그리고 t는 Target Sequence의 실제 길이를 뜻한다.


여기서 상수 a와 b는 각각 Encoder/Decoder에 사용되는 언어에 대한 Hyperparameter이다. 예를들면, 현재 논문에서는 English-German 번역모델을 제시하고 있는데, English에 비해 German의 어휘가 약 1.2배 더 많다고 한다. 따라서 a는 1.2, b는 0으로 설정하는 것이다.


Residual Blocks

해당 논문에서는 깊은 학습을 위해 Residual Learning을 하고자 한다. 그 방법으로 각 구조에 대해 Residual Block 구조를 제시한다. 일단 가장 왼쪽에 있는 구조는 기존 방식 그대로 ReLU를 이용한 구조이며, 중간에 있는 구조는 Residual Multiplicative Block이라는 방식을 사용한 구조이다. 가장 오른쪽은 MU Block의 구조가 어떻게 이루어져 있는지에 대해 설명하는 그림이다.


여기서 ReLU Residual block은 machine translation experiment에, 그리고 Residual Multiplicative Block은 Language Modeling에 사용되었다고 언급하고 있다.


Recurrent ByteNet

논문에서는 Dilated CNN을 이용한 ByteNet 뿐만이 아닌 RNN을 이용한 Recurrent한 구조의 ByteNet의 성능을 측정하고자 했다. 위 그림에서 왼쪽은 Encoder는 그대로 Dilated CNN으로 유지한 채 Decoder부분만 RNN으로 대체한 구조이며, 오른쪽은 Encoder와 Decoder 모두 RNN구조로 대체한 구조이다.


Result & Conclusion

Result

위 표는 모델의 특성에 따라 달라지는 실행 시간과 같은 특징을 표로 나타낸 것이다. 여기서 RP는 Resolution Preserving이라고 해서 Sequence의 길이가 다양하게 변할수 있는지에 대한 여부 정도로 이해할 수 있을 것이다. Path_S는 Source Token과 Output Token 사이의 거리를 지칭하며, Path_T는 Target Token과 Output Token 사이의 거리를 지칭한다.


여기서는 각 모델간의 성능을 BLEU Score로 비교하고 있는데, 역시나 이 논문에서 제시하는 모델이 가장 성능이 좋게 나온다고 주장하고 있다. 여기서 Inputs/Outputs은 Unit의 최소 단위를 말한다. Word-pieces의 경우 https://lovit.github.io/nlp/2018/04/02/wpm/ 를 참고하면 이해하는데 도움이 될 것이다. BPE는 Word-pieces 모델의 한 종류로서 Byte-pair Encoding을 뜻한다. 이 부분은 지난주 논문인 Neural Machine Translation of Rare Words with Subword Units(https://arxiv.org/abs/1508.07909)에서 다룬 바 있다.


Conclusion

해당 논문에서는 ByteNet 모델을 이용한 빠른 학습을 위한 병렬처리 구조, Dilated CNN을 이용하여 정보를 광범위하게 고려하는 방법, Residual Multiplicative Unit을 이용한 LSTM-like한 유닛 구조의 제시, 그리고 Dynamic Unfolding을 통한 다양한 길이를 고려하는 방법을 제시함으로써 빠른 시간내에 학습을 하고자 했다. 이 결과로 속도 뿐만이 아닌 성능도 개선되었다는 점은 인상적이다.

다만 아쉬운 점은 후에 Transformer라는 개념의 등장으로 ByteNet과 같은 방법은 현재는 더이상 쓰지 않는 방법이 되었다. 때문에 '예전에는 이런 방식을 썻구나' 하는 정도의 느낌으로 논문을 이해하는 것이 좋을 듯 싶다.