논문 리뷰

Transformer(2017.06): Attention Is All You Need

cch8ii 2025. 1. 14. 20:36
논문 링크: 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

한 줄 정리

 

Transformer는 읽을 때 제대로 읽어야겠다 하는 마음에 논문 리뷰를 미루고 미루다 이제 하게 되었다... 엉엉 

그만큼 중요한 논문이기 때문에 Transformer 논문 리뷰는 자세하게 설명해보겠다!! 아자아자!!

NLP의 발전 과정

출처: 동빈나님의 유튜브 / https://www.youtube.com/watch?v=AA621UofTUA&t=916s

본 논문에서도 언급하겠지만 이해를 위해 Transformer 논문을 리뷰하기 전 아주 아주 간단하게 전체적인 NLP 역사를 살펴보자. 

RNN

기존의 DNN 모델은 고정된 크기의 입출력을 처리하는 구조였다. 하지만 문장, 음성, 시계열데이터와 같은 데이터들은 길이가 가변적이고 앞뒤 문맥을 고려해야 의미를 이해할 수 있다는 특징이 있었다. 이는 DNN의 한계가 되었고 RNN을 사용해 이전 단어의 정보를 기억하면서 학습하게 되었다. 

RNN ❘ 출처: https://wikidocs.net/152773

RNN은 순차적인 시퀀스 데이터 (예: 문장, 음성) 를 처리할 수 있는 신경망 구조이다. 현재 단계의 출력이 다음 단계의 입력이 되는 방식으로 처리되며 순환 구조(Recurrence)를 사용해 이전 상태를 다음 단계로 전달한다. 이는 입력 길이와 관계 없이 순차적인 데이터 처리 가능하게 한다. 위 그림과 함께 RNN을 이해해보자. RNN은 이전 상태 (h_{t-1}) 와 현재 입력 (x_t) 을 기반으로 새로운 은닉 상태 (h_t)를 계산한다. 계속해서 이전 상태를 활용하니 순차적인 시퀀스 데이터를 처리할 수 있게 되었다. 

RNN의 주요 한계는 다음과 같다. 

① 기울기 소실(Vanishing Gradient) 문제: 역전파 과정에서 시간이 길어질수록 기울기가 점점 작아지고 결과적으로 긴 문맥을 학습하는 것이 어려워진다. 

② 장기 의존성 문제(Long-term Dependency): 문장이 길어질수록 처음 입력된 정보가 나중에 영향을 주기 어렵다. 

③ 병렬 처리 불가능: 순차적으로 데이터를 처리하므로 병렬 연산이 어렵고 학습 속도가 느리다. 

더보기

💡 RNN의 4가지 유형

RNN의 4가지 유형

기계 번역은 many to many에 해당한다. 

각 유형에 따른 Task가 있지만 이는 RNN 논문 리뷰에서 더 자세히 다루고 여기선 이것만 알고 넘어가도 좋을 것 같다. 

 

LSTM(Long Short-Term Memory) & GRU(Gated Recurrent Unit)

RNN의 단점 (기울기 소실, 장기 의존성 문제) 을 해결하기 위해 등장한 모델들이다. 

출처: https://wikidocs.net/152773

위 사진은 LSTM 의 구조를 표현한 사진이다. LSTM의 구조를 다 다루기엔 너무 기니 간단히 LSTM의 핵심 아이디어만 설명하자면 셀 상태(Cell State)와 3개의 게이트(Forget, Input, Output)를 추가하여 장기 의존성 문제 해결하는 것이다. 기울기 소실 문제를 방지해 긴 문맥 학습을 가능하게 한다. 

하지만 LSTM은 사진에서 볼 수 있다시피 하나의 셀에 4개의 연산이 필요해 시간이 많이 걸린다. 때문에 GRU는 LSTM을 단순화해 계산량을 줄였다. 

Seq2Seq

이후 Seq2Seq가 등장했다. Encoder-Decoder 구조를 사용하여 기계 번역 등 시퀀스 변환 Task에 적용한 것이다. 입력 문장을 하나의 고정된 크기(Context Vector)로 인코딩한 후 이를 기반으로 디코딩해 출력 문장을 생성한다. 하지만 여기서도 한계가 있었다. 바로 문장이 짧아도 길어도 하나의 고정된 크기로 인코딩해야 했다는 점이 한계를 만든 것이었다. 문장이 길어질수록 고정된 크기의 Context Vector가 정보 손실을 초래하고 장문의 번역 성능이 떨어지는 것이다. 

 

이러한 한계를 극복하기 위해 Transformer가 등장했다. 고정된 크기의 Context Vector 대신 입력 문장 전체에서 중요한 정보를 동적으로 추출하게끔 한 것이다. 어떻게 구현했는지 논문을 읽으면서 살펴보자. 

 


Abstract

기존의 주요 시퀀스 변환 모델 (Sequence transduction model)은 인코더와 디코더를 포함하는 복잡한 순환 신경망 (RNN) 또는 합성곱 신경망 (CNN)을 기반으로 한다. 최고 성능을 보이는 모델들은 인코더와 디코더를 연결하는 Attention 메커니즘을 포함한다. 

본 논문에서는 Transformer라는 새로운 간단한 네트워크 아키텍처를 제안하며 Transformer 네트워크는 오직 Attention 메커니즘만 기반으로 하고 순환(Recurrence)과 합성곱(Convolutions)을 완전히 사용하지 않는다. 

 

두 개의 Machine translation task에서 실험한 결과, 기존 모델보다 더 높은 품질을 제공하면서 병렬처리가 용이하고 학습에 필요한 시간이 대폭 줄어들었다고 한다. Transformer는 WMT 2014 영어-독일어 번역 작업에서 BLEU score 28.4를 달성하여, 기존 최고 성능(앙상블 모델 포함)보다 2 BLEU 이상 개선했다. 또한 WMT 2014 영어-프랑스어 번역 작업에서는 단일 모델 기준으로 BLEU 점수 41.8을 기록하며 새로운 최첨단(state-of-the-art) 성능을 달성했다. 

모델은 8개의 GPU에서 단 3.5일 동안 학습되었으며 기존 최고 성능 모델들의 학습 비용에 비해 훨씬 적은 비용이 소요되었다. 

1. Introduction

순환 신경망(Recurrent Neural Networks, RNN), 장단기 기억 네트워크(Long Short-Term Memory, LSTM), 게이트 순환 유닛(Gated Recurrent Unit, GRU) 을 포함한 순환 신경망 모델들은 Language modeling 및 Machine translation과 같은 시퀀스 모델링 및 변환 문제에서 SOTA (state-of-the-art) 를 달성하며 많이 사용되어 왔다. 이후로도 수많은 연구가 이러한 순환 언어 모델과 Encoder-Decoder 아키텍처의 성능을 더욱 향상시키기 위해 지속적으로 연구해왔다. 

더보기

💡 왜 "순환" 모델이라고 할까? 

순환 신경망(Recurrent Neural Network, RNN)"이라는 이름이 붙은 이유는 출력값을 생성하는 과정에서 이전 상태(hidden state)를 다음 단계로 넘겨주는 순환 구조(recurrent structure)를 갖고 있기 때문이다. 

보통 일반적인 신경망의 경우 모든 입력을 한 번에 처리하지만 RNN은 입력을 한 번에 하나씩 순서대로 처리하면서 이전 단계의 정보를 현재 단계로 전달한다. 이는 과거 정보가 현재 상태에 영향을 주는 방식으로 학습이 이루어지기 때문에 이러한 특성이 마치 순환하는 것처럼 보이기 때문에 RNN이라 한다. 

 

