ML \ DL/Paper Reviews

Attention Is All You Need

lfgwy 2022. 12. 1. 00:37

설명에 사용될 직접 그린 그림 중 파란색으로 표시된 것은 이전 설명에 없던 새로운 부분임을 나타내는 것이지 다른 의미는 x

Introduction

 

 

목적:

이 논문이 쓰였을 당시의 transduction model(기계번역으로 대표되는 sequence 변환 모델)은 encoder, decoder를 포함하는 복잡한 RNN이나 CNN구조를 가진 모델들이 지배적이었다. 그 중에서 몇 모델들은 attention mechanism을 채택하여 사용 중이었다. 해당 논문을 통해 저자들은 RNN이나 CNN구조를 아예 배제하고 오직 attention mechansim에만 기반한 비교적 단순한 구조의 모델인 Transformer를 소개한다. 

 

 

기존 모델들의 단점:

Recurrent한 모델들은 시퀀스에 포함돼있는 순서에 대한 정보에 의거하여 정렬한 이후에 input을 반복적으로 넣어 Hidden state를 update하는 방식으로 동작했기에 병렬적인 처리가 어려웠다. 이는 메모리나 연산 속도의 측면에서 비효율적이다. 또 기존의 RNN을 이용한 encoder-decoder 모델들은 하나의 context vector에 원문의 모든 정보를 압축해야했기에 정보 손실에 대한 우려가 존재했다. 또한, RNN구조의 고질적인 문제인 기울기 소실에서도 자유롭지 못하다.

이러한 문제들을 RNN 구조를 배제하고 Attention만을 이용한 Transformer를 통해 해결하고자 한다. 

Attention만을 이용하는 경우 병렬 처리가 가능하기에, 메모리나 연산 속도의 측면에서 기존의 모델들보다 유리하고, 매번 encoder의 출력 전부를 입력으로 받기에 정보 손실에 대한 우려가 적다.

 

 

 

Attention이란?

 

 

Transformer에 대해서 자세히 알아보기 이전에 계속 언급되고 있는 Attention이 무엇인지 한 번 살펴보자.

살펴보기에 앞서 Attention의 등장배경에 대해 간단히 알아보자. Transformer가 등장하기 이전에 사용되던 대표적인 Transduction model로는 seq2seq이 있는데, 아래와 같이 RNN구조를 이용한다. 

 

 

RNN구조를 사용하기 때문에 앞서 언급한 "기존 모델들의 단점"에서 자유롭지 못했다.

 

 

위의 그림에서 볼 수 있듯이 마지막 hidden state값만 context vector로 decoder에 전달되기에 정보 손실이 발생한다. 또, context vector는 고정된 크기의 벡터이기에 문장이 짧은 경우에는 크게 문제가 되지 않지만, 문장이 긴 경우에는 모든 정보를 함축하기에는 어려움이 있다.

이를 해결하기 위해 고안된 아이디어가 encoder의 모든 hidden state를 decoder의 입력으로 받는 방법인데, 이 때 Attention이 등장하게 된다. 아래와 같이 말이다. 

 

 

Attention의 기본 아이디어는 디코더에서 출력 단어를 예측하는 매 시점마다, 인코더에서의 모든 출력을 참고한다는 것이다. 단, 출력 전체를 전동일한 비율로 참고하는 것이 아닌, 해당 시점에서 예측해야 할 단어와 연관이 있는 부분에 좀 더 집중(attention)해서 보게 된다. 예를 들어 위의 예에서 번역의 결과인 '좋은'을 출력하기 위해서는 morning보다는 good에 조금 더 무게를 두고 보는 것이다.  

 

이것이 어떻게 가능한지 수식을 통해 살펴보자.

 

YouTube 동빈나 - https://www.youtube.com/watch?v=AA621UofTUA&t=1226s

 

Decoder에서 현재의 출력을 결정 짓기 위해 사용되는 것은 이전 time step에서의 hidden state $s_{i-1}$과 Encoder에서의 hidden state인 $h_j$이다. 이 두 hidden state를 이용하여 모종의 함수 a(다양한 방법이 있어 논문에서 사용한 방법은 이후 Encoder를 설명하는 부분에서 설명하고 여기서는 이 정도로 넘어가도록 하겠다)를 거쳐 에너지 $e_{ij}$를 구한다. 그리고 Encoder의 모든 hidden state에 대해 구한 에너지들을 softmax 함수에 태워 가중치를 구해준다. 이 가중치를 각각의 hidden state에 곱해 어떤 단어에 비중을 두고 Decoder의 현재 출력을 결정 지을지를 구할 수 있다. 

 

