8주차(1) - Convolutional Sequence to Sequence Learning

2019. 3. 11. 00:30풀잎스쿨 NLP Bootcamp

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

참고자료: (최태균님 발표자료) CNN_Seq2Seq.pdf

참고자료2: https://norman3.github.io/papers/docs/fairseq.html


Abstract

Seq2Seq모델은 Encoder-Decoder구조를 통해서 효과적인 Translation 성능을 보여줬다. 하지만 RNN자체의 문제점인 병렬처리가 힘들다는 단점을 가지고 있었다. 이러한 문제점을 지난주 논문인 Neural Machine Translation in Linear (https://tinyurl.com/yyawyung)논문에서 ByteNet 구조를 통해 해결하고자 했다.

실제로 해당 논문은 Dilated Convolution Layer를 이용한 ByteNet 구조와 Dynamic Unfolding, 그리고 Residual Blocks를 이용하여 모델을 구성했고, English-German에 한정해서 좋은 Translation 성능을 보인바가 있다.

하지만 해당 논문에서 제시한 논문은 완전한 Convolution 구조가 아닌 Residual Multiplicative Block(이하 MU Block)이라는 구조를 통해 해결한 바가 있다. MU Block은 LSTM의 구조를 본따 만든 구조이며, 때문에 Short-Path에 대해 매우 신경써야 하는 단점이 있었다. 또한 해당 논문에서는 Attention에 대해서는 별도로 고려하지 못하는 구조를 가진다는 단점도 존재한다.

이 논문에서는 ConvNet 구조만으로 이루어졌으며 Attention을 고려할 수 있는 NMT모델을 제시한다. 

Contribution

Convolution Network Architecture

Positional Embeddings

여기서 말하는 Positional Embedding이란 Input Sequence에 대한 Position을 라벨링 해준 작업이라고 생각하면 좋다. 예를 들면, '나는 바다에 갔다' 라는 문장이 있다면 '나'에 해당하는 단어는 0번의 Position, '는'에 해당하는 단어는 1번의 Position을 가진다고 본다. 이런식의 Embedding이 필요한 이유는 Input Sequence에 포지션에 대한 정보를 넣어주기 위함이다.

Convolutional Block

Conv Block은 여러개의 Block을 Stacking한 형태이다. 즉, 결과적으로 정보를 Hierarchical하게 학습하는 구조가 된다. 논문에서는 Kernel Size를 3으로 설정하고 있는데, Size 3의 Window에서 나오는 Output들간에 관계를 다시 계산하는 방식을 거치게 되면, 결국 주 단어(Center에 위치한 단어)와 주변 단어와의 관계를 계산하게 되는 것이다. 또한 Stacking을 할수록 전체 문장에 대한 Dependency를 고려할 수 있다는 장점도 가지게 된다.


이런식으로 Convolution Layer를 구성하게 되면 처음과 마지막 단어에 대해 어느정도의 정보 손실이 일어날 수 밖에 없다. 이를 위해 Padding을 적용하게 된다. 여기서의 Padding은 Sequence의 길이를 유지시키기 위해 적용되며, 논문에서의 구현 방법은 문장의 앞/뒤 모두 Padding을 적용하는 방식을 따르고 있다. (하지만 실제 구현된 코드를 살펴보면 문장의 앞에만 Padding을 적용한다는 정보가 있다)

또한 Deep Convolution을 학습하기 위해 Block을 Residual Connection으로 연결하는 형태를 취한다. 여기서 i-k/2와 i+k/2는 각각 주 단어의 앞/뒤 단어를 가리킨다. 따라서 공식을 보면 Convolution의 각 Input에 대해 Block의 Output과 Residual Connection을 가진다고 이해할 수 있다.

그리고 최종적으로 Output Distribution에 대해 i+1의 Prediction을 이전 Step의 Output에 기반하여 Prediction을 내고있다.

Gated Linear Unit

또한 Embedding된 Sentence를 Conv.에 맞게 변환하는 과정을 Linear Mapping을 통해 적용하고 있는데, 이는 Embedding과 Conv.의 차원은 다를 수 있기 때문이다. 또한 Conv.는 Fixed Dimension을 가지기 때문에 이러한 과정을 통해 Dimension을 맞춰주는 작업을 할 필요가 있다. 바로 이 Linear Mapping에서 나오는 결과는 아래와 같이 계산될 수 있다.

수식 자체는 간단하다. Linear Mapping을 거친 결과물을 정확히 절반씩 나누어(A, B) 한쪽은 Residual Connection, 다른 한쪽은 Sigmoid activation을 거쳐 Point-wise Product를 계산한다. 이렇게 연산되는 부분이 바로 Gated Linear Unit이다. GLU는 각 Convolution Layer(Block 아님)에 적용된다.


Multi-Step Attention

순서대로 살펴보자. 우선 Attention을 계산하기 위해 현재의 Decoder state인 h_i와 이전 Target element의 Embedding을 같이 결합하게 된다. (d_i)


그리고 여기서 Attention을 계산하는 것은 Decoder state의 Summary인 d_i와 Encoder Block의 마지막 output의 dot product를 기반으로 계산하게 된다. (a_ij)



이렇게 계산된 Attention을 기반으로 현재 Decoder Layer의 conditional input을 encoder의 output(z_j)와 input element embedding(e_j)의 weighted sum을 통해 계산하게 된다. 이렇게 계산되는 Attention은 각 Layer마다 적용되게 되는데, 이러한 방식을 multiple 'hops'라고 칭하고 있다. (Multi-Step Attention이라고 부르는 이유이기도 하다)


따라서 위와 같은 방식으로 Attention이 적용되게 되는 것이다. 즉, 이전 Layer에서 어떤 단어가 Attention이 되었는지를 Network가 감안할 수 있게 되는 방식이다.


최종적으로는 아래와 같은 구조로 수식들이 적용되게 된다.


Normalization & Initialization

사실 위와 같이 Layer마다 Attention이 잘 학습되기 위해서는 Input과 Output간에 dependency가 없어야 한다는 전제조건이 붙는다. 하지만 학습을 진행하면 결국 Input과 Output사이에 Dependency가 존재하게 되는데, 이러한 현상을 최대한 방지하고자 Normalization을 적용하게 된다.

모델 내에서의 Normalization은 Encoder Layer에서의 Gradient를 Attention이 적용된 Layer의 갯수에 비례해서 scaling하는 방식으로 진행된다. 여기서 Source에 대한 Word Embedding은 제외하게 된다.

Initialization는 Activation의 variance를 유지하기 위해 적용한다. Embedding의 경우, 모든 embedding을 평균 0, Stddev 0.2의 Normal distribution으로 initialize한다. Layer의 경우 weight를 평균 0, Stddev는 sqrt(1 / (number of input connections to each neuron))으로 initialize한다. GLU의 weight도 initialize하게 되는 Layer input의 분산의 4배가 되도록 initialize하게 된다.

Result & Conclusion

Result

해당 결과를 살펴보면 기존 Seq2Seq모델인 GNMT의 성능에 비해 월등히 빠른 것을 볼 수 있다. 여기서 b는 beam size(Beam search)이다. 심지어는 GPU의 성능이 TPU의 성능보다 더 나은 경우도 살펴볼 수 있다.


위 결과는 Attention을 적용하는 Layer #에 따른 BLEU Score를 나타낸다. 결과적으로는 Attention을 적용할 수록 대부분의 경우 BLEU Score가 올라가는 결과를 보여준다. 또한 하나의 Layer만 Attention을 적용했을때 몇번째 Layer에 적용해야 성능이 좋은지에 대한 결과도 보여주고 있는데, 5번째 Layer를 제외하면 그렇게 큰 차이가 없는 것을 확인할 수 있다.


Conclusion

이 논문에서는 Sequence to Sequence 학습을 위한 Fully Convolution 모델 구조를 제시한다. 이 모델은 Convolution 모델의 특성상 병렬처리에 적합하다는 장점을 가지며, Hierarchical한 구조를 학습 시키기에도 적합하다는 장점을 가지게 되었다. 그리고 이 모델은 GLU를 통한 gating과 multiple attention step을 사용하여 성능을 향상시키고자 한다.

사실 이전에도 ConvNet을 통한 빠른 학습이 용이한 구조를 제시한 논문은 있었지만 해당 논문은 이러한 ConvNet기반의 Seq2Seq중 가장 훌륭한 모델이라는 평가가 있다.