Transformer - Attention Is All You Need 완벽하게 이해하기

Sarah Lee·2025년 2월 23일

LLM

목록 보기
1/2
post-thumbnail

2017년 구글에서 발표한 논문 "Attention Is All You Need"는 기존의 RNN과 CNN 기반의 자연어 처리 모델을 뛰어넘는 혁신적인 Transformer 구조를 제안했다. Transformer는 완전히 Attention Mechanism만으로 RNN의 순차적 처리라는 병목을 해결하고, 병렬화를 극대화하여 학습 속도를 획기적으로 향상시켰다. Transformer는 NLP Task 뿐만 아니라, Vision, Speech, Reinforce Learning, 생명과학, 수학 등 다양한 도메인의 뼈대로 쓰이며 범용 모델로 자리잡았다.

🖋️ 내가 작성한 논문도 Vision Transformer를 사용했고, 지금 사용되고 있는 LLM 모델들은 모두 이 Transformer 구조를 기반으로 하고 있다고 해도 과언이 아니다. 따라서 좀 오래되긴 했지만 첫 포스팅으로 선정!

0. Abstract

  1. 기존의 sequence 처리 모델은 주로 RNN와 CNN을 기반으로한 encoder-decoder 형태가 주를 이루었고, 이 사이를 어탠션 매커니즘을 활용하여 연결한 모델들이 가장 높은 성능을 달성했다.
  2. 이 논문에서는 순수 어탠션 기반의 Transformer 모델을 제안하며, RNN과 CNN을 배제하고 병렬화를 극대화 하여 성능과 효율성을 향상시켰다.
  3. WMT 2014 영어-독일어 번역 태스크와, 영어 -프랑스어 번역 태스크에서 최고의 성능을 달성하였다.
  4. 그럼에도 불구하고 8개의 GPU로 3.5일의 training 시간밖에 걸리지 않았다.
  5. 또한, 이 모델은 번역뿐만 아니라 다른 태스크에서도 적용되어 일반화가 가능함을 보였다.

1. Introduction

  1. 기존의 시퀀스 모델은 RNN(LSTM, GRU)와 CNN을 활용하여 발전하였지만, 순차적 연산으로 인한 병렬화 문제와 시퀀스의 길이가 길어짐에 따라 메모리 한계 때문에 장기 기억의 어려움이 존재했다.
  2. 최근 연구에서는 Factorization trick이나, conditional computation 등을 통해 효율성을 높이려고 했지만, 여전히 순차 처리의 늪에서 빠져나오진 못하였다.
  3. Attention mechanism은 다양한 태스크에서 시퀀스 모델링 및 transduction 모델링에서의 핵심 요소가 되었으며, 입/출력 시퀀스의 길이와 상관 없이 모델링이 가능하다는 장점이 있다. 그러나 이러한 어탠션도 대부분 RNN과 함께 사용되었다.
  4. 이 논문에서는 Transformer는 완전히 어탠션을 기반으로 하여 시퀀스 데이터를 처리하는 첫 번째 논문으로, 효율적인 병렬화와 적은 연산량으로 높은 성능을 달성하였다.

2. Background

  1. 기존 시퀀스 처리 모델들은 computation 비용을 낮추기 위해 다양한 방식으로 개선되어 왔다.
    • CNN - Extended Neural GPU, ByteNet, ConvS2S: input과 output의 representation 계산을 병렬화 하였지만, 긴 거리의 단어 간 관계를 학습하는 데에는 한계가 있다.
    • Transformer에서는 attention-weighted postition과, Multi-Head Attention을 함께 사용하여 학습 횟수가 linear, logarithmically 증가하는 것에서 일정한 횟수의 연산으로 획기적으로 줄어들었다.
  2. Self-Attention: sequence의 representation을 학습하기 위해 문맥 이해, 요약 등의 NLP 태스크에 많이 사용되었다.
  3. End-to-end memory networks: 어탠션 기반의 recurrence은 간단한 질문-대답 태스크에서 sequence aligned recurrence 보다 효과적인 성능을 보여주었다.
  4. 결국 Transformer는 self-attention만을 사용하여 input과 output의 representation을 계산하는데 성공한 최초의 transduction model이다.

3. Model Architecture

여기서 부터는 StatQuestTransformer Neural Networks, Clearly Explained!!! 영상을 참고하여 정리해보았다. StatQuest의 Josh Starmer는 대학원에서 처음 통계/머신러닝을 배울 때 나의 제 2 스승이실만큼 영상을 많이 보았고... 무엇보다 쉽게 예시를 들어 설명해주시기 때문에 입문자들에게 강추한다. 최근에는 딥러닝 모델들에 대한 영상들도 올라오기 시작했다.

