본문 바로가기

paper review

Attention Is All You Need Review

"Attention Is All You Need" paper는 현대 인공지능의 패러다임 자체를 바꿔버린 역사적인 논문이다. '시대를 바꾼 논문' 이라는 표현이 과장이 아닐정도로, 이 논문 직후에 많은 곳에서 'self-attention' 방식을 도입하였다. 

GPT, BERT, T5, LLaMA, Claude, ChatGPT 등 거의 모든 최신 모델의 기반

  • GPT 시리즈: Transformer 디코더 기반
  • BERT: Transformer 인코더 기반
  • T5, BART: Transformer 인코더-디코더 기반
  • ViT (Vision Transformer): 이미지를 처리할 때도 Transformer 사용

➡️ Transformer는 NLP → Vision → Audio → Multimodal → LLM까지 완전히 확산

 

이제 paper를 차근차근 읽어가면서, 공부해보자!!

https://arxiv.org/abs/1706.03762

 

 


Contents

0. Abstract

1. Introduction

2. Background

3. Model Architecture

4. Why Self-Attention

5. Training

6. Results

7. Conclusion

8. My Conclusion


 

0. Abstract

이 논문 이전에는, 대부분의 sequence를 다루는 모델들은 RNN이나 CNN기반으로, encoder와 decoder의 결합 형태였다.

(여기서 sequential data란, 시간적 또는 순서적 정보가 중요한 데이터로 audio, video와 같이 길이가 가변적이라 다루기가 쉽지 않다.)

이 논문에서는 'Transformer'라는, 오직 'attention' 메커니즘에 의존하는 sequential transduction model을 제안하였다.

(without RNN or CNN)

결과부터 스포하자면, 병렬화와 학습시간에서 기존의 모델과 비교해서 장점을 보여줬다. 

세계 기계 번역 대회인 WMT 2014에서는 English->German task에서 28.4 BLEU를 달성해, 기존의 모델들보다 2 BLEU나 높은 성과를 보여줬다. 또한, English constituency parsing(영어 구문 분석)에서도, 크고 작은 데이터에 대해서 좋은 성과를 보여줬다. 


1. Introduction / 2. Background

기존의 RNN기반 모델들은, 입력 문장의 각 단어를 한단계식 처리하고, 출력도 한 단어씩 순서대로 생성하는 방식이다.(단어의 위치에 따라)

현재 상태는 과거 상태에 의존하므로, position t에 관한, 과거 hidden state ht-1와 input을 기반으로 현재 hidden state인 ht을 생성한다. 이러한 방식은 병렬화를 배제하게 되고, 문장이 길어질 수록 메모리 제약 때문에 배치 학습도 어려워지는 문제가 있다. 

최근 연구에서는, factorization trick이나 conditional compuatation과 같이 빠르게 계산하는 방식이 연구되었지만, 순차 계산이라는 한계는 아직 존재한다.

Attention 방식은 이러한 input과 output사이의 거리에 의존하지 않게 해주는 장점이 있지만, 대부분의 attention 방식들은 RNN과 함께 쓰인다. (거리와 의존하지 않는다는 뜻은, 뒤에 더 자세히 설명하겠지만, 문장 내에서 맨 앞 단어와 맨 뒷 단어를 다룰 때, rnn or cnn은 순차적으로 계산해야 되기 때문에 결과적으로 문장 전체를 계산하게 되지만, attention은 문장 내 위치를 한번에 연결 할 수 있다는 의미이다.)

이 논문에서 제안한 Transformer는 오직 attention 방식만을 사용하였다.

Main Idea : RNN/CNN을 사용하지 않고 only attention만 사용했다는 것이 이 논문의 가장 중요한 포인트다.

 


 

3.  Model Architecture

대부분의 강력한 신경망 기반 시퀸스 변환 모델들은 encoder-decoder구조를 따른다.  

따라서, transformer모델도 이러한 구조를 채택하였다. 