기존의 순환 신경망 기반 시퀀스 모델은 일반적으로 입력 및 출력 시퀀스의 각 위치(symbol position)를 처리하면서 연산을 수행한다. 이 말의 의미는 입력 데이터를 순서대로 (= Time step 별로) 하나씩 처리한다는 의미이다. 즉, 각 위치를 시간과 함께 정렬해 연산을 진행하며 t 시점의 Hidden state h_t는 이전 Hidden state h_{t-1} 와 해당 위치의 입력을 기반으로 생성된다. 이 과정에서 이전 단계의 Hidden state (h_{t-1})를 다음 단계 (h_t) 로 넘겨주고 새로운 입력과 함께 현재 상태를 계산하는 방식이다. 

그러나 이러한 순차적 특성(sequential nature) 때문에 시간 순서대로 하나씩 처리해야 하고 병렬 처리가 불가능하며 시퀀스 길이가 길어질수록 메모리 제한으로 인해 메모리 사용량이 많아지고 학습 속도가 느려지는 단점이 존재한다. 

때문에 이후 연구들에서 인자화 기법(factorization tricks)과 조건부 연산(conditional computation)을 활용해 계산 효율성을 크게 향상시키는 데에 성공했지만 근본적인 한계는 극복하지 못했다. 

더보기

💡 인자화 기법(factorization tricks) 과 조건부 연산(conditional computation)

인자화 기법(factorization tricks)은 복잡한 수학적 연산 (예를 들어 행렬 연산)을 효율적으로 수행하기 위해 특정 구조로 변환하는 방법이다. 자세하게 설명하긴 양이 많아 안 하겠지만 그냥 대규모 모델에서 연산량을 줄이면서 비슷한 성능을 유지하기 위해 사용되는 방법이라고 한다. 

조건부 연산(conditional computation)은 신경망이 입력 데이터에 따라 다른 경로의 연산을 수행하도록 하는 기법이다. 전체 네트워크를 사용하지 않고 필요할 때만 일부 가중치나 노드를 활성화해 연산 효율성을 높이는 방식이다. 

 

이 두 개념은 딥러닝 모델을 더 효율적으로 학습시키는 데 중요한 기법들이다. 

여기서 다시 정리해보면 기존 RNN 기반 모델의 한계는 다음과 같다.

  • RNN은 이전 단계(hidden state)에 의존해서 순차적으로 계산해야 하므로 병렬 처리가 불가능하다. 
  • 시퀀스가 길어지면 멀리 떨어진 단어들과의 관계(장거리 의존성)를 학습하기 어렵다. 
  • 학습 속도가 느리고 연산 비용이 많이 든다. 

이러한 한계를 해결하기 위해 Attention 메커니즘이 등장했다. Attention 메커니즘은 입력 시퀀스에서 중요한 단어를 선택하고 장거리 의존성을 쉽게 모델링할 수 있는 방법으로 Attention 메커니즘을 사용하면 멀리 떨어진 단어와의 관계도 쉽게 학습할 수 있고 중요한 부분에 더 집중할 수 있다.

Attention 메커니즘은 다양한 시퀀스 모델링에서 중요한 요소가 되었다. 하지만 기존의 Attention 메커니즘은 대부분 RNN과 함께 사용되었다. 순차적으로 처리해야 하기 때문에 병렬 처리에 여전히 어려움이 있고 학습 속도가 느리다는 문제를 가지고 있게 된 것이다. 

 

본 논문에서는 Transformer라는 새로운 모델 아키텍처를 제안하며 이는 순환 신경망을 아예 사용하지 않고 오직 Attention 메커니즘만을 사용해 입출력 간의 전역적 (Global) 의존성을 모델링한다. Transformer는 병렬 처리를 크게 향상시킬 수 있으며, 8개의 P100 GPU에서 단 12시간의 학습만으로 새로운 최첨단 번역 품질(state-of-the-art)을 달성할 수 있음을 보였다.

 

2. Background

이러한 Sequential computation (순차적 계산) 을 줄이려는 목표는 Extended Neural GPU, ByteNet, ConvS2S의 기반이 되며 이들 모델은 모두 컨볼루션 신경망( = CNN) 을 Basic building block (기본 구성 요소) 로 사용하며 모든 입력 및 출력 위치에서 은닉 표현을 병렬로 계산한다. 즉. RNN처럼 한 단어씩 순차적으로 계산하지 않고 여러 단어를 한 번에 병렬 연산할 수 있는 것이다. 

하지만 이러한 기존 모델들의 문제는 멀리 떨어진 토큰 간의 관계를 학습하는 데 문제가 있었다는 것이다. ConvS2S는 거리에 비례해 연산량이 선형적으로 증가하고, ByteNet은 로그 형태로 증가했다. 두 단어가 멀리 떨어져 있을수록 모델들이 관계를 학습하기 위해 더 많은 연산을 필요로 하게 된 것이다. 즉, 멀리 떨어진 단어 간의 의존성을 학습하는 것이 어려워졌다. 

 

Transformer에서는 두 토큰 사이의 관계를 학습하는 데 필요한 연산을 고정된 수(constant number of operations)로 줄인다. 즉, 두 단어가 얼마나 떨어져있든 동일한 연산량만 필요하고 연산량 증가 없이 장거리 의존성(Long-range dependency)을 학습할 수 있게 되는 것이다. 

하지만 단점도 존재한다. Self-Attention은 단어들 간의 관계를 계산할 때 어텐션 가중치의 평균화(Averaging attention-weighted positions) 현상이 발생한다. 이로 인해 입력 단어들의 세밀한 정보가 손실될 위험이 있고 이를 유효 해상도 (effective resolution) 가 감소하는 대가를 치르는 것이라고 논문에선 표현한다. 때문에 이를 해결하기 위해 Transformer에서는 Multi-Head Attention을 사용해 여러 개의 서로 다른 어텐션을 동시에 학습해 정보 손실을 줄이고 다양한 시점에서 문맥을 이해할 수 있도록 보완한다. 

 

Self-Attention은 하나의 시퀀스 내에서 서로 다른 위치들을 연관시켜 해당 시퀀스의 표현을 계산하는 어텐션 메커니즘이다. 각 단어가 다른 단어와 얼마나 관련이 있는지 유사성을 측정하고 이를 통해 단어 간 관계를 반영한 문장 표현을 만든다. Self-Attention은 Reading comprehension (독해), Abstractive summarization (추상적 요약), Textual entailment (텍스트 함의), Learning task-independent sentence representations (작업과 독립적인 문장 표현 학습 = 특정 작업이 아니라 일반적인 문장 표현 학습) 등 다양한 Task에서 성공적으로 사용되었다. 

기존 RNN이나 CNN 기반 모델들은 문장을 처리할 때 순서 (sequential order) 를 유지하면서 연산을 진행해야 했다. 하지만 Self-Attention의 핵심 아이디어는 한 번에 모든 단어의 관계를 계산할 수 있게 하기 때문에 병렬 연산이 가능해진다. 

 

또한 End-to-End 메모리 네트워크라는 것이 있는데 End-to-End 메모리 네트워크는 기존 RNN과는 다르게 순차적인 계산을 피하면서도 어텐션 메커니즘을 활용한다. RNN의 방법인 시퀀스 정렬 재귀(sequence-aligned recurrence)를 사용하는 대신 재귀적 어텐션 메커니즘(recurrent attention mechanism)을 사용한다. 기존 RNN 기반 모델은 재귀(recurrence) 방식으로 순서대로 정보를 전달하지만  End-to-End 메모리 네트워크는 순차적인 RNN 구조 대신 어텐션을 이용해 정보를 저장하고 검색하는 방식을 사용한다는 것이다. 즉, 기존의 RNN처럼 순차적으로 정보를 학습하는 것이 아니라 메모리 구조를 활용해 특정한 정보를 찾아서 사용하는 방식이다. 이는 간단한 언어 기반 QA 및 언어 모델링 Task에서 우수한 성능을 입증했다. 

 