1. Word Embedding

  • 학습된 embedding을 dmodeld_{model} 차원으로 만들어 주기 위해 사용한다.
  • 위의 예시에서는 let's go라는 문장이 있을 때, 각각 단어의 차원이 2인 word vector로 변환하는 과정을 보여준다.
  • 각 토큰은 모두 동일하게 학습된 network에 의해서 생성된다. 즉, 어떤 길이의 문장이 오더라도 같은 word embedding network를 사용할 수 있다.

2. Positional Embedding

이전에 공부할 때는 이해가 안되었던 부분. StatQuest를 보니 한방에 이해되었다.

  • "Squatch eats pizza!" 라는 문장과 "Pizza eats Squatch!" 라는 문장은 어떻게 구별할까? RNN과 같이 순차적으로 처리하지 않기 때문에 이러한 위치에 대한 정보를 넣어주는 것이 필요하다.
  • 따라서 Transformer에는 이러한 position에 대한 정보를 넣어주기 위해, 위에서 구한 word embedding과 함께 같은 차원으로 positional embedding을 더해준다.

  • 위 그림과 같이 이 논문에서는 서로 다른 frequency를 가진 sine과 cosine 함수를 encoding에 사용하였다. 논문에서는 learnable positional encoding에 대해서도 나오는데, 성능도 어차피 비슷하고 sequence길이가 달라질 수 있기 때문에 sinusoidal version을 사용했다고 한다.
  • 위 그림에서는 dmodel=4d_{model} = 4 인 예시를 보여주고 있다. 따라서 sine 과 cosine 함수가 총 4개가 나열되어 있고 (y축), x축에는 word position 이 순서대로 대응된다고 생각하면 된다.
  • 따라서 하나의 word에 대해서 총 4개의 positional embedding이 나오고, 이전에 계산한 word embedding과 이를 더해주면 embedding은 끝난다.

3. Self-Attention

  • 길이가 다른 시퀀스의 representation을 학습하기 위해서, Transformer는 Self-Attention 기법을 사용하였다.
  • 논문에서는 Why Self-Attention이라는 색션에서 이 매커니즘의 장점을 다루고 있는데,
    1. Computational complexity per layer
    2. Amount of computation that can be parallelized
    3. Long-range dependencies in the network
  • 로 꼽고 있다. 이는 다음과 같은 표로 complexity를 계산하였다.

  • Self-Attention: 모든 토큰이 서로를 참조한다. Query-Key 곱셈에서 dd 차원 벡터들이 내적만 수행되므로 결과 행렬은 n×nn\times n이 된다. 여기에 Value 행렬이 곱해지므로 최종적으로 O(n2d)O(n^2\cdot d) 의 연산량이 된다.
  • Recurrent: 매 타임 스탭마다 연산이 반복된다. 그리고 입력 벡터 크기 d와, hidden state d가 곱해지는 행렬 연산 d2d^2 이 수행된다.
  • Convolutional: 고정된 크기 k의 kernel을 사용하여 인접한 k개의 입력 벡터를 처리한다. 각 위치에서 k개의 입력을 고려해 연산을 수행하고, 한 위치에서 수행되는 연산량은 k×d2k\times d^2 가 된다.
  • CNN은 병렬화가 가능하지만 멀리 떨어진 토큰 간의 관계를 학습하는 데 한계가 있고, RNN은 병렬화가 어려운 단점이 있다.
  • 추가적으로 Self-Attention은 interpretable 하다는 장점까지 가진다.
  • 결론: Self-Attention이 짱이다.

4. Attention 계산, Scaled Dot-Product Attention

