논문리뷰 - Attention is all you need - 어텐션 플리즈 !

반응형

Attention is all you need

[Paper] : (https://arxiv.org/abs/1706.03762)

기존 자연어처리 분야에서 엄청난 혁신을 불러온 논문 'Attention all you need'에 대해서 리뷰해봅시다 !
본 리뷰는 논문 리뷰와 후에 pytorch를 사용해 구현해보기까지 준비했습니다.

저는 NLP에 크게 관심이 없지만 attention 기법은 자연어처리뿐만 아니라 비전 분야에서도 SOTA를 달성했습니다.
이전에 포스팅한 vit 그리고 swim-transformer 등 attention과 transformer에 대한 학습은 인공지능을 공부한다면 필수적입니다.

딥러닝 기반의 기계 번역 발전 과정

Screenshot from 2023-07-27 14-15-41

2021년 기준으로 최신 고성능 모델들은 Transformer 아키텍쳐를 기반으로 하고 있습니다.

  • GPT: Transformer의 디코더(Decoder) 아키텍처
  • BERT : Transformer의 인코더(Encoder) 아키텍처

Abstract

본 논문에서는 RNN 또는 CNN이 아닌 오직 attention mechanism에만 기반한 Transformer라는 간단한 모델을 제안합니다.
Abstract에서 제안한 모델의 특징은 아래와 같이 요약 가능합니다.

  1. Attention을 통해서 오직 행렬의 곱셈을 사용하여 병렬적으로 시퀀스 데이터를 처리하기 때문에 연산 속도가 크게 개선되었습니다.

  2. WMT 2014 dataset을 이용해서 영어를 독일어로 번역하는 task, 영어를 불어로 번역하는 task에서 훨씬 개선된 성능을 보여줍니다.

  3. 크거나 한정된 학습 데이터를 가지고서도 다른 task들에 성고적으로 일반화될 수 있다는 것을 보였습니다.


Introduction

Introduction에서는 기존의 순환 알고리즘인 Recurrent model ( RNN )의 단점을 지적합니다.
RNN은 parallelization(병렬화)가 불가능해 longer sequence length에서 치명적입니다.

  • 최근 연구에서 factorization trick과 conditional compitation을 통해 계산 효율성을 많이 개선했습니다. 하지만 근본적인 sequential computation의 문제는 남아있죠.

Attention mechanism은 다양한 분야의 sequence modeling과 transduction model에서 주요하게 다뤄집니다.

  • Attention mechanism은 input과 output 길이를 신경쓰지 않아도 됩니다.

  • Seq2Seq 모델에 attention을 혼합한 형태

Screenshot from 2023-07-27 14-52-30

하지만 Transformer는 input과 output간 global dependency를 추출하기 위해 순환구조를 사용하지 않고 attention mechanism만을 사용합니다.


BackGround

Extended Neural GPU, ByteNet, ConvS2S 에서도 연속적 연산을 줄이기 위한 연구가 이루어졌는데, 모두 CNN을 기본 구성 요소로 사용했습니다.

  • 이러한 모델들은 input과 output간의 관련성을 파악하기 위해 거리에 따라 계산량이 증가합니다.
  • 당연히 데이터의 길이가 길면 input과 output간의 거리가 멀어지므로 의존성을 알기 어렵다. ( ex 매우 긴 문장 )

반면 Transformer에서는 Multi-Head Attention을 통해 상수 시간의 계산만으로 가능합니다.

Self attention

Self-Attention은 입력 시퀀스의 각 요소가 다른 모든 요소와의 관계를 학습하도록 하는 메커니즘입니다. 즉, 각 요소는 자신을 기준으로 입력 시퀀스 전체에 "주목"합니다. 이는 모델이 입력 시퀀스의 전체적인 컨텍스트를 이해하는 데 도움이 됩니다.

  • 예를 들어, "The cat, which already ate ..., was full" 이라는 문장에서 "was"라는 단어는 "cat"과 관련이 있습니다. Self-Attention 메커니즘을 사용하면 모델은 "was"가 "cat"과 관련이 있다는 사실을 학습할 수 있습니다.

Self-Attention은 Transformer 모델의 핵심 구성 요소로, 입력 시퀀스의 각 요소가 다른 요소와 어떻게 상호작용하는지를 파악하게 해줍니다. 이는 모델이 문장의 구조와 문맥을 더 잘 이해하도록 돕습니다.

요약하면, "Attention"은 모델이 입력 시퀀스의 중요한 부분에 집중하도록 하며, "Self-Attention"은 각 입력 요소가 전체 시퀀스에 대해 주목하도록 합니다. 이 두 메커니즘 모두 입력 데이터의 다양한 부분과 그것들이 어떻게 상호작용하는지 이해하는 데 중요합니다.

End-to-end memory network

sequence-aligned recurrence 보다 recurrent attention mechanism에 기반합니다.
simple-language question answering 과 language modeling task에서 좋은 성능을 보입니다.

반면 Transformer 모델의 경우 온전히 self-attention에만 의존한 최초의 transduction model입니다.


Model Architecture

Transformer의 아키텍쳐를 살펴보면서 동작 원리를 이해해봅시다.

Screenshot from 2023-07-27 15-02-50

Transformer 모델은 RNN이나 CNN을 전혀 사용하지 않는 대신 Positional Encoding을 사용합니다.
인코더와 디코더로 구성되고 Attention 과정을 여러 레이어에서 반복합니다.


Transformer의 동작원리 1. 입력 값 임베딩(Embedding)

Transformer 이전의 전통적인 임베딩은 아래와 같습니다.

Screenshot from 2023-07-27 15-10-20

RNN을 사용하지 않으려면 위치 정보를 포함하고 있는 임베딩을 사용해야 합니다.
* 이를 위해 Transformer에서는 Positional Encoding을 사용합니다.

Screenshot from 2023-07-27 15-10-25


Transformer의 동작원리 2. 인코더(Encoder)

임베딩이 끝난 이후에 Attention을 진행합니다.

Screenshot from 2023-07-27 15-12-37

성능 향상을 위해 잔차학습(Residual Learning) 을 사용합니다.

  • 잔차학습(Residual Learning)이란?

    • Residual Learning의 핵심 아이디어는 각 계층이 원래의 입력 대신 입력의 잔차(즉, 입력과 출력 간의 차이)를 학습하게 하는 것입니다. 이러한 접근 방식은 신경망이 더 깊게 쌓을 수 있게 하고, 깊이를 더하면서 발생할 수 있는 문제를 완화하는 데 도움이 됩니다.
  • 잔차학습의 장점

    1. 손쉬운 최적화: 잔차 학습은 신경망의 최적화 문제를 완화합니다. 신경망이 깊어질수록 역전파 중에 발생할 수 있는 그래디언트 소실(vanishing gradient) 또는 그래디언트 폭발(exploding gradient) 문제를 완화해줍니다.
    2. 깊이에 따른 성능 향상: 잔차 연결은 신경망이 깊어져도 성능이 계속 향상될 수 있도록 해줍니다. 이는 신경망이 입력과 출력 사이의 복잡한 매핑보다는 입력과 출력 간의 잔차를 학습하게 되기 때문입니다.
    3. 코드 구현의 간결성: 잔차 학습은 기존의 신경망 구조에 비교적 쉽게 추가할 수 있으며, 코드 구현도 간결합니다.

이러한 장점 덕분에 Residual Learning은 지금까지도 딥러닝의 복잡한 Task에서 뛰어난 성능을 보여줍니다.ResNet은 이러한 잔차학습의 아이디어를 사용한 대표적인 신경망 구조 중 하나입니다.

Screenshot from 2023-07-27 15-22-16

Attention과 정규화(Normalization) 과정을 반복합니다.
* 각 레이어는 서로 다른 파라미터를 가집니다.

Screenshot from 2023-07-27 15-23-07


Transformer의 동작원리 3. 인코더(Encoder)와 디코더(Decoder)

Screenshot from 2023-07-27 15-24-35

Transformer에서는 마지막 인코더 레이어의 출력이 모든 디코더 레이어에 입력됩니다.
* 논문에서는 n_layers(레이어의 개수)를 4로 설정했습니다. 아래는 n_layers=4일 때의 예시입니다.

Screenshot from 2023-07-27 15-25-12


Transformer의 동작원리 4. Attention

인코더와 디코더는 Multi-Head Attention 레이어를 사용합니다.
어텐션 연산을 위해서는 세 가지의 입력 요소가 필요합니다.

  1. 쿼리(Query) 2. 키(Key) 3. 값(Value)

Screenshot from 2023-07-27 15-27-51

인코더와 디코더는 Multi-Head Attention 레이어를 사용합니다.

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

Q는 query matrix, K는 key matrix, V는 value matrix, dk는 key의 차원을 나타냅니다.
(self-attention도 식은 똑같습니다.)

Screenshot from 2023-07-27 15-29-07


Transformer의 동작원리(하나의 단어) 5. 쿼리(Query) 키(key) 값(value)

Attention을 위해 쿼리(query) 키(key) 값(value)이 필요합니다.
각 단어의 임베딩을 이용하여 생성할 수 있습니다.

Screenshot from 2023-07-27 15-43-40


Transformer의 동작원리(하나의 단어) 6. Scaled Dot-Product Attention

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

Query로 'I love you'라는 문장에서 'I'가 들어왔습니다.
I , love, you 각각에 해당하는 key값과 각각 곱해져서 하나의 attention energy 값을 구할 수 있죠?
key의 dimension값에 루트를 씌운 값을 나눠주는 이유는 softmax함수에 들어가는 값의 크기를 normalization해주기 위해 각각 scailing vaector로 나눠준 것입니다.

  • softmax의 특징 : 0 근처에서는 Gradient가 높게 형성되지만 값이 이리저리 이동하게되면 기울기 값이 많이 줄어들기 때문에 Gradient Vanishing을 피하기 위해 스케일링을 해줍니다.

그 이후에 softmax 함수를 거쳐서 각각의 key값에 대해서 어떤 가중치를 가질 수 있는지 구합니다.
72%, 15%, 13%는 I에 대해 각 단어별 가중치 값에 value 값들을 각각 곱한 뒤에 전부 더해서 Attention value 값을 만듭니다.(=weighted sum)

Screenshot from 2023-07-27 15-45-30


Transformer의 동작원리(행렬) 7. 쿼리(Query) 키(key) 값(value)

  • 실제로는 행렬(matrix) 곱셈 연산을 이용해 한번에 연산이 가능합니다.

Screenshot from 2023-07-27 15-47-56


Transformer의 동작원리(행렬) 8. Mask

마스크 행렬(mask matrix)를 이용해 특정 단어는 무시할 수 있도록 합니다.
마스크 값으로 음수 무한의 값을 넣어 softmax함수의 출력이 0%에 가까워지도록 만듭니다.

인코더와 디코더의 구조는 거의 일치하지만 다른 점은 디코더에서는 한 층에 어텐션을 두 개 사용했다는 점입니다.

먼저 target 문장에 대한 정보를 받아옵니다. (항상 transformer는 학습을 할 때 paired된 데이터를 받습니다.)

예를 들어, 한글-영어로 가정한다면 인풋에는 ‘ 나는 학생입니다 ‘ 라는 문장이 들어옵니다.

그렇다면 이 문장은 앞서 본 input embedding 과정에서 봤던 것처럼 문장을 벡터화를 하고 input embedding 을 거쳐 적절한 크기의 matrix를 만드는 단계를 거칩니다.

output도 마찬가지이죠. ‘나는 학생입니다’에 대응하는 ‘i’m a student’라는 문장을 똑같은 과정으로 matrix를 만들어주고 positional encoding을 통해 학습할 수 있는 형태로 만들어줍니다.

위의 그림에서 input과 다른 Masked multi-head attention이 존재합니다.

Masked의 원활한 이해를 돕기 위해서 앞서 사용한 ‘나는 학생입니다’라는 문장을 예로 설명해볼게요.

‘나는 학생입니다’라는 인풋으로 ‘I’m a student’라는 아웃풋이 나오도록 학습을 해야합니다.

‘나는 학생입니다’ 문장은 matrix 형태로 존재하고 이를 바탕으로 I 를 먼저 만들어냅니다.

이후 input matrix를 활용하여 am이 오는 것을 맞추고 그 다음에 a , student 순서대로 다음에 어떤 단어가 오는지 맞추는 과정을 거칩니다.

  • x 부분은 마스킹 표시
    image

**즉, 현재 I 라는 단어를 예측한다면 뒤의 정보 ( 'm a student ) 는 사용하면 안된다는 것입니다.

**만약 뒤의 정보를 사용하게 된다면 ‘I’m a student’라는 정보를 다 가지고 학습을 진행하는 것이기 때문에 cheating이 되는 것이죠.

**현재 위치 기준으로 뒷 부분은 attention이 적용되지 않도록 마스킹을 해주는 것입니다.

Screenshot from 2023-07-27 15-56-54


Transformer의 동작원리(행렬) 9. Multi-Head attention

Transformer 아키텍쳐를 보면 input embedding + positional encoding 이후 multi-head attention으로 가는 단계에서 화살표 세 개가 있는데요, 이는 각각 key query value를 의미합니다.

multi-head attention이라는 의미 자체가 attention을 여러개 사용한다는 의미입니다.

한글에서 영어로 바꾸는 작업을 해줘야 하기 때문에 Encoder에 있는 값을 받아서 번역을 요청하는 것입니다.

KEY-VALUE를 Encoder에서 얻는 값으로 출력을 합니다. 그리고 Decoder에서 얻은 값을 query로 이용하게 됩니다.

이전에 언급했듯이 정보를 요청하는 것이 query의 역할입니다.

주어진 데이터에 접근을 하여 유사성을 계산하는 것이기 때문에 key query value가 이런 식으로 들어오게 됩니다.

그래서 ‘나는 학생입니다’에 대한 주어진 데이터셋이 key-value 값이 되는 것이고, 영어로 요청된 정보가 query 값이 되는 것이죠.

여기서 중요한 점은 매 층마다 encoder에 있는 정보를 사용하겠다는 것입니다.

이후 이전 과정과 동일하게 이전 값을 더해주고 정규화합니다.

이 부분을 6회 반복합니다.

최종적으로 linear를 통해서 우리가 번역하고자 하는 언어에서 알고있는 단어의 개수만큼 노드를 생성해줍니다.

예를 들어 10000개의 영어 단어를 번역하고자 한다면 마지막에는 10000개의 노드를 갖는 output값이 나오게 됩니다.

( ex. [0,0,1,1,0 …. ] )

그리고 softmax를 통해서 각 노드의 확률 계산을 하는 것입니다.

( ex. [0.8, 0.1, 0, …] )

따라서 가장 높은 확률을 기준으로 해서 단어 세트를 가져오게 되는 것입니다.

( I am a student 문장의 각각의 단어 예측 )

Screenshot from 2023-07-27 16-02-21

  • Multihead(Q,K,V)를 수행한 뒤에도 차원(dimension)이 동일하게 유지되는 것을 확인할 수 있습니다.

Screenshot from 2023-07-27 16-04-29


Summary

  • 데이터는 항상 paired 데이터를 사용 ( 한글 - 영어, 영어 - 프랑스어 등 ) , 각 단어마다 one-hot 벡터로 표현됩니다.
  • input embedding을 통해서 우리가 원하는 dimension으로 만들어 줄 수 있다. 그 다음 posional encoding 이라는 matrix를 만들어서 더해줍니다.
  • 위의 값을 통해 key query value 값으로 attention을 구합니다. 여기서 attention을 여러번 구하여 종합적으로 판단. ( 이전 값 더하고 Normalization )
  • Normalization은 학습 속도를 높이기 위해서 사용.
  • 다시 Feed Forward를 통하여 이전 값을 더하고 정규화.
  • decoder도 거의 비슷하지만 masked multi-head attention을 사용
  • Encoder에서 얻은 한글로 key-value 값을 얻고 영어를 query로 사용

Reference

Vit를 위한 Transformer - [https://minyoungxi.tistory.com/51]
동빈나 유튜브 - [https://www.youtube.com/watch?v=AA621UofTUA]

반응형