Transformer와 다른 기존 모델들 간의 가장 큰 차이점은 무엇일까?

Transformer는 Sequence aligned RNN이나 CNN 없이 입력과 출력의 표현을 계산하는 오직 Self-Attention을 기반으로 하는 최초의 변환(transduction) 모델이라고 할 수 있다. 

더보기

💡 기존 모델과 차이점

  • 기존 모델 (RNN, CNN 기반)
    • RNN: 순차적으로 데이터를 처리해야 해서 병렬 연산이 어렵고 학습 속도가 느림
    • CNN: 병렬 연산이 가능하지만 멀리 떨어진 단어들 간의 관계 학습이 어려움
    • End-to-End 메모리 네트워크: 특정 문제(Q&A 등)에서 성능이 좋지만 범용 모델로 사용하기엔 한계
  • Transformer
    • RNN이나 CNN을 사용하지 않고, 오직 Self-Attention만 사용
    • 병렬 연산이 가능, 먼 거리에 있는 단어들 간의 관계를 효과적으로 학습 가능
    • 기존 RNN과 CNN 기반 모델들이 가진 병목 현상(bottleneck) 해결

자세한 내용들은 논문을 더 읽어보면서 알아보자. 

 

3. Model Architecture

대부분의 신경망 기반 시퀀스 변환 (sequence transduction) 모델은 Encoder-Decoder 구조를 가진다. 여기서 Encoder는 입력 시퀀스 (x_1, ..., x_n) 을 연속적인 표현 시퀀스 z = (z_1, ..., z_n) 으로 매핑한다. 이후 Decoder는 z를 기반으로 출력 시퀀스 (y_1, ..., y_m) 을 한 번에 하나의 요소씩 생성한다. 각 단계에서 Transformer의 Decoder는 이전 출력을 이용해 다음 결과를 예측하는 방식인 자기회귀 (auto-regressive) 방식으로 동작하며 이전에 생성된 출력들을 추가 입력으로 사용해 다음 출력을 생성한다. 

 

Transformer는 Encoder와 Decoder 모두에서 스택된 Self-attention과 위치별(Point-Wise) Fully-connected 레이어를 사용하는 전체적인 아키텍처를 따른다. 밑에 그림 1에 왼쪽은 Encoder이며 오른쪽은 Decoder이다. 

 

3.1 Encoder and Decoder Stacks

Encoder

출처: http://wikidocs.net/31379

인코더는 N = 6 개의 동일한 레이어 (stack of 6 identical layers) 로 구성된다. 각 층은 2개의 Sub-layer 를 포함하는데 ① 첫 번째 서브 레이어는 Multi-head attention 메커니즘(Multi-Head Self-Attention Mechanism) ② 두 번째 서브 레이어는 위치별(position-wise) Feed-forward 네트워크이다. 각 서브 레이어에는 잔차 연결(residual connection)이 적용되며 이후 Layer normalization이 수행된다. 

즉, 각 서브 레이어의 출력은 다음과 같이 계산된다. (여기서 Sublayer(x)는 서브 레이어 자체를 의미한다.)

 

잔차 연결을 원활하게 수행하기 위해 모델 내 모든 서브 레이어 및 임베딩 레이어의 출력 차원 (d_model) 은 512로 설정된다. 

 

Decoder

출처: https://wikidocs.net/31379

Decoder 또한 N = 6 개의 동일한 레이어로 구성된다. 각 Decoder 레이어는 Encoder 레이어와 마찬가지로 두 개의 서브 레이어를 포함하지만, 3번째 서브 레이어가 추가된다. 세 번째 서브 레이어는 Encoder 스택의 출력에 대해 Multi-head attention을 수행한다. Encoder와 마찬가지로 각 서브 레이어에는 잔차 연결과 Layer normalization이 적용된다. 또한 Decoder 스택의 Self-attention 서브 레이어에는 아직 예측하지 않은 위치를 참조하지 못하도록 Masking을 진행한다. 이를 통해 출력 시퀀스의 위치 i에서의 예측은 i 이전의 출력만을 기반으로 수행되도록 보장된다. Masking 기법과 더불어 출력 임베딩이 한 위치씩 Offset되어 적용됨으로써 이전 출력을 기반으로 순차적으로 예측이 이루어진다. 출력 임베딩의 Offset 적용이란 Transformer 디코더가 출력 문장을 한 칸씩 밀어 넣어서 학습을 진행하는 것을 말한다. 

출처: https://wikidocs.net/31379

위 그림과 같이 Transformer 디코더에서는 출력 임베딩(Output embeddings)이 한 위치씩 밀려서(shifted) 적용되는 것을 알 수 있다. 

 

3.2 Attention

어텐션 함수는 Query와 Key-value pairs 를 입력으로 받아 출력을 생성하는 매핑 함수로 정의할 수 있다. Query, Keys, Values와 출력은 모두 벡터 형태를 가진다. 출력은 Value들의 가중합(weighted sum)으로 계산되며 각 Value에 할당된 가중치는 Query와 해당 Key 간의 호환성 함수(compatibility function) 값에 의해 결정된다. 여기서 호환성 함수(compatibility function)란 Query오 Key 간의 유사도를 측정하는 함수이다. 즉, Transformer에서 어텐션 가중치를 계산할 때 Query와 Key 간의 연관성(Compatibility)을 평가하는 데 기준이 되는 함수인 것이다. 

 

3.2.1 Scaled Dot-Product Attention

오른쪽 이미지 출처: https://wikidocs.net/31379

본 논문에서는 Scaled Dot-Product Attention을 사용한다. 입력은 Query (Q), Key (K), Value (V) 로 구성되며 Query와 Key의 차원은 d_k, Value의 차원은 d_v이다. Scaled Dot-Product Attention은 Query와 Key 간의 내적 (Dot product)을 계산한 후 이를 √(d_k)로 나누고 Softmax 함수를 적용해 가중치 (= 어텐션 Value)를 얻는다.

💡 왜 Q-K 내적을 √(d_k)로 나눌까? 
나누는 이유는 Softmax 함수의 안정성을 유지하기 위해서이다. 
Transformer에서는 Q와 K의 Dot product를 계산해 유사도를 측정한다. 즉 QK^T 값이 클수록 높은 유사도를 가지며 이에 따라 Softmax 함수를 통해 어텐션 가중치를 할당하는 것이다. 여기서 Dot-Product Attention의 문제점이 나타난다. 만약 Q와 K의 값이 너무 크다면, 큰 값끼리 내적을 수행하면 결과 값의 크기도 커지고 Softmax의 출력 값들이 극단적으로 변할 수 있게 된다. 만약 이대로 진행한다면 어텐션이 특정 토큰에만 집중되는 현상 (= Attention collapse)이 일어난다. 때문에 내적한 값들을 √(d_k)로 나눠서 크기를 조정해 내적 값이 너무 커지는 것을 방지하고 Softmax가 극단적인 값이 아니라 적절한 확률 분포를 만들 수 있도록 한다. 

이런 연산을 여러 개의 Query에 대해 동시에 수행하며 Q, K, V를 행렬 형태로 구성해 다음과 같이 계산한다. 