Encoder는 input (x1,....,xn)을 입력받아, 연속적인 데이터 (z1,....,zn)을 만드는 역할을 한다. 

Decoder는 encoder에서 만든 z를 입력받아, output(y1,....,yn)을 만든다. 이 때, output은 한번에 한요소씩 생성하게 된다. 

모델은 **오토리그레시브(auto-regressive)**하게 동작하며, 이전에 생성된 단어들을 다음 단어 생성 시 입력으로 사용한다.

여기서 위에서 말한, 거리에 의존하지 않는다는 말과 부합하지 않는것처럼 들리는데, transformer는 학습시에는 병렬로 거리와 상관없이 가능하다는 거지, 추론시에는 한단어씩 순차적으로 만들 수 밖에 없다.

ex) 'I Love you' 를 입력하면, I love you는 병렬로 학습하지만, '나는 너를 사랑해'라는 출력은 한 단어씩 생성하게 된다. (self-attention은 masking이라는 기능이 추가되지만 추후에 설명..)

 

Transformer Architecture

Transformer구조는 위와 같이 encoder-decoder구조를 따르는데, 인코더 디코더 모두에서 stacked self-attention과 fully connected layer를 사용한다. 


3.1 Encoder and Decoder Stacks

Encoder

인코더는 총 6개의 개별층으로 이루어져있다. 각 층은 2개의 sub-layer로 이루어져있다.

첫번째 sub layer는 multi-head self-attention 구조이고,

두번째 sub layer는 fully connected feed-forward network이다.

각 sub layer에 residual connection 과 layer normalization과정을 진행해준다. 

residual connection(잔차 연결)은 입력값을 출력에 더해주는 기법이고, layer normalization은 크기를 줄여주는 방식이다. 

따라서, sublayer의 Output은 LayerNorm(x + sublayer(x))와 같다. 

(여기서, residual connection이 가능하기 위해, 모든 서브레이어와 임베딩 층의 출력 차원은 d=512로 맞춰주었다.)

 

Decoder

디코더도 총 6개의 층으로 이루어져있다. 인코더의 2개의 sub-layer이외에도, 한개의 추가 sub layer를 추가시켜 주었다.

(3번째 서브레이어는 인코더의 출력에 대해 multi-head attention을 가능하게 해주는 역할을 한다. )

residual connection 과 layer normalization과정도 동일하게 진행시켜준다. 

**이후의 위치를 참조하지 못하게 하는, 'masking'을 추가해준다. -> i번째는 i보다 작은 인덱스만 참조할 수 있게 한다. 


 3.2 Attention

Attention 함수는 **쿼리(query)**와 **일련의 키-값 쌍(key-value pairs)**을 입력받아 출력을 생성하는 함수로 정의된다. 이때 query, key, value, output은 모두 벡터 형태이다.

출력은 **(Value)들의 가중합(weighted sum)**으로 계산되며, 각 값에 부여되는 가중치는 **query와 해당 key 간의 유사도(compatibility)**를 기반으로 합니다. (dot product 사용)

attention 함수 구조

3.2.1 Scaled Dot-Product Attention

query와 key 벡터의 유사도를 구하기 위해 dot-product를 사용한다 .

각 벡터의 차원들은 query와 key는 dk이고 value는 dv이다. (일반적으로, value까지 같은 차원을 사용하긴 한다.)

각 query벡터들을 동시에 연산하기 때문에, 행렬 Q로 만들어서, key,value로 만든 행렬 K,V와 연산해준다. 

Q와 K를 내적한 값을 차원의 루트값으로 나누어주고, 이를 softmax취해서, value에 가중합으로 사용할 수 있게 하였다. 

 

cf) 기존의 가장 많이 사용하는 attention 방식은 additive와 multiplicative(dot-product)가 있었다. transformer에서 사용하는 방식은 multiplicative에 차원의 루트값으로 나누어주는 scaling만 추가 된 것이다. 

