딥러닝(DL)/논문 리뷰

Attention is All You Need (NIPS 2017) - Transformer

Song 컴퓨터공학 2023. 8. 29. 07:40

오늘 소개할 논문은 최근에도 자연어 처리와 비전 분야 모두에서 월등한 성능을 보이면서 발전하고 있는 Transformer 에 대한 논문입니다. 비전공자도 누구나 아는 ChatGPT 에서 GPT model 또한 Transformer 의 디코더 아키텍처를 활용한 모델입니다. Transformer 을 처음으로 제안한 논문이 바로 "Attention is All You Need" 으로 논문의 이름에서 알 수 있듯 트랜스포머 아키텍처는 Attention 메커니즘을 핵심 아이디어로 사용하고 있다는 것을 유추할 수 있습니다.

 

바로 이전의 논문 리뷰 순서가 Seq2Seq, Seq2Seq with Attention 논문이었습니다. Seq2Seq 는 기존의 통계적 기계번역이 아닌 신경망 기계번역, 그 중에서도 인코더-디코더 구조로 2개의 LSTM(RNN) Layer를 사용하고  Encoder 에서 고정된 길이의 context vector를 만들고 Decoder 에서는 context vector 로 target sequence 를 출력하는 방식을 사용했습니다. 고정된 크기를 가지는 context vector를 사용하게 되면 source sequence 의 모든 정보를 context vector 에 압축해야 하므로 bottleneck이 발생하고 문장이 길어질수록 성능이 떨어지는 문제점을 확인할 수 있었습니다. 이를 보완하기 위해 Seq2Seq with Attention 논문에서는 "인코더에서 나오는 정보를 모두 활용(Attention)하자" 라는 아이디어를 사용해, 디코더에서 매번 인코더의 모든 출력 중 어떤 정보가 중요한지를 계산해 energy 를 구하고 energy 에 대해 소프트맥스를 취한 Weight 를 모두 인코더의 hidden state에 반영하여 출력을 구합니다. 이 방식을 사용하면 기존의 모든 source sequence를 하나의 고정된 길이를 가지는 벡터로 변환하지 않아도 되고, 긴 문장에 대해서도 더 좋은 성능을 나타내는 실험 결과까지 얻어낼 수 있습니다. Attention을 사용하는 또 다른 장점으로는 가중치를 사용해 각 출력이 어떤 입력 정보를 참고했는지도 시각화하여 확인할 수도 있습니다. 이 2개 논문에 대한 더 자세한 내용은 링크를 참고해주세요. [ Seq2Seq, Attention ]

 

Transformer 논문에서는 Seq2Seq 모델에 Attention 을 적용했던 이전 논문과 달리, RNN 자체를 사용할 필요가 없다는 아이디어로 오직 Attention 기법에 의존하는 아키텍처를 설계합니다. 다시 한 번 논문의 이름을 확인해보면 "Attention is All You Need", 직역해보면 "Attention이 너가 필요한 모든 것이다" 이렇게 해석할 수 있는데 이름만 봐도 Attention 기법만 잘 사용하면 된다 라는 것을 알 수 있습니다. 따라서 Transformer 이후의 논문은 더 이상 NLP task 에 대해서 주로 RNN 기반의 아키텍처를 사용하지 않고 Attention 기법을 더 활용하는 방안의 연구가 많습니다.

 

RNN이나 CNN을 사용하지 않으면 문장 내 단어들의 순서에 대한 정보를 주기 어렵습니다. 대신 Transformer 는 문장 내 순서에 대한 정보를 주기 위해 입력값 임베딩 시 Positional Encoding 이라는 기법을 사용합니다. 또한 RNN을 사용하지는 않지만 인코더와 디코더로 구성되어 있는 점은 이전 논문과 동일하며, Attention 과정이 한 레이어가 아닌 여러 레이어에서 반복한다는 특징을 가지고 있습니다. 또한 성능 향상을 위해 ResNet 에서 제안된 학습 방법인 Residual Learning 을 사용합니다. 더 디테일한 내용은 논문을 보면서 알아보도록 하겠습니다.

 

[ 코드 구현 링크 ]

 

GitHub - Song-Joo-Young/Deep-Learning-Paper-Review

Contribute to Song-Joo-Young/Deep-Learning-Paper-Review development by creating an account on GitHub.

github.com


Attention Is All You Need

Abstract