이해를 위해 부가적인 설명을 덧붙이자면 다음과 같다. 입력 문장 행렬에 가중치 행렬을 곱해서 Q 행렬, K 행렬, V 행렬을 구한다. 

출처: https://wikidocs.net/31379 여

여기서 어텐션 스코어를 구하기 위해 Q 행렬을 전치한 K 행렬과 곱해 내적해준다. 

출처: https://wikidocs.net/31379

이 행렬에다가 √(d_k) 를 나눠주면 이는 각 행과 열이 어텐션 스코어 값을 가지는 행렬이 된다. 

출처: https://wikidocs.net/31379

 

왜 이러한 방식을 사용하게 되었을까? 

가장 일반적으로 사용되는 어텐션 함수는 Additive Attention과 Dot-Product (Multiplicative) Attention이 있다. 먼저 Dot-Product Attention은 본 논문에서 사용하는 방식과 동일하지만 √(d_k) 스케일링이 없다. Additive Attention은 Feed-forward 네트워크로 호환성 함수를 계산하며 이론적으로 Dot-Product Attention과 비슷한 복잡도를 가지지만 실제 연산에서는 속도가 더 느리고 메모리 사용량이 많다. 

출처: https://pretteyandnerdy.wordpress.com/2019/04/26/attention-is-all-you-need/

d_k가 작은 경우 두 방식의 성능은 비슷하지만 큰 경우 Additive Attention이 성능이 더 좋다. 이는 d_k가 클 때 Dot-Product Attention의 내적 값들이 너무 커져 softmax의 기울기가 매우 작아지는 문제가 발생하기 때문이다. 이를 방지하기 위해 Dot-Product Attention에서는 내적 값을 √(d_k)로 나누어 정규화한다. 그것을 위에서 설명한 Scaled Dot-Product Attention이라고 하는 것이다. 

 

 

3.2.2 Multi-Head Attention

Transformer의 Self-attention은 입력 문장에서 각 단어들이 서로 얼마나 중요한지를 학습하는 기법이다. 여기서 하나의 어텐션 (Single head) 만 사용한다면 모델이 한 번에 하나의 관계만 학습할 수 있어 문장에서 한 가지 시점에서의 연관성만 파악할 수 있게 되는 문제가 발생한다. 이를 해결하기 위해서 하나의 어텐션을 여러 개의 Multi head로 나누어서 각각 다른 정보를 학습하도록 하게 한 것이다. 이를 통해서 서로 다른 문맥을 동시에 고려할 수 있게 된다. 

 

때문에 본 논문에서는 d_{model}-dimentional Keys, Values, Queries를 사용해 단일 어텐션 함수를 수행하는 대신 Query, Key, Value 값을 각각 d_k, d_k, d_v 차원으로 변환하는 선형 프로젝션을 h번 수행하는 것이 유익함을 발견했다고 덧붙인다. 이렇게 변환된 Query, Key, Value 값에 대해 어텐션 함수를 병렬로 수행한 후 d_v-dimensional 출력을 얻고 이를 연결(concatenate)한 후 다시 투영해 최종 출력을 생성한다. 이는 다음과 같은 그림에 과정이 나타나있다. 

오른쪽 이미지 출처: https://wikidocs.net/31379

Multi-Head Attention은 모델이 다양한 Representation subspace (표현 하위 공간)에서 여거 위치 정보를 동시에 참고할 수 있도록 한다. 반면 단일 어텐션 (single attention head)에서는 평균화(averaging)가 이러한 정보를 방해할 수 있다. 

여기서 프로젝션 행렬은 다음과 같이 정의된다. 

본 논문에서는 h = 8 개의 병렬 어텐션 레이어 즉, 8개의 헤트를 사용한다. 각 헤드에서는 d_k = d_v = d_{model} / h = 64를 사용한다. 각 헤드의 차원이 감소하므로 총 계산 비용은 전체 차원을 사용하는 Single-head attention과 유사하다. 

 

3.2.3 Applications of Attention in our Model

Transformer는 Multi-Head Attention을 3가지 방식으로 활용한다. 

 

① Encoder-Decoder Attention

→ Decoder가 Encoder의 정보를 참고하기 위한 어텐션

  • Query (Q)는 이전 디코더 레이어의 출력
  • Key (K), Value (V)는 인코더의 최종 출력 

이를 통해 Decoder 의 모든 위치가 입력 시퀀스 전체를 참고해 새로운 단어를 생성할 수 있도록 한다. 이는 기존 Seq2Seq 모델에서 사용되는 Encoder-Decoder Attention 메커니즘을 모방한 것이다. 

기존 RNN 기반의 Seq2Seq 모델에서는 Decoder가 Encoder의 마지막 Hidden state 하나만 참고해 번역을 수행해 긴 문장을 번역할 때 정보 손실이 커지는 문제가 발생했다. 하지만Transformer는 Encoder-Decoder Attention을 사용해 입력 문장의 모든 위치를 참고할 수 있도록 만들었고 이 덕분에 Decoder는 문장의 전체 문맥(Context)를 반영한 출력을 생성할 수 있게 된다.

 

② Self-Attention in Encoder

→ 입력 문장 내 단어들 간의 관계를 학습하기 위한 어텐션

  • Query (Q), Key (K), Value (V)를 모두 동일한 입력 문장에서 가져옴

즉, 각 위치는 이전 인토더 레이어의 모든 위치를 참고할 수 있다. 이 어텐션은 문장에서 멀리 떨어진 단어들도 서로 영향을 줄 수 있도록 학습하기 위해서 필요하다. 입력 문장의 모든 단어들이 서로를 참고하면서 더 나은 문맥 표현을 학습할 수 있게 되는 것이다.

 

③ Self-Attention in Decoder

Decoder가 이전에 생성한 단어들을 참고하여 다음 단어를 예측할 수 있도록 하는 어텐션

  • Query (Q), Key (K), Value (V)를 모두 동일한 Decoder 내부에서 가져온다. 

이때 현재까지의 단어만 참고하도록 제한하기 위해 Masking을 적용한다. Decoder의 Self-attention도 Encoder와 동일하지만 현재 위치까지의 정보만을 참고하도록 해야 한다. 왜냐하면 Auto-Regressive(자기회귀) 속성을 유지해야 하기 때문이다. 즉, 이전까지 생성된 단어들만 참고해서 새로운 단어를 생성해야 하는 것이다. 만약 Masking을 적용하지 않으면 Decoder가 아직 생성되지 않은 미래 단어를 미리 참고할 위험이 생긴다. 때문에 이를 구현하기 위해 Softmax 입력에서 법적인 연결(illegal connections)에 해당하는 값들을 -∞로 설정하여 마스킹(masking)을 수행한다. 즉, 다시 설명하자면 Softmax 연산 전에 미래 단어들 (= 아직 생성되지 않은 단어) 과 연결되는 값들을 -∞ 로 설정해 Masking 처리를 한다. 이를 통해 Decoder가 미래 정보를 참조하지 못하도록 한다. 

 

3.3 Position-wise Feed-Forward Networks

Attention sublayer 외에도 Transformer의 Encoder와 Decoder의 각 레이어에는 Feed-forward 네트워크가 포함된다. 이 Feed-forward 네트워크는 각 위치에 대해 개별적으로 그리고 동일하게 적용되며 두 개의 선형 변환(linear transformations)과 그 사이의 ReLU 활성화 함수(ReLU activation)로 구성된다. 

