인공지능/논문

Attention Is All You Need(Transformer)

hyunji00pj 2025. 3. 18. 17:46

배경 및 문제의식

기존의 기계 번역 및 시퀀스 모델링에서는 RNN(Recurrent Neural Network)과 CNN(Convolutional Neural Network)을 많이 사용했습니다. 하지만 RNN은 순차적으로 학습해야 하므로 병렬처리가 어렵고, 긴 문장에서 장기 의존성(long-term dependency)을 학습하기 어렵다는 단점이 있습니다. 해당 논문은 recurrence와 convolution 을 전부 제외하고 오직 attention mechanism에만 기반한 Transformer라는 간단한 모델을 제안하는데, 초록에서 제안한 모델의 특징은 아래와 같이 요약할 수 있습니다.

 

  • 어텐션 기법으로 재귀적으로 각각의 시퀀스를 처리하지 않고 오직 행렬 곱을 이용해서 병렬적으로 시퀀스 데이터를 처리하기 때문에 전보다 훨씬 더 빠른 처리가 가능함
  • WMT 2014 data set을 이용해서 영어를 독일어로 번역하는 작업, 영어를 불어로 번역하는 작업에서 훨씬 개선된 성능을 보여줌
  • 크거나 한정된 학습 데이터를 가지고서도 다른 task들에 성공적으로 일반화될 수 있음을 보임

 

순환 모델의 병렬처리 문제

 

 

RNN, LSTM, GRU(Gate Recurrent Unit) 등은 언어 모델링 및 기계 번역과 같은 sequence 모델링 및 변환 문제에서 뛰어난 성과를 보이는 Recurrent 모델입니다  Recurrent 모델은 보통 입력과 출력의 symbol position에 따라 계산을 수행합니다.

계산 단계에서 위치를 정렬하고 이전 상태 ht-1과 위치 t 함수인 은닉상태 ht를 생성합니다.

 

[바닐라 RNN 구조]

 

이는 시퀀스가 길수록 메모리 문제로 인해 병렬적 처리가 어렵게 하고, 최근 들어 모델의 성능 자체는 비약적으로 상승했지만 위의 문제는 해결되지 않았습니다.

 

" Attention mechanism 제시 "

Attention mechanism은 입력과 출력 시퀀스 거리와 관계없이 의존성을 모델링할 수 있으나 거의 대부분의 경우 순환 네트워크와 함께 사용되고 있어 효율적인 병렬화 불가능 따라서 이 논문에서 순환없이 입력값과 출력값 간 전역 의존성을 모델링할 수 있는 Attention mechanism만을 사용한 모델 구조인 Transformer 제안

 

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

  • 이러한 모델들은 입출력 간 관련성을 파악하기 위해 거리에 따라(선형 또는 로그 비례) 계산량이 증가함
  • 따라서 입력값과 출력 값의 거리가 멀수록 의존성을 알기 어려움

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

 

Attention 메커니즘이란?

"중요한 정보에 더 집중하게 만드는 연산 방식"

사람이 문장을 이해할 때, 각 단어를 고르게 읽는 게 아니라 중요한 단어에 더 집중하는 것처럼, Attention은 입력에서 어떤 부분에 주목해야 할지를 학습합니다.

'한/영 번역의 Attention'

 

위의 그림은 한/영 번역에서의 Attention을 나타내고 있습니다. 보시다시피 영어 'train'와 한국어 '기차를'이 강한 Attention 상관관계에 있습니다. 이에 비해 다른 단어들과는 Attention이 약합니다. 

 

 지금부터는 Attention 모델의 구조에 대해 알아보도록 하겠습니다. Attention을 설명하기에 앞서 Encoder와 Decoder에 대해 설명하도록 하겠습니다. 위의 영/한 번역의 예시를 이용해 이를 설명하겠습니다. 대부분의 자연어 모델은 Encoder와 Decoder로 구성이 되어있습니다. Encoder는 입력으로 input data를 받아 압축 데이터(context vector)로 변환 및 출력해주는 역할을 합니다. Decoder는 반대로 압축 데이터(context vector)를 입력 받아 output data를 출력해줍니다. 이는 우리가 사용하는 전화기의 원리와 동일한데, 이렇게 해주는 이유는 정보를 압축하므로써 연산량을 최소화하기 위해서입니다. 위 그림에서 보다시피 문맥 벡터는 Encoder의 마지막 RNN 셀에서만 나오므로 그 전 RNN셀들의 반영이 되지 않습니다. 

 