현재까지의 성능 좋은 변환(번역) 모델들은 인코더와 디코더를 포함한 복잡한 RNN 또는 CNN에 기반을 두고 있습니다. SOTA 모델 또한 attention mechanism 을 사용해 인코더와 디코더를 연결하는 방식으로 동작합니다. 본 논문에서는 recurrence and convolutions 를 전부 제외하고 오직 attention mechanism에만 기반한 Transformer 라는 간단한 모델을 제안합니다. 두 번의 기계 번역 실험을 통해 본 모델의 병렬화, 학습시간 감소, 성능 향상을 확인했습니다. 이 모델을 통해 WMT 2014 영어-독일어 번역에서 앙상블을 포함하던 이전의 SOTA 모델보다 2점 높은 28.4 BLEU score 를 달성했습니다. WMT 2014 영어-프랑스어 번역에서는 Transformer 모델은 8개의 GPU로 3.5일간 학습시켜 41.8 BLEU score를 얻었고, 이는 SOTA 모델보다 훨씬 적은 Train cost 를 가짐에도 불구하고 가장 뛰어난 성능입니다. 본 논문에서는 Transformer가 대규모 혹은 소규모 학습 데이터 기반의 영어 구문 분석 task 에서 뛰어난 성능을 보이며, 다른 task에 대해서도 일반화가 될 수 있음을 보입니다. 

 

1 Introduction

RNN, LSTM, GRU 는 언어 모델링 및 기계 번역과 같은 시퀸스 모델링 및 변환 문제에서 최고의 접근 방식으로 확립되어 왔습니다. 이후의 연구에서도 인코더-디코더 아키텍처와 recurrent language model 에 대한 경계를 확장하려는 시도가 많았습니다.

 

Recurrent 모델은 일반적으로 입력과 출력의 symbol position에 따라 계산을 수행합니다. 계산 단계에서 위치에 대한 정보를 적절히 맞추기 위해 이전 hidden state $h_{t-1}$와 $t$ 시점에서의 입력에 대한 함수로 hidden state $h_t$를 생성합니다. 이는 근본적으로 메모리 제한 때문에 시퀸스가 길어질수록 병렬화가 힘들어집니다. 최근 연구에서 인수분해 트릭, 조건부 계산 등을 통해 모델의 성능 자체는 비약적으로 상승하는 추세이지만 위 문제는 여전히 해결하지 못하고 남아있습니다.

 

Attention mechanism은 시퀸스/변환 모델링 및 다양한 작업에서 필수적인 부분이 되었으며 이를 통해 거리(길이)에 관계 없이 종속성을 모델링할 수 있습니다. 그러나 거의 대부분의 경우 RNN과 함께 사용되고 있습니다. 본 논문에서는 recurrence를 피하고 대신 attention mechanism에 전적으로 의존하여 입력과 출력 사이의 전역 종속성(global dependencies)를 이끌어 내는 모델 아키텍처인 Transformer 를 제안합니다. Transformer 는 병렬화를 비약적으로 달성했으며 8개의 P100 GPU에서 12시간 이내의 짧은 시간동안 학습한 모델만으로 SOTA 모델에 도달할 수 있습니다.

 

2 Background

연속적인 계산을 줄이려는 시도는 Extended Neural GPU, ByteNet, ConvS2S 등의 모델을 탄생시켰으나 이들은 전부 CNN을 기본 block 으로 사용합니다. 이러한 모델들은 임의의 위치에 대한 입출력 사이의 관련성을 파악하기 위해서는 거리에 따라(선형 또는 로그 비례) 계산량이 증가하며, 이는 장거리 의존성을 학습하기 어렵게 합니다. Transformer는 이를 상수 시간 복잡도의 계산만으로 가능하게 만들었습니다.

 

Self-attentioin(intra-attention 으로도 불림)은 시퀸스의 representation을 계산하기 위해 단일 시퀸스의 서로 다른 위치와 연관된 attention mechanism 입니다. Self-attention 은 이전에도 독해, 추상적 요약, 텍스트 관련 학습, 독립적 문장 표현 등의 다양한 과제에 대해서 성공적으로 사용된 방법입니다. 

 

End-to-end 메모리 네트워크는 sequence-aligned recurrence 대신 recurrent attention mechanism에 기반하였으며 simple-language QA와 언어모델링 task 등에서 좋은 성과를 내었습니다. 그러나, Transformer는 RNN이나 convolution 없이 오직 attention에 전적으로 의존한 첫 번째 변환 모델입니다. 앞으로 이 모델에 대한 설명이 이어집니다.

 

3 Model Architecture

Transformer 는 크게 인코더-디코더로 구분되며, 인코더는 입력인 symbol representations $(x_1, ... , x_n)$ 을 continuous representation $z=(z_1, ..., z_n)$ 으로 매핑합니다. $z$가 주어지면 디코더는 한번에 한 원소씩 출력하여 출력 시퀸스 $(y_1, ..., y_n)$를 생성합니다. 각 단계는 자동회귀(auto-regressive)이며 다음 단계의 symbol을 생성할 때 이전 단계에서 생성된 symbol을 추가 입력으로 받습니다.

Transformer는 인코더-디코더 모두에서 쌓은 self-attention 과 point-wise, FC layer를 사용하며 모델에 대한 구성은 위 그림에 나타나 있습니다.

 

3.1 Encoder and Decoder Stacks

Encoder:

인코더는 $N=6$개의 동일한 레이어로 구성되며, 각 레이어는 아래 2개의 sub-layer로 구성됩니다.

  • Multi-head self-attention mechanism
  • Simple, position-wise fully connected feed-forward network

