딥러닝, 논문 리뷰

[딥러닝, 논문리뷰] Attention Is All You Need 1 - Positional Encoding

cheorish 2025. 2. 6. 16:28

https://arxiv.org/abs/1706.03762

 

Attention Is All You Need

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new

arxiv.org

 

Abstract

 

자연어처리의 혁신이라 불리고, 끝판왕이라 불리며 저에게 딥러닝에 관심을 갖게 해준 주인공을 드디어 정리하게 되었습니다.

 

이름 만큼 도발적이면서도 많은 인공지능 연구에 영향을 줬다고 과언이 아닐 만큼의 대단한 논문이긴 합니다.

 

밑바닥부터 시작한다는 마음으로, 총 3편에 걸쳐 기능별로 정리해볼 예정입니다.

 

기존의 정통 기계번역 모델들의 한계(CNN, RNN, LSTM, Seq2Seq)를 개선하기 위해 제안 된 모델로서, 논문에서는 RNN 및 LSTM기반으로 연결되었던 메커니즘을 완전히 버리고,

 

Attention이라는 새로운 메커니즘을 기반으로 하는 새로운 아키텍처인 Transformer를 제안합니다.

 

또한 논문에서는 해당 모델이 WMT 2014 영어-독일어 번역 작업에서 28.4 BLEU를 달성하여 기존의 최고 결과를 2 BLEU 이상 개선하였다고 하고,

 

WMT 2014 영어-프랑스어 번역 작업에서는 8개의 GPU로 3.5일 동안 훈련한 후 새로운 단일 모델 최고 BLEU 점수인 41.8을 기록했다고 합니다.

 

그러므로 이번 논문으로 제안된 방법을 통해 대규모 및 제한된 훈련 데이터 모두에서 영어로 구성 된 분석에 성공적으로 적용 되어 다른 작업에도 일반화가 된다는 것을 보여준다고 합니다.

 

정통 기계번역에 사용되었던 대표 모델 Seq2Seq

 

Introduction

 

순환 신경망(RNN), 장단기 메모리(LSTM), 게이트 순환 신경망(GRU), Seq2Seq(인코더-디코더)는 언어 모델링 및 기게 번역과 같은 시퀀스 모델링은 기계 번역과 같은 순차적 데이터 처리 문제에서 중요한 모델로 자리를 잡아왔음,

 

이러한 모델들은 입력 및 출력 시퀀스의 각 위치를 계산 과정의 시간 단계와 정렬하여, 이전 숨겨진 상태 \(h_{t-1}\)​와 현재 입력을 기반으로 새로운 숨겨진 상태 \(ht\)​를 생성하는 방식으로 작동합니다.

 

하지만, 이러한 순차적 계산 방식은 훈련 데이터 내 병렬화를 어렵게 만듭니다(기울기 소실 및 장기 의존성 문제) 특히, 시퀀스 길이가 길어질수록 메모리 제약으로 인해 한 번에 처리할 수 있는 배치 크기가 제한됩니다.

 

(인코더 - 디코더 사이에 존재하는 컨텍스트 벡터) 이에 따라, 최근 연구들은 계산 효율성을 향상시키기 위한 다양한 방법을 제안했습니다.

 

예를 들면, 연산을 최적화 하는 factorization 기법이나, 특정 연산만 활성화 하는 conditional computation 기법이 있습니다. 그러나 이러한 개선에도 불구하고, 순차적 연산이 필요한 근본적인 문제는 여전히 존재했습니다 .

 

1. 주목받는 어텐션 메커니즘

 

어텐션 메커니즘은 기계 번역 및 다양한 자연어 처리 작업에서 중요한 역할을 하고 있으며, 입력 및 출력 시퀀스에서 거리와 상관 없이 의존성을 모델링 할 수 있도록 도와줌

 

기존 연구들은 대부분 어텐션을 순환 신경망과 함께 결합하여 사용했으며, RNN 없이 단독으로 어텐션을 활용하는 경우는 없었다고 논문에서 얘기합니다.

 

2. Transformer 모델의 제안

 

