Search
Duplicate
🤖

Transformer: Attention is All You Need

Created
2022/07/30
Editor
Tags
NLP

논문 선정 이유

본 논문에서는 시퀀스변환 task에서 흔히 사용됐었던 convolution이나 recurrent layer 없이 순수 attention 메커니즘만을 이용하여 높은 성능 개선을 이끌어낸 Transformer를 제시합니다. 자연어처리 관련 모델을 공부할 경우 대표적으로 먼저 언급될 정도로 저명한 논문일 뿐 아니라, 텍스트를 뛰어 넘어 이미지, 비디오 등 다양한 분야에 활용될 만큼 획기적인 매커니즘을 제안하였다고 생각하여 이를 공부해보고자 논문을 선택하였습니다.

Abstract

유명한 시퀀스 변환 모델들은 복잡한 순환﹒합성곱 신경망(이하 RNN﹒CNN)을 기반으로 encoder와 decoder를 포함하고 있습니다. 가장 성능이 좋은 모델 또한 attention 매커니즘을 이용하여 encoder와 decoder를 연결합니다. 해당 논문에서는 RNNCNN 없이 오직 Attention 매커니즘만을 기반으로 한, 새롭고 간편한 네트워크 구조인 Transformer를 제안합니다. 2가지의 기계번역 task에서 Transformer 모델들은 성능이 매우 우수했으며, 병렬화를 통해 학습 시간을 현저히 줄여나갔습니다. 우리의 모델은 WMT 2014 English-German 번역 task에서 앙상블을 통해 기존의 최고 점수를 2 BLEU 이상 향상시키면서, 28.4 BLEU를 달성하였습니다. WMT 2014 English-French 번역 task는 8개의 GPU, 3.5일간의 학습을 통해 41.8 BLEU를 달성하여 우리의 모델이 새로운 단일 모델 SOTA(State-Of-The-Art)를 달성하였습니다.
BLEU : 한 자연어에서 다른 자연어로 기계 번역 된 텍스트 품질을 평가하기위한 알고리즘
또한, 기계 번역 이외에도 English constituency(크거나, 매우 적은 학습 데이터에 대하여 구문 분석 진행)에 대해서도 일반화가 잘 되는 것을 확인할 수 있습니다.

Introduction

RNN(Recurrent Neural Networks), 특히 LSTM(Long Short-Term Memory), GRU(Gated Recurrent Unit)은 시퀀스모델링이나 언어모델링, 기계번역과 같은 변환 문제에서 SOTA 접근법으로 견고하게 자리잡고 있습니다. 순환 언어 모델과 encoder-decoder 구조의 한계를 넓히기 위한 노력은 계속 되고 있습니다.
Recurrent 모델들은 전형적으로 input과 output 시퀀스의 토큰 위치에 따라 계산을 분해합니다. 계산시간에 각 step에 위치를 정렬시켜, hidden state hth_t의 시퀀스를 생성하여, 이전의 hidden state인 ht1h_{t-1}의 함수, 그리고 t position에서의 입력으로 적용합니다. 본질적으로 이런 연속적인(sequential한) 특성은 학습에 있어서 병렬화를 배제하는데, 메모리 제약으로 인해 학습 샘플간의 batch를 제한하여, 시퀀스의 길이가 길어질수록 취약합니다. 최근에는 인수분해 꼼수(?)와 조건부 계산을 통해 학습의 계산 효율성을 높이고, 모델의 퍼포먼스 또한 향상시키고 있습니다. 그러나 연속적 계산이라는 근본적인 문제가 여전히 남아있습니다.
입﹒출력의 시퀀스에서 그들의 거리와 상관 없는 의존성을 허용하면서, 다양한 task에 대하여 시퀀스 모델링 및 변환 모델에서 Attention 매커니즘은 중요한 부분이 되어가고 있습니다. 그러나, 몇가지를 제외하고는 Attention 매커니즘은 recurrent 네트워크와 함께 사용됩니다.
해당 모델에서는 recurrence를 제거하고 입력과 출력 사이의 global한 의존성을 끌어내기 위해 Attention 매커니즘에 전적으로 의존하는 구조인 Transformer를 제시합니다. Transformer는 훨씬 더 병렬화가 가능하게 만들고, 8개의 P100 GPU에 대하여 12시간 정도만 학습해도 번역 품질에 대하여 새로운 SOTA를 달성할 수 있습니다.

Background