Key, Query, Value가 어떻게 만들어지고 계산되는지 하나씩 뜯어보자.
먼저 let's에 대한 다른 단어 (자신 포함)의 similarity를 계산하는 과정을 하나씩 풀어보았다.

  1. let's를 가지고 Query를 생성한다. 여기에서 Query를 생성하기 위한 Weight matrix의 dimension은 WiQRdmodel×dkW{^Q_i} \in \mathbb{R}^{d_{model}\times d_k} 가 되는데, 여기서 dkd_k 는 query와 key의 dimension이다.
    • key와 value를 생성할 때에도 동일한 방식으로 Weight matrices의 차원을 계산할 수 있다. 이 모든 weight과 bias는 train 때 backpropagation으로 정해지며, 모든 token에 대해서 동일하게 쓰인다.
    • 아래 첨자 ii는 head에 대한 것으로, Multihead Attention을 사용하기 때문에 head 별로 서로 다른 representation을 학습할 수 있다. 이는 뒤에서 다시 설명하겠다.
  2. Query value를 계산했다면, 나머지 시퀀스 (본인 포함) 토큰에 대하여 Key를 동일한 방식으로 계산한다.
  3. Similiarity를 계산하는 방법은 Dot product이다. Query와 Key를 내적하여 similiarity를 구하고, 여기서 SoftMax를 사용하여 0과 1 사이 값으로 만들어준다 (합이 1이 되도록). 위의 예시에서는 Let's가 Let's를 참조한 결과는 1.0이 나오고, let's와 go의 similiarty + softmax를 한 결과는 0이 된 것을 볼 수 있다.
  4. 최종적으로 Query에 대한 다른 token의 similarity까지 포함한 representation을 계산하기 위해, 마지막으로 전체 token 마다 Value matrix가 만들어지고, 여기에서 이 softmax로 계산된 attention scores가 scale되어 곱한 것이 Attention의 결과이다.
    이를 수식으로 간단하게 쓴 것이 다음과 같다.

Query, Key, Value 를 계산하는 Matrix는 고정이다. 따라서 sequence 길이에 관계 없이 똑같은 Weights를 재사용 할 수 있다.
또한, 모든 계산은 병렬화가 가능하다! 한번에 연산 가능.

5. Multi-Head Attention

  • 위에서 언급했던 것처럼, 우리는 Self-Attention을 여러 head로 나누어서 계산 뒤 concat 함으로서 각각의 head들이 서로 다른 representation을 학습하도록 한다.
  • Appendix에서는 서로 다른 head가 학습한 모습을 시각화하여 보여주고 있다.

6. Residual Connection and FFN

  • 이후, 여기에 안정적인 neural network training을 위해 처음 input embedding을 다시 더해주는 residual connection이 이루어진다.
  • 그리고 최종적으로 FFN network를 통과시키면 Encoder 부분이 끝난다.
  • FFN network 또한 모든 token에 동일하게 적용되고, layer 마다는 서로 다른 parameter를 사용하게 된다.
  • 참고로 본 논문에서는 Encoder block의 layer 개수가 N=6N=6이 사용되었다.

7. Decoder Self-Attention

  • Decoder의 Self-Attention은 Encoder와 유사하게 이루어지는데, 대신 leftward information flow를 지켜야 하기 때문에 auto-regressive 하게 이루어져야 한다. 즉, 내가 생성해야 하는 단계의 토큰의 정답을 보면 안됨.
  • 따라서 Masking을 사용해서 현재 위치와 이전까지 생성된 토큰까지만 attention을 계산한다.
  • Softmax와 곱해지는 Value에 -\infin 을 곱해주어 masking out을 한다.

    그렇다면 Decoder는 병렬화가 가능할까?

    • Training 단계에서는 모든 정답 sequence가 존재하기 때문에 masked self-attention을 통해 병렬화가 가능하다.
    • Inference 단계에서는 다음에 어떤 단어가 나올지 모르기 때문에 sequentially 작동할 수밖에 없다.

8. Encoder-Decoder Attention

  • Decoder가 Encoder에서 이해한 representation을 그대로 활용할 수 있도록 하기 위해 필요함.
  • Decoder에서는 Query를, Encoder token에서는 Key와 Value를 가져와서 smiliarity를 계산한다.
  • 이 과정을 통해 모든 Decoder의 token은 Encoder의 모든 input을 참조할 수 있게 된다.

9. Decoding numbers into words

  • 최종적으로 Training 과정에서는 다음과 같은 Linear 연산 & Softmax 과정을 거쳐 최종 Output probability가 계산된다.
  • Inference 과정에서 최종적으로<EOS> token이 나오게 되면 Decoding이 종료된다.

4. 마치며

  • 이후 논문 내용은 Training parameters, Results (벤치마크 데이터셋에서의 성능), 그리고 Conclusion으로 끝난다. 이는 크게 중요한 내용은 아니기 때문에 생략한다.
  • Transformer가 나온 뒤로, Vision Task에서는 ViT (Vision Transformer)가 state-of-the-art 성능을 찍었다.
  • ViT를 이해하기 위해 자주 들어갔던 블로그 링크: https://amaarora.github.io/posts/2021-01-18-ViT.html

5. References

profile
AI 세상에서 개발자로 살아남기

0개의 댓글