본 논문에서는 Transformer라는 새로운 모델 아키텍처를 제안합니다. Transformer는 순환 구조(RNN)를 완전히 배제하고, 오직 어텐션 메커니즘만을 활용하여 입력과 출력 간의 전역적인 의존 관계를 모델링합니다. 이를 통해 다음과 같은 이점을 얻을 수 있습니다.

 

  1. 병렬화 가능: 기존 RNN 기반 모델과 달리, 모든 입력 단어를 한 번에 처리할 수 있어 학습 속도가 획기적으로 향상됩니다.
  2. 높은 성능: Transformer 모델은 단 12시간 동안 8개의 P100 GPU에서 훈련한 후, 기존 모델보다 더 높은 번역 성능을 달성했습니다.

Background

1. 순차적 연산 감소를 위한 기존 연구

 

순차적 연산(sequential computation)을 줄이는 것은 기존 신경망 모델들이 해결하고자 했던 주요 목표 중 하나였습니다. Extended Neural GPU, ByteNet, ConvS2S와 같은 모델들은 이러한 문제를 해결하기 위해

 

합성곱 신경망(CNN)을 기반으로 하는 접근 방식을 사용했습니다. 이러한 모델들은 입력과 출력의 모든 위치에 대해 병렬적으로(hidden representations in parallel) 계산을 수행합니다.

 

그러나 이러한 모델에서는 입력 또는 출력의 두 임의의 위치 간 신호를 연결하기 위한 연산량이 위치 간의 거리에 따라 증가합니다.

  • ConvS2S 모델에서는 선형적으로(linearly) 연산량이 증가하며,
  • ByteNet 모델에서는 로그 형태로(logarithmically) 연산량이 증가합니다.

이러한 구조적 특징 때문에, 서로 먼 위치 간의 의존 관계를 학습하는 것이 어려워지는 단점이 있습니다.

반면, Transformer 모델은 이러한 문제를 해결하기 위해 위치 간 연산량을 상수(Constant)로 유지합니다.

 

그러나, 어텐션을 활용한 위치 가중 평균(averaging attention-weighted positions)을 사용하기 때문에, 해상도(정보 손실) 감소의 문제가 발생할 수 있습니다.

 

이러한 문제를 해결하기 위해 Multi-Head Attention을 활용하여 성능을 향상시켰습니다.

 

2. Self-Attention

 

Self-Attention은 단일 시퀀스 내에서 다른 위치 간의 관계를 학습하는 방법으로, 여러 NLP 작업에서 효과적으로 사용되었습니다.

 

다음 섹션에서 자세하게 개념부터 정리할 예정

 

3. Transformer의 차별점

RNN 및 CNN을 전혀 사용하지 않고, Self-Attention만을 활용하는 최초의 모델로, 더 빠르고 효율적인 연산이 가능


Model Architecture

1.Encoder and Decoder Stacks

인코더-디코더 기본 구조만 먼저 논문 순서대로 정리한 후에, 이번 섹션에서는 Positional Encoding 부분을 집중적으로 정리하겠습니다.

메인 아키텍처

 

기존의 Seq2Seq와 비슷하게, 인코더-디코더 구조로 구성되어 있으며 각 기능별 간단하게 소개하려고 한다.

 

1. Encoder (인코더) 구조

  • 총 6개의 동일한 레이어로 구성됨
  • 각 레이어간 2개의 서브 레이어로 구성되어 있음
    • 멀티-헤드 어텐션 메커니즘
    • 피드 포워드 네트워크
  • 잔차 연결(Residual Connection)을 각 서브-레이어 주변에 적용하며, 이후 Layer Normalization을 수행함
  • 서브 레이어 출력 수식
    • \(LayerNorm(x+Sublayer(x))\)
  • \(Sublayer(x)\)은 해당 서브-레이어의 연산을 의미함
  • 잔차 연결이 원활히 이루어지도록 모든 서브-레이어 및 임베딩 레이어는 512차원의 출력(dmodel = 512)를 생성

2. 디코더 (Decoder)

  • 디코더는 6개의 동일한 레이어로 구성됨
  • 디코더는 인코더와 마찬가지로 두 개의 기본 서브-레이어를 포함하며, 추가적인 세 번째 서브-레이어를 가짐
    1. 멀티 헤드 어텐션
    2. 피드포워드 네트워크
    3. 인코더 출력에 대한 멀티 헤드 어텐션
  • 각 서브-레이어는 잔차 연결 및 Layer Normalization을 적용
  • 디코더의 셀프 어텐션 서브-레이어는 미래 정보를 참고하지 못하도록, 마스킹 기법이 적용 됨
    • 이는 출력 임베딩을 한 위치씩 이동시켜 현재 위치 \(i\)의 예측이 \(i\)보다 작은 위치의 출력에만 의존하도록 보장합니다.

