·AI·ML

Attention Is All You Need

2017년 Google Brain의 Transformer 논문을 읽고 번역·해설한다. 왜 이 논문이 AI의 역사를 바꿨는가.

#AI·ML#딥러닝#논문리뷰

2017년, Google Brain과 Google Research 소속 연구자 8명이 공동으로 발표한 논문 "Attention Is All You Need"는 현대 AI의 판도를 바꾼 한 편의 선언문입니다. RNN도, CNN도 아닌 오직 Attention만으로 시퀀스를 처리할 수 있다는 아이디어—그 단순하고 대담한 주장이 GPT, BERT, 그리고 오늘날 우리가 사용하는 거의 모든 대형 언어 모델의 토대가 되었습니다.

Abstract

논문의 핵심 주장을 먼저 정리하면 이렇습니다.

현재 지배적인 시퀀스 변환 모델은 인코더와 디코더를 포함하는 복잡한 RNN·CNN 기반입니다. 최고 성능의 모델들 역시 Attention Mechanism을 통해 인코더와 디코더를 연결하곤 합니다. 우리는 새로운 심플 네트워크 아키텍처인 Transformer를 제안합니다. 반복(recurrence)과 합성곱(convolution)을 완전히 배제하고, 오직 Attention Mechanism에만 기반합니다.

두 가지 기계 번역 실험에서 이 모델은 더 높은 병렬화 가능성과 훨씬 짧은 학습 시간을 갖추면서도 품질에서도 우수함을 보였습니다. WMT 2014 영어-독일어 번역에서 28.4 BLEU를 달성하며 기존 최고 결과보다 2 BLEU 이상 향상했고, 영어-프랑스어 번역에서는 8개의 GPU로 3.5일 학습 후 41.8이라는 단일 모델 최고 BLEU 점수를 기록했습니다.

BLEU(Bilingual Evaluation Understudy)는 기계 번역 성능을 측정하는 대표적인 지표입니다. 수치가 높을수록 사람의 번역에 가깝다는 의미입니다.

1. Introduction: RNN의 한계

Transformer 이전, 시퀀스 모델링의 표준은 RNN, 특히 LSTM(Long Short-Term Memory)과 GRU(Gated Recurrent Unit)였습니다. 이 모델들은 언어 모델링과 기계 번역 분야에서 당시 최고 수준의 성능을 보여주고 있었습니다.

그런데 RNN에는 구조적인 병목이 있었습니다.

순환 모델은 입력·출력 시퀀스의 기호 위치에 따라 계산을 순차적으로 진행합니다. 이전 은닉 상태 ht1h_{t-1}과 현재 위치 tt의 입력을 받아 새로운 은닉 상태 hth_t를 생성하는 방식입니다. 이 본질적으로 순차적인 특성은 훈련 샘플 내에서의 병렬화를 원천적으로 막습니다. 특히 시퀀스가 길어질수록 메모리 제약으로 배치 처리도 어려워집니다.

쉽게 말하면, RNN은 앞 단어를 처리해야 뒷 단어를 처리할 수 있는 구조입니다. 문장 전체를 한꺼번에 병렬로 처리할 수 없습니다. 문장이 길어질수록 학습은 느려지고, 먼 거리의 단어 간 의존 관계는 점점 희미해집니다.

이에 반해 Attention Mechanism은 거리에 상관없이 시퀀스 내 임의 두 위치의 관계를 직접 포착할 수 있습니다. 저자들은 여기서 한발 더 나아가 Attention만으로 전체 아키텍처를 구성하는 Transformer를 제안합니다.

2. Background: 이전 시도들

순차 계산을 줄이려는 시도 자체는 Transformer 이전에도 있었습니다. Extended Neural GPU, ByteNet, ConvS2S 등은 CNN을 기본 블록으로 삼아 모든 입력·출력 위치에 대한 은닉 표현을 병렬로 계산했습니다.

하지만 이 CNN 기반 모델들에서는 두 위치 사이의 거리가 멀수록 그 관계를 연결하는 데 필요한 연산 수가 늘어났습니다. ConvS2S는 선형적으로, ByteNet은 대수적으로 증가합니다. 멀리 떨어진 단어들 사이의 의존 관계를 학습하기가 그만큼 어렵다는 뜻입니다.

Transformer에서 이 경로 길이는 상수로 줄어듭니다. 어떤 두 위치 사이의 관계도 단 한 번의 연산으로 연결됩니다. 이것이 Transformer의 핵심 강점 중 하나입니다.