이렇게 문맥 벡터(context vector)를 사용하면 연산량이 줄어든다는 장점이 있지만 정보의 손실이 발생하는 문제점 역시 발생하게 됩니다. 이러한 정보 손실 문제를 해결하기 위해 'Attention'이라는 개념이 도입됐습니다.

Encoder and Decoder 구조에서 각각의 out이 hidden state의 형태로 출력됩니다. 유의할 점은 Encoder의 경우 모든 RNN 셀의 hidden states들을 사용하는 반면, Decoder의 경우 현재 RNN셀의 hidden state만을 사용합니다. 그 이유는 맨 위의 그림 '한/영 번역의 Attention'에서 보다시피 Target seqence의 한 단어와 Source seqence의 모든 단어의 Attention 상관관계를 비교하기 때문입니다. 여기서 hidden state는 압축된 문맥으로 해석할 수 있습니다.

 

Decoder hidden state:  Target seqence의 문맥

Encoder hidden states: Source seqence의 문맥(모든 문맥을 활용하겠다.)

  이제 위에서 구한 Encoder hidden states와 Decoder hidden state을 이용해 Attention score를 구해줍니다. hidden state는 행렬입니다. 때문에 위의 그림과 같이 Encoder hidden states들과 전치한 Decoder hidden state를 내적(dot product)해주면 상수 값이 나오게 됩니다. 이 상수값은 Encoder의 RNN셀의 수만큼 나오게 됩니다. 위의 경우 score1 ~ score4까지 4개가 나옵니다. 이 score들을 Attention score라고 부릅니다. 

Attention Value

 

  앞에서 구한 Attention score들을 softmax 활성 함수(activation function)에 대입하여 Attention distribution을 만들어줍니다. 이렇게 하는 이유는 각 score들의 중요도를 상대적으로 보기 쉽게 하기 위해서입니다. softmax함수는 어떤 변수를 0 ~ 1 사이의 값으로 만들어주는데, 이를 다른 말로 하면 확률화 해준다는 것입니다. 즉 Attention score들을 확률분포로 변환한다고 이해하시면 됩니다. 그다음 Encoder hidden states들을 방금 구한 Attention distribution에 곱하여 합해주어 Attention value 행렬을 만들어줍니다. 즉 각 문맥들(hidden states)의 중요도(Attention score)를 반영하여 최종 문맥(Attention value)을 구한다고 생각하면 됩니다.

 마지막으로 Decoder의 문맥을 추가해주기 위해 Decoder hidden state를 Attention value아래 쌓아 줍니다. 이 과정을 'concatenate'라고 합니다. 추가적으로 성능을 향상하기 위해 tanh, softmax 활성 함수를 이용해 학습을 시키면 최종적인 출력 'y'가 나오게 됩니다. 

 

총정리

Attention: 모델의 성능 향상을 위해 문맥에 따라 집중할 단어를 결정하는 방식

Decoder hidden state:  Target seqence의 문맥

Encoder hidden states: Source seqence의 문맥(모든 문맥을 활용하겠다.)

1. Encoder hidden states들과 Decoder hidden state를 내적(dot product)하여 Attention score계산

2. Attention score에 softmax함수를 취하고 이를 다시 Encoder hidden states들과 곱한 다음 이를 합하여 Attention value계산

3. Attention value 행렬에 Decoder hidden state 행렬을 쌓아 올리고(concatenate) tanh, softmax함수를 통해 학습시키다.

 

 

(i) Self-attenion

  • 말 그대로 자신에게 수행하는 어텐션 기법으로 단일 시퀀스 안에서 서로 다른 위치에 있는 요소들의 의존성을 찾아냄
  • 메커니즘 독해, 추상적 요약, 텍스트 포함, 학습 과제, 독립적인 문장 표현을 포함한 다양한 task에서 성공적으로 사용됨

 

 첫 번째 메커니즘은 Self Attention입니다. "Self Attention"이란 말 그대로 Attention을 자기 자신한테 취한다는 것입니다. 그럼 도대체 왜 이런 행위를 하는 것일까요? 그 이유는 바로 문장에서의 단어들의 연관성을 알기위해서 입니다. 위 그림에는 "The animal didn't cross the street because it was too tired."라는 문장이 있습니다. 여기서 "it"이 가리키는 단어는 무엇일까요? 사람은 문맥상 it이 animal을 가리킨다는 것을 쉽게 알 수 있습니다. 그러나 컴퓨터에게는 이러한 과정이 매우 어렵습니다. 이를 쉽게 해주는 방법이 Self Attention입니다. 