아래 그림은 morning을 아침으로 번역하는 과정을 표현한 것이다. 아마 아래 그림을 보면 조금은 이해에 도움이 되지 않을까 싶다.

 

 

 

 

Model Architecture

 

The Transformer - Model Architecture

 

모델의 전체 구조는 위와 같다. 

 

왼쪽에 있는 구조를 Encoder라 하고, 오른쪽에 있는 구조를 Decoder라 부른다.

 

Encoder-Decoder 구조에 대해 간단히 설명하자면, Input Sequence $(x_1, x_2, ... , x_n)$을 받아 Encoder에서는 이를 $(z_1, ... ,z_n)$의 contextual representation으로 변환한다. Decoder에서는 $(z_1, ... ,z_n)$를 받아 output_sequence인 $(y_1, ..., y_m)$을 출력한다.

 

Encoder에 대해서 먼저 자세히 살펴보자.

 

 

Encoder

Input Embedding 

 

 

우선 최초에는 Input을 embedding해준다. Input Embedding이란, 사람의 언어를 컴퓨터가 이해하고 처리하기 쉬운 형태인 벡터로 변환하는 과정이다. 트랜스포머의 인코더와 디코더는 512차원의 벡터를 사용한다

 

 

Positional Encoding

 

 

RNN은 데이터를 순차적으로 받으면서 자동으로 순서에 대한 정보를 얻을 수 있었다. Transformer에서는 미리 언급한 것처럼 RNN구조를 사용하지 않기 때문에 별도로 위치에 대한 정보를 전달해주어야 하는데, Positional Encoding이 이 역할을  해준다. Positional Encoding에서는 Input Embedding Matrix와 동일한 크기를 갖는, 위치에 대한 정보를 가지고 있는 matrix를 Input Embedding Matrix에 element-wise하게 더해주어 각각의 단어의 순서를 알 수 있게 해준다.

 

이 때 위치에 대한 정보를 구하기 위해 논문에서는 아래 두 함수를 사용한다.

 

Attention Is All You Need

  • pos: 입력 문장에서 특정 단어의 임베딩 벡터의 위치
  • i: 임베딩 벡터의 차원 index
  • $d_{model}$: dimension of model, 논문에서는 512. 

YouTube 동빈나 - https://www.youtube.com/watch?v=AA621UofTUA&t=1226s

 

 

그림을 통해 살펴보자면, 위의 그림에 빨간 동그라미 친 부분의 pos = 0, i = 3이다.

 

위의 식을 다시 한 번 살펴보면 임베딩 벡터 내의 차원의 인덱스 i가 짝수인 경우에는 sin함수를, 홀수인 경우에는 cos함수를 사용한다는 것을 알 수 있다. 이런 식으로 값을 구하고 나면 각각의 단어가 어떤 순서를 가지고 있는지 컴퓨터가 알 수 있게 된다. 이 값을 구해 Input Embedding Matrix에 element-wise하게 더해준 값을 Encoder의 Input으로 넣어주게 된다. Input Embedding Matrix에 positional encoding 값을 더해주므로 설령 같은 단어일지라도, 문장 내의 위치에 따라 다른 값이 더해지면서 그 값이 달라진다. 즉, 순서 정보가 고려된 임베딩 벡터로 바뀌어 Encoder의 Input으로 들어가게 된다.

 

  • Positional Encoding후 Encoder에 들어가는 입력 값, Encoder가 받는 Input = 입력 문장에 대한 정보(Input Embedding) + 위치 정보(Positional Encoding)

 

* 참고: Positional Encoding시 꼭 위의 함수를 사용해야하는 것은 아니고, 위치 정보를 전달할 수만 있다면 어떠한 함수/방법을 사용해도 상관없다. 실제로 논문의 저자들도 다른 방법들을 사용해보았고, 큰 성능의 차이는 없었다고 한다. 다만, 논문에서는 위와 같은 함수를 사용했을 때, 더욱 긴 시퀀스에서도 보다 좋은 성능을 보일 것이라고 언급하고 있다.

 

 

Multi-Head Attention (Self-Attention)

 

 