추가적으로 2개의 sub-layer에 대해 residual connection을 사용하고 그 이후 레이어 정규화를 수행합니다. 각 sub-layer의 출력값은 $\text{LayerNorm}(x+\text{SubLayer}(x))$ 이며, $\text{SubLayer}(x)$ 는 sub-layer 자체적으로 구현되는 함수를 뜻합니다. Residual connection을 용이하게 하기 위해, 임베딩 레이어를 포함한 모델의 모든 sub-layer는 $d_{model}=512$차원의 출력값을 가집니다.

 

Decoder:

디코더 역시 $N=6$개의 동일한 레이어로 구성되는데, 각 레이어는 인코더와 동일한 2개의 sub-layer 외에 한 가지를 더 가집니다. 

  • encoder stack의 출력에 multi-head attention을 수행하는 sub-layer

인코더와 비슷한 구조로 Residual connection이 각 sub-layer의 정규화 레이어 뒤에 있습니다. 그리고 디코더가 출력을 생성할 때 다음 출력에서 정보를 얻는 것을 방지하기 위해 masking 을 사용합니다. 이는 $i$번째 원소를 생성할 때는 $1~(i-1)$ 번째 원소만 참조할 수 있도록 하는 것입니다.

 

3.2 Attention

Attention 함수는 query, key-value 쌍의 집합을 출력에 매핑하는 것으로 설명될 수 있습니다. 즉 query + key-value → output 으로의 변환을 수행합니다. 이 때 query, key, value, output은 모두 벡터입니다. output은 value 들의 가중합으로 계산되며, 이 때의 가중치는 query와 연관된 key의 호환성 함수(compatibility function)에 의해 계산됩니다.

 

3.2.1 Scaled Dot-Product Attention

Scaled Dot-product attention 이라는 이름은 Attention을 계산하는데 내적을 쓰고, 그 결과에 scale 조정을 하기 때문에 붙여졌습니다. 아래 그림의 왼쪽이 Scaled Dot-Product Attention 을 나타낸 그림이고, 이는 오른쪽의 보라색 박스를 의미합니다. 

입력은 $d_k$ 차원의 query와 key, $d_v$ 차원의 value 로 구성됩니다. query와 모든 key의 내적을 계산하고, 각각을 $\sqrt{d_k}$ 로 나누고(Scaling) value에 대한 가중치를 얻기 위해 소프트맥스를 적용합니다.

 

실제로는 query들에 대해 동시에 계산하기 위해 이를 행렬 $Q$로 묶습니다. 모든 key와 value 역시 각각 행렬 $K$와 $V$로 표현됩니다. 행렬로 표현된 query, key, value에 대해 다음과 같은 출력 행렬을 계산합니다.

$$ \text{Attention}(Q,K,V) = \text{softmax} \left( \dfrac{QK^T}{\sqrt{d_k}} \right) V $$

가장 널리 사용되는 Attention 함수는 2가지 입니다.

  • Additive attention : 단일 hidden layer의 feed-forward 네트워크를 사용해 호환성 함수를 계산
  • Dot-product(Multiplicative) Attention : 빠른 속도의 행렬곱 알고리즘에 의해 더 빠르고 더 공간 효율적으로 동작

Dot product attention 은 스케일링 factor $\dfrac{1}{\sqrt{d_k}}$ 를 제외하면 본 논문에서 소개한 Scaled Dot product attention 과 동일합니다. Additive attention은 위의 내용 그대로 단일 hidden layer 의 순전파 네트워크를 통해 호환성 함수를 계산합니다. 이론적인 복잡도는 두 가지가 유사하지만, 고도로 최적화된 행렬곱 코드를 사용하여 구현할 수 있기 때문에 실제로는 Dot-product Attention이 빠르고 공간 효율적입니다. $d_k$가 작은 경우 두 메커니즘은 비슷하게 수행되는 반면에 Additive attention은 더 큰 값의 $d_k$에 대해서는 스케일링 작업 없는 Dot-product attention 보다 좋은 성능을 보입니다. 저자들은 이를 큰 값의 $d_k$에 의해 Dot-product의 크기가 매우 커지고, 이는 소프트맥스 함수를 매우 작은 그레디언트를 가지는 영역으로 push하기 때문이라고 설명합니다. 이런 현상을 해결하기 위해 dot product를 $\dfrac{1}{\sqrt{d_k}}$ 로 스케일링합니다. 스케일링을 통해 소프트맥스에서 그레디언트가 작은 영역에 빠지는 것을 방지할 수 있습니다.

 

3.2.2 Multi-Head Attention

