연구하는 안씨의 기록

[논문 리뷰] Attention Is All You Need (1, 3장 리뷰) 본문

논문 리뷰

[논문 리뷰] Attention Is All You Need (1, 3장 리뷰)

an씨 2025. 5. 22. 20:01

Transformer 뿐만 아니라, 거의 모든 현대의 딥러닝 모델의 기본이 된 self attention에 대해 공부하고 싶어서, Attention is all you need 논문 리뷰를 진행하고 있다. 우선 1, 3장을 바탕으로 기본적인 구조를 이해하고 정리하였으며, 4장 이후의 내용을 추가 업로드 할 예정이다. 논문 리뷰에는 아직 시간이 소요되는 편이지만, 논문을 바탕으로 공부하는 과정이 재미있는 것 같다. 

1. Background(서론)

  • 기존의 시퀀스 모델링은 RNN(LSTM, GRU)을 기반으로 하며, 이는 순차적인 구조로 인해 병렬화가 어렵고 훈련이 느리다.
  • 최근에는 attention 메커니즘이 널리 쓰이고 있지만, 대부분 RNN과 함께 사용되고 있다.
  • 이에 따라, 해당 논문의 저자들은 RNN과 CNN 없이 오직 어텐션만 사용하는 Transformer 구조를 제안한다.
  • 입력과 출력 간의 전역적인 의존성(global dependencies)을 학습. Transformer는 훨씬 더 병렬화가 가능하며, 8개의 P100 GPU로 단 12시간의 훈련만으로새로운 수준의 번역 품질에 도달할 수 있음.

3. Model Architecture(모델 구조)

  • Transformer는 기존의 시퀀스-투-시퀀스(seq2seq) 모델처럼 인코더–디코더 구조를 따름.
  • 하지만 내부는 전부 어텐션 + 피드포워드 네트워크로 구성되어 있으며, 순환(RNN)이나 합성곱(CNN)은 전혀 없다.

간략한 구조

  • 입력 → Encoder (Self-Attention 쌓기)
  • 출력 ← Decoder (Masked Self-Attention + Encoder-Decoder Attention)
  • 학습 방식: Auto-Regressive (이전 단어 기반으로 다음 단어 예측)

3.1. Encoder and Decoder Stacks

  • 인코더 (Encoder): 입력 문장을 처리해서 "의미 벡터"로 바꿔줌
  • 디코더 (Decoder): 그 의미 벡터를 보고, 단어를 하나씩 뽑아내면서 문장을 만들어냄

인코더 구조 (입력을 처리-이해)

  • 같은 구조를 6번 반복한 layer들로 구성되며, layer 안에는 2개의 블록으로 구성된다. 이 두개의 블록을, sub-layer라고 논문에서 정의하고 있다.
    • Multi-Head Self-Attention 블록
      • 문장 안의 단어들이 서로를 어떻게 참고할지를 학습하는 구조
    • simple, position-wise fully connected Feed-Forward 블록
      • 각 단어의 표현을 한 번 더 비선형적으로 변형해주는 작은 신경망
  • 각 서브레이어 주위에 residual connection(잔차 연결)을 적용하고, 그 다음에는 layer normalization(레이어 정규화)를 적용.
    • 잔차 연결은 “입력+출력”을 통해 정보를 직접 전달해서, 깊은 네트워크가 학습되기 어렵지 않도록 도와줌.
    • LayerNorm은 값의 분포를 안정화시켜 학습 속도를 높임.
  • 즉, 각 서브레이어의 출력은 아래와 같이 계산된다.
    • LayerNorm(x + Sublayer(x))
    • 이때 Sublayer(x)는 해당 서브레이어에서 실제로 수행하는 연산을 의미
  • 이러한 잔차 연결이 잘 동작하도록, 모델 내 모든 서브 레이어와 임베딩 레이어는 출력 벡터의 차원 수를 동일하게 d_model=512로 설정.