연속적인 계산을 줄이기 위한 목표는 또한 Extended Neural GPU, ByteNet, ConvS2S의 기반을 형성했습니다. 이들은 모두 모든 입﹒출력의 위치에서 hidden representation을 병렬적으로 계산하는 CNN을 기초적인 building block으로 사용하였습니다. 해당 모델들에서는, 임의의 두 입력 또는 출력 위치로 부터 신호를 관계시키기 위해 요구되는 계산의 수가 위치들간의 거리에 비례하는데, ConvS2S는 선형적으로, ByteNet은 대수적으로(log와 비례하여) 증가합니다. 이는 위치가 멀 수록 의존성을 학습하기가 더 어렵게 합니다. Transformer에서는 계산의 수가 상수 번으로 줄어들었습니다. 그래도 Attention-가중 위치를 평균 내기 위해 효과적인 해상도가 감소하는 cost가 존재하지만, 이는 section 3.2에 설명될 Multi-Head Attention을 통해 상쇄시킬 수 있습니다.
때로는 intra-attention이라고도 불리는 Self-attention은 한 시퀀스의 representation을 계산하기 위하여 단일 시퀀스의 서로 다른 위치들을 관련시키는 매커니즘입니다. self-attention의 경우, 독해, 생성요약, 문맥 추론, 그리고 태스크 비의존적인 문장 표현 등 다양한 task에서 성공적으로 사용되고 있습니다.
End-to-End memory네트워크는 배열된 시퀀스의 recurrent 네트워크 대신, 재귀적 attention 매커니즘을 기반으로 하고, 단일 언어 QA(Question-Answering)이나 언어모델링 task에 좋은 성능을 보이고 있습니다.
그러나, Transformer는 입력과 출력의 representation을 계산하기 위해 시퀀스 할당 RNN이나 합성곱 없이 self-attention에만 전적으로 의존하는 첫번째 변환 모델입니다.

Model Architecture

인코더-디코더 구조에서 인코더는 입력 sequence (x1, ... ,xn)를 받아 continuous representation z = (z1, ... ,zn)를 반환하고, 디코더는 이 z를 사용해 출력 sequence (y1, ... ,yn)를 생성합니다. 이때 각 time step에서 다음 단어입력을 생성할 때, 모델은 이전에 생성된 단어를 추가적인 input으로 사용하기 때문에 Auto-Regressive합니다.
Transformer도 이러한 전반적인 아키텍쳐를 따릅니다. 인코더와 디코더에 stacked self-attention, point-wise, fully connected layer를 사용합니다.

Encoder and Decoder Stacks

(1) Encoder

위 그림에서 왼쪽에 해당하는 것으로 동일한 레이어의 인코더 6개(N=6) 를 병렬로 연결해 구성합니다. 각 레이어에는 2개의 sub-layers 가 있습니다.
첫번째 sub-layer : multi-head self- attention mechanism
두번째 sub-layer : simple position-wise fully connected feed-forward network
그림에서 Add & Norm 에 해당하는 부분으로 두개의 sub-layer 각각에 잔차연결(residual connection)과 층 정규화(layer normalization)을 사용합니다. 잔차연결은 x + Sublayer(x), 즉 sub-layer 층의 입력과 출력을 더하는 과정입니다. 따라서 sub-layer와 임베딩 레이어의 출력과 입력의 차원은 동일해야합니다(d_model = 512). 그리고 층 정규화를 적용해, 최종 함수는 LayerNorm(x + Sublayer(x)) 입니다.

(2) Decoder

위 그림에서 오른쪽에 해당하는 것으로 마찬가지로 디코더 6개의 (N=6) 동일한 레이어를 stack해 구성합니다. 인코더의 2개의 sub-layer와 더불어 sublayer인  인코더의 출력에 대한 Masked multi-head self-attention을 추가합니다. 뒤에 오는 단어를 참고하지 못하도록 masking을 사용했습니다. 즉 i 시점의 단어가 오직 i 이전의 단어에만 의존하도록 했습니다. 또한 각 sub-layer에 대해 잔차연결과 층 정규화를 사용합니다.

Attention