$d_{model}$ 차원 key, value, query로 단일 attention function 을 사용하는 것보다 query, key, value를 $d_k$, $d_k$, $d_v$ 차원으로 각각 다르게 $h$번 학습시키는 것이 좋은 성능을 보이는 것을 발견했습니다. 이 때 $h$번 학습한다는 것은 단순한 반복이 아닌, 각 sub-layer에 동일한 부분이 $h$개 존재하고 이에 대해 병렬적으로 attention function 을 적용하는 것을 말합니다. 각각의 sub-layer에서 query, key, value에 대해 병렬적인 attention function을 적용하고 $d_v$ 차원의 출력 벡터를 만들어냅니다. 이들은 concat 된 이후에 다시 한번 FC 레이어를 거쳐 최종 출력을 반환합니다.

Multi-head attention 은 모델이 서로 다른 위치에서 서로 다른 subspace의 정보를 공통적으로 결합하여 참조할 수 있도록 합니다. Single attention head를 사용하면, 평균이 이를 제한합니다. [With a single attention head, averaging inhibits this.]

 

위의 내용을 수식으로 나타내면 아래와 같습니다.

 

$$ \begin{align*}  \text{MultiHead}(Q,K,V) &= \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O \\  \text{where } \text{head}_i &= \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) \end{align*} $$

 

각각의 파라미터 행렬은 $W_i^Q \in \mathbb{R}^{d_{model}\times d_k}$, $W_i^K \in \mathbb{R}^{d_{model}\times d_k}$, $W_i^V \in \mathbb{R}^{d_{model}\times d_v}$, $W^O \in \mathbb{R}^{h{d_v\times d_{model}}}$ 입니다. 본 논문에서는 $h=8$, $d_k = d_v = d_{model} / h = 64$ 를 사용했습니다. 각 head의 차원이 감소하기 때문에 전체적인 계산 비용은 single-head attention 때와 비슷합니다.

 

3.2.3 Applications of Attention in our Model

Transformer는 3개의 다른 방식으로 multi-head attention 을 사용합니다.

  • "Encoder-Decoder attention" layer 에서 query는 이전 디코더 layer로부터 오고, memory key와 value는 인코더의 출력에서 옵니다. 이를 통해 디코더가 입력의 모든 위치(원소)를 참조할 수 있도록 합니다. 이는 전형적인 Seq2Seq 모델의 인코더-디코더 attention mechanisim을 모방하였습니다. [ 이전 관련 논문 리뷰 ]
  • 인코더는 Self-attention layer를 포함합니다. 이 때의 모든 key, value, query는 같은 곳(인코더의 이전 layer의 출력)으로부터 옵니다. 따라서 인코더의 각 위치(원소)는 이전 layer의 모든 위치(원소)를 참조할 수 있습니다.
  • 디코더 또한 Self-attention layer를 포함합니다. 디코더의 Self-attention layer는 각 위치가 "해당 위치까지"에 대한 디코더의 이전의 모든 위치에 대해 참조할 수 있도록 합니다. Auto-regressive 속성을 보존하기 위해서 디코더는 출력을 생성할 때 다음 출력을 고려하면 안됩니다. 따라서 허용되지 않는 연결에 대해, softmax의 입력에서 masking 기법(음의 무한대 $-\infty$로 세팅)을 사용하여  결론적으로 softmax의 출력이 0이 되도록 만듭니다. 본 논문의 모델에서는 Scaled Dot-product attention 내부에서 이를 구현합니다.

 

3.3 Position-wise Feed-Forward Networks

Attention sub-layer 외에도 인코더와 디코더의 각 layer는 FC feed-forward 네트워크를 포함하는데, 이는 각 위치마다 동일하게 적용되지만 각각 따로 적용됩니다. 이는 ReLU를 사이에 둔 2개의 선형 변환을 포함합니다. 선형 변환은 다른 위치에 대해서는 동일하지만 layer to layer 에서는 다른 파라미터를 사용합니다. 이는 Kernel size가 1인 CNN과 동일한 구조입니다.

$$ \text{FFN}(x) = \text{max}(0, xW_1+b_1)W_2 + b_2 $$

입력 및 출력의 차수는 $d_{model}=512$를 사용하고, 내부 layer는 $d_{ff}=2048$을 가집니다.

 

3.4 Embeddings and Softmax

다른 시퀸스 변환 모델과 유사하게 입력 토큰과 출력 토큰을 $d_{model}$ 차원의 벡터로 변환하기 위해 임베딩을 사용합니다. 또한 디코더 출력을 다음 토큰 예측 확률로 바꾸기 위해 softmax와 일반적인 선형 변환을 사용합니다. 본 모델에서는 두 개의 임베딩 레이어와 softmax 이전 선형 변환 사이에서 동일한 가중치 행렬을 공유합니다. 임베딩 레이어에서는 $\sqrt{d_{model}}$을 곱했습니다.

 

3.5 Positional Encoding

Transformer 모델은 RNN과 CNN을 사용하지 않기 때문에 모델에 시퀸스의 순서를 전달하기 위해서는 토큰의 상대적인 혹은 절대적인 위치에 대한 정보를 주입해야만 합니다. 이를 위해 인코더/디코더 스택의 하단에 있는 입력 임베딩에 "Positional Encodings"를 추가(adding)합니다. Positional encoding 은 임베딩과 동일한 차원인 $d_{model}$을 가지기 때문에 둘을 합산할 수 있습니다.(element-wise). positional encoding에는 여러 선택지가 있고, 그 중 본 모델에서는 다른 주파수의 sin과 cos 함수를 사용합니다.

 