디코더 구조 (출력을 생성)

  • 같은 구조를 6번 반복한 layer들로 구성되며, layer 안에는 3개의 블록으로 구성된다.
    • Masked-Self-Attention
      • 디코더의 self-attention 서브 레이어에서는 현재 위치가 미래 위치를 참조하지 못하도록 제한(masking)을 적용
      • (디코더는 단어를 왼쪽에서 오른쪽으로 한 개씩 만들어야 하니까, 아직 생성되지 않은 미래 단어를 보면 안됨.)
    • Multi-Head Attention (Encoder–Decoder Attention)
      • 인코더와는 다르게 서브레이어가 하나 더 있음. 이 서브레이어는 인코더의 출력을 대상으로 멀티 헤드 어텐션을 수행함. 디코더가 문장을 생성할 때, 인코더가 만든 의미 벡터를 참고하게 해주는 역할.
    • Feed-Forward 블록
  • 인코더와 마찬가지로, 디코더에서도 각 서브레이어를 잔차 연결과 레이어 정규화로 감싼다. (잔차 + 정규화는 Transformer 전체의 기본 설계 방식)
  • 마스킹과, 출력 임베딩을 한 칸씩 뒤로 밀어 넣는 방식을 함께 사용하면, i번째 위치에서의 예측은 i보다 앞선 단어들에만 의존하게 된다. → 이미 생성된 단어들만 참고해서 다음 단어를 예측하도록 강제됨. → auto-regressive 구조의 핵심

정리하자면, 인코더는 입력 문장을 문맥 벡터로 바꾸고, 디코더는 그 문맥을 보면서 단어를 하나씩 차례로 만들어낸다. 모든 연산은 어텐션 + 작은 MLP로 구성되어 있고, 정보 손실을 막기 위해 잔차 연결과 정규화를 사용.

3.2. Attention

3.2.1. Scaled Dot-Product Attention

  • 어텐션은 아래와 같은 세가지 입력 vector들로 구성된다.
    • Query(Q): 내가 알고 싶은 것
    • Key(K): 각각의 항목이 가지고 있는 정보의 “이름표”
    • Value(V): 실제 정보 내용
  • 목표: Query (Q), Key (K), Value (V) 3개 텐서를 입력받아, Query에 가장 잘 맞는 Value 조합을 만들어내는 어텐션 함수를 정의하는 것
  • Attention은 Q와 K의 유사도(점곱)를 기반으로, V의 가중합을 계산

쉽게 말하자면, Query와 Key의 유사도를 계산해서 얼마나 집중할지 정하고,
그 비중만큼 Value들을 더해서 최종 정보를 만들어낸다.

Query가 “무엇을 알고 싶은가?”를 나타낸다면, Key는 “내가 가진 정보들 중 어떤 것이 Query에 맞는가”를 판단하는 도구이고,

Value는 “그 정보를 담고 있는 실제 내용”이다.

3.2.2. Multi-Head Attention

한 번만 어텐션 하지 않고, 여러 번 다양한 방식으로 병렬로 진행.

  • H개의 head에서 각각 Q,K,V를 다른 가중치로 변환해서 attention 수행
  • 이렇게 얻은 여러 결과를 concatenate + 선형 변환하여 최종 결과 생성

→ Multi-Head를 사용함으로서, 각 head가 다른 위치 관계, 의미 관계, 어휘 관계에 집중할 수 있음.

3.2.3. Applications of Attention in Transformer

Transformer 에서 Attention이 쓰이는 위치는 총 3곳

  • 인코더의 Self-Attention
    • 입력 문장 내 단어들이 서로를 바라보며 의미 파악
  • 디코더의 Masked Self-Attention
    • 이미 생성된 단어까지만 보며 다음 단어 예측
    • 이때, 마스킹은 Decoder에만 적용되는 것임.
  • 디코더의 Encoder-Decoder Attention
    • 인코더가 만든 정보(입력 의미)를 참고하며 출력 생성
[입력] → Self-Attention → ... → Encoder Output
                           ↓
           Decoder: Masked Self-Attention
                           ↓
           Encoder–Decoder Attention (참조)
                           ↓
           Feed-Forward → [다음 단어 예측]

3.3 Position-wise Feed-Forward Networks

Transformer의 인코더와 디코더 각각의 레이어에는 어텐션 외에 **Feed-Forward Network (FFN)**라는 작은 신경망이 들어간다. 하지만 이 FFN은 일반적인 MLP와는 사용 방식이 다르다.

  • 이 FFN은 시퀀스의 각 위치에 독립적으로 적용된다.
  • 즉, 문장 내 각 단어의 벡터동일한 FFN 구조를 각각 적용하는 형태.
    • 같은 레이어 안에서는 모든 단어에 똑같은 FFN 구조를 씌우는 셈
      (같은 레이어 내에서는 파라미터 공유, 다른 레이어는 다름)
  • 이는 ReLU 활성화를 사이에 두고 두 개의 선형 변환으로 구성