2. Positional Encoding

Transformer 모델은 RNN이나 CNN을 전혀 사용하지 않기 때문에, 입력 시퀀스의 순서를 직접적으로 반영할 수 있는 구조를 필요로 했는데. 그것은 언어 모델에 있어 치명적인 단점이 될 수 있음.

 

트랜스포머는 기본적으로 직렬방식(순서대로)가 아닌, 한 번에 계산하는 병렬방식의 연산을 하기에 문장별로 위치 값을 지정하는 방법이 따로 없었음(Attention 기법, 다음 파트에서 자세하게 작성할 예정)

 

만약 순서 정보를 반영하지 않는다면?

 

\(['나는', '학교를', '간다'] → ['I', 'go', 'to', 'school']\)

 

위 간단한 단어를 변환 한다고 가정 했을 때, 단어의 순서를 보존할 정보가 없으므로, 모델이 가중치에 따라서 자유롭게 단어를 섞을 가능성이 생기기에

 

"Go I school to" 또는 "School to I go" 같은 엉뚱한 단어가 나올 가능성이 있음;; 😱

 

그렇기에 단어간의 순서를 지정할 수 있는 포지셔널 인코딩을 적용하여 상대적 순서를 학습할 수 있도록 보완 함

📌 Transformer의 Positional Encoding 수식

Transformer는 고정된 위치 인코딩을 사용하며, 이를 위해 사인(sine)과 코사인(cosine) 함수의 서로 다른 주파수를 적용함

 

  • 수식

 

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


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

 

  • 수식 설명 
    • \( pos :\) 문장에서 단어의 위치 (0부터 시작)
    • \( i :\) 임베딩 벡터의 차원 인덱스(짝수/홀수 구분)
    • \( d_{model}:\) 모델의 임베딩 차원 (예: 512) 
    • \(10000^{\frac{2i}{d_{model}}}:\) 특정 주파수에 따라 변형되는 스케일링 요소

 

📌 Positional Encoding 수식 해석

  • 짝수 인덱스 \(2i\)사인 함수(sin) 적용
  • 홀수 인덱스 \(2i+1\)코사인 함수(cos) 적용
  • 높은 차원(i 값이 클수록)에서는 더 천천히 변하는 주파수 사용
  • 낮은 차원(i 값이 작을수록)에서는 더 빠르게 변하는 주파수 사용
    이렇게 하면 모델이 상대적인 단어의 위치를 더 잘 인식할 수 있음

📌 Positional Encoding 예제

만약 dmodel = 512라면,

  • 첫 번째 차원( i=0 )에서는 빠르게 변화하는 sin/cos 값이 적용
  • 마지막 차원( i=255 )**에서는 매우 천천히 변화하는 값이 적용됨

이 방식은 모델이 작은 거리와 큰 거리 모두에 대해 상대적 위치를 학습할 수 있도록 도움을 줌 

그렇다면 왜 Sine과 Cosine을 사용하는지?

1. Sine & Cosine은 연속적이고 주기적이기 때문.

  • 문장의 단어 순서는 연속적인 정보, 그렇기에 위치 인코딩도 연속적인 값을 가져야 함
  • 사인 / 코사인 함수는 연속적이며, 입력 값이 조금씩 변해도 큰 변동이 없이 자연스럽게 변함
  • 예를 들어, "나는 학교에 간다" → "나는 도서관에 간다"처럼 비슷한 문장에서, 단어의 위치가 미세하게 변화 해도 모델이 학습을 안정적이게 할 수 있도록 연속적이며 안정적인 변화를 제공하기 때문

 

출처 : https://m.blog.naver.com/lim4447/221587511188

 

보기와 같이 안정적이면서 연속적인 값을 그래프로 표현하는 사인 / 코사인을 볼 수 있다.

 

2. Sine & Cosine은 상대적인 위치를 쉽게 표현할 수 있기 때문

  • 트랜스포머는 문장의 절대적인 위치 정보보다, 단어 간의 상대적인 위치를 더 중요하게 여김.
  • 사인 / 코사인 함수는 서로 다른 주파수를 적용 하여, 멀리 떨어진 단어들의 관계를 쉽게 학습할 수 있도록 도와줌
    • 쉽게 설명해서 "나는" 이라는 단어와 "학교를" 이라는 단어가 서로 가까운지 먼지, 같은 문장 내에서 어떤 관계인지에 대해서 쉽게 파악할 수 있게끔 도와주는 기능을 함