$$ \begin{align*} PE_{(pos, 2i)} &= sin(pos/10000^{2i/d_{model}}) \\ PE_{(pos, 2i+1)} &= cos(pos/10000^{2i/d_{model}}) \end{align*} $$

 

$pos$는 위치를 의미하고 $i$는 차원을 의미합니다. positional encoding(위치 인코딩)의 각 차원은 정현파에 해당합니다. 이 파장은 $2\theta$ 부터 $10000\cdot 2\theta$까지 geometric progression을 형성합니다. 여러 개의 위치 인코딩 함수 중 이 함수를 선택한 이유는 상대적인 위치에 대해 참조하는 것이 쉽다고 가정을 내리고 또한 어떤 고정된 오프셋 $k$에 대해서도 $PE_{pos+k}$ 를 $PE_{pos}$의 선형 함수로 나타낼 수 있기 때문입니다. 이 말은 곧 학습 때보다 더 긴 시퀸스를 만다더라도 쉽게 추정이 가능하다는 말과 동일합니다. 

 

실험을 통해 다른 결과와 비교했을 때도, 정현파를 이용한 버전이 훈련에 사용했던 데이터보다 길이가 긴 시퀸스에 대해서도 더 잘 추론하는 것을 확인할 수 있었습니다.

 

 

4 Why Self-Attention

이번 섹션에서는 self-attention layer 의 다양한 측면을 일반적인 시퀸스 변환 인코더 디코더 같이 입력 심볼 $(x_1, ..., x_n)$을 다른 길이로 표현되는 $(z_1, ... ,z_n)$ 에 매핑하는 ($x_i, z_i \in \mathbb{R}^d$) recurrent layer나 convolution layer 에 대해 비교합니다. self-attention을 사용하는 이유에 대해 3가지의 사항을 고려합니다.

 

첫 번째는 계층당 총 계산 복잡도[ total computational complexity per layer ] 입니다. 두 번째는 병렬화될 수 있는 계산량(최소 sequential 연산에 의해 측정이 가능한)[ amount of computation that can be parallelized, as measured by the minimum number of sequential operations required],  그리고 세 번째는 길이가 긴 의존도에 대한 경로의 길이[ path length between long-range dependencies ] 입니다.

 

의존성을 학습하는 능력에 큰 영향을 미치는 핵심 요소 중 하나는 순방향, 역방향 신호가 통과해야하는 경로의 길이[ length of the paths forward and backward signals have to traverse in the network ]입니다. 입력 및 출력 시퀸스의 위치 조합 사이에 대해 이런 경로가 짧을 수록 장거리 의존성을 쉽게 학습할 수 있습니다. 이런 효과를 고려하여 seq2seq 에서는 입력을 거꾸로 바꿔서 넣기도 했었죠. 본 논문에서는 서로 다른 layer type으로 구성된 네트워크에 대해 임의의 두 입력과 출력 위치 사이의 최대 경로 길이를 비교[compare the maximum path length]합니다.

 

 

위 표의 결과와 같이, Self-attention layer는 Sequential operation 에서 모든 위치를 연결하여 상수 시간복잡도를 가지는 반면, Recurrent layer는 $O(n)$의 시간 복잡도를 가집니다. 계산 복잡도의 측면에서 self-attention layer는 시퀸스 길이 $n$이 표현 차원 $d$보다 작은 경우 recurrent에 비해 더 빠릅니다. (시간 복잡도가 각각 $O(1)$과 $O(n)$이므로). 그리고 이러한 시퀸스의 특징은 기계 번역 SOTA 모델에서 많이 사용한다고 합니다. (Byte-pair, word-piece 등 타 논문을 언급)

 

매우 긴 시퀸스를 포함하는 작업에 대해 계산 성능을 향상시키기 위해 self-attention은 각 출력 위치를 중심으로 하는 입력 시퀸스에서 크기 $r$의 주변만을 고려하도록 제한할 수 있습니다. 이 방식을 사용하면 최대 경로 길이가 $O(n/r)$로 증가합니다. 추가적인 연구를 통해 더 자세한 접근법을 조사할 계획이라고 합니다.

 

단일 컨볼루션 레이어에서 커널 폭이 $k<n$인 경우, 이는 모든 입력과 출력 위치 쌍들을 연결하지는 않습니다. 모든 입력과 출력 위치 쌍을 연결하려면 $O(n/k)$인 컨볼루션 레이어의 스택이 필요하거나, 혹은 확장 컨볼루션의 경우는 $O(\log _k(n))$의 시간 복잡도를 가지며, 이를 사용하면 네트워크 내 임의의 두 위치 사이의 가장 긴 경로의 길이가 증가합니다. 컨볼루션 레이어의 경우 일반적으로 recurrent 레이어에 비해 $k$배 더 많은 자원을 소모(시간 복잡도 측면에서 말하는 듯합니다. expensive 로 표현)합니다. 그러나 Separable convolution의 경우는 복잡도를 $O(k\cdot n \cdot d + n \cdot d^2)$까지 낮출 수 있습니다. 그러나 $k=n$인 상황에 대해서라도, Separable convolution의 시간복잡도는 결과적으로 self-attention과 동일한 복잡도를 가집니다.

 