예시 문장으로 이해하기

문장:

"The cat sat on the mat"

우리가 "cat"이라는 단어를 처리할 때,

  • "sat" (행동),
  • "the" (관사),
  • "mat" (위치의 대상)
    이런 단어들이 문맥을 형성하죠.

➡ Self-Attention은 "cat"이라는 단어가 다른 단어들과 얼마나 관련 있는지를 계산하고, 그 가중치를 곱해서 새로운 표현(임베딩)을 생성합니다.

 

 지금부터는 Self Attention의 계산 과정을 알아보도록 하겠습니다. Self Attention에서는 Query, Key, Value 라는 3가지 변수가 존재합니다.

 

예를 들어 여러분이 호텔에서 접수를 하고 키를 받아 방에 들어가 최종적으로 술을 마신다고 가정하겠습니다.

 

처음에 접수처에서 호텔 직원에게 "512호 예약자인데 어떻게 들어가나요?"라고 묻는 말이 "Query"를 의미합니다.

 

그다음 직원이 512호의 열쇠를 주는데, 이 열쇠가 "Key"가 되고 마지막으로 512호에 들어가 안에 있는 술이 "Value"라고 이해를 하시면 됩니다.  Self Attention의 에서 가장 중요한 개념은 Query, Key, Value의 시작 값이 동일하다는 점입니다. 때문에 Self를 붙이는 겁니다. 그러나 이 말이 Query, Key, Value이 동일하다는 말은 아닙니다. 그 이유는 위 그림과 같이 중간에 학습 weight W값에 의해 최종적인 Query, Key, Value값은 서로 다르게 됩니다. 다시 말해 "Query, Key, Value의 기원은 같으나 최종 값은 학습을 통해 달라진다."라고 이해하시면 되겠습니다.

실제 예시 계산

예제 문장:

"I love NLP"

  1. 각 단어를 임베딩하고 → Query , Key , Value 로 선형 변환
Q = [I_q, love_q, NLP_q]
K = [I_k, love_k, NLP_k]
V = [I_v, love_v, NLP_v]

"love"의 self-attention을 계산한다면:

→ 즉, "love"는 "I", "love", "NLP" 각각과 얼마나 관련 있는지 계산하고 그 중요도를 곱해 새로운 "love"의 표현을 생성함

 

마지막으로 병렬처리에 대해 설명을 하도록 하겠습니다. 위에서는 이해를 돕기위해 단어 하나의 Attention을 구하는 과정을 설명했는데, 실제로는 여러단어를 위 그림과 같이 병렬처리해 계산을 합니다. 병렬처리를 하면 연산속도가 빨라지는 이점이 있습니다.

 

 

(ii) Multi-head Attention

 

 

 이전에는 단 한 번의 Attention을 통해 학습을 시켰으나, Attention을 병렬로 여러 개 사용하자 더욱 성능이 좋아졌습니다. 위 그림은 Multi-head Attention 메커니즘을 도식화한 것입니다. 보다시피 head의 수만큼 Attention을 각각 병렬로 나누어 계산을 합니다. 도출된 Attention Value들은 마지막에 concatenate를 통해 하나로 합쳐집니다. 이렇게 하면 Attention을 한번 사용할 때와 같은 크기의 결과가 도출됩니다. 

일반적인 Attention 메커니즘

 이해를 돕기 위해 예를 들어 보겠습니다. 예를 들어 [4x4] 크기의 문장 임베딩 벡터와 [4x8]의 Query, Key, Value가 있을 때, 일반적인 한 번에 계산하는 Attention 메커니즘은 [4x4]*[4x8]=[4x8]의 Attention Value가 한 번에 도출됩니다. 

 

Multi-head Attention

반면 Multi-head Attention 메커니즘은 위와 같은 구조로 계산이 됩니다. 여기서는 head의 수를 4개라고 하겠습니다. head의 수가 4개이므로 각 연산과정이 4분의 1만큼만 필요하다는 이야기입니다. 때문에 위에서 크기가 [4x8]이었던 Query, Key, Value를 4 등분하여 [4x2]로 만듭니다. 이렇게 되면 자연스럽게 각 Attention Value는 [4x2]가 됩니다. 이 Attention Value들을 마지막에 concatenate를 시켜주면 위 그림과 같이 크기가 [4x8]이 되어 일반적인 Attention 메커니즘의 결괏값과 동일하게 됩니다. 여러 부분에서 도출돼 결과를 통해 서로 정보를 상호 보완하기 때문에 Multi-head Attention 메커니즘이 성능이 더 좋다.

 