3. 사인 & 코사인은 모델이 거리 정보를 직접 학습할 수 있도록 돕는다

  • CNN/RNN처럼 거리 정보를 자연스럽게 학습할 수 없음(병렬 연산이기 때문에)
  • 사인 / 코사인 함수는 특정 주파수를 적용해서, 단어 간 거리를 반영할 수 있음
  • 주파수가 작을수록(저차원) → 근처 단어 간 관계 표현에 유리
  • 주파수가 클수록(고차원) → 멀리 떨어진 단어 간 관계 표현에 유리
  • 즉, "나는"과 "학교를"처럼 가까운 단어뿐만 아니라, "나는"과 "공부했다"처럼 멀리 있는 단어도 모델이 잘 학습할 수 있음

4. 사인 & 코사인은 트랜스포머가 새로운 문장 길이에 일반화 할 수 있도록 돕는다

  • 기존 모델(RNN/CNN)은 학습한 문장 길이에만 최적화됨 → 새로운 문장 길이에 약함
  • 사인/코사인 기반 위치 인코딩은 수식으로 계산되므로, 학습한 문장 길이를 넘어도 일반화 가능
  • 예를 들어, 나는 학교를 간다" (5단어)를 학습했을 때, → "나는 학교에서 친구와 공부를 했다" (8단어) 같은 더 긴 문장도 잘 처리할 수 있음
  • 즉, 학습 데이터에서 본 적 없는 길이의 문장도 유연하게 처리 가능!

결론

이유 설명
연속적인 값 제공 문장의 단어 순서는 연속적인 정보이므로, Positional Encoding도 부드럽게 변화 해야 함 
상대적 위치 정보 제공  단어 간의 관계를 효과적으로 표현할 수 있도록 도와줌
거리 정보 학습 가능  가까운 단어뿐만 아니라, 멀리 떨어진 단어 관계도 학습 가능
문장 길이에 일반화 가능 학습한 문장보다 긴 문장에도 적용할 수 있음

 

3. Position-wise Feed-Forward Networks

트랜스포머 모델에서 각 인코더 및 디코더 레이어는 멀티 헤드 어텐션(Multi-Head Attention) 외에도 추가적인 연산을 진행하는데, 피드 포워드 뉴럴 네트워크 → 정확히는 위치별 피드 포워드 뉴럴 네트워크라고 합니다.

 

1️⃣ Position-wise Feed-Forward Networks란?

  • 각 단어(토큰)의 위치(position)마다 독립적으로 적용되는 완전연결(Feed-Forward) 신경망
  • 각 단어(토큰)의 임베딩을 개별적으로 변환하므로, 단어 간 연산이 공유되지 않음
  • 모든 단어에 대해 동일한 FFN이 적용되지만, 레이어마다 다른 가중치(Weights)를 사용
  • 입력차원 \(d_{model} = 512\), 내부 차원 \(d_{ff} = 2048\) (더 큰 차원으로 변환 후 다시 축소) 

2️⃣ FFN의 수식 (Feed-Forward Network Formula)

  • FFN은 두 개의 선형 변환(Linear Transformation)과 하나의 ReLU 활성화 함수(ReLU Activation Function)로 구성됩니다.

수식 

 

\(FFN(x) = \max(0, xW_1 + b_1)W_2 + b_2\)

 

 

첫 번째 선형 변환 (Linear Transformation 1)

 

\(xW_1 + b_1\)

 

  • \( x \)를 더 큰 차원 \( d_{ff} = 2048 \)로 확장

 

비선형 활성화 함수 (ReLU 적용)

 

\(\max(0, xW_1 + b_1)\)

 

  • 음수 값을 0으로 변환하여 비선형성을 추가

 

두 번째 선형 변환 (Linear Transformation 2)

 

\(\max(0, xW_1 + b_1))W_2 + b_2\)

 

  • 차원을 다시 \(d_{model} = 512 \)로 축소

결론은 기본적인 신경망을 조금 변형한 것을 배치한 느낌이다.

 

3️⃣트랜스포머에서 FFN이 필요한 이유

