카테고리 없음

[2025-1] 이재호 - Attention is all you need

jeffy1234 2025. 1. 4. 13:42

https://arxiv.org/abs/1706.03762

 

Attention Is All You Need

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new

arxiv.org

구글에서 2017년에 발표한 Attention is all you need는 현재 자연어나 비전 등 다양한 방면에서 활용되는 Transformer라는 모델을 처음 소개한 논문이다. 기존의 seq2seq의 인코더 디코더 구조를 따르면서도 RNN을 사용하지 않고 attention만으로 모델을 구현하였다. 

 

Abstract

 

  • 간단한 구조:
    • Encoder와 Decoder는 Attention 메커니즘으로만 구성됨.
    • 순차적인 계산(Sequential Computation)을 필요로 하지 않아 병렬 처리가 가능하며, 학습 시간이 단축됨.
  • 우수한 성능:
    • WMT 2014 영어-독일어 번역 작업에서 BLEU 점수 28.4를 기록하며, 기존 최상위 모델을 능가함.
    • 영어-프랑스어 번역 작업에서도 BLEU 점수 41.8로 단일 모델 기준 최고 성능을 달성함.
  • 효율성:
    • 영어 프랑스어 번역 테스크 수행 시 8개의 GPU로 3.5일만에 학습을 완료하였으며, 기존의 최고 성능 모델보다 훨씬 적은 계산 비용으로 높은 품질을 제공.
  • 다양한 적용 가능성:
    • 영어 구문 분석(Constituency Parsing) 등 다른 작업에서도 Transformer가 성공적으로 적용됨.

 

Introduction

기존의 시퀀스 모델링과 언어 모델, 번역 모델의 접근법은 RNN, LSTM, gated RNN 을 사용하여 encoder - decoder 아키텍쳐를 만들어 사용하는 방식이었다. 그러나 이와 같은 방법들은 병렬화가 안돼 연산 속도가 느리다는 점과 입력 시퀀스가 길수록 메모리를 전부 기억하는데 한계가 있었다. 입력과 출력 시퀀스의 거리와 상관없이 모델링을 할 수 있도록 attention mechanism이 등장하였지만 RNN 과 함께 쓰이는 방식으로 사용 되었기에 기존 모델링의 근본적인 문제점을 해결하지는 못했다. 

따라서 이 논문의 저자들은 attention mechanism만을 사용한 transformer라는 새로운 모델을 만들어 병렬 계산이 가능하고 긴 의존성을 효율적으로 학습할 수 있도록 했다.

 

Model Architecture

Transformer - model architecture

 

 

먼저 전체적인 틀을 보면 Transformer도 encoder - decoder의 구조를 따르고 있고 encoder의 정보를 decoder에서 활용해 최종 단어를 예측하는 방식이다. 그러면 단계별로 어떤 과정이 일어나는지 알아보겠다. 

 

Input embedding

처음에 어떤 문장이 input으로 들어오면 token화 된다. 이는 기존에 정해진 알고리즘을 사용한다. 토큰은 꼭 단어 기준으로 나누어지는 것은 아니므로 단어의 개수와 동일하게 생각하면 안된다. 이후 Input embedding을 통해 각 토큰을 임베딩 차원의 벡터로 만들어준다. (논문에서는 512차원을 사용했다.) Transformer는 Input이 순차적으로 입력되는 것이 아니라 동시에 입력되므로 각 토큰 별로 순서를 사용자가 정해주어야 한다. 이를 위해 positional encoding 과정을 거치게 된다. Positional encoding 시 사용되는 식은 아래와 같다. 각 토큰 별로 512차원의 벡터를 만들어 기존 input 벡터에 더해주는 방식으로 진행된다.

pos는 단어의 위치, i는 벡터의 몇번째 차원인지를 나타낸다.
여기서는 총 3개의 토큰을 4-dimensional vector로 임베딩 해주고 positional encoding까지 해준 모습이다.

 

위 예시를 보면 조금 더 이해가 잘 될것이다. 

 

Encoder

Encoder는 multi-head attention과 Add&Norm, Feed Forward와 Add&Norm으로 이루어져 있다. 먼저 multi head attention부터 알아보자.

 

# multi - head attention

 

Positional encoding을 거친 후 N x $ d_{\text{model}} $ 차원의 데이터가 encoder로 들어가게 된다. (N: token 수, $ d_{\text{model}} \; : \text{임베딩 벡터 차원, 논문에서는 } 512 $ ). 이 input vector를 사용해 query, key, value 를 만들어준다. 논문에서는 query, key, value를 64 차원으로 설정했다. Input vector를 $X$라고 한다면 query = $ XW^q $ , key = $ XW^k $ , value = $ XW^v $ , $ W^q = W^k =  R^{d_{\text{model}} × d_k}, W^v = R^{d_{\text{model}} × d_v} $ 이다. 이때 논문에서는 $d_k$ , $d_v$를 64로 설정하였고 query와 key의 차원은 반드시 일치시켜야 하지만 value의 차원은 달라도 된다. 

이제 $N × d_k$의 query, key, value 가 생겼다. 이제 query와 key를 서로 곱해주고 $ \sqrt{d_k} $ 로 나누어 scaling 해준다. 이는 $d_k$가 커짐에 따라 query와 key 값을 곱했을 때 나오는 값이 커지는데 이를 보완해주기 위함이다. query와 key를 곱해줄 때 차원을 맞춰주기 위해 key matrix를 transpose 시켜준다. 이때 query와 key의 차원이 다르다면 연산이 불가능하므로 query와 key의 차원수는 항상 일치해야 한다. $ QK^T $ 를 해주면 $ N×N $ 행렬이 구해지게 되는데 이는 각 input token이 다른 input token 하고 얼마나 관련이 있는지를 나타내는 행렬로 볼 수 있다. 왜냐하면 사실상 $QK^T$ 연산을 하게 되면 $Q$의 각 행과 $K^T$의 각 열의 내적을 계산하게 되는데 내적 값이 클수록 두 벡터가 일치하는 경향이 크기 때문이다. 