W_1, W_2: 학습 가능한 가중치 행렬 b_1, b_2: 편향 ReLU: 활성화 함수

  • 논문에서는 이것을 커널 크기 1의 합성곱(convolution) 2개로도 해석 가능하다고 언급
    • 왜냐하면, 커널 사이즈가 1이면 각 위치에 독립적으로 연산을 적용하는 것이니까. (MLP와 동등)
  • 입력 / 출력 차원 : d_model = 512
  • 내부(hidden) 차원 : d_ff = 2048
    • 512 → 2048 → 512
  • 이는 Self-Attention 후 각 단어 벡터를 정제하고 강화할 목적이며, 위치 간 정보와는 별도로, 각 위치의 정보 표현을 강화할 수 있다.

3.4 Embeddings and Softmax

텍스트는 원래 단어(문자열)이므로, Transformer가 처리할 수 있게 숫자 벡터로 변환(임베딩)하고, 마지막에는 다시 예측 확률(소프트맥스)으로 변환하는 과정이 필요.

  • Transformer는 입력 토큰(예: 단어, subword, 문자 등)을 고정된 차원의 벡터로 바꿉니다.
    • 입력 문장, 출력 문장 모두 임베딩
    • 모든 임베딩은 모델의 차원과 동일(d_model = 512)
  • 해당 논문에서는 입력 임베딩, 출력 임베딩, 소프트맥스 직전 선형 변환같은 가중치 행렬을 공유
    • 파라미터 수를 줄일 수 있고 성능도 약간 더 좋아진다는 연구 결과( Using the output embedding to improve language models)가 있음

정리하자면, 

[토큰] → [임베딩 벡터] + [포지셔널 인코딩] → [Transformer 본체 통과] → [디코더 출력 벡터]
→ [선형 변환 (공유 가중치)] → [소프트맥스] → [다음 단어 확률 예측]

 

3.5 Positional Encoding

Transformer는 RNN도, CNN도 사용하지 않기 때문에, 토큰의 순서 정보(sequence order)를 알 수 없음.

그럼 RNN, CNN은 토큰의 순서 정보를 어떻게 알 수 있는지?

  • RNN: 단어를 시간 순서대로 하나씩 처리하는 구조이므로, 순서 정보가 내장됨
  • CNN: 고정된 커널(window)을 기준으로 이웃한 단어들 간의 관계를 연산, 즉 순서 정보는 간접적으로 포함(위치적 구조가 파악됨)
  • 하지만 Transformer는 모든 단어를 동시에(병렬적으로) 처리함 → 순서 개념이 없음. 단어들이 동시에 병렬로 처리되며, 단순 벡터 간 유사도에만 기반함

그래서 Positional Encoding을 더해서 “이 단어가 몇 번째 단어인지”를 명시적으로 알려준다.

Positional Encoding (how)

  • 입력 임베딩에 Positional Encoding 벡터를 더함
  • Input Vector = Token Embedding + Positional Encoding
  • 이 연산은 인코더와 디코더의 가장 아래층에서 적용됨
  • Positional Encoding은 임베딩 벡터와 동일한 차원 (512차원)을 가짐 → 둘을 더할 수 있게 하기 위해

pos: 토큰의 위치 (0부터 시작) iii: 벡터의 차원 인덱스 d_model : 모델 차원 (보통 512)

  • 짝수 차원(2i)일 때는 sin 함수 사용
  • 홀수 차원(2i+1)일 때는 cos 함수 사용

왜 이러한 수식이 사용되는가? (왜 sin/cos인지)

  • 상대적 위치 추론에 유리
    • 예를 들어 PE_(pos+k)는 PE_(pos)의 선형 변환으로 표현 가능. 즉, “거리” 개념을 선형적으 학습 가능
  • 길이 외삽 가능
    • sin/cos는 패턴이 반복되므로, 학습 시 본 적 없는 길이도 다룰 수 있음
    • 학습 중에는 최대 길이 128을 봤더라도 테스트에서 512도 처리 가능