Positional Encoding 이후에는 Attention을 수행하는데, Encoder에서의 Attention을 Self-Attention이라 한다. 위의 Attention을 설명할 때, 현재의 출력을 결정 짓는데에 있어 가장 연관성이 높은 hidden state를 찾았던 것과 유사하게 Self-Attention을 수행하면 각각의 단어들 서로 간의 attention score를 구해 입력 문장에 존재하는 단어 간의 연관성에 대한 정보(문맥에 대한 정보)를 학습할 수 있다.

 

 

 

Attention Score는 위와 같은 방식으로 구하는데, 왼쪽은 그림으로 나타낸 것이고, 오른쪽은 수식으로 나타낸 것이다. (Masking은 optional한 것으로 필요한 경우 사용된다. 이후 Decoder의 self attention과정에서 사용된다.)

여기서 Q는 Query를, K는 Key를 V는 value를 의미하고, $d_k$는 query와 key의 dimension이다(이는 일반적으로 $d_{model}$과 같기 때문에 논문에서는 512다). 간단히 설명하자면 질문하고자 하는 것이 Query, 그 답의 보기가 되는 것들이 Key가 된다.

아래의 I study at school이라는 문장을 예시로 보면, 문장 속의 각각의 단어가 어느 정도의 연관성을 가지는지 측정하고자 하는데, I, study, at, school이 각각 query에 들어가게 되고, I, study, at, school이 key가 된다. 즉 I라는 단어가 query가 되어 I, study, at, school 각각의 key들과의 연관성을 구하게 되고, 똑같은 과정이 study, at, school 모두에 반복된다. 

 

YouTube Minsuk Heo 허민석 - https://www.youtube.com/watch?v=mxGCEWOxfe8&t=233s

 

 

위 그림에서 X는 imbedding된 단어들의 벡터가 matrix형태로 표현된 X와 각각 학습과정에서 최적화되는 weight matrix $W_q$, $W_k$, $W_v$와 곱해져 각 문장의 query, key, value는 단순한 행렬곱을 통해 구해진다.

 

YouTube Minsuk Heo 허민석 - https://www.youtube.com/watch?v=mxGCEWOxfe8&t=233s

 

 

각 단어 간의 연관성을 구하기 위해 dot product를 사용하면 그 결과값으로는 어떠한 값이 나오게 되고, 이 값이 높을 수록 연관성이 높은 것으로 이해할 수 있다. 

 

 

 

위에서 보였던 수식을 다시 한 번 보자면, 현재까지 설명한 내용이 $QK^T$에 대한 내용이다. 이에 softmax를 취해 확률값으로 바꾸기 이전에 $\sqrt{d_k}$로 나누어주는데, 이는 dimension이 크면 dot product의 값이 커지면서 softmax의 값을 기울기가 매우 작은 큰 값으로 보내버려 attention의 성능이 현저히 떨어지는 현상을 해결하기 위함이다. 

 

YouTube Minsuk Heo 허민석 - https://www.youtube.com/watch?v=mxGCEWOxfe8&t=233s

 

 

scaling까지 마친 이후에는 softmax 함수를 이용해 softmax값을 구한 후 이를 value와 곱해 연관성이 있는 value에는 높은 연관성이 있음을, 낮은 value에는 낮은 연관성이 있음을 나타낼 수 있다. 

 

Transformer에서의 attention은 여러 개의 head를 가지기 때문에 Multi-Head Attention이라 불린다.

 

 

RNN을 사용했을 경우에는 불가능했을 병렬화의 장점을 최대한으로 살린 것으로, 논문에서는 8개의 head를 사용하는데, 이를 이용하여 각 head에 512차원의 연산을 수행하는 것이 아닌 512/8 = 64차원의 연산을 수행하여 연산에서 이점을 취할 수 있다. 또한, 하나의 attention으로 모호한 정보들간의 연관성을 충분히 나타내기 어려운 경우에 multi-head attention을 통해 서로 다른 관점에서 정보를 수집해 이를 보완할 수도 있다. 그 후 연산의 결과를 다시 concat하여 입력값과 출력값의 dimension이 같게끔 해 dimension이 줄어들지 않게 한다. 이 덕분에 후에 layer를 여러 개 쌓아 사용하는 것이 가능해진다.

 

 

Add & Norm

 

 

Attention Layer를 통과한 이후 residual learning(잔여 학습)이 수행되는데, residual learning이란 특정 layer를 건너뛰어 복사된 값을 그대로 넣어주는 것을 의미한다. 기존 정보를 입력받으면서 추가적으로 잔여된 부분만 학습하기에 학습 난이도가 낮아지고, 이로 인해 모델의 초기 수렴 속도가 높아지고, global optima를 찾을 확률이 증가해 성능이 증가하는 효과를 기대할 수 있다. 추가로 역전파 과정에서 positional encoding에 대한 정보가 흐려지는 현상을 방지해주기도 한다. 

 

