카테고리 없음

Transformer - Attention is All you need

galaxyou 2026. 5. 7. 14:54

1. Abstract + Introduction

기존 모델의 한계

  • 당시 최첨단 모델들은 주로 RNN, LSTM, GRU 기반의 인코더-디코더 구조
  • RNN - 단어를 순서대로 처리 → 병렬화 불가능 → 학습 시간 매우 긺
  • 장기 의존성 문제: 문장이 길어질수록 멀리 떨어진 단어 사이의 관계를 학습하기 어려움
  • CNN의 시도: CNN을 활용해 병렬화 시도(두 단어 사이 거리가 멀수록 많은 계산이 필요)

해당 논문의 제안

복잡한 구조를 다 걷어내고 'Attention' 하나에 집중

  • 재귀나 컨볼루션을 완전히 제거하고, 오직 Attention 메커니즘에만 기반한 'Transformer' 구조 제안
  • Self-Attention: 문장 내의 각 단어가 서로 어떤 관련이 있는지 스스로 계산하여 문맥을 파악
  • Multi-Head Attention: 여러 개의 Attention을 병렬로 수행하여, 단어 간의 관계를 다양한 관점(예: 문법적 관계, 의미적 관계 등)에서 포착
  • 순차적 처리가 필요 없어 병렬화 가능

성과 및 의의

  • 압도적인 성능 (SOTA 달성): 2014년 WMT 영-독, 영-불 번역 태스크에서 기존 모델들을 제치고 최고의 성능(BLEU 점수)
  • 학습 효율성: 기존 모델들이 수주간 학습해야 했던 성능을, 트랜스포머는 단 며칠(심지어 12시간 내외) 만에 달성
  • 범용성 증명: 번역뿐만 아니라 문장 파싱 등 다른 태스크에서도 매우 우수한 성능을 보여, 모델의 일반화 능력을 입증
  • 패러다임의 전환: 딥러닝 모델 설계의 중심을 RNN에서 Attention 기반 구조로 완전히 이동

 

2. Background

  1. CNN의 적용따라서 컨볼루션 연산을 NLP에 적용하는 시도를 해봄(Extended Neural GPU, ByteNet, ConvS2S): Transformer에서 개선!
  2. → 근데 이건 거리가 멀어지면 연산량 너무 많아짐
  3. 순차적 연산을 줄이는 것, 병렬화는 CNN의 특징
  4. self-attention트랜스포머는 RNN이나 CNN 없이 순수하게 Attention만으로 전체 구조를 설계한 최초의 모델
  5. 한 시퀀스 내의 서로 다른 위치에 있는 단어들을 연결하여, 해당 시퀀스의 전체적인 표현을 계산

3. Model architecture

인코더(encoder) - 토큰화된 입력 시퀀스$(x_1, ..., x_n)$를 연속적인 표현 $z = (z_1, ..., z_n)$으로 변환

디코더(decoder) - 주어진 $z$를 기반으로 출력 시퀀스$(y_1, ..., y_m)$를 한 번에 하나의 요소씩 생성

이전에 생성된 토큰을 추가 입력으로 활용하여 다음 출력 생성

 

3.1 Encoder and Decoder Stacks

인코더(Encoder):

  • 6개의 동일한 레이어 반복
  • 서브레이어 2개
    1. Multi-Head Self-Attention
    2. 입력 시퀀스 내 각 단어가 시퀀스 내 다른 모든 단어를 참조
    3. Position-wise Feed-Forward Network
    4. 각 위치에 대해 독립적으로 적용되는 두 개의 선형 변환 + ReLU
  • 각 서브레이어에 잔차 연결 적용 후, 레이어 정규화 수행
  • 출력: $\text{LayerNorm}(x + \text{Sublayer}(x))$
  • 모델 내 모든 하위 계층과 임베딩 계층의 출력 차원
  • $d_{\text{model}} = 512$로 고정

디코더(Decoder):

  • 6개의 동일한 레이어 반복
  • 서브레이어 3개
    1. Masked Multi-Head Self-Attention
      • 이전까지 생성된 단어들만 참조 가능하게 미래 정보 마스킹
    2. Encoder-Decoder Attention
      • encoder의 출력을 key와 value로 사용하고, decoder의 이전 출력을 query로 사용
      • 이는 일반적인 sequence-to-sequence 모델에서의 attention과 동일
    3. Position-wise Feed-Forward Network
  • 각 서브레이어에 잔차 연결 적용 후, 레이어 정규화 수행

3.2 Attention

output: 어텐션 층 하나를 통과해서 나온 토큰별 벡터