각 위치에서의 선형 변환은 동일하지만 레이어마다 다른 파라미터를 사용한다. 레이어마다 다른 파라미터를 사용하는 이유는 다음과 같다. 가장 첫 번째로 각 레이어가 서로 다른 특징을 학습해야 하기 때문이다. 만약 모든 레이어가 동일한 FFN 파라미터를 공유한다면 모든 레이어가 같은 작업을 반복하게 될텐데 파라미터를 다르게 해서 각 레이어에서 다른 패턴을 학습하게 하는 것이다.

이를 다른 방식으로 설명하면 커널 크기 1을 갖는 두 개의 컨볼루션과 같다고 논문에서는 표현한다. 이 부분이 이해가 가지 않아서 더 찾아보았다.이 문장은 FFN을 CNN 방식으로 해석한 설명이다. 위 (2) 번 식과 같은 연산의 경우 사실 각 위치에서 독립적으로 수행되므로 커널 크기가 1인 (= 각 단어 위치에서만 적용되는) 두 개의 1x1 컨볼루션과 동일한 역할을 하는 것이다. 즉, FFN이 위치별(Position-wise)로 작동하기 때문에 CNN의 커널 크기가 1인 컨볼루션과 같은 방식이라고 설명한 것이다. 

입력과 출력 차원은 d_{model} = 512이며 내부 레이어의 차원은 d_{ff} = 2048이다. 

 

3.4 Embeddings and Softmax

Transformer는 어떻게 입력 단어를 수치적으로 표현하며 (임베딩) 출력 단어를 어떻게 예측할까? 

다른 시퀀스 변환(sequence transduction) 모델과 유사하게 Transformer는 학습된 임베딩(learned embeddings)을 사용해 입력 토큰과 출력 토큰을 d_{model}-dimentional 벡터로 변환한다. 예를 들어 d_{model} = 512 라면 문장의 각각의 단어들을 각각 512차원의 벡터로 표현하는 것이다.

더보기

💡 예를 들어 '나는 밥을 먹는다.'라는 문장이 입력 문장으로 들어온다면...

  • 나는 → 512차원의 벡터
  • 밥을 → 512차원의 벡터
  • 먹는다 → 512차원의 벡터

또한 출력 단어를 예측하는 과정에서 Transformer의 Decoder는 문장을 생성할 때 각 단어가 등장할 확률을 예측해야 한다. 즉, Decoder 출력을 예측된 다음 확률 (predicted next-token probabilities) 로 변환하기 위해 일반적인 선형 변환과 Softmax 함수를 사용하려 각 단어가 등장할 확률을 계산한다. Softmax는 모든 가능한 단어들 중에서 가장 적절한 단어를 선택하는 역할을 하는 것이다. 

 

Transformer 에서는 두 개의 임베딩 레이어 (입력, 출력) 와 Softmax 이전 선형 변환에서 동일한 Weight matrix를 공유한다. 왜냐하면 Transformer에서는 입력과 출력이 같은 단어 집합 (어휘)를 사용한다. 따라서 단어를 임베딩하는 방식과 최종 출력을 예측하는 방식이 동일한 구조를 가지는 것이다. 이때 가중치를 공유함으로써 메모리를 절약하고 학습 효율이 증가하는 장점을 가질 수 있다. 

그리고 임베딩 레이어에서는 이 가중치 행렬을 √(d_{model}) 배율로 곱한다. (= 임베딩 벡터에  √(d_{model}) 를 곱한다는 뜻) 입력 벡터의 크기를 조정해 학습 안정성을 높이기 위해서이다. 왜냐하면 임베딩 벡터는 평균이 0이고 분산이 작은 값을 갖는다. 하지만 어텐션 연산에서는 입력 벡터의 크기가 너무 작으면 학습이 제대로 안 될 수 있다. 때문에  √(d_{model}) 을 곱해서 벡터의 크기를 조정한다. 이를 통해 신경망이 더 효과적으로 학습할 수 있도록 한다. 즉, 임베딩 벡터가 너무 작아지지 않도록 조정하는 과정이라고 이해하면 좋을 것 같다. 

더보기

💡 왜 임베딩 벡터는 평균이 0이고 분산이 작을까? 

이유는 신경망의 가중치 초기화와 학습 안정성 때문이다. 임베딩 벡터의 초기값은 일반적으로 정규분포에서 샘플링된다. 신경망에서 가중치를 초기화할 때 보통 평균이 0이고 작은 분산을 가진 값들로 설명하는 것이 일반적이다. 왜냐하면 너무 큰 값이면 기욱기가 폭할할 가능성이 높아져 신경망이 학습하기 어려워지고 너무 작은 값이면 기울기가 너무 작아져 학습이 느려질 수 있기 때문이다. 이러한 원칙이 Transformer의 단어 임베딩에도 적용된다. 

 

3.5 Positional Encoding

출처: https://wikidocs.net/31379

Transformer는 기존 RNN이나 CNN과 달리 모든 단어를 한 번에 병렬로 처리하기 때문에 순환(recurrence)도 없고 컨볼루션(convolution)도 없다. 따라서 입력된 단어의 순서를 직접 알 수 없게 되지만 사실 문장에서 단어의 순서는 매우 중요하다. 때문에 모델이 입력 시퀀스의 순서(order)를 활용할 수 있도록 토큰들의 상대적(relative) 또는 절대적(absolute) 위치(position)에 대한 정보를 추가해야 한다. 즉, 입력 임베딩에 위치 인코딩을 더해 최종 입력을 만들어 같은 단어라도 문장에서 위치가 다르면 다른 벡터 값을 가지게끔 하는 것이다. 

 

이를 위해 Transformer는  Positional Encoding을 Encoder와 Decoder의 입력 임베딩에 추가해 단어의 위치 정보를 반영했다. Positional Encoding은 임베딩과 동일한 차원인 d_{model}을 가지므로 두 개를 합(sum)할 수 있다. d_{model}은 Transformer의 모든 레이어의 출력 차원을 의미하는 하이퍼 파라미터이고 논문에서는 512의 값을 가진다. 

Positional Encoding에는 다양한 방식 (학습된 방식과 고정된 방식)이 존재한다. 본 연구에서는 서로 다른 주파수(frequencies)를 갖는 사인(sine) 및 코사인(cosine) 함수를 사용한다. 

여기서 pos는 입력 문장에서의 임베딩 벡터의 위치를 말하며 i는 임베딩 벡터 내의 차원 인덱스 (dimension index)를 의미한다. 위의 식에서는 임베딩 벡터 내의 각 차원의 인덱스가 짝수인 경우 사인 함수의 값을 사용하고 홀수인 경우에는 코사인 함수의 값을 사용한다. 즉, Positional Encoding의 각 차원은 사인파(sinusoid)에 해당하며 각각의 파장(wavelength)은 2π에서 10000×2π까지 기하급수적 증가(geometric progression)한다. 

출처: https://wikidocs.net/31379

더 자세히 설명하자면 이 방식은 차원 인덱스 i를 추가함으로써 각 차원이 서로 다른 주파수(frequency)를 가지도록 설계되었다. 즉 각 차원마다 다른 주기의 사인(sine) 및 코사인(cosine) 함수가 사용되므로 서로 다른 위치를 구별할 수 있는 것이다. 

 

왜 사인(sine) 및 코사인(cosine) 함수를 선택했을까?