논문에서 Self-Attention을 "인트라 어텐션(intra-attention)"이라고도 부릅니다. 단일 시퀀스 내 다른 위치들 사이의 관계를 계산해 시퀀스의 표현을 만들어내는 메커니즘입니다. Self-Attention은 독해, 추상 요약, 텍스트 수반(textual entailment) 등 다양한 NLP 태스크에서 이미 효과가 입증되어 있었습니다.

3. Model Architecture

Transformer는 인코더-디코더 구조를 따릅니다.

인코더는 입력 심볼 표현의 시퀀스 (x1,,xn)(x_1, \ldots, x_n)을 연속 표현의 시퀀스 z=(z1,,zn)\mathbf{z} = (z_1, \ldots, z_n)으로 매핑합니다. 디코더는 z\mathbf{z}를 받아 출력 시퀀스 (y1,,ym)(y_1, \ldots, y_m)을 한 번에 한 원소씩 자기회귀적(auto-regressive)으로 생성합니다. 즉, 다음 토큰을 생성할 때 이전에 생성한 토큰들을 추가 입력으로 사용합니다.

3.1 Encoder와 Decoder 스택

인코더는 동일한 레이어 N=6N = 6개를 쌓은 구조입니다. 각 레이어에는 두 개의 서브레이어가 있습니다.

  1. Multi-Head Self-Attention 메커니즘
  2. Position-wise Fully Connected Feed-Forward Network

두 서브레이어 각각에 잔차 연결(residual connection)을 적용하고, 그 뒤에 레이어 정규화(layer normalization)를 수행합니다. 각 서브레이어의 출력은 다음과 같이 표현됩니다.

LayerNorm(x+Sublayer(x))\text{LayerNorm}(x + \text{Sublayer}(x))

잔차 연결을 원활하게 하기 위해 모든 서브레이어와 임베딩 레이어의 출력 차원을 dmodel=512d_\text{model} = 512로 통일합니다.

디코더 역시 N=6N = 6개의 동일한 레이어로 구성됩니다. 인코더의 두 서브레이어에 더해, 인코더 스택의 출력에 대해 Multi-Head Attention을 수행하는 세 번째 서브레이어가 추가됩니다. 또한 디코더의 Self-Attention 서브레이어는 **마스킹(masking)**을 적용합니다. 이는 자기회귀 속성을 보장하기 위한 것으로, 위치 ii에 대한 예측이 위치 ii보다 앞선 출력에만 의존하도록 이후 위치로의 정보 흐름을 차단합니다.

3.2 Self-Attention

Transformer의 가장 핵심적인 개념이 Self-Attention입니다. 직관적으로 말하면, 어떤 단어를 이해할 때 문장 내 다른 어떤 단어들에 얼마나 "주의"를 기울여야 하는지를 학습하는 메커니즘입니다.

예를 들어 "The animal didn't cross the street because it was too tired"라는 문장에서 "it"이 무엇을 가리키는지 파악하려면, 모델은 "animal"에 높은 어텐션 가중치를 부여해야 합니다. Self-Attention이 바로 이 과정을 수행합니다.

3.2.1 Scaled Dot-Product Attention

Attention 함수는 Query, Key, Value의 세 요소로 정의됩니다.

  • Query (Q): 현재 처리 중인 위치의 표현—"나는 어디에 주목해야 하는가?"
  • Key (K): 각 위치의 레이블—"나는 이런 정보를 갖고 있다"
  • Value (V): 각 위치의 실제 내용—Key와 매칭됐을 때 전달되는 정보

출력은 Value들의 가중 합으로, 각 Value에 부여된 가중치는 Query와 해당 Key의 호환성(compatibility)으로 계산됩니다.

논문이 제안하는 "Scaled Dot-Product Attention"의 수식은 다음과 같습니다.

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

QQKK의 내적(dot product)으로 유사도를 구한 뒤, 차원 dkd_k의 제곱근으로 나눠 스케일링하고, softmax를 통해 확률 분포로 변환합니다. 이 가중치를 VV에 곱해 최종 출력을 얻습니다.

dk\sqrt{d_k}로 나눌까요? dkd_k가 클수록 내적값의 크기도 커져 softmax 함수가 기울기가 매우 작은 영역으로 밀려날 수 있습니다. 이를 방지하기 위해 스케일링을 적용합니다.