구하는 방법: 시퀀스의 모든 토큰의 V와 어텐션 점수의 가중합

V: 해당 토큰의 내용

어텐션 점수: 해당 토큰과 본체 토큰이 얼마나 연관됐는지 가중치(유사도)

‘본체 토큰의 쿼리’와 ‘시퀀스 내 각 토큰들의 키’의 유사도

 

3.2.1 Scaled Dot-Product Attention

(입력) query (Q), key (K), value (V) → attention → (출력) weighted sum

  • attention score 계산 방법:
  • $\text{Attention}(Q, K, V) = \text{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right) V$
  • 핵심 아이디어:
    • Q와 K의 내적(dot-product)을 이용해 유사도 측정
    • 유사도를 softmax로 정규화하여 가중치로 사용
    • V에 이 가중치를 곱해 최종 출력 생성
  • 스케일링 이유
  • $d_k$ 증가 → 내적의 분산 증가 → Softmax 통과 시 값이 양극단으로 심하게 펼쳐짐 → 기울기 소실
  • :따라서 $\sqrt{d_k}$로 나눠서 안정화시킴
    • 왜 $\sqrt{d_k}$로 나누는가
      • : 이게 내적의 표준편차니까 표준편차로 나눠서 표준화한거~
      • 내적(QK)의 분산 = $d_k$
      • Q와 K가 각각 평균 0, 분산 1로 돼있음
      • 내적 = 요소를 각각 곱하고 싹 더함 $\text{Dot Product} = \sum_{i=1}^{d_k} q_i k_i$
        • 한 쌍($q_i k_i$)의 분산:
        • $Var(q_i k_i) = E[q_i^2] E[k_i^2] - (E[q_i] E[k_i])^2$
        • $Var(q_i) = E[q_i^2] - (E[q_i])^2$
        • $E[q_i^2] = Var(q_i) + (E[q_i])^2 = 1 + 0$
        • $Var(q_i k_i) = 1 *1 - 0=1$
      • 더하면 분산도 같이 더해짐, 시그마는 $d_k$번 → 1을 $d_k$번 더함 → 분산은 $d_k$
     

가장 일반적으로 사용되는 두 가지 어텐션 기법

  1. 가법 어텐션(Additive Attention)
  2. : 그냥 비교 대상… $Q$와 $K$를 단순히 곱하는 게 아니라, 둘을 합친(Add) 뒤에 작은 신경망(FNN + 은닉층)에 집어넣음
  3. 내적 어텐션(Dot-Product Attention)
  4. : 트랜스포머에서 쓰는 것의 원형, 여기에 $\frac{1}{\sqrt{d_k}}$ 만 추가하면 Scaled Dot-Product Attention

두 방식의 비교

  • Dot-Product Attention이 더 빠르고, 메모리 사용량이 적음
  • 큰 $d_k$ 값에서는 Scaling 없는 Dot-Product Attention이 성능이 떨어지고, Additive Attention이 더 우수한 성능

3.2.2 Multi-Head Attention

단일 attention만 사용하는 대신, 여러 "head"를 병렬로 사용

  • Q, K, V를 여러 개의 subspace로 분할해서 여러 개의 attention 연산을 병렬로 수행
  • 각각의 head는 서로 다른 정보를 학습함
  • ex. 얘는 문맥, 얘는 수동태, 얘는 대명사,…
  • 마지막에 head들의 출력을 concat → projection하여 최종 출력 생성

$\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O$

각 head는:

$\text{head}_i = \text{Attention}(QW^Q_i, KW^K_i, VW^V_i)$

  • 실제 설정: $h = 8, d_k = d_v = 64$ → 병렬 attention분산 투영 ($W^Q, W^K, W^V$): 8개의 64차원 헤드로 쪼개기결합(Concat): 64차원 8개를 다시 붙여서 512차원으로 만들기
  • 최종 투영 ($W^O$): $W^O$를 곱해서 정보를 통합하고 최종 아웃풋 완성!
  • 어텐션 연산: 8개의 시각으로 각자 계산
  • 입력: 512차원 벡터

3.2.3 Application of Attention in our Model