사인(sine) 및 코사인(cosine) 함수는 주기적(periodic) 특성이 있어 위치 정보를 자연스럽게 반영할 수 있고 이를 통해 상대적인 위치 정보(relative position)를 쉽게 학습할 수 있게 된다. 때문에 본 논문에서는 모델이 상대적 위치(relative positions)를 기준으로 어텐션을 쉽게 학습할 수 있도록 만들 것이라고 가정하고 사인(sine) 및 코사인(cosine) 함수를 사용했다. 이는 어떤 고정된 Offset k에 대해 PE_{pos + k} 가 PE_{pos}의 선형 함수로 표현될 수 있기 때문이다.

💡 Positional Encoding을 사용하는 이유
Transformer에서는 단어의 위치가 단순한 숫자로 표현될 수 없으므로, 주기적인 사인(sine) 및 코사인(cosine) 함수를 활용해 위치를 반영한다. 
① 상대적 위치를 자연스럽게 학습 가능
② 새로운 길이의 문장에도 일반화 가능: 학습 중 보지 못한 긴 문장이 들어와도 위치 패턴이 유지된다. 
③ 추가적인 학습이 필요 없음: 수학적 함수이기 때문에 추가 학습이 필요 없다. 

본 연구에서는 학습된 위치 임베딩(learned positional embeddings)을 사용하는 실험도 수행했으며 두 방식이 거의 동일한 결과를 생성함을 발견했다고 한다. (표 3의 E 행 참고)

그러나 Transformer는 Sin-Cos 방식 (sinusoidal version)을 선택했다. 그 이유는 이 방식이 훈련 중 관찰한 시퀀스 길이보다 더 긴 시퀀스에도 일반화(extrapolate)할 가능성이 있기 때문이다.

 

4. Why Self-Attention

그렇다면 본 논문에서 사용되는 Self-Attention 레이어와 기존에 사용되었던 가변 길이(variable-length) 시퀀스 변환(sequence transduction)에 사용되는 순환(Recurrent) 및 합성곱(Convolutional) 레이어의 차이는 무엇일까? 왜 Self-Attention 레이어를 사용하는 것일까? 

 

바로 더 효율적인 연산, 더 높은 병렬성, 그리고 장거리 의존성 학습 능력을 제공하기 때문이다. 이를 설명하기 위해 본 논문에서는 세 가지 기준을 고려한다. 

 

① 각 레이어에서의 총 연산 복잡도 (total computational complexity)

연산 복잡도는 특정 연산을 수행하는 데 필요한 계산량을 의미한다. RNN의 연산 복잡도는 O(nd^2)이며 각 단어를 순차적으로 처리해야 하기 때문에 문장이 길어질수록 연산 시간이 선형적으로 증가해 학습 속도가 느려진다. 하지만 Self-Attention의 연산 복잡도는 O(n^2d)로 모든 단어 간 관계를 한 번에 계산할 수 있다. 즉, 시퀀스 길이 n이 Representation 차원 d보다 작을 경우 Self-Attention이 RNN보다 더 빠른 것이다. 최신 NLP 모델들은 보통 d가 크기 때문에 Self-Attention이 유리한 경우가 많다. 
② 병렬화할 수 있는 연산량 (the amount of computation that can be parallelized)

병렬화란 한 번에 여러 연산을 동시에 수행하는 것을 의미한다. 병렬화할 수 있는 연산량은 최소한으로 필요한 순차적 연산의 개수(minimum number of sequential operations required)를 기준으로 측정된다. 때문에 RNN의 병렬화 가능 여부는 불가능하다. 즉, RNN은 O(n)개의 순차적 연산이 필요해 학습 속도가 느리다. 하지만 Self-Attention은 모든 단어에 대한 어텐션을 한 번에 계산할 수 있어 병렬화가 가능하고 학습 속도가 훨씬 빠르다. 
③ 네트워크에서 장거리 의존성(long-range dependencies) 간의 경로 길이(path length) 비교

장거리 의존성이란 문장에서 멀리 떨어진 단어 간의 관계를 학습하는 능력을 의미한다. 장거리 의존성을 학습하는 것은 많은 시퀀스 변환 Task에서 주요한 도전과제이다. 이러한 의존성을 학습하는 능력에 영향을 미치는 주요 요인 중 하나는 네트워크 내에서 순방향(forward) 및 역방향(backward) 신호가 통과해야 하는 경로의 길이이다. 입력과 출력 시퀀스의 임의의 조합 간 경로가 짧을수록 장거리 의존성을 학습하기가 더 쉬워진다. 따라서 서로 다른 레이어 유형으로 구성된 네트워크에서 입력 및 출력 위치 간 최대 경로 길이 (maximum path length) 를 비교한다. RNN의 문제점이 장거리 의존성 학습이 어렵다는 것인데 RNN은 입력과 출력 간의 경로가 길수록 정보 전달이 어려워진다. 왜냐하면 정보가 여러 개의 RNN 셀을 거쳐 전달되면서 기울기 소실 문제가 발생하기 때문이다. O(n)인 것이다. 하지만 Self-Attention은 모든 단어가 직접 연결된다. 경로 길이가 O(1)이 되어서 멀리 떨어진 단어들도 쉽게 관계를 학습할 수 있게 되는 것이다. 

표 1에서 볼 수 있듯이 Self-Attention 레이어는 모든 위치를 고정된 개수의 순차적 연산(Sequential Operations)으로 연결할 수 있다. 반면 RNN은 O(n)개의 순차적 연산이 필요하다. 

또한 연산 복잡도(Computational Complexity) 관점에서 시퀀스 길이 n이 Representation 차원 d 보다 작은 경우 Self-Attention 레이어는 RNN보다 연산적으로 더 빠르다. 최신 Machine translation (Word-Piece, Byte-Pair Encoding)에서도 시퀀스 길이가 짧기 때문에 Self-Attention이 더 유리하다. 

Self-Attention의 문제점을 꼽자면 시퀀스 길이가 길어질수록 연산량이 O(n^2) 으로 증가해 아주 긴 문장을 처리할 때 연산 속도가 느려질 수 있는데 이에 대한 해결책으로 로컬 어텐션 (Local Attention)을 도입할 수도 있다. 긴 시퀀스(Long Sequences) 처리 시 연산 속도 개선을 위해 Self-Attention의 입력을 출력 위치를 중심으로 한 크기 r 의 윈도우 내에서만 계산하도록 제한하는 것이다. 즉, 출력 위치를 중심으로 한 크기 r의 윈도우 내에서만 계산하는 것인데 이렇게 하면 최대 경로 길이가 O(n/r) 로 증가하지만 계산량을 줄일 수 있다. 이 방법은 본 논문에서 적용하진 않았고 나중에 연구할 것이라고 밝혔다. 

 

합성곱 신경망(Convolutional Layers)과 비교해보면 어떨까? 

CNN은 원래 이미지 처리에 많이 사용되지만 NLP에서도 활용할 수 있다. 하지만 CNN은 기본적으로 한 번에 볼 수 있는 단어의 범위(커널 크기, kernel size) 가 정해져 있어 근처의 단어들만 참고하기 때문에 장거리 의존성을 학습하는 데 한계가 있다. 이러한 문제를 해결하려면 CNN은 멀리 떨어진 단어들을 연결하기 위해 여러 개의 CNN 층을 쌓아야 한다. 즉 단일 CNN 레이어는 모든 단어를 연결할 수 없으며 여러 개의 레이어를 쌓아야 문장 전체를 고려할 수 있는 것이다. 때문에 문장 전체를 이해하려면 여러 레이어가 필요하고 경로 길이가 길어질 수 있다. 

반면 Self-Attention의 경우, 모든 단어를 한 번에 연결할 수 있다. 즉, CNN처럼 여러 레이어를 거칠 필요 없이 한 번의 연산으로 모든 단어 간의 관계를 계산하는 것이 가능하다는 것이다. 연산량을 비교해봐도 CNN보다 Self-Attention이 훨씬 더 효율적이라는 것을 알 수 있다. 때문에 Transformer에서는 CNN 대신 Self-Attention을 사용한다. 

 