제안된 모델: Transformer

트랜스포머는 Attention 메커니즘만을 사용한 최초의 모델입니다. RNN이나 CNN을 전혀 사용하지 않고, 입력과 출력의 모든 단어 간 관계를 attention을 통해 학습합니다.

 

전체 구조 개요

 

  • 왼쪽: Encoder stack (N layers)
  • 오른쪽: Decoder stack (N layers)
  • 가운데 상단: Linear + Softmax → 출력 확률

세부 구성 설명 (왼쪽 → 오른쪽)

1. Input Embedding + Positional Encoding

  • Transformer는 RNN처럼 순서를 처리하지 않기 때문에 위치 정보(Positional Encoding)를 입력 임베딩에 더해줍니다.
  • 위치에 따라 sin/cos 곡선 값이 더해진 벡터 사용

Input:       ["나는", "기차를", "탔다"]
Embedding:   [벡터1, 벡터2, 벡터3]  
+ Position Encoding → 위치 정보 반영

2. Encoder Block (왼쪽 N×)

한 층 구성:

  1. Multi-Head Attention (Self-Attention)
    • 문장 내의 모든 단어가 서로를 바라봄 (self-attend)
  2. Add & Norm
    • 잔차 연결 + Layer Normalization
  3. Feed Forward
    • position-wise fully connected (비선형 레이어)
  4. Add & Norm 다시

→ 이런 블록을 N번 반복 (논문에서는 N=6)

 

3. Decoder Block (오른쪽 N×)

한 층 구성:

  1. Masked Multi-Head Attention
    • 미래의 단어를 못 보게 masking한 Self-Attention
      (예: 번역 시 아직 생성되지 않은 단어를 보지 않도록)
  2. Add & Norm
  3. Multi-Head Attention
    • Encoder의 출력과 연결된 Cross-Attention
      (입력 문장과 출력 문장 간 관계)
  4. Add & Norm
  5. Feed Forward
  6. Add & Norm

→ 이것도 N번 반복

 

Linear + Softmax

  • Decoder의 마지막 출력은 linear projection을 거쳐 vocabulary 크기로 변환되고,
    softmax로 가장 확률 높은 단어를 출력합니다.

 

전체 흐름

  1. 입력 문장 → Input Embedding + Positional Encoding
  2. Encoder에서 N번 처리 → context 표현
  3. Decoder는 "출력 문장 일부"를 보고 다음 단어 생성
    (shifted right + masking)
  4. Decoder 내부에서는 Encoder와 상호작용 (cross attention)
  5. 마지막은 Linear + Softmax → 단어 예측

Transformer의 장점

항목Self-AttentionRNNCNN
병렬처리 매우 용이 불가 가능
경로 길이(Path Length) O(1) O(n) O(log n)
계산 복잡도 O(n²) O(n) O(k·n)
  • 병렬처리 가능
  • 긴 거리 의존성 학습에 유리
  • 구조적으로 해석이 쉬움 (Attention 시각화 가능)

성능 및 실험 결과

기계번역 (Machine Translation)

  • WMT 2014 English → German: BLEU 28.4점 (기존 SOTA 대비 +2점)
  • WMT 2014 English → French: BLEU 41.8점
  • 학습 시간: 8개의 P100 GPU에서 3.5일

구성 비교 실험

  • Multi-head 수, Feed-Forward 차원, Dropout 등 다양한 구성 실험
  • 성능 향상에 가장 큰 영향을 준 것은 모델 크기 증가적절한 dropout

다른 태스크 일반화

  • Constituency Parsing (구문 분석)에도 적용 → 기존 RNN 기반 모델보다 높은 성능 달성

결론 및 영향

  • 트랜스포머는 시퀀스-투-시퀀스 모델링에서 혁신적인 구조적 전환을 제안
  • 이후 등장한 BERT, GPT, T5 등 대형 모델들의 기반이 됨
  • 텍스트뿐 아니라 이미지, 오디오, 비디오 등 다양한 도메인에 확장 가능성