Transformer는 총 3가지 방식으로 Multi-Head Attention을 사용

  1. Encoder-Decoder Attention → decoder의 각 위치가 encoder의 모든 위치를 참조
    • $Q$ (쿼리): 이전 디코더 층에서 가져옴 (지금 내가 만들 단어가 무엇을 찾아야 하는지 묻는 역할)
    • $K, V$ (키와 값): 인코더의 최종 출력에서 가져옴 (입력 문장 전체의 정보)
    • 효과: 디코더가 단어를 뱉을 때마다 입력 문장의 어느 부분을 중점적으로 봐야 할지 결정하게 함
  2. 인코더가 분석한 입력 문장 정보를 디코더에게 전달하는 다리 역할
  3. Encoder Self-Attention → 각 위치가 입력 시퀀스 내 다른 모든 위치에 어텐션
    • $Q, K, V$ 모두 이전 인코더 층의 출력에서 가져옴
    • 범위: 인코더 내의 모든 위치가 이전 층의 모든 위치를 참고 가능
    • 효과: 문장 전체를 한 번에 조망하며 각 단어의 의미를 입체적으로 완성
  4. 인코더 안에서 단어들이 서로를 쳐다보며 문맥을 파악하는 단계
  5. Decoder Masked Self-Attention → 미래 단어를 보지 않도록 마스킹하여, 현재까지의 출력에만 어텐션
    • $Q, K, V$ 모두 이전 디코더 층의 출력에서 가져옴
    • Auto-Regressive 특성을 지키기 위해, 현재 위치 이후(미래)의 정보는 볼 수 없게함
    • 소프트맥스를 취하기 전, 미래 위치에 해당하는 값들을 $-\infty$로 밀어버려(Masking Out) 확률이 0이 되게 함
  6. 디코더가 이미 생성한 단어들을 토대로 다음 단어를 준비하는 단계

3.3 Position-wise Feed-Forward Networks

각 encoder와 decoder 레이어에는 attention 서브레이어 외에 **position-wise feed-forward network (FFN)**가 하나씩 있다.

구조

  • FFN은 시퀀스의 각 위치에 독립적으로 동일한 두 개의 선형 변환을 적용하는 구조
  • 표현식
    1. $x$에 첫 번째 선형 변환 $W_1$ 적용
    2. ReLU 활성화 함수 적용
    3. 두 번째 선형 변환 $W_2$ 적용
  • $\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2$
  • 이 구조는 사실상 커널 크기 1의 1D convolution과 수학적으로 동일한 연산!FFN도 단어의 순서는 건드리지 않고 그 단어가 가진 512개의 특징들만 요리조리 섞어주는 역할
  • 이미지 처리에서 1x1 컨볼루션이 공간 정보는 그대로 두고 채널(특징)만 섞어주는 것처럼,

하이퍼파라미터

  • 입력/출력 차원 $d_{model} = 512$
  • 내부(hidden) 차원 $d_{ff} = 2048$
  • 즉, 512차원 → 2048차원 → 512차원으로 변환되는 두 단계 네트워크

3.4 Embeddings and Softmax

  1. 임베딩과 벡터 변환 ($d_{\text{model}}$)
  2. 인코더에 들어가는 입력 토큰과 디코더에 들어가는 출력 토큰 모두 학습된 임베딩 과정을 거쳐 $d_{\text{model}}$ 크기의 벡터로 변환
  3. 가중치 공유 (Weight Sharing) 모델 내부에서 세 군데의 가중치 행렬을 똑같은 것으로 사용이유: 모델의 파라미터(용량)를 줄여서 효율성을 높이고, 같은 단어라면 입력될 때나 출력될 때나 비슷한 의미적 공간($d_{\text{model}}$)에 머물게 하기 위해서
  4. 공유 지점: (1) 입력 임베딩, (2) 출력 임베딩, (3) 디코더 끝단의 선형 변환(Linear transformation).
  5. 임베딩에 레이어에서 나온 값들에 $\sqrt{d_{\text{model}}}$ 를 곱하는 이유
    • 포지셔널 인코딩 값들은 평균적으로 1 근처, 임베딩 값들도 너무 작으면 위치 정보에 단어의 의미 정보가 묻힐 수 있음
    • 임베딩 값의 크기를 키워줌으로써, 단어의 의미 정보가 위치 정보보다 더 지배적인 영향력을 갖도록 밸런스를 맞춰줌
    • 왜 하필 $\sqrt{d_{\text{model}}}$ 일까?얘는 보통 입력차원($d_{model}$)에 반비례하게 분산을 잡는 경우가 많아서 분산이 $1/d_{\text{model}}$
    • → $\sqrt{d_{\text{model}}}$을 곱함으로써 벡터 전체의 평균적인 크기(에너지)가 1이 됨?
    • 임베딩 벡터를 처음에 초기화할 때 Xavier 초기화를 쓰는 경우가 많은데
  6. 이유: 뒤에서 더해질 포지셔널 인코딩 때문

3.5 Postional Encoding

RNN, CNN 대신 토큰의 순서 정보를 인코딩할 수단

Transformer는 사인과 코사인함수를 이용한 고정된 포지셔널 인코딩을 사용함