Self-Attention의 추가적인 장점은 모델의 해석 가능성 (Interpretability)이다. Self-Attention은 더 해석 가능한 모델을 만들 수 있다는 의미이다.

Self-Attention의 어텐션 분포(Attention Distributions)를 분석한 결과 각 어텐션 헤드(Attention Heads)가 서로 다른 작업을 학습하는 것이 명확하게 관찰되었다. 일부 헤드는 구문적(Syntactic) 구조를 학습하며 일부 헤드는 의미적(Semantic) 구조를 학습하는 것을 알 수 있었다. 즉,Self-Attention을 사용하면 모델이 어떻게 문장을 이해하는지 더 쉽게 분석할 수 있다.

 

5. Training

5.1 Training Data and Batching

본 논문에서는 약 450만 개(4.5M)의 문장 쌍(sentence pairs) 으로 구성되어 있는  WMT 2014 영어-독일어(English-German) 데이터셋으로 학습을 진행했다. 각 문장은 Byte-Pair Encoding (BPE) 을 사용해 인코딩되었으며 소스(Source)와 타겟(Target) 언어가 공유하는 단어 사전(vocabulary size)은 약 37,000개 토큰이다.또한 영어-프랑스어(English-French) 번역을 위해 3600만 개(36M)의 문장 쌍으로 구성되어 있는 WMT 2014 영어-프랑스어 데이터셋도 사용했다. 이는 Word-Piece 모델을 활용해 32,000개의 단어 사전(vocabulary)으로 분할했다. 

배치는 비슷한 길이를 가진 문장들을 그룹화하여 배치로 구성했으며, 각 배치에 약 25,000개의 소스 토큰과 25,000개의 타겟 토큰이 포함되었다. 

5.2 Hardware and Schedule

본 논문에서 사용한 하드웨어는 8개의 NVIDIA P100 GPU이며 이를 사용해 학습을 진행했다. Base 모델의 학습 속도는 논문에서 사용한 기본 하이퍼파라미터(Base Model Hyperparameters)를 적용했을 때 각 학습 Step 당 0.4초가 소요되며 총 100,000 스텝을 약 12시간 동안 학습했다. Big 모델의 학습엔 각 학습 Step 당 1.0초가 소요되었으며 총 300,000 스텝을 약 3.5일 동안 학습했다. 

5.3 Optimizer

본 논문에서는 Adam Optimizer를 사용했으며 β1 = 0.9, β2 = 0.98, ϵ = 10^{-9} 로 설정했다.

학습률 스케줄링은 위와 같은 공식에 따라 변화하게끔 했다. 위 식에서 학습률은 초기에는 선형적으로 증가하지만 이후엔 Step 수의 역제곱근(inverse square root of step number)에 비례해 감소하게끔 한다. 또한 초기에 워밍업 스텝(Warm-up Steps)을 설정해 초기 4000 스텝(warmup_steps = 4000) 동안 학습률을 점진적으로 증가시킨다. 초기 단계에서는 학습률을 천천히 증가시키고 일정 Step 이후에는 점진적으로 감소하여 안정적인 학습을 유도한 것이다. 

5.4 Regularization

Transformer 모델의 학습 과정에선 3가지 Regularization 기법을 적용한다. 

 

Residual Dropout

Residual Dropout 는 다음과 같다. 가장 먼저 각 서브 레이어의 출력에 Dropout을 적용한다. 이후 입력과 더한 후 Layer normalization 전에 Normalization을 수행한다. Encoder 및 Decoder 스택에서 임베딩과 Positional Encoding 합산 후에도 Dropout을 적용한다.

Base 모델에서는 Dropout 비율 P_{drop} = 0.1 을 사용한다. 

 

Label Smoothing

다음은 Label Smoothing 방법이다. 학습 중, 라벨 스무딩(Label Smoothing) 값을 ϵ_{ls} = 0.1 로 설정한다. 이렇게 하면 모델이 지나치게 확신을 갖는(overconfident) 것을 방지하게 되는 효과가 있다. Perplexity는 다소 낮아지지만 Accuracy와 BLEU score가 향상된다. 

💡 세 가지 Regularization 기법이라면서..?
Residual Dropout과 Label Smoothing만 명확하게 언급되고, 세 번째 기법은 직접적으로 명시되지 않는다. 때문에 GPT에게 물어봤다. 
Transformer의 구조상 Layer Normalization이 모든 서브레이어에서 적용되고 있으며, 이는 학습을 안정화하는 중요한 역할을 하는 것으로 보아 세 번째 정규화 기법은 "Layer Normalization"일 가능성이 높다고 이야기해주었다. 

 

6. Results

6.1 Machine Translation

WMT 2014 English-to-German translation task에서 대형 Transformer 모델 (표 2의 Transformer (big)) 은 기존의 최고 성능 모델 (앙상블 포함) 보다 2.0 BLEU 이상 높은 점수를 기록하며 새로운 최고 BLEU score 28.4를 달성했다. 이 모델의 구성은 표 3의 마지막 행에 나열되어 있다. 

 

훈련에서는 8개의 P100 GPU를 사용해 3.5일이 소요되었다고 한다. 심지어 기본 모델(base model)조차도 이전에 발표된 모든 모델 및 앙상블보다 우수한 성능을 보이며 경쟁 모델들에 비해 훈련 비용이 훨씬 낮다.

 

WMT 2014 English-to-French translation task에서는 대형 모델이 BLEU score 41.0을 기록하며 이전에 발표된 모든 단일 모델보다 뛰어난 성능을 달성했다. 이와 동싱 기존 최고 성능 모델 대비 훈련 비용이 1/4 이하였다고 한다. 영어-프랑스어 번역을 위해 훈련된 Transformer (big) 모델에서는 기존에 기본적으로 사용된 드롭아웃 비율 P_{drop} =  0.3이 아니라 P_{drop} = 0.1 을 사용했다. 

 

Base 모델의 경우 10분 간격으로 저장된 마지막 5개의 체크 포인트를 평균내어 단일 모델을 생성했다고 한다. 대형 모델에서는 마지막 20개의 체크포인트를 평균내어 사용했다. 

더보기

💡 왜 체크포인트를 평균냈을까? (Averaging Checkpoints)

체크포인트란 모델이 훈련되는 도중 특정 시점에서 저장된 가중치(weight) 및 상태(state) 를 의미한다. Transformer 논문에서 수행한 것은 여러 개의 최종 체크포인트를 평균내어 하나의 단일 모델을 생성하는 기법이다. 

이것의 목적과 효과는 다음과 같다. 

1. 일관된 일반화 성능 향상

모델이 특정 체크포인트에서 훈련 데이터에 과적합될 수 있다. 때문에 여러 개의 체크포인트를 평균내면 개별 모델의 편향을 줄이고 더 일반화된 성능을 얻을 수 있다. 

2. 운 좋게 좋은 체크포인트를 뽑는 게 아니라 안정적인 성능 보장

훈련 과정에서 특정 체크포인트는 우연히 BLEU score가 높을 수 있지만 그 체크포인트가 항상 최적이라고 할 수 없다. 때문에 평균을 내면 모델의 일관된 성능을 보장할 수 있다. 

3. 추론 과정에서 더 부드러운 예측 가능

검증 데이터에서 성능이 불안정하게 변하는 문제를 줄일 수 있으며 개별 체크포인트보다 더 안정적인 번역 품질을 제공한다. 