큰 숫자의 차원을 다룰 경우, multi(scaling) > additive > multi(기존) 의 순서대로 성능을 보여주는데, 이는 scaling하지 않을 경우, 내적값이 매우 커져, 학습이 멈추는 구간이 생긴다고 추측하고 있다. 따라서, scaling과정을 추가해준것!

 

3.2.2 Mutli-Head Attention

한번의 attention함수를 실행하는 것보다, (query,key,value)들을 h번 섢여 변환해서, 독립적으로 attention을 여러번 수행하는 것이 더 효과적인 것을 알아냈다. 

각 Head는, 서로 다른 attention과정을 수행하며, output으로 각 head마다 d_v 차원의 출력이 생성된다.

이 결과들을 하나로 이어 붙인(concatenate) 뒤, 다시 하나의 선형 변환을 적용하여 최종 값을 만들게 된다. 

MultiHead 어텐션의 최종 출력은 각 head에서의 attention 결과들을 연결하고, 이를 **출력 선형변환 W^O**를 통해 다시 d_model 차원으로 만든다.

(이 논문에서는 8개의 head를 썼다고 한다..)

 

3.2.3 Applications of Attention in our Model

Transformer는 multi-head attention(앞으로는, MHA라 하자)을 3가지 방식으로 사용한다. 

  1. Encoder-Decoder Attention
  2. Encoder Self-Attention
  3. Decoder Self-Attention

1은 decoder에서 단어를 생성할 때, query vector는 이전 디코더에서 오게 되고, key and value vector는 encoder의 output에서 가져오는 과정을 의미한다. 

2,3은 각각 encoder와 decoder에서만 일어나는 과정인데, 모두 전 encoder/decoder layer에서 vector들을 가져오게 된다. 단, encoder는 학습 단계이므로, 모든 단계의 encoder에서 가져올 수 있지만, decoder는 추론 단계이므로, 직전 단계의 decoder로부터 가져올 수 있다는 차이가 있다. 


3.3 Position-wise Feed-Foward Networks

attention으로 문맥을 고려한 후, 각 단어의 표현을 독립적으로 변형하는 역활을 하는 신경망이다. 각 단어에 대해 독립적으로 적용된다. 

이 신경망은 두 개의 linear transformation 사이에 ReLU(non-linear)함수를 넣은 구조로 되어있다. 

max함수가 ReLU.

모든 단어에 같은 FFN을 적용하지만, 층이 바뀌면 서로 다른 paramter을 사용한다. 

 


3.4 Embedding and Softmax

다른 모델과 마찬가지로, 단어자체를 그대로 사용할 수 없으니 학습된 임베딩을 사용하여 벡터로 바꾸게 된다. (입력/출력 단어 모두)

decoder에서는 벡터를 결과 단어로 바꾸기 위해서, 선형변환과 softmax function을 사용한다.(어떤 단어가 나올 확률이 가장 높은가? 라는 확률을 얻기 위해서)

임베딩과정에서 사용되는 가중치 행렬은 입/출력 임베딩과 pre-softmax linear transformation에서 모두 공유하는데,

이는 입력 임베딩(맨 처음, 단어에서 벡터로 바꿀 때), 출력 임베딩(디코더 입력에 들어가는 단어들), 출력층 linear layer(pre softmax: decoder의 출력 벡터를 단어분포로 바꿀 때)를 의미한다. 이로 인해, paramter수를 줄여서, 더 좋은 성능을 보여준다. 


3.5 Positional Encoding

rnn/cnn 없이 만든 모델이므로, transformer모델은 문장의 추가적인 위치정보가 필요하다. 

이를 위해, 'positional encodings'을 encoder/decoder 스택의 가장 아래에 있는 input embedding에 더해준다. 

positional encoding은 embedding과 동일한 차원인 d_model을 가지게 해서, 덧셈을 가능하도록 하였다. 