$\text{PE}{(pos, 2i)} = \sin\left(\frac{pos}{10000^{\frac{2i}{d{\text{model}}}}}\right)$

$\text{PE}{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{\frac{2i}{d{\text{model}}}}}\right)$

  • $pos$ : 단어의 위치
  • $i$: 임베딩 차원의 인덱스
  • 각 차원마다 서로 다른 주기(주파수)를 갖는 사인/코사인 값을 사용함
  • 이 값을 임베딩 벡터에 더해 모델에 순서 정보를 주입

왜 사인/코사인인가?

  • 다양한 주기를 가진 사인/코사인 조합을 통해 위치 간 관계를 쉽게 학습할 수 있음
  • 아날로그시계의 시침, 분침, 초침 처럼 각 주기가 따로 돌아가면 두 주기의 조합으로 더 많은 관계를 매핑할 수 있음
  • 선형 함수로 표현 가능$pos+k$번째 위치의 값은 $pos$번째 값에 특정 행렬을 곱하는 것만으로 계산가능상대적 거리 정보도 포함 가능 → 일반화에 유리
  • → “현재 위치($pos$)에서 $k$만큼 떨어진 곳($pos+k$)"의 정보를 찾을 때, 일정한 선형 변환만으로 계산 가능
  • 삼각함수의 덧셈 정리: $\sin(a+b) = \sin a \cos b + \cos a \sin b$
  • 훈련 데이터보다 더 긴 시퀀스에도 extrapolation 가능
  • 위치 정보가 일정한 패턴 안에서 반복되고 확장되기 때문에, 훈련 때보다 더 긴 문장이 들어와도 그 상대적인 위치 관계를 유추해서 처리할 수 있음

실험적 비교

  • 학습된 위치 임베딩과 비교 실험도 진행
  • 결과적으로 둘 다 성능은 거의 동일, 그러나 고정형(sinusoidal)이 더 일반화성 측면에서 유리하다고 판단

4. Why Self-Attention

Self-Attention의 3가지 주요 장점

  1. 계산 복잡도
  2. 병렬화 가능
  3. 장거리 의존성 학습 경로 길이

1. 계산 복잡도

구조 Layer당 복잡도 (n: 시퀀스 길이, d: 차원)

Self-Attention $O(n^2 \cdot d)$
Self-Attention (restricted) $O(r \cdot n \cdot d)$
RNN $O(n \cdot d^2)$
CNN (kernel size = k) $O(k \cdot n \cdot d^2)$
  • 시퀀스 길이가 짧고 차원이 클 경우, self-attention이 훨씬 효율적
  • 특히 대부분의 NLP 모델에서는 $d \gg n$이므로 self-attention이 유리함

계산 효율성 한계 극복 방안

  • 출력 위치를 기준으로 주변 $r$개의 단어만 보도록 제한
  • 계산량은 줄어들지만, 한 번에 문장 끝까지 도달하지 못하므로 최대 경로 길이가 $O(n/r)$로 늘어남

2. 병렬화

  • RNN은 이전 단계 출력에 의존 → 병렬화 불가능
  • CNNSelf-Attention은 모든 위치를 동시에 계산 가능 → 병렬화 가능
  • Transformer는 RNN 없이 self-attention만 사용하므로 훈련 속도가 빠름

3. 장거리 의존성 학습 경로

구조 최대 경로 길이 (두 위치 간 정보 이동 거리)

Self-Attention $O(1)$ ← 모든 위치가 바로 연결됨
Self-Attention (restricted) $O(n/r)$
RNN $O(n)$
CNN $O(\log_k n)$ (dilated convolution 사용 시)
  • Self-attention은 멀리 떨어진 단어 간 연결이 단 한 번의 연산으로 가능
  • 따라서 장기 의존성을 훨씬 쉽게 학습할 수 있음

+) 모델의 해석 가능성

어텐션이 단순히 성능만 좋은 게 아니라, 모델이 "왜 그렇게 생각했는지" 보여줄 수 있음

  • 어텐션 분포 분석: 모델이 어떤 단어에 집중하는지 시각화 가능
  • 헤드의 분업: 각 어텐션 헤드는 서로 다른 작업(문법 구조 파악, 의미 관계 파악 등)을 수행하도록 스스로 학습
  • 언어적 패턴: 문장의 구문론적, 의미론적 구조를 잘 반영하는 패턴이 나타남

5. Training

학습 설정