Attention은 query에 대해서 key-value 쌍을 출력과 mapping합니다. 여기서 Query, Keys, Values 그리고 출력은 모두 벡터입니다. Query에서 모든 key와의 유사도를 구하고, key에 해당하는 각 value를 유사도 가중합으로 출력이 계산됩니다. Query, Keys, Values는 sequence의 모든 단어 벡터들입니다.
1. Query vector
> 현재 처리하고자 하는 token을 나타내는 vector
2. Key vector
> 일종의 label, 시퀀스 내에 있는 모든 토큰에 대한 identity
3. Value vector
> Key와 연결된 실제 토큰을 나타내는 vector

(1) Scaled Dot- Product Attention

입력은 queries, 차원이 d_k인 keys, 차원이 d_v인 values로 구성되어 있습니다. 가중치를 얻기 위해 softmax function을 적용합니다. key의 차원, d_k에 루트를 씌운 값으로 나누어줘 스케일링해줍니다. 이때 각 query 벡터를 따로 계산하는 것이 아니라 query 집합으로 동시에 계산합니다. 따라서 queries, keys, values는 각각 행렬 Q, K, V가 됩니다. 최종 출력식은 다음과 같습니다.
일반적으로 자주 사용되는 attention 함수에는 Additive attention과 본 모델에 사용한 Dot-product attetion이 있습니다. 두 방법의 이론상 복잡성은 비슷하지만 실제 적용에서 Dot-product attention이 휠씬 빠르고 더 space-efficient 합니다. 최적화된 행렬 곱 code를 구현할 수 있기 때문입니다.

(2) Multi-Head Attention

d_model 차원의 queries, keys, values을 사용한 한번의 attention 함수보다 각각 d_v, d_k, d_k 차원으로 축소해 서로 다른 h개의 linear projection을 한 것이 더 효과적이라는 것을 알아냈습니다. 차원을 축소한 V, K, Q를 병렬 attention을 적용합니다. 결과적으로 d_v차원의 출력 값이 만들어집니다. 이것이 합쳐져(concatenated) 다시 투영(projection)해 최종 값을 얻을 수 있습니다.
이는 서로 다른 positions에 서로 다른 representation subspaces에서 결합적으로(jointly) 정보에 접근할 수 있도록 합니다. 즉 축소된 Attention을 병렬화해 다양한 시각으로 정보를 수집할 수 있습니다. 즉 단어간의 연관도를 구할 때, 문법적 구조나 의미적 구조에 대해서 복합적으로 반영할 수 있습니다.
본 논문에서 8개의 parallel attention layers(h=8)을, 각 d_k, d_v는 64차원(512/8=64)을 사용했습니다.

(3) Applications of Attention in our Model

Transformer은 multi-head attention을 3가지 방법으로 사용했습니다.
디코더의 두번째 sub-layer, Multi-Head Attention에 사용되었습니다. "encoder-decoder attention" 레이어에서 queries는 이전의 디코더 레이어에서 오고 memory keys와 values는 인코더의 출력으로부터 옵니다. 이것은 디코더가 입력 sequence의 모든 position을 고려할 수 있도록 합니다. 이는 sequence-to-sequence 모델의 일반적인 인코더-디코더 attention 매커니즘을 모방한 것입니다.
인코더의 첫번째 sub-layer, Multi-Head Attntion에 사용되었습니다. 인코더는 self-attention layers를 포함합니다. self-attention layer에서 모든 key, values, queries는 같은 곳(인코더의 이전 레이어의 출력)에서 옵니다. 인코더의 각 position은 이전 레이어의 모든 position을 고려할 수 있습니다.
디코더의 첫번째 sub-layer, Masked Multi-Head Attention에 사용되었습니다. 디코더의 self-attention layer로 디코더가 해당 position과 이전까지의 positon만을 고려할 수 있도록 합니다. 현재 position 다음의 position을 masking out합니다. 아주 작은 값에 수렴하도록 값을 주고 softmax를 적용하는 방법으로 미래의 position에 대한 영향을 maskong out할 수 있습니다.

Position-wise Feed-Forward Networks

인코더와 디코더의 각 레이어는 Fully Connected feed-forward network을 포함합니다. 각 position에 독립적으로 동일하게 적용됩니다. 이것은 두개의 선형변환과 ReLU로 이루어져 있습니다.
하나의 층 내에서 다른 position에 대해 선형변환은 같지만, 레이어마다는 다른 모수를 사용합니다. 입력과 출력의 차원은 d_model = 512, 그리고 inner-layer의 차원은 d_ff = 2048입니다.

Embeddings and Softmax