역할 설명
멀티 헤드 어텐션 후 추가적인 정보 변환  어텐션을 통해 추출한 정보를 더 정교하게 가공 
각 단어별 독립적인 변환 수행  문맥과 무관하게 개별 단어 특징을 강화 
고차원 공간에서 특징을 학습한 후 다시 축소 차원 확장(512 → 2048 → 512)을 통해 중요한 정보만 유지 
비선형성을 추가 하여 모델의 표현력 향상 ReLU를 적용 하여 단순한 선형 변환 보다 강력한 학습 가능

 


결론 

 

1️⃣ Positional Encoding (위치 인코딩)

Transformer는 RNN을 사용하지 않기 때문에, 단어 순서 정보를 직접적으로 학습할 수 없음
✅ 따라서, 입력 임베딩(Input Embedding)에 "위치 인코딩(Positional Encoding)"을 추가하여 단어의 위치 정보를 제공
사인(Sine)과 코사인(Cosine) 함수의 서로 다른 주파수를 활용하여, 연속적인 순서 정보를 부여
이 방식은 새로운 문장 길이에도 일반화(Extrapolation) 가능

 

📌 Positional Encoding 공식


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


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

 

 

📌 Positional Encoding의 핵심 역할

역할 설명
단어 순서 정보 제공  트랜스포머는 병렬 연산 수행으로 인해 단어 간 위치 정보를 저장하기 어려운 부분을 해결 하기 위해 단어 간 위치 정보를 제공 받아야 함 
연속적 & 주기적 변화  사인/코사인 함수는 자연스럽고 부드러운 순서 정보 표현 가능 
상대적 위치 정보 반영 단어 간의 상대적 거리 관게를 모델이 학습할 수 있도록 도움 
일반화 가능 새로운 문장 길이에도 적용이 가능하여, 특정 길이에만 최적화 되지 않음 

 

➡ 결론: Positional Encoding은 트랜스포머가 단어의 순서를 이해할 수 있도록 도와주는 핵심 요소

 

2️⃣ Feed-Forward Neural Network (FFN)

멀티 헤드 어텐션(Multi-Head Attention) 이후, 각 단어별 개별적인 변환을 수행하는 레이어
두 개의 선형 변환(Linear Transformation)과 ReLU 활성화 함수(Activation Function)를 포함
차원을 확장(512 → 2048 → 512)하여 더 풍부한 정보를 학습한 후, 다시 원래 크기로 축소
각 단어별 연산을 독립적으로 수행하여, 단어 간 간섭을 최소화

 

📌 FFN 공식

 

\(FFN(x) = \max(0, xW_1 + b_1)W_2 + b_2\)

 

📌 FFN의 핵심 역할

 

역할 설명
멀티 헤드 어텐션 후 추가적인 정보 변환  어텐션을 통해 추출한 정보를 더 정교하게 가공
각 단어별 독립적인 변화 수행 문맥과 무관하게 개별 단어 특징을 강화
고차원 공간에서 특징을 학습한 후 다시 축소 차원 확장 (512 → 2048 → 512)을 통해 중요한 정보만 유지
비선형성을 추가하여 모델의 표현력 향상 ReLU를 적용하여 단순한 선형 변환보다 강력한 학습 가능

 

➡ 결론: FFN은 Multi-Head Attention의 출력을 더 정교하게 변환하여 모델의 학습 능력을 극대화하는 중요한 요소

3️⃣ Positional Encoding & FFN의 관계는?

Positional Encoding은 Transformer가 단어의 순서를 학습할 수 있도록 돕는 역할을 수행
FFN단어별 특징을 강화하고, 모델이 더 깊이 있는 표현을 학습할 수 있도록 변환하는 역할을 수행
즉, Positional Encoding은 입력 데이터를 정렬하는 역할, FFN은 변환하는 역할 

4️⃣ 최종 결론

요소 역할 핵심효과
Positional Encoding 단어의 순서를 반영 트랜스포머가 순서 정보를 학습할 수 있도록 도움
Feed-Forward Neural Network (FFN) 각 단어별 특징 변환 더 깊이 있는 정보 학습 가능, 모델의 표현력 향상

 

💡 Positional Encoding이 없다면?

 

➡ Transformer는 단어의 순서를 이해할 수 없고, 어순을 무작위로 해석할 위험이 있음

 

💡 FFN이 없다면?

 

➡ Transformer는 어텐션을 통해 추출한 정보만 활용할 뿐, 개별 단어에 대한 정교한 변환을 수행할 수 없음

 

즉, Transformer 모델이 강력한 성능을 발휘하는 이유는 Positional Encoding과 FFN이 적절히 결합되어 있기 때문

 

 

계속..