5.1 Training Data and Batching

  • 영어-독일어(WMT 2014): 약 450만 문장 쌍
  • 영어-프랑스어(WMT 2014): 약 3600만 문장 쌍
  • 서브워드 분할 사용 (BPE, Byte-Pair Encoding)
    • 영어-독일어: 약 37,000개의 공유 토큰
    • 영어-프랑스어: 32,000개의 word-piece
  • Batch 구성 방식: 문장 길이 비슷한 것끼리 묶음
    • 한 배치당 약 25,000개의 source & target 토큰 포함

5.2 Hardware and Schedule

  • 하드웨어: 8개의 NVIDIA P100 GPU 사용
  • 학습 시간:
    • Base model: 100,000 step (약 12시간)
    • Big model: 300,000 step (약 3.5일)
  • Base step time: 0.4초 / Big step time: 1.0초

5.3 Optimizer

  • Adam Optimizer 사용
    • $\beta_1 = 0.9, \beta_2 = 0.98, \epsilon = 10^{-9}$
  • 학습률 스케줄링 공식:
  • $\text{lrate} = d_{\text{model}}^{-0.5} \cdot \min(\text{step}^{-0.5}, \text{step} \cdot \text{warmup}^{-1.5})$
  • 초반에는 선형 증가, 이후에는 $\text{step}^{-0.5}$로 감소
  • warmup step: 4000

5.4 Regularization

Transformer는 세 가지 정규화 방법을 사용

  1. Residual Dropout
    • 각 서브레이어 출력에 dropout 적용 (P=0.1)
    • positional encoding과 임베딩 합에도 dropout 적용
  2. Label Smoothing
    • 정답 확률을 100%로 하지 않고, 일부 분산시켜 일반화 성능 향상
    • 값: $\epsilon_{ls} = 0.1$
  3. Weight Sharing (본문에 정규화로 분류되진 않지만 효과 있음)
    • 입력 임베딩 / 출력 임베딩 / softmax projection 간 가중치 공유

6. Results

6.1 Machine Translation

  • 평가 기준: BLEU 점수 (기계 번역의 품질 평가 지표)
WMT 2014 EN-DE 27.3 28.4 기존 최고 모델보다 2.0+ 점 향상
WMT 2014 EN-FR 38.1 41.8 단일 모델 기준 새로운 최고 성능

🔧 기타 설정:

  • checkpoint averaging: 마지막 5개 또는 20개 체크포인트 평균
  • beam search 사용 (beam size=4, length penalty α=0.6)

6.2 Model Variations

  • Attention Head 수 변화 (A)
    • 너무 적어도, 너무 많아도 성능 저하
    • 기본값: 8개 head (dk=dv=64)
  • Key/Value 차원 변경 (B)
    • dk, dv가 작아질수록 성능 감소 → dot-product compatibility 계산이 어려워짐
  • 모델 크기 변화 (C)
    • layer 수 증가 시 BLEU 증가
    • 큰 모델일수록 성능 향상
  • Feedforward 내부 차원 변화 (C)
    • d_ff 늘리면 성능 향상 (512→2048, 4096 등)
  • Dropout 비율 변화 (D)
    • 적절한 dropout은 과적합 방지에 효과적
  • Positional Encoding 방식 (E)
    • 고정형(sinusoidal)과 학습형(learned)의 성능 거의 동일

6.3 English Constituency Parsing(구문 분석 성능)

  • Penn Treebank 데이터셋 (WSJ) 사용
  • Transformer (4-layer, d_model=1024)는:
    • 훈련 데이터만 사용: F1 = 91.3
    • 준지도 학습 시: F1 = 92.7
  • 이는 기존 대부분의 parsing 모델보다 높은 점수이며,
  • 특히 작은 데이터셋에서도 강력한 일반화 성능을 보여줌

 

7. Conclusion

핵심 성과

  • Transformer는 기존의 RNN, CNN 기반 시퀀스 모델을 대체하는 첫 구조로,
    • Multi-Head Self-Attention만을 사용하여 설계됨
    • 복잡한 recurrence 없이도 높은 성능 달성
  • 기계 번역 작업에서:
    • 기존 최고 성능을 단일 모델로 초과
    • 훈련 시간은 기존보다 훨씬 짧음
      • 예: 3.5일 학습으로 EN-FR에서 BLEU 41.8 달성
  • 구문 분석 등 다른 태스크에도 잘 일반화됨 → 범용적 구조로 가능성 증명

미래 연구 방향

  • 다양한 입력/출력 형태의 태스크로 확장 예정
    • 예: 이미지, 오디오, 비디오
  • Local / Restricted Attention 연구
    • 긴 시퀀스에 대해 계산량 줄이는 방법 모색
  • 더 비순차적인(sequence-less) 생성 방식 연구
    • 병렬성의 한계를 더 줄이기 위한 시도