그 이후 정규화를 통해 학습의 효율을 증가시켜준다.

 

 

Feed Forward  → Add & Norm

 

 

최종적으로 앞선 연산의 값을 relu activation을 포함한 feed forward 연산의 값으로 넣어준다. 

논문에서는 $d_{model}$을 512로, feed-forward의 input layer의 neuron의 수를 512, hidden layer의 neuron의 수를 2048, 다시 output layer가 512개의 neuron을 갖는 구조를 사용한다. Feed-forward 연산이 없다면 attention은 단순히 단어 임베딩 벡터의 값을 조정하는 역할밖에 안하므로 feed-forward 연산을 통해 비선형성을 부여해 앞으로의 학습에 더욱 용이하게끔 해주는 것이라고 이해하면 될 것 같다. 

 

이로써 Encoder를 구성하는 한 개 Layer의 구조를 살펴보았는데 Transformer에서는 이와 같은 layer를 6개를 중첩하여 사용해 attention과 정규화를 반복적으로 수행해준다. 이는 앞서 언급한 것처럼 입력값과 출력값의 dimension이 같게끔 해준 덕에 이러한 연산이 가능한 것이다. 이 때 각 layer의 구조는 동일하지만 모두 서로 다른 weight, parameter를 지닌다. 

 

 

 

 

Decoder

 

Embedding & Positional Encoding

 

 

Decoder의 Output Embedding과 Positional Encoding은 Encoder에서와 그 역할과 방법이 동일하기 때문에 설명은 생략한다.

 

Decoder는 2개의 sub layer로 구성되어있던 Encoder와는 달리 Attention Layer가 하나 추가되어 3개의 sublayer를 가지고 있는데, 그 중 첫번째 attention layer인 Masked Multi-Head Attention에 대해 살펴보자. 

 

 

Masked Multi-Head Attention (Self-Attention)

 

 

Mask라는 말이 붙은 것은 i번째 position에 대한 예측이 그 이전 값에만 의존할 수 있게끔, 즉 지금까지 출력된 값에만 Attention을 적용하기 위해서 마스킹을 진행하기 때문이다. 그것을 제외하고는 Encoder의 self attention과 동일하다.

 

 

Multi-Head Attention(Encoder-Decoder Attention)

 

 

인코더 디코더 어텐션에서는 이전까지와 같이 문장에 존재하는 단어 간의 연관성에 대한 정보(문맥에 대한 정보)를 학습하는 것이 아니다. 인코더 디코더 어텐션에서는 디코더의 출력 단어가 query가 되고 key, value로는 인코더의 출력 값이 사용된다. 따라서 셀프어텐션에서 처럼 문장 내 단어 서로 간의 연관성을 찾는 것이 아니라, 각각의 출력 단어를 만들기 위해, 인코더의 어떤 값을 참고해야할지를 결정한다. 

 

 

Feed Forward  → Add & Norm

 

 

 

최종적으로 feed forward 연산과 residual learning, normalization을 해주게 된다.

Decoder도 Encoder와 같이 6개의 동일하지만 서로 다른 가중치를 가지는 레이어로 구성된다. 

 

 

참고한 자료:

Youtube 동빈나 - [딥러닝 기계 번역] Transformer: Attention Is All You Need (꼼꼼한 딥러닝 논문 리뷰와 코드 실습)

https://www.youtube.com/watch?v=AA621UofTUA&t=1226s 

YouTube Minsuk Heo 허민석 - 트랜스포머 (어텐션 이즈 올 유 니드)

https://www.youtube.com/watch?v=mxGCEWOxfe8&t=233s 

 

YouTube DeepLearningAI - C5W3L07 Attention Model

https://www.youtube.com/watch?v=SysgYptB198 

YouTube DeepLearningAI - C5W3L08 Attention Model

https://www.youtube.com/watch?v=quoGRI-1l0A 

http://jalammar.github.io/illustrated-transformer/

 

The Illustrated Transformer

Discussions: Hacker News (65 points, 4 comments), Reddit r/MachineLearning (29 points, 3 comments) Translations: Arabic, Chinese (Simplified) 1, Chinese (Simplified) 2, French 1, French 2, Japanese, Korean, Persian, Russian, Spanish, Vietnamese Watch: MIT

jalammar.github.io