이 포스트부터 읽어보세요.
2017년 NIPS에서 Google이 소개한 Transformer에 대한 논문이다. 논문 원본은 여기에서 볼 수 있다.
기존의 CNN과 RNN에서 벗어난 새로운 구조를 제안한다.
# Introduction
RNN, 특히 LSTM, GRU는 sequence modeling, transduction problem(Language Modeling, Machine Translation, etc.) 등의 분야에서 SOTA의 성능을 꾸준히 제공하고 있다. Recurrent 한 모델들은 특정 step에서 이전 hidden state $ h_{t-1} $ 를 바탕으로 $ h_t $ 를 생성한다. 이렇게 순차적으로 처리하는 특성 때문에 병렬 처리에 어려움이 있었다. 다양한 방법으로 이러한 문제를 해결하려고 했지만, 순차적인 처리에 있는 근본적인 문제는 여전히 존재한다. Attention 기법은 input과 output의 거리에 상관없이 dependency를 학습할 수 있도록 한다. 이러한 attention 기법은 기존의 recurrent한 방식과 함께 사용되었다.
이번 논문에서는 Transformer를 제안한다. Recurrent 한 구조를 피하고, attention 기법에만 의존해서 input과 output 사이의 global dependencies를 학습할 수 있다. Transformer는 병렬성을 증가시켜 적은 시간의 학습시간에도 불구하고 SOTA의 결과를 제공한다.
# Background
순차적인 컴퓨팅을 제거하기 위해 CNN을 사용하는 다양한 방식들이 제안되었었다. 이러한 방식들은 임의의 두 위치의 관계를 학습해야 한다. 이 때, 두 위치가 멀리 떨어져 있는 경우 dependency를 학습하기 어렵다는 단점이 있다.
Self-attention(intra-attention)은 동일한 seqence에 있는 서로 다른 위치에 대해서 연산을 수행해, sequence에 대한 representation을 학습하는 방법이다. Transformer는 최초로 유일하게 self-attention으로만 구성된 transduction model이다.
# Model Architecture
가장 성능이 좋은 neural sequence transduction model은 encoder-decoder 구조로 되어있다. Encoder는 $ (x_1, x_2, ..., x_n) $ 으로 구성된 입력을 받아서 continuous representation인 $ z = (z_1, z_2, ..., z_n) $ 으로 매핑한다. $ z $ 가 주어졌을 때, decoder는 $ (y_1, y_2, ..., y_m) $ 의 결과를 제공한다. 이전 단계에서 생성한 결과를 다음 단계의 입력으로 사용한다. Transformer는 동일한 구조를 유지하지만 self-attention을 사용한다.
# Encoder and Decoder Stacks
# Encoder
Encoder는 N = 6 의 스택으로 구성도어 있다. 각 층은 2개의 sub-layer로 구성되어 있다. 첫 번째 sub-layer는 multi-head self-attention 기법을 사용한다. 그 다음 층은 fully connected feed-forward network로 구성된다. Residual Connection을 두 sub-layer를 거쳐서 적용하고 layer normalization을 수행한다. Residual Connection을 수행하기 위해 embedding 층을 포함하는 모든 sub-layer는 $ d_{model} = 512 $ 의 차원으로 제공된다.
# Decoder
Decoder도 동일하게 N = 6 의 스택으로 구성되어 있다. Encoder에도 존재하는 2개의 sub-layer를 포함해서 총 3개의 sub-layer로 구성된다. 새로 추가된 sub-layer는 encoder의 출력와 multi-head attention을 수행한다. Encoder와 유사하게 residual connection을 수행하고 이후에는 layer normalization을 수행한다. 또한, 뒤에 나오는 입력들에 대한 정보를 미리 알지 못하도록 self-attention 방식을 수정한다. Masking 방식으로 수행이 되는데, 해당 방식을 통해서 i 번째 위치에 대한 예측은 i 보다 작은 결과에 대해서만 의존적이게 한다.
# Attention
Attention은 key-value의 쌍과 query 의 mapping이라고 할 수 있다. 최종 출력을 value 들의 weighted sum으로 구성된다. 이 때, weight은 query와 상응하는 key에 해단 compatibility function의 결과로 구해진다.
# Scaled Dot-Product Attention
Transformer에서 사용하는 특수한 Attention을 "Scaled Dot-Product Attention" 이라고 한다. Query와 Key는 $ d_k $ 차원이고, value는 $ d_v $ 차원으로 구성된다. Query와 모든 keys에 대한 dot-product를 구하고, $ \sqrt{d_k} $ 로 나눠주게 된다. 실제로 연산하는 경우, 모든 query 값을 모아서 하나의 matrix인 Q 로 사용하고, key와 value도 동일하게 K와 V 라는 matrix로 생성해서 연산한다. 연산은 다음과 같이 수행한다 :
가장 많이 사용되는 attention function은 additive attention과 dot-product attention 이다. Dot-product는 $ \sqrt{d_k} $ 로 나눠주는 것을 제외하면 동일한 연산이다. 두 방법을 비교했을 때, dot-product 가 훨씬 빠른 계산 속도를 제공하고, 훨씬 효과적으로 메모리를 사용한다. $ {d_k} $ 가 작은 크기인 경우 두 방식은 유사한 성능을 제공하지만, $ d_k $ 의 값이 커지는 경우 dot-product의 결과가 매우 커질 수 있다. 그렇기 때문에 $ \sqrt{d_k} $ 로 나눠주면서 scaling을 하게된다.
# Multi-head Attention
한 개의 attention만 수행하기 보단, attention을 병렬로 h 번 수행하는 것이 더 효과적이라는 것을 알 수 있었다. 이렇게 동시에 연산된 결과들은 $ d_v $ 차원의 출력을 제공하게 된다. 각 층의 출력은 concatenate해서 최종 결과로 사용한다. Multi-head attention은 모델로 하여근 다양한 속성에 대해서 학습할 수 있도록 한다.
이 논문에서는 h = 8 만큼 층을 이용해서 병렬처리를 했다. 또한 $ d_k = d_v = 64 $ 으로 지정했다. 차원이 줄어 들었기 때문에, 기존의 차원을 그대로 사용한 single-head attention 과 연산 비용이 비슷하다.
# Applications of Attention in our Model
Transformer에서 multi-head attention을 3가지 방식으로 사용한다.
- Encoder-decoder attention : Key/value는 encoder의 결과로, query는 decoder의 이전 층을 이용해서 attention을 수행한다. Decoder가 Encoder의 모든 입력과 직접 연결될 수 있다.
- Encoder는 self-attention layer를 보유하고 있다. Key, value, query 는 모두 동일한 입력에서 제공된다. 인코더는 이전 층의 모든 입력에 대해서 attend 하게 된다.
- Decoder의 self-attention layer도 encoder 와 유사하게 동작한다. Decoder의 경우, 미래에 나타나는 입력에 대한 정보를 미리 보유하고 있으면 안되기 때문에 masking을 해서 이후에 나타는 입력에 대한 attention을 하지 않는다.
# Position-wise Feed-Forward Networks
Encoder와 Decoder 모두 fully connected feed-forward network를 보유한다. 해당 층에서는 두 개의 linear transformation을 수행하고, 두 연산 사이에는 ReLU 연산을 수행한다. 두 linear transformation은 서로 다른 파라미터를 사용한다. 해당 연산은 크기 1의 convolution 연산과 동일하다고 할 수 있다. 각 층의 입력과 출력은 $ d_{model} = 512 $ 이고, inner-layer는 $ d_{ff} = 2048 $ 의 차원을 보유한다.
# Embeddings and Softmax
우리는 Learned embedding을 이용해서 input token과 output token을 $ d_{model} $ 차원의 벡터로 변환한다. 또한, 학습된 linear transformation과 softmax 함수를 통해서 decoder output으로 다음 토큰의 확률을 계산한다. 두 개의 임베딩 층(입력, 출력층)과 softmax 이전의 linear transformation에 동일한 weight matrix를 적용한다.
# Positional Encoding
Tranformer에는 recurrence와 convolution이 모두 없기 때문에, 입력의 position 정보를 함께 입력해야 한다. 그러기 위해서 "positional encodings" 를 입력 임베딩과 함께 추가해서 입력했다. Positional embedding은 입력 임베딩과 동일하게 $ d_{model} $ 차원으로 구성되어 있어서, 두 임베딩이 합쳐질 수 있게 한다. Positional encoding을 나타내는 방법은 다양하게 존재하지만, 이 논문에서는 sine, cosine 함수를 이용하게 된다.
$ pos $ 는 위치(position)를 나타내고, $ i $ 는 차원을 나타낸다. Sinusoid의 형태를 갖추는데, $ 2\pi ~ 10000 * 2 \pi $ 의 주기를 갖게 된다. 우리는 상대적인 위치를 기반으로 attend 하면 더 빠르게 학습할 수 있을 것이라고 예측했다. $ PE_{pos+k} $ 의 값은 $ PE_{pos} $ 값의 linear 연산을 통해서 구할 수 있기 때문이다.
# Why Self-Attention
이 부분의 논문에서는 self-attention layer와 다른 recurrent, convolution layer를 비교한다. 다른 encoder-decoder에서 수행하듯이, 순차 입력으로 제공되는 $ x_1, x_2, ..., x_n $ 을 새로운 순차 입력 $ z_1, z_2, ..., z_n $ (모두 d-차원 벡터) 으로 매핑한다. Self-attention를 사용한 이유를 3가지로 구분해서 설명한다.
첫 번째 요소는 각 층의 computational complexity 이다. 두 번째는 병렬처리가 가능한 computation 의 양이다. 이 요소는 최소한의 sequential operation으로 계산된다. 마지막으로는 long-range dependency 사이의 거리를 사용한다. Sequence transduction task에서 멀리 떨어진 입력의 dependency를 처리하는 것은 어려운 문제이다. 멀리 떨어진 입력에 대한 dependency를 학습하는데 있어서 성능에 영향을 주는 요소 중 하나는, backward/forward signal이 네트워크 안에서 이동해야 하는 거리이다. 해당 거리가 짧은수록 멀리 떨어져있는 dependency를 효과적으로 학습할 수 있다.
[표-1]을 보면, self-attention layer는 각 위치를 상수 횟수의 sequential operation으로 처리한다. 반면에 recurrent layer는 $ O(n) $ 의 seqential operation을 수행하게 된다. Computational complexity를 고려했을 때, sequence의 길이 $ n $ 이 representation의 차원 $ d $ 보다 작은 경우 self-attention layer는 recurrent layer 보다 빠르게 연산될 수 있다. Machine translation task를 수행하는 SOTA 모델들은 대부분 이러한 조건을 만족한다. 매우 긴 sequence 에 대해서 성능을 유지하기 위해서는 self-attention은 두변의 $ r $ 개의 이웃된 요소들에 대해서만 수행되어야 한다. 이런 경우 최대 path length 는 $ O(n/r) $ 이 될 것이다. 그 외에도, self-attention은 interpretable model을 제공한다. 각 attnention은 서로 다른 특징을 학습하고, syntactic, semantic 구조를 이해할 수 있도록 한다.
# Training
# Training Data and Batching
우리는 standard WMT 2014 English-German dataset (4.5million 문장쌍) 을 이용해서 학습을 진행했다. 각 문장들은 byte-pair encoding을 이용해서 인코딩(37,000개의 토큰으로 구성) 되었다. English-French 번역의 경우, larget WMT 2014 English-French dataset 을 이용해서 학습했다. 각 학습 배치는 한 쌍의 문장으로 구성되었고, 25,000개의 source, 25,000개의 target token으로 구성되었다.
# Hardware and Schedule
우리는 전체 모델을 8개의 NVIDIA P100 GPU를 이용해서 학습시켰다. 각 training step 은 0.4초 정도 걸렸고, base model은 100, 000step 동안 학습시켰다. Big Mode은 한 step에 1.0초가 걸렸고, 300,000step 동안 학습을 진행했다.
# Optimizer
학습하는 과정에서 Adam Optimizer를 이용했다. warmup_steps 동안에는 학습률을 증가시키다가, 이후에는 감소시켰다.
# Regularization
학습 과정에서 3개의 regularization을 적용했다.
- Residual Dropout : sub-layer의 출력에 대해서 dropout을 적용했다. 더해지고, normalized 되기 전에 dropout을 적용했다.
- 단어의 임베딩과 positional encoding의 합에 대해서도 dropout을 적용했다.
- Label smoothing : 0.1 의 label smoothing 을 적용시켰다. 해당 적용으로 인해서 perplexity 는 줄어들었지만, BLEU 점수를 증가시키는 효과가 있었다.
# Results
# Machine Translation
WMT 2014 English-to-German translation task에 대해서 big transformer model은 이전에 최고 성능을 보여줬던 모델을 뛰어넘는 성능을 보여줬다. BLEU 점수를 2.0 정도 증가시키면서 SOTA BLEU score (28.4점) 를 제공했다. 8 P100 GPU를 이용해서 3.5일 동안 학습을 진행했다. WMT 2014 English-to-French translation task에서는 big transformer model 은 1/4의 학습 비용만으로 이전에 최고 성능의 모델들을 뛰어넘었고, 41.0 BLEU 점수를 제공했다. Big model의 경우 마지막의 20개 체크포인트를 평균해서 사용했고, Base model 의 경우, 한 개의 모델만을 이용해서 10분 간격으로 5개의 체크포인트를 유지했다. Beam size = 4 로 해서 beam search 를 진행했다.
# Model Variations
Transformer의 다양한 요소들의 중요성을 파악하기 위해서 base model을 다양한 방식으로 수정했다. 해당 테스트는 English-to-German translation 의 성능을 기반으로 평가했다.
[표-2]에서 (B)는 key size가 모델의 성능에 영향을 미친다는 것을 나타낸다. 또한, (C)와 (D)에서는 당연하게도 큰 모델들의 성능이 더 좋고, overfitting을 예방하기 위해서 dropout이 효과적이라는 것을 나타낸다. (E)에서는 기존의 sinusodial positional encoding을 learned positional embedding으로 교체한 결과이고, 기존의 성능과 유사하다는 것을 알 수 있었다.
# English Constituency Parsing
Transformer가 일반적인 task에 사용될 수 있을지 확인하기 위해서 English constituency parsing에 적용시켜 보았다. Output이 input보다 훨씬 길다는 문제를 해결해야 하는 task이다. 우리는 4-layer model dimension = 1024 인 Transformer를 Penn TreeBank의 일부인 Wall Street Journal(WSJ) 부분에 대해서 학습했다. [표-4]를 보면, 특정한 task에 대해서 튜닝을 진행하지 않았어도 좋은 성능을 제공한다는 것을 알 수 있었다.
# Conclusion
이번 논문을 통해서 Transformer에 대해서 소개했다. Attention 기법만 이용한 최초의 Sequence transduction model 이다. 기존의 encoder-decoder 구조에 존재하던 recurrent한 요소들을 모두 multi-headed self-attention으로 대체했다. Translation task에 대해서는 기존의 다른 모델을보다 월등히 좋은 SOTA 성능을 제공할 수 있었다. attention-based model 들이 다른 다양한 task들에 적용되기를 기대한다. Text가 아닌 다른 입력을 받는 것에 대한 확장도 시도해볼 예정이다.
댓글