Beam search에서는 Beam width = 4, 길이 패널티 α = 0.6을 사용했으며 이러한 하이퍼팔미터는 실험 후 결정되었다고 한다. 추론 과정에서 최대 출력 길이는 입력 길이 + 50 으로 설정했으며 가능하면 조기에 종료하도록 했다고 한다. 

더보기

💡 Beam search?

Beam search는 자연서 생성 (NLG) Task에서 널리 사용되는 탐색 알고리즘으로 번역, 텍스트 생성, 음성 인식 등의 작업에서 가장 가능성 높은 출력을 선택하는 데 사용된다. 동작하는 방법은 다음과 같다. 

출처: https://velog.io/@nawnoes/%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC-Beam-Search

원래 문장을 생성할 때 처음엔 모든 가능한 다음 단어의 확률을 계산한다. 여기서 Beam width(빔 크기)만큼의 후보를 유지한다. Beam width는 한 번에 고려할 가능한 문장 조합의 개수를 의미하는 것으로 만약 Beam width가 3이라면 ㅏ가장 높은 확률을 가진 3개의 후보만 유지하는 것이다. 이 다음 각 후보에서 다시 다음 단어를 예측하고 확률을 곱해서 확장된 문장 후보들의 점수를 계산한다. 이 과정을 출력 길이가 최대 길이에 도달할 때까지 반복한다. 여기서 확률값이 길이가 길어질수록 작아지는 문제를 해결하기 위해 α = 0.6와 같은 길이 패널티를 적용한다. 

Beam search의 장점은 무엇일까?

Greedy Search(탐욕적 탐색, 즉 한 번에 가장 확률 높은 단어를 고르는 방식)보다 더 나은 번역 품질을 보장한다는 것이다. 때문에 전체 문장 수준에서 더 좋은 선택을 할 가능성이 높다.

표 2에서는 기존의 다른 모델 아키텍처와 비교해 Transformer의 번역 품질 및 훈련 비용을 요약한다. 본 논문에서는 모델 훈련에 사용된 부동소수점 연산량(floating point operations)을 훈련 시간, 사용된 GPU 수, 각 GPU의 단정밀도(single-precision) 연산 성능 추정치를 곱해 산출했다. 

6.2 Model Variations

Transformer의 다양한 구성 요소가 성능에 미치는 영향을 평가하기 위해 기본 모델을 여러 방식으로 변형해 성능 변화를 측정했다. 실험은 WMT 2014 English-to-German translation 개발 세트에서 진행했으며 Beam search는 사용하고 체크포인트 평균 처리를 적용하지 않았다. 

 

표 3은 이러한 결과를 설명하고 있다. 

표 3의 (A) 행에서는 Attention head 개수 및 Attention key, value 차원을 변경하면서 연산량을 동일하게 유지했다. 여기서 단일 헤드 어텐션(single-head attention)은 최적 설정보다 BLEU score가 0.9 낮았으며 반대로 너무 많은 헤드를 사용할 경우 성능이 감소하는 것을 알 수 있었다. 

표 3의 (B) 행에서는 Attention key 크기 d_k 를 줄이면 모델 성능이 저하됨을 알 수 있다. 이는 호환성(compatibility)을 결정하는 것이 쉽지 않으며 단순한 내적(dot product)보다 더 정교한 호환성 함수가 유용할 가능성이 있음을 시사한다.

표 3의 (C) 및 (D) 행에선 더 큰 모델이 더 나은 성능을 보이며 Dropout이 Overfitting 방지에 효과적임을 알 수 있다. 

표 3의 (E) 행에서는 기존 사인파 위치 인코딩(sinusoidal positional encoding)을 학습 가능한 위치 임베딩(learned positional embeddings)으로 대체했다. 그 결과 기본 모델과 거의 동일한 성능을 보였다. 

6.3 English Constituency Parsing

또한 본 논문에서는 구문 분석 실험을 진행했다. 구문 분석 실험의 목적은 Transformer가 다른 NLP task에도 일반화될 수 잇는지 평가하기 위함이다. 해당 Task는 다음과 같은 어려움을 가지고 있다. 

1. 출력 구조가 강한 제약을 받는다. 문장이 문법적 계층 구조를 따라야 하기 때문이다. 

2. 출력 길이가 입력보다 훨씬 길다. 일반적인 기계 번역보다 더 복잡한 구조인 것이다. 

3. 기존 RNN 기반 Sequence-to-Sequence 모델이 소규모 데이터 환경에서 SOTA 성능을 달성하지 못했다. 

 

가장 먼저 4-layer Transformer를 사용했고 d_{model} = 1024로 설정했다. 데이터셋은 WSJ (Wall Street Journal) 데이터셋을 사용햇으며 약 40K의 문장이 들어있다고 한다. 또한 반지도 학습(Semi-supervised setting)을 진행해 WSJ 데이터셋 외에도 17M 문장을 포함하는 대형 코퍼스를 사용했다. 어휘 크기는 16K 토큰 (WSJ 전용 학습)과 32K 토큰 (반지도 학습) 이라고 한다. 

Dropout과 Attention 및 잔차 설정은 실험을 통해 선택했으며 나머지 하이퍼파라미터는 English-to-German translation task에서 사용한 기본 모델과 동일하게 유지했다. 추론 과정 설정에서 최대 출력 길이는 입력 길이 + 300, Beam width는 21, 길이 패널티는 0.3으로 설정했다. 

실험 결과, Task 특화 튜닝 없이도 Transformer가 매우 우수한 성능을 보였다. 이전 모델들보다 높은 성능을 기록했으며 단 하나의 예외 모델인 Recurrent Neural Network Grammar (RNNG)을 제외하고는 모두 뛰어넘었다. 특히 기존 RNN 기반 Sequence-to-Sequence 모델과 달리, Transformer는 WSJ 데이터셋 (40K 문장) 만으로도 BerkeleyParser보다 우수한 성능을 달성했다.즉, 추가적인 하이퍼파라미터 튜닝 없이도 SOTA에 근접한 성능을 달성했음을 알 수 있으며 이는 트랜스포머의 강력한 모델링 능력을 시사한다고 볼 수 있다.

 

7. Conclusion

Transformer는 완전히 Attention 기반으로 동작하는 최초의 Sequence transduction 모델이며 기존 Encoder-Decoder 아키텍처에서 일반적으로 사용되던 순환 신경망을 Multi-headed self-attention으로 대체했다. 

Transformer의 성능 및 장점을 요약하면 다음과 같다. 

Translation task에서 순환 (RNN) 또는 합성곱 (CNN) 기반 아키텍처보다 훨씬 빠르게 훈련이 가능했다. 또한 WMT 2014 English-to-German WMT 2014 English-to-French translation task에서 새로운 SOTA를 달성했다. 특히 WMT 2014 English-to-German translation task에서 기존의 모든 앙상블 모델을 초월하는 성능을 기록했다. 

본 논문의 결론 부분에선 향후 연구 방향도 밝힌다. Attention 기반 모델의 가능성에 대한 기대를 드러내며 이를 다양한 다른 Task로 적용할 계획이라고 밝혔다. 또한 텍스트 이외의 입출력 모달리티를 포함하는 문제로 Transformer를 확장할 계획이며 대규모 입출력을 더 효율적으로 처리하는 방법을 탐색할 것이라고 이야기했다. 마지막으로 생성 과정을 덜 순차적으로 만드는 방법도 연구 목표 중 하나라고 밝히며 논문을 마무리한다. 


참고한 사이트