positional encoding에는 learned(학습되는방식)과 fixed(고정방식)이 있는데, 이 논문에선 fixed를 썼다. 

fixed 방식은, 삼각함수 sin cos을 이용해서, 위치를 표현하였다. (사실, learned, fixed둘다 거의 동일한 성능을 보여준다.)

-> 고정된 방식을 사용한 이유는, sinusoidal(사인파)기반 방식을 사용해서, 길이가 더 긴 문장(sequence)에도 쉽게 대응하기 위해서다. 

 


 

4.  Why Self-Attention

이 논문에서 왜 self-attention기법만을 사용했는지를 보여주기 위해, 기존의 RNN/CNN과 비교를 해보자. 

총 3가지 기준으로 비교를 하였다.

  1. computational complexity(각 층당 계산 복잡도)
  2. 병렬 처리 가능한 계산량의 크기(필요한 최소 순차 연산 수)
  3. 네트워크 내 장기 의존성(long-range dependencies)간의 경로 길이(path length)

(여기서 장기 의존성이란, 멀리 떨어져있는 단어들간의 연결을 의미한다. 따라서, 멀리 떨어져 있는 단어들간의 경로 길이가 짧을 수록 좋다.)

 

비교 항목Self-AttentionRNNCNN

계산 복잡도 O(n^2 * d) O(n * d^2) O(k * n * d ^2)
병렬성 높음 (한 번에 전체 계산) 낮음 (순차적) 중간
장기 의존성 경로 1단계 (O(1)) n단계 (O(n)) O(\log_k(n))
학습 안정성 높음 낮음 (기울기 소실/폭발) 중간

 

부가적으로, attention은 문장의 해석 가능성(interpretable)도 제공해준다. 

ex) 문장의 syntatic and semantic구조와 관련된 행동을 보인다는건데, 이게 무슨 소리냐면, 주어-동사 관계나, 대명사가 실제로 무엇을 지칭하는지와 같이, 인간이 아니면 문장속에서 찾을 수 없었던 정보를, self-attention모델도 이해하려고 한다는 것이다. 

 


5.  Training

생략. paper참고.

 


6.  Results

이것도 표로 대체. paper참고하자.(어차피 대부분 성능이 좋았다는 이야기... 그러니까 유명해졌겠죠??)


7.  Conclusion

Transformer의 main idea는 기존 encoder-deocder 구조에서 사용되던 RNN을 multi self-attetion head로 대체할 수 있다는 것이다. 문장의 번역 작업에서 transformer는 rnn/cnn보다 훨신 좋은 성능을 보여줬으며,실제로 English to German WMT에서 좋은 성적을 거두었다. 논문의 저자들은 텍스트 이외의 이미지, 오디오, 비디오 처럼 크기가 큰 입력과 출력을 효융ㄹ적으로 처리할 수 있도록 지역적이고 제한된 attention 메커니즘도 연구할 계획이라고 했다. -> 실제로 ViT, Audio Spectorgram Transformer, Multimodal mdoes(VilBERT, Flaming 등..)이 개발되었다. 

또한, 추론(생성)과정에서 덜 순차적으로 만드는 것도 또 다른 연구 목표라고 하였다. (이 논문에서는 아직, 생성 단계에는 왼-> 오 순서로 auto regressive한 방식으로 동작하기 때문)


8. My Conclusion

처음으로 공부한 paper라 읽는데 순탄하지는 않았지만, gpt와 구글링의 도움을 받아 transformer구조를 어느정도는 배워볼 수 있었다. 

(gpt의 기반이 된 연구를 공부하는데 gpt를 사용했다는..)

RNN/CNN을 더 자세히 알고 있으면 이해하기 쉬울 거 같은데, 아직 그 부분이 부족한거 같아서 다시 공부해봐야겠다..

+(어떻게 rnn/cnn에서 이런 방식을 생각한거지.. 나도 대학원 가면 이런 paper를 남길 수 있을까..)