부가적인 이점으로 self-attention은 더 해석 가능한 모델을 산출할 수 있습니다. 모델에서 attention distribution을 조사하며 자세한 참조는 부록에 나타나 있습니다. 이 내용은 attention을 적용했던 이전 리뷰 논문인 seq2seq with attention에서 히트맵으로 출력이 어떤 입력을 참조했는지 나타내는, 그런 것을 의미하는 겁니다.

 

결론은 self-attention 이 짱이다. Layer 당 계산량이 적고, 계산이 병렬화 될 수 있다. recurrence 의 경우 순차적 계산 때문에 병렬화가 거의 불가능한데 이를 개선할 수 있습니다. 마지막으로 길이가 긴 입력 시퀸스에 대해 장거리 의존성을 학습할 수 있는 중요한 요인은 네트워크 상에서 통과해야 하는 최대 경로의 길이입니다. 표의 맨 오른쪽에서 확인할 수 있듯 최대 경로 길이에 대한 복잡도는 Self-attention 레이어가 다른 레이어에 비해 낮다는 것을 알 수 있고, 이로 인해 장거리 의존성의 학습 속도가 가장 빠르다 라는 것을 알 수 있습니다. 이러한 장점들 때문에 Self-attention 을 사용합니다.

 

5 Training

Parameter Descrption
DataSet(German) WMT 2014 English-German dataset (4.5M 쌍의 문장, 37,000 vocab )
DataSet(French) WMT 2014 English-German dataset (36M 쌍의 문장, 32,000 vocab )
Batch size 25000
Hardware P100 GPU 8개
Schedule Base Model : 12 hour = 100,000 step × 0.4 sec/step
Big Model : 36 hour = 300,000 step × 0.4 sec/step
Optimizer Adam ($\beta_1= 0.9$, $\beta_2 = 0.98$, $\epsilon = 10^{-9}$)
Learning Rate $lrate = d_{model}^{-0.5}\cdot \text{min}(step\_ num^{-0.5}, step\_ num \cdot warmup\_steps^{-1.5})$
warmup_steps 4000
Regularization Residual Dropout($P_{drop} = 0.1$)

 

6 Results

Machine Translation, Model Variations, English Constituency Parsing에 대한 실험 결과입니다. Base Model만으로도 충분한 최고 성능을 보여주며, 특히 Big Model의 경우 state-of-the-art를 상당한 수준으로 경신하는 성능을 보여줍니다. 이외의 추가적인 내용은 요약하지 않고, 길지 않으니 필요하면 논문을 참고하시면 될 것 같습니다.

 

7 Conclusion

본 논문에서는 인코더-디코더 아키텍처에서 가장 일반적으로 사용되는 recurrent layers 를 multi-headed self-attention 으로 대체하여 전적으로 attention에 기반한 최초의 시퀸스 변환 모델인 Transformer를 제시했습니다. 

 

번역 작업에 대해서 트랜스포머는 recurrent나 convolutional layer를 기반으로 한 아키텍처보다 훨씬 빠르게 학습될 수 있습니다. WMT 2014 English-to-German, WMT 2014 English-to-French translation task에 대해 새로운 SOTA 를 달성하였습니다. 이 작업에서 트랜스포머 모델은 이전에 보고된 모든 앙상블을 능가합니다.

 

우리(저자들)은 attention 기반 모델의 미래에 대해 기대하고 있으며, 이를 다른 작업에도 적용할 계획입니다. Transformer를 텍스트 이외의 입력 및 출력에 대한 문제로 확장하고 이미지, 오디오 및 비디오와 같은 큰 입력과 출력을 효율적으로 처리하기 위한, local에 초점을 맞추는 restricted attention mechanisms 를 다룰 예정입니다.

 

 

Attention Visulizations

여러 개의 attention을 시각화한 자료가 부록에 나와 있어 보면서 마무리하도록 하겠습니다.


너무 중요한 논문이기 때문에 다시 한 번 핵심 내용을 전체적으로 정리해보도록 하겠습니다.