query와 key를 곱해주고 scaling까지 해준 행렬에다가 softmax를 취해주고 value와 곱해주면 $N×d_v$ 의 행렬을 얻게 된다. query와 key를 통해 모든 토큰끼리의 연관성을 계산해주고 이를 value에다 곱해줌으로써 각 토큰 사이의 연관성을 잘 파악할 수 있다.

지금까지 설명한 attention mechanism을 나타낸 식이다.

지금까지 설명한 attention은 하나의 head에서 일어난 것이었고 이를 여러번 수행한 것이 multi - head attention이다. 논문에서는 8개의 head를 사용했다. 한번의 attention을 거치면 $N×d_v$ 의 행렬을 얻게 되고 이를 h개의 head 만큼 수행했다고 하면 최종 output은 각 head에서 나온 행렬을 열 방향으로 concat을 해주어 $N×hd_v$ 의 행렬을 얻게된다. 이를 $W_0 = R^{hd_v × d_{\text{model}} } $ 와 곱해주어 처음 input과 동일한 형태의 output을 추출하게 된다. 논문에서는 8개의 head를 사용했다. Head 별로 사용하는 query, key, value의 값은 다르고 이 때문에 문장의 서로 다른 부분에 집중해 전체적으로 문장의 의미를 더 잘 파악할 수 있다고 여겨지고 있다.

Attention mechanism
Multi-head Attention

위의 두 그림은 attention과 multi-head attention이 어떻게 이루어지는지에 대한 예시이다.

 

Add & Norm

Multi-head attention을 통해 나온 결과물에 처음 input 값을 더해주고 layer normalization을 진행해준다. 이는 정보량 보존과 back propagation시 gradient를 보존하는데 영향을 준다. Layer normalization을 통해서는 각 레이어 값이 크게 변화하는 것을 방지해 모델을 더 빠르게 학습한다. Transformer의 전체 아키텍쳐를 보면 모든 sub layer을 통과할 때마다 Add & Norm 과정을 거치는 것을 알 수 있다. 

 

Feed Forward

Feed forward 과정에서는 두 번의 linear transformation을 거치고 그 사이에 RELU activation을 사용해준다.

512 -> 2048 -> 512 의 차원 변형을 거쳐 최종적으로는 input과 같은 차원을 출력한다.

Feed Forward를 거친후 또 다시 Add & Norm을 거치면 한 번의 Encoder 과정을 거치게 된다. 이 과정을 N 번 반복해준다. 논문에서는 6번 반복해주었다.

 

Decoder

이제 decoder에 대해 알아보자. Decoder도 Encoder와 마찬가지로 embedding과 positional encoding 과정을 거친다. 그리고 Masked - multi head attention 과정을 거친다. Encoder와 다르게 masked - multi head attention을 하는 이유는 Decoder에서 다음 단어를 예측할 때 현재까지의 정보만을 사용하고 미래의 단어를 사용할 수 없기 때문이다. Encoder에서는 모든 단어를 한번에 넣어주었는데 Decoder에서도 똑같이 한다면 이는 일종의 cheating이다. 따라서 우선 모든 단어를 넣고 attention을 진행하되 $QK^T$에서 미래에 해당하는 단어들에 -inf를 부여하여 masking을 해주고 mask 처리된 행렬을 softmax 해준다. 이를 통해 현재 시점까지의 정보만을 활용할 수 있게 한다.

Masked - multi head attention을 통해 얻은 출력 값을 query로 encoder에서 얻은 출력값을 key, value로 사용하여 attention을 또 진행해준다. 이후 feed forward network를 또 거친다. 이 과정을 6번 진행해주고 linear layer을 통해 총 후보 토큰의 개수에 맞게 차원을 조절해준뒤 softmax를 통해 제일 확률이 높은 output 값을 선택해준다. 

 

Why Self attention?

  • 각 layer의 계산 복잡도 감소
  • Recurrence를 없애 더 많은 양을 병렬 처리 할 수 있음
  • Long term dependency에 대해 효율적인 처리를 할 수 있다

Training

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

Result

  • 시험 결과, SOTA를 달성했으며 학습에 필요한 계산량 또한 획기적으로 줄인 것을 확인할 수 있음
  • BLEU 뿐만 아니라, Machine Translation, English Constituency Parising 등 general task에 대해서도 좋은 결과를 나타냄

 

  • 위에서 제안한 Transformer의 구조에서 몇 가지 요소들을 변경한 후 English-German translation task에 적용한 실험 결과
  • (A) : head의 개수, dk.dv 값 변경한 경우 : head가 너무 많으면 오히려 성능이 떨어진다.
  • (B) : dk 만 변경
  • (C) : 모델의 크기를 키운 경우 : 모델이 커지면 성능이 더 좋아진다.
  • (D) : dropout 의 영향 : dropout 도 성능에 영향을 미친다.
  • (E) : positional embedding의 중요성 : learned positional embedding을 사용해도 성능에 큰 변화는 없다.

  • 다른 task에 대해서도 사용이 가능할지 실험하기 위해, English Constituency Parsing task에 transformer를 적용하였고 상당히 좋은 성능을 제공한다는 것을 확인할 수 있었음.