기존에도 Additive Attention과 Dot-Product Attention이 있었지만, Dot-Product 방식은 고도로 최적화된 행렬 곱 연산을 활용할 수 있어 실제로는 훨씬 빠르고 메모리 효율적입니다. 저자들은 여기에 스케일링 인자를 추가한 것입니다.

3.2.2 Multi-Head Attention

단일 Attention 함수를 dmodeld_\text{model} 차원 전체에 적용하는 것보다, 서로 다른 표현 부분 공간(representation subspace)에서 병렬로 여러 번 Attention을 수행하는 것이 더 효과적입니다. 이것이 Multi-Head Attention의 아이디어입니다.

MultiHead(Q,K,V)=Concat(head1,,headh)WO\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h)\,W^O

headi=Attention(QWiQ,KWiK,VWiV)\text{head}_i = \text{Attention}(QW_i^Q,\, KW_i^K,\, VW_i^V)

각 헤드는 QQ, KK, VV를 서로 다른 학습된 선형 투영(linear projection)으로 변환한 뒤 독립적으로 Attention을 수행합니다. 그 결과를 이어붙이고(concatenate) 다시 한 번 선형 변환해 최종 출력을 만듭니다.

직관적으로, 서로 다른 Attention 헤드는 서로 다른 "관점"에서 문장을 해석합니다. 어떤 헤드는 구문적 관계를, 어떤 헤드는 의미적 관계를 포착하는 식입니다.

논문에서는 h=8h = 8개의 헤드를 사용합니다. 각 헤드의 차원은 dk=dv=dmodel/h=64d_k = d_v = d_\text{model} / h = 64입니다. 헤드 수가 늘어난 만큼 각 헤드의 차원이 줄어들어 전체 계산 비용은 단일 헤드 Attention과 유사하게 유지됩니다.

3.2.3 모델 내 Attention의 세 가지 사용 방식

Transformer는 Multi-Head Attention을 세 가지 방식으로 활용합니다.

인코더-디코더 어텐션: 디코더가 인코더의 출력 전체를 참조합니다. Query는 디코더 이전 레이어에서, Key와 Value는 인코더 출력에서 가져옵니다. 번역 시 디코더의 모든 위치가 입력 시퀀스 전체를 참조할 수 있게 해줍니다.

인코더 Self-Attention: 인코더 내 각 위치가 이전 레이어의 모든 위치를 참조합니다. 입력 문장 내 단어들 사이의 관계를 파악하는 역할입니다.

디코더 Masked Self-Attention: 디코더 내 각 위치가 해당 위치까지의 위치들만 참조합니다. 미래 토큰을 "엿보는" 것을 막기 위해 이후 위치에 해당하는 softmax 입력값을 -\infty로 마스킹합니다.

3.3 Position-wise Feed-Forward Networks

Attention 서브레이어 외에, 인코더와 디코더의 각 레이어에는 위치별로 독립적으로 적용되는 Feed-Forward Network(FFN)가 포함됩니다. 구조는 ReLU 활성화 함수를 사이에 둔 두 개의 선형 변환입니다.

FFN(x)=max(0,xW1+b1)W2+b2\text{FFN}(x) = \max(0,\, xW_1 + b_1)\,W_2 + b_2

입력과 출력 차원은 dmodel=512d_\text{model} = 512이며, 내부 레이어 차원은 dff=2048d_{ff} = 2048입니다. 각 위치에 동일한 변환이 적용되지만, 레이어마다 서로 다른 파라미터를 사용합니다.

3.4 Embeddings and Softmax

다른 시퀀스 변환 모델들과 마찬가지로, 입력·출력 토큰을 dmodeld_\text{model} 차원의 벡터로 변환하기 위해 학습된 임베딩을 사용합니다. 디코더 출력을 다음 토큰 예측 확률로 변환하는 데는 학습된 선형 변환과 softmax 함수를 사용합니다.

두 임베딩 레이어와 pre-softmax 선형 변환 사이에 가중치 행렬을 공유하고, 임베딩 레이어에서는 이 가중치에 dmodel\sqrt{d_\text{model}}을 곱합니다.

3.5 Positional Encoding

RNN이나 CNN 없이 Attention만 사용하면, 모델은 시퀀스의 순서 정보를 자연스럽게 갖지 못합니다. "I love you"와 "you love I"를 구분할 수 없게 되는 것입니다. 이를 해결하기 위해 Positional Encoding을 도입합니다.