Transformer 논문에서는 Seq2Seq 모델에 Attention 을 적용했던 이전 논문과 달리, RNN 자체를 사용할 필요가 없다는 아이디어로 오직 Attention 기법에 의존하는 아키텍처를 설계합니다. Transformer 아키텍처는 Encoder-Decoder 구조로 이루어져 있지만 RNN이나 CNN을 전혀 사용하지 않습니다. RNN이나 CNN을 사용하지 않으면 문장 내 단어들의 순서에 대한 정보를 주기 어렵습니다. RNN을 사용하지 않으려면 위치 정보를 포함한 임베딩을 사용해야 합니다. 따라서 Transformer 는 문장 내 순서에 대한 정보를 주기 위해 입력값 임베딩 시 Positional Encoding 을 사용합니다. Positional Encoding 이란 Encoder에서 이루어지며 Input Embedding matrix와 동일한 차원의 위치 정보를 포함한 Encoding 벡터를 만들어 element-wise adding, 차원을 맞추고 단순히 더하는 방식을 사용합니다. 이렇게 입력 임베딩과 위치 인코딩을 더한 것을 Multi-head attention의 입력으로 넣습니다. Encoder 부분에서 실행되는 attention은 self-attention 으로 입력 시퀸스 내의 각각의 토큰이 서로에게 어떤, 얼만큼의 연관성을 지니고 있는지를 참조합니다. 또한 성능 향상을 위해 ResNet 에서 제안된 학습 방법인 Residual Learning 을 사용합니다. Residual Learning 과 더불어 Normalization 까지 수행한 이후의 값을 FC Layer의 입력으로 넣고 Residual Learning 과 Normalization을 수행하는 등, 여러 개의 레이어를 중첩하여 인코더의 출력을 얻습니다. 이 때 레이어를 중첩해서 사용할 수 있다는 점에서 이전 레이어의 출력과 다음 레이어의 입력은 당연히 차원이 같을 수 밖에 없고, 이 때 각 레이어는 서로 다른 파라미터를 가집니다. 인코더의 가장 마지막 출력값이 디코더의 입력값으로 들어가게 됩니다. 

 

디코더 파트 또한 여러 개의 레이어로 구성이 되어있고, 디코더의 마지막 레이어에서 나온 출력값이 기계 번역의 결과가 됩니다. 디코더 각각의 레이어는 인코더의 가장 마지막에서 나온 출력값을 입력으로 받습니다. 디코더 또한 단어 정보를 받아서 위치 인코딩을 더한 결과를 입력으로 넣고, 디코더 파트에서는 2개의 attention을 사용합니다. Encoder와 마찬가지로 self-attention을 사용하고 추가적으로 Encoder-Decoder attention을 사용합니다. 각각의 단어가 인코더의 출력 정보를 반영해서 다음 출력을 생성합니다. 즉 트랜스포머에서는 마지막 인코더 레이어의 출력이 모든 디코더 레이어에 입력됩니다. 원래 RNN이나 LSTM을 사용하는 경우는, 고정된 크기의 Encoder, Decoder를 사용하는 반면 입력 토큰의 개수만큼 반복적으로 매번 hidden state 를 만들었다고 하면 Transformer는 sequence 자체가 인코더에 한번에 쭉 연결되어 한번에 입력으로 들어가기 때문에 병렬화가 쉽고 계산이 빠르다는 장점이 있습니다. RNN을 사용하지 않는 대신 인코더와 디코더를 다수 사용하며, 대신 디코더는 <eos> 토큰이 나올 때까지 순환적으로 동작합니다. 

 

Transformer 아키텍처의 인코더와 디코더 모두에서 사용되는 attention은 여러 개의 head 를 가진다는 의미로 Multi-head attention이라고 부릅니다. 

 

attention을 위한 3가지 입력 요소는 Query, Key, Value 입니다. 어떠한 단어가 다른 단어와 얼마만큼의 관련이 있는가? 라고 할 때 이 질문을 하는 주체가 Query(쿼리)가 되고, 물어보는 대상이 Key(키)가 됩니다. 키와 쿼리에 대해서 얼마만큼 연관성이 있는지 attention score를 구하고, 스케일링, 마스킹, softmax 를 거치고 value와 곱해서 결과적인 attention value 값을 구합니다. 입력으로 들어온 값은 3개로 복제가 되어서 value, key, query로 구분한 다음 Linear layer를 지나 행렬곱을 수행한 후 h개로 구분된 각각의 쿼리쌍들을 만들어내게 됩니다. h는 head의 개수로 각각의 head끼리 서로 다른 V, K, Q 값을 받아서 attention을 수행해서 결과를 내보냅니다. 입력값과 출력값의 차원이 같아야하기 때문에 Concat 후 다시 Linear layer를 거쳐 차원을 맞춰주는 작업을 수행합니다. 이 내용들을 수식으로 표현하면 아래와 같습니다.

 

$$ \begin{align*} &\text{Attention}(Q,K,V)= \text{softmax} \left( \dfrac{QK^T}{\sqrt{d_k}} \right) V \\ &\text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O \\ &\text{where } \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) \end{align*} $$

 

$\sqrt{d_k}$라는 scaling factor를 사용하는 이유는 softmax 함수 특성상 gradient가 작아지는 지점이 있어 학습이 안될 수 있는데 이를 방지하기 위함입니다. 또한 Masked multi-head attention 이라고 Figure 1에 나와있는 부분이 있는데 이는 디코더가 출력을 생성할 때 다음 출력에서 정보를 얻는 것을 방지하기 위해 masking 을 사용하는 겁니다.

 