다른 sequence 변환과 비슷하게, transformer도 입력 토큰과 출력 토큰을 차원이 d_model인 벡터로 전환하기 위해 learned embedding을 사용합니다. 디코더의 출력으로 next-token 확률을 예측하기 위해 학습가능한 선형변환과 소프트맥스 함수 사용합니다. 두 임베딩 레이어와 pre-softmax 선형 변환에서 동일한 weight 행렬을 공유합니다. 임베딩 레이어에서 이 가중치들에 d_model 루트 씌운 값을 곱해 사용합니다.

Positional Encoding

Transformer는 RNN과 CNN을 사용하지 않기 때문에 sequence의 순서를 반영하기 위해서 단어 토큰의 상대적 또는 절대적 위치에 대한 정보를 삽입하는 것이 필요합니다. 따라서 인코더와 디코더의 입력 임베딩에 "Positional Encoding"을 추가했습니다. Positional Encoding은 임베딩의 차원과 마찬가지로 d_model 차원을 갖게 해 두개간의 덧셈을 가능하게 합니다. 위치 정보를 가진 값을 만들기 위해 다음 두 함수를 사용합니다.
pos : 위치 (position)
i : 차원(dimension)
각 위치 인코딩의 차원은 사인곡선(sinusoid)에 대응됩니다. 인덱스가 짝수(2i)일 때는 사인함수를 사용하고 홀수(2i+1)일 때는 코사인 함수를 사용합니다. 어느 k 값이라도 PE_(pos+k)는 선형 함수 PE_(pos)로 나타날 수 있기 때문에 사인·코사인 함수를 선택했습니다.
Learning positional embedding 방법도 거의 비슷한 결과를 보여주지만, 사인곡선의 방법이 학습과정에서 만났던 sequence 보다 긴 sequence에 대해서도 추론할 수 있기 때문에 사용했습니다.

Why Self-Attention

전형적인 시퀀스 변환 encoder나 decoder처럼, 가변길이를 가진 시퀀스의 representation (x1,...,xn)(x_1,...,x_n)을 동일한 길이를 가진 시퀀스의 representation (z1,...,zn)(z_1, ..., z_n)에 매핑하는데 전형적으로 사용되는 recurrent convolutional layer를 self-attention layer와 다양한 관점에서 비교해보려 합니다. 해당 논문에서는 다음과 같은 세가지의 이유로 self-attention을 주장합니다.
1.
각 layer의 전체 계산복잡도
2.
병렬화할 수 있는 계산량(요구되는 연속적 계산의 최소 개수로 측정)
3.
네트워크 내부의 장거리 의존성 사이의 경로 길이
장거리 의존성을 학습하는 것은 다양한 시퀀스 변환 task에서 중요한 과제입니다. 이러한 의존성을 학습할 수 있는 능력에 영향을 주는 한가지 요인은 네트워크에서 지그재그로 주어지는 전위, 후위 신호의 길이입니다. 입력과 출력의 시퀀스에서 어떠한 위치에서든지 사이의 경로들이 짧을 수록, 장거리 의존성을 학습하기가 쉬워집니다. 그래서 다른 layer들로 구성된 네트워크에서 입력과 출력 위치가 가장 먼 경로의 길이를 비교하게 됩니다.
레이어 타입마다 가장 큰 경로의 길이, 레이어 당 계산 복잡도와 최소한의 연속적 계산량을 비교하였습니다.
n : 시퀀스 길이
d : representation 차원
k : convolution의 kernel size
r : 제한된 self-attention에서의 이웃 수
연속적 계산량이 O(n)을 따르는 recurrent layer와 달리, self-attention layer는 상수개의 연속적으로 실행되는 계산들로 모든 위치를 연결합니다. 계산복잡도에 대해서는, 시퀀스의 길이 n이 representation의 차원인 d보다 작을 때 recurrent layer보다 self-attention layer가 더 빠른데, word-piecebyte-pair representation 같은 기계번역에서 SOTA 모델들이 사용하는 문장 representation의 경우 대부분 n이 d보다 작습니다. 매우 긴 시퀀스와 관련된 task의 성능을 향상시키기 위해, self-attention에서 각각의 출력 위치를 중심으로 하는 입력 시퀀스의 이웃 수를 r로 제한시킬 수 있습니다. 이를 통해 경로 길이의 최댓값은 O(n/r)로 증가할 수 있습니다.
kernel 너비 k가 n보다 작은 하나의 convolutional layer는 입력과 출력에 대하여 모든 쌍을 연결할 수 없습니다. 그렇게 하기 위해서는 네트워크 안에서 두 위치 사이의 가장 긴 경로의 길이를 증가시키면서, 인접한 kernel의 경우 convolutional layer가 O(n/k)O(n/k)만큼 필요하고, 확장된 convolution의 경우는 O(logk(n))O(log_k(n))만큼 필요합니다. convolutional layer의 경우 k 때문에 보통 recurrent layer보다 더 높은 값을 가집니다. 그러나 분리된 convolutional layer의 경우, 계산 복잡도를 O(knd+nd2)O(k*n*d+n*d^2)로 줄여줍니다. 그러나, k=n일 때는, 분리된 convolutional layer의 복잡도가 self-attention과 point-wise fedd-forward layer의 결합의 복잡도와 동일해져, 해당 논문에서는 이 방식을 채택하였습니다.
또한 추가로, self-attention은 더욱 해석적인 모델들을 만들어낼 수 있습니다. 각각의 attention 헤드는 서로 다른 task를 수행할 수 있도록 학습될 뿐만 아니라, 문장의 syntactic(문법적), semantic(구문적) 구조와 관련된 특성을 포착하는 것을 보여줍니다.