인코더와 디코더 스택의 하단, 즉 입력 임베딩에 위치 정보를 더해줍니다. Positional Encoding은 임베딩과 더해질 수 있도록 동일한 차원 dmodeld_\text{model}을 가집니다.

논문은 사인·코사인 함수를 사용하는 고정된(fixed) Positional Encoding을 제안합니다.

PE(pos,2i)=sin ⁣(pos100002i/dmodel)PE_{(pos, 2i)} = \sin\!\left(\frac{pos}{10000^{2i/d_\text{model}}}\right)

PE(pos,2i+1)=cos ⁣(pos100002i/dmodel)PE_{(pos, 2i+1)} = \cos\!\left(\frac{pos}{10000^{2i/d_\text{model}}}\right)

pospos는 시퀀스 내 위치, ii는 차원 인덱스입니다. 각 차원은 서로 다른 주파수를 가진 사인파에 대응하며, 파장은 2π2\pi에서 100002π10000 \cdot 2\pi까지 등비급수를 이룹니다.

이 함수를 선택한 이유는 상대적 위치를 쉽게 학습할 수 있도록 해주기 때문입니다. 임의의 고정된 오프셋 kk에 대해 PEpos+kPE_{pos+k}PEposPE_{pos}의 선형 함수로 표현될 수 있습니다. 학습된 Positional Embedding과 비교 실험했을 때 결과가 거의 동일했으며, 사인파 버전은 훈련 중 보지 못한 더 긴 시퀀스에도 외삽(extrapolate)할 수 있다는 이점이 있어 선택했습니다.

4. Why Self-Attention?

저자들은 Self-Attention이 순환·합성곱 레이어에 비해 세 가지 측면에서 유리하다고 분석합니다.

레이어당 전체 계산 복잡도: Self-Attention 레이어는 시퀀스 길이 nn이 표현 차원 dd보다 작을 때(기계 번역에서 word-piece나 byte-pair 표현을 쓰면 대부분 그렇습니다) 순환 레이어보다 빠릅니다.

병렬화 가능한 계산량: Self-Attention은 상수 개의 순차 연산만 필요한 반면, 순환 레이어는 O(n)O(n)의 순차 연산이 필요합니다.

장거리 의존성 경로 길이: 네트워크 내 임의 두 위치 사이의 경로가 짧을수록 장거리 의존성을 학습하기 쉽습니다. Self-Attention은 모든 위치 쌍을 상수 개의 연산으로 연결하는 반면, 순환 레이어는 O(n)O(n), CNN은 O(logkn)O(\log_k n) 또는 O(n/k)O(n/k)의 경로 길이를 가집니다.

부수적인 이점도 있습니다. Self-Attention 모델은 더 해석 가능한 경향이 있습니다. 개별 Attention 헤드들이 서로 다른 태스크를 수행하도록 분명하게 학습되며, 그 분포가 문장의 구문적·의미적 구조와 관련된 양상을 보입니다.

5. Training

5.1 훈련 데이터와 배치

영어-독일어 번역에는 WMT 2014 English-German 데이터셋(약 450만 문장 쌍)을 사용했습니다. Byte-Pair Encoding으로 인코딩하여 소스-타깃 공유 어휘 약 37,000 토큰을 구성했습니다. 영어-프랑스어에는 WMT 2014 English-French 데이터셋(3,600만 문장)을 사용했습니다.

각 훈련 배치는 약 25,000 소스 토큰과 25,000 타깃 토큰을 포함하도록 구성했습니다.

5.2 하드웨어와 스케줄

8개의 NVIDIA P100 GPU 단일 머신에서 훈련했습니다. 베이스 모델은 스텝당 약 0.4초, 총 100,000 스텝(약 12시간)을 훈련했습니다. 빅 모델은 스텝당 1.0초, 300,000 스텝(3.5일)을 훈련했습니다.

5.3 Optimizer

Adam 옵티마이저(β1=0.9\beta_1 = 0.9, β2=0.98\beta_2 = 0.98, ε=109\varepsilon = 10^{-9})를 사용했으며, 학습률을 다음 공식에 따라 동적으로 조정했습니다.

lrate=dmodel0.5min ⁣(step_num0.5, step_numwarmup_steps1.5)\text{lrate} = d_\text{model}^{-0.5} \cdot \min\!\left(\text{step\_num}^{-0.5},\ \text{step\_num} \cdot \text{warmup\_steps}^{-1.5}\right)

처음 warmup_steps = 4000 스텝 동안 학습률을 선형으로 증가시키고, 이후 스텝 수의 역제곱근에 비례하여 감소시킵니다.