수식의 내용을 조금 더 해석해보면 토큰 한 개에 대해서 토큰은 각각 $1\times d_{model}$을 가지게 될겁니다. 임베딩 차원 $1 \times d_{model}$인 입력이 들어오게 되면 이것을 복사한 후 행렬곱을 수행해 $d_{model}/h$의 차원을 가지는 3개의 Query, Key, Value vector 로 변환되게 됩니다. 이 때 $d_{model}/h$의 차원이 아닌 key와 value 에 대해 각각 $d_k, d_v$의 차원을 가질수도 있지만 본 논문에서는 $d_v = d_k = d_{model}/h$로 놓았으므로 $d_{model}/h$을 기준으로 설명하겠습니다.

 

이 때 행렬곱을 수행하여 차원이 변환되는 것이므로 그 행렬은 입력 단어가 단순한 한 개의 토큰(단어)이라고 생각했을 때(단어의 조합이면 좀 더 복잡하므로 토큰 1개에 대해 생각) $d_{model} \times (d_{model}/h)$ 의 차원을 가지게 될 겁니다. $ 1\times d_{model}$ $\to$ $\times [d_{model} \times (d_{model}/h)]$ $\to$ $1 \times d_{model}/h$ 로 차원이 변환되는 것이죠. 물론 이 때 출력은 3개입니다. 입력에 대한 각각의 Query, Key, Value 입니다.

 

그 다음으로 $Attention(Q,K,V) = \text{softmax} \left( \dfrac{QK^T}{\sqrt{d_k}} \right) V$ 식을 보면 Query × Key의 Transpose 를 계산합니다. $1 \times d_{model}/h$을 Transpose 하면 $d_{model}/h \times 1$ 이 나오겠죠? $1 \times d_{model}/h$ 차원의 벡터와 $d_{model}/h \times 1$ 의 벡터를 곱하면 $1 \times 1$이 나오게 됩니다. 이 vector 가 논문에서 말하는 attention energies 입니다. 즉 Query와 Key를 곱하여 만약 입력 단어가 1개가 아니라 $n$개 였다면 $n \times n$ 크기의 행과 열의 크기가 똑같은 정방 행렬이 만들어지게 됩니다. 만약 마스킹을 한다면 이 attention energies matrix 와 차원이 동일한 mask matrix를 사용해서 마스크 값으로 $-\infty$의 값을 넣어 softmax 의 출력이 0%에 가까워지도록 만듭니다. 그 후 이 값에 스케일링을 거치고, softmax를 거친 이후에, Value 값이었던 $1 \times d_{model}/h$ 를 곱하게 되면 결론적으로 $1 \times 1$에다 $1 \times d_{model}/h$을 곱한 것이기 때문에 $1 \times d_{model}/h$의 출력이 나타나게 됩니다. 이것이 수식에서는 attention matrix 가 됩니다. 각 head 들은 query, key, value 에 대한 attention matrix를 모두 가지고 있습니다. 만약 head 가 $h$개가 있다고 하면 $1 \times d_{model}/h$ 는 결국 $d_{model}$, 즉 임베딩 차원과 같은 값을 가지는 벡터로 매핑됩니다. 이 부분부터는 저도 완벽히 이해는 가지 않는데, 실험 상에서 사용했던 숫자를 넣으면 계산은 맞아서 우선은 Concat을 한 결과가 $d_{model}$ 이 나오고 각각의 토큰에 대해 수행하면 sequence 길이 × 임베딩 벡터의 크기($d_{model}$) 가 나오는 것만 짚고 넘어가겠습니다. 마지막 Linear 레이어에서 $d_{model} \times d_{model}$ 을 곱하면서 결론적으로 MultiHead 는 입력과 출력의 차원이 동일한 결과를 나타냅니다. ( Concat을 한 결과가 임베딩 차원과 동일해지는 내용이 왜 그런지 명확히 이해가 가질 않습니다. 또한 마지막 $d_{model} \times d_{model}$ 을 하지 않아도 출력의 차원은 동일합니다.. 마지막 Linear 레이어가 차원 축소 or 확장의 역할을 할 줄 알았는데 그렇지 않네요. 이에 대해서는 추가적인 공부 후 수정할 기회가 있다면 수정하도록 하겠습니다. )

 

저보다 훨씬 똑똑한 ChatGPT의 성능에 현타를 느끼고 있습니다

 

즉 정리하면 Transformer에는 3가지 종류의 어텐션을 사용합니다. Encoder self-attention, Masked Decoder Self-attention, Encoder-Decoder attention 입니다. 이러한 Attention 과정을 여러 레이어에서 반복하는 것만으로 이전의 아키텍처와 비교할 수 없는 성능을 보인 Transformer 논문 리뷰였습니다. 감사합니다.

 

Reference : 

https://arxiv.org/abs/1706.03762