Training

Dataset : WMT 2014 English-German dataset (4.5million sent. pairs, byte-pair encoding), WMT 2014 English-French dataset (36M sent., 32000 word-piece vocab.)
Hardware : 8개의 NVIDIA P100 GPU를 사용해서 base model은 100,000 step (1step = 0.4초), big model 은 300,000step(1step = 1.0초) 동안 학습을 진행했습니다.
Optimizer : Adam optimizer 사용해서 learning rate는 [식-5] 와 같이 warmup step = 4000으로 두고 학습을 진행했습니다.
Residual Dropout : 각 sublayer의 결과에 대해서 residual connection을 수행하기 전에 dropout 을 적용한다. Pdrop=1 으로 지정하였습니다.
Label Smoothing : label smoothing value = 0.1 로 지정해서 사용합니다. Perplexity 에는부정적인 영향을 주지만, accuracy와 BLEU 점수에는 긍정적인 영향을 줍니다.

Results

WMT 2014 English-German translation task(EN-DE) 와 WMT 2014 English-Frensh translation task(EN-FR) 의 결과로, SOTA를 뛰어넘는 좋은 결과를 확인할 수 있습니다.
위에서 제안한 Transformer의 구조에서 몇 가지 요소들을 변경한 후 English-German translation task에 적용한 실험 결과입니다.
(A) head의 개수, dk,dvd_k, d_v를 변경 : head가 너무 많으면 오히려 성능이 떨어집니다.
(B) dkd_k만 변경
(C) 모델의 크기를 키운 경우 : 모델이 커질수록 성능이 개선됩니다.
(D) dropout의 영향 : dropout 도 성능에 영향을 미칩니다.
(E) positional embedding의 중요성 : learned positional embedding을 사용해도 성능에 큰 변화는 없습니다.
다른 task에도 적용이 가능한지 실험하기 위해, English Constituency Parsing task에 transformer를 적용해보았습니다. 최고의 성능을 제공하지는 못하지만, 의외로 꽤 좋은 성능을 제공한다는 것을 확인할 수 있습니다.

Conclusion

해당 논문에서는, encoder-decoder 구조에서 가장 흔하게 사용되는 recurrent layer를 multi-head self-attention으로 교체하면서, 전적으로 attention에만 의존하는 최초의 시퀀스 변환 모델, Transformer를 제안하였습니다.
번역 task에서, Transformer는 recurrent, convolutional layer를 기반으로 하는 구조들보다 훨씬 빨리 학습될 수 있습니다. WMT 2014 English-to-German, WMT 2014 English-to-French 번역 task 둘 다, 새로운 SOTA를 달성하였습니다. 해당 논문에서의 최고의 모델은 이전에 연구되었던 모든 앙상블을 뛰어넘었습니다.
또한, 추후의 attention-based model을 기대하면서, Transformer를 text가 아닌 입력과 출력의 모달리티 문제에 적용하고, 지역적이고, 제한된 attention 매커니즘이 이미지, 오디오, 비디오와 같은 큰 입출력을 효과적으로 다루게끔 확장시킬 계획이라고 합니다.

코드 실습

Reference

Attention Is All You Need https://arxiv.org/pdf/1706.03762.pdf