5.4 정규화

세 가지 정규화 기법을 사용했습니다.

Residual Dropout: 각 서브레이어의 출력에 드롭아웃을 적용한 뒤 서브레이어 입력에 더하고 정규화합니다. 인코더와 디코더 스택 모두에서 임베딩과 Positional Encoding의 합에도 드롭아웃을 적용합니다. 베이스 모델에서는 Pdrop=0.1P_{drop} = 0.1을 사용했습니다.

Label Smoothing: εls=0.1\varepsilon_{ls} = 0.1의 레이블 스무딩을 적용했습니다. 모델이 덜 확신하도록 학습시켜 perplexity는 다소 올라가지만, 정확도와 BLEU 점수는 향상됩니다.

6. Results

6.1 기계 번역 성능

WMT 2014 영어-독일어 번역에서 Transformer(big) 모델은 앙상블을 포함한 기존 최고 모델들을 2.0 BLEU 이상 앞서며 28.4라는 새로운 SOTA를 기록했습니다. 8개의 P100 GPU로 3.5일 학습한 결과입니다.

영어-프랑스어 번역에서도 BLEU 41.0을 달성해 기존 공개된 단일 모델 전체를 능가했으며, 이전 SOTA 모델 학습 비용의 1/4 미만으로 이를 달성했습니다.

베이스 모델은 10분 간격으로 저장된 마지막 5개 체크포인트를 평균했고, 빅 모델은 마지막 20개 체크포인트를 평균했습니다. 빔 서치(beam size = 4, length penalty α=0.6\alpha = 0.6)를 사용했습니다.

6.2 모델 변형 실험

다양한 구성 변형 실험을 통해 각 컴포넌트의 중요도를 검증했습니다.

  • Attention 헤드 수를 변화시켰을 때 단일 헤드는 최적 설정 대비 0.9 BLEU 낮았으며, 헤드가 지나치게 많아도 성능이 떨어졌습니다.
  • Attention 키 크기 dkd_k를 줄이면 모델 품질이 저하되었습니다. 호환성 판단이 단순 내적 이상의 복잡한 함수를 요구할 수 있음을 시사합니다.
  • 더 큰 모델이 더 나은 성능을 보였으며, 드롭아웃이 과적합 방지에 매우 효과적이었습니다.
  • 사인파 Positional Encoding을 학습된 Positional Embedding으로 대체했을 때 결과가 거의 동일했습니다.

6.3 영어 구문 분석

Transformer가 번역 이외 태스크에서도 일반화 가능한지 확인하기 위해 영어 구문 분석(constituency parsing) 실험을 수행했습니다. Penn Treebank의 Wall Street Journal 데이터(약 40K 훈련 문장)에서 dmodel=1024d_\text{model} = 1024의 4레이어 Transformer를 학습했습니다.

태스크 특화 튜닝 없이도 대부분의 기존 모델을 능가하는 성능을 보였으며, RNN sequence-to-sequence 모델들을 앞질렀습니다.

7. Conclusion: 왜 이 논문이 역사를 바꿨는가

저자들의 맺음말을 직접 인용하면 이렇습니다.

이 연구에서 우리는 인코더-디코더 아키텍처에서 가장 흔히 사용되는 순환 레이어를 Multi-Head Self-Attention으로 대체하여, 순전히 Attention에만 기반한 최초의 시퀀스 변환 모델 Transformer를 제시했습니다.

이 논문이 특별한 이유는 단순히 성능이 좋았기 때문만이 아닙니다. 구조 자체가 근본적으로 달랐습니다. 순서를 순차적으로 처리해야 한다는 인코딩된 가정을 버리고, 전체 시퀀스를 한 번에 병렬로 처리할 수 있게 했습니다. 그리고 이 병렬성 덕분에 GPU 클러스터에서의 대규모 학습이 비로소 가능해졌습니다.

GPT 시리즈, BERT, T5, 그리고 오늘날의 Claude와 ChatGPT까지—현대 대형 언어 모델의 거의 전부가 이 논문에서 제안한 Transformer 아키텍처 위에 서 있습니다. "Attention Is All You Need"라는 제목은 도발적인 주장이 아니라, 실제로 증명된 사실이었습니다.


원문: Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., Kaiser, Ł., & Polosukhin, I. (2017). Attention is all you need. Advances in Neural Information Processing Systems, 30.

글이 도움이 됐다면 GitHub에서 이야기 나눠요.