AI 논문 해설/국가권력급

[국가권력급 논문 - 1] Attention Is All You Need - Transformer 시대의 서막

torchtorchkimtorch 2024. 6. 13. 15:19

문 원본 주소

https://arxiv.org/pdf/1706.03762

 

 

※ 오탈자, 내용 오류 지적, 질문은 댓글 또는 kimtorchedu@gmail.com로 이메일 남겨주시면 감사하겠습니다.

 

# 언어 모델의 왕좌를 차지한 Chat GPT에서 GPT는 Generative Pre-trained Transformer의 약자입니다. 그중 한 자리를 차지하고 있는 Transformer는 2017년 발표된 Attention Is All You Need에서 고안된 모델 구조입니다. 당시 RNN 등의 구조가 가지고 있는 한계를 압도적으로 극복해 내며, 이 글을 작성하고 있는 2024년까지도 대부분의 언어 모델은 이 Transformer의 구조를 차용하고 있습니다.


0. Abstract

Transformer는 CNN과 RNN을 배제한 채, Attention mechanism 만으로 인코더와 디코더를 연결해 주는 구조를 의미합니다. 그 결과는 다음과 같습니다.

 

- 기존 모델 대비 퀄리티의 압도적인 증가

- 병렬화 가능

- 학습 시간 감소

- 일반화 가능

 

# 이러한 Transformer의 장점들은 실제로 유의미한 것으로 증명되었고, 이후 NLP 뿐만이 아닌 딥러닝 전반에 걸쳐 엄청난 파급 효과를 가져왔습니다. 


1. Introduction

RNN, LSTM, GRU 등 기존 모델 구조의 단점은 다음과 같았습니다.

 

- 병렬적인 계산이 제한됨.

- 긴 시퀀스를 처리하는 데에 한계가 있음.

>> Sequential 연산의 근본적인 제약 사항

 

이러한 흐름 속에서, 거리와 상관없이 요소 간의 종속성을 모델링할 수 있는 Attention 구조가 등장하였습니다. 그러나 이 구조는 Recurrent 구조와 함께 사용된다는 한계를 지니고 있습니다. 

 

# 즉, 당시의 Attention은 기존의 RNN 등의 구조가 가진 단점을 완전히 극복하지는 못했습니다. 

 

따라서 Recurrence를 배제하고, Attention 구조만을 사용하여 Input과 Output 간의 전역 종속을 이끌어내는 Transformer를 고안하게 되었습니다. 효율적인 병렬화가 가능할뿐더러, 8개의 P100 GPU로 12시간의 학습 진행 후 번역의 퀄리티에서 SOTA를 달성하였습니다.  


2. Background

Extended Neural GPU, ByteNet, ConvS2S와 같이 Sequential 연산을 줄이기 위한 연구가 지속되었습니다. 이러한 모델에서는 두 포지션의 거리에 따라 연산의 수가 증가합니다. (ConvS2S는 선형적으로, ByteNet은 로그로) 때문에 거리가 어느 정도 존재하는 경우 종속성을 학습하는 것이 어렵습니다. Transformer는 이러한 연산량을 상수로 줄이는데, 이때 Attention가중치를 평균화하며 발생하는 해상도 감소를 Multi-Head Attention으로 상쇄합니다.

 

# Multi-Head Attention에 대한 내용은 3. Model Architecture을 다루며 소개하겠습니다. 여기까지는 Transformer가 기존에 존재하였던 모델 구조에서 거리에 따라 연산량이 폭발적으로 증가하는 문제를 해결한다라고 이해하시면 되겠습니다.

 

Self-attention은 시퀀스를 표현하기 위해 하나의 시퀀스 내에 다른 두 위치의 어텐션 점수를 계산합니다. E2E (End-to-end) 메모리의 경우 Recurrent attention 메커니즘을 사용하였습니다.

 

Transformer는 RNN 혹은 Convolution을 사용하지 않고 오로지 Self-attention에 의존한 최초의 Transduction 모델입니다.


3. Model Architecture

Transformer는 당시 경쟁력 있던 모델들이 가지고 있던 encoder-decoder 구조를 따라갑니다. 해당 구조는 다음과 같이 정의됩니다.

 

입력 시퀀스를 다음과 같이 가정했을 때,

 

$$ x_{1}\;,...\;,x_{n} $$

 

Encoder를 거쳐 표현된 연속적인 변환 시퀀스는 다음과 같습니다.

 

$$ z_{1},\;...\;,z_{n} $$

 

이것은 다시 Decoder를 거쳐 한번에 하나씩 출력 시퀀스를 생성해 냅니다. 

 

$$ y_{1}\;...\;,y_{m} $$

 

매 단계마다 모델은 Auto-regressive 하기에, 다음 시퀀스를 생성해 낼 때, 전에 생성해 냈던 출력들을 추가적인 입력 값으로 사용합니다.

 

# 수식을 이해하는데 필요한 정의입니다. 

 

<그림 1 - 트랜스포머 구조도>

 

Transformer은 인코더, 디코더 모두 Stacked self-attention과 Point-wise, fully connected layers를 사용합니다. 

 

# Point-wise: 입력 시퀀스의 각 위치마다 별개의 연산을 수행한다는 것을 의미합니다.

# Fully connected: 모든 입력 뉴런이 출력 뉴런과 연결된다는 것을 의미합니다.

# 그림 1은 후술 할 Multi Attention까지 아셔야 완벽한 이해가 가능합니다. 지금은 그냥 이렇게 생겼구나,라고 생각하시면 됩니다.

3.1 Encoder and Decoder Stacks

Encoder: Encoder는 6개의 동일한 레이어로 구성되어 있습니다. 각각의 레이어는 두 개의 하위 레이어를 갖고 있습니다. 첫 번째 하위 레이어는 Multi-head self-attention 구조이며, 두 번째 하위 레이어는 position-wise fully connected 된 feed-forward network입니다. 각각의 하위 레이어엔 residual connection을 사용하고, 이후 layer normalization을 수행합니다. 

 

# Residual connection:  입력을 몇 개의 레이어를 거친 후 다시 더해주는 방식으로 기울기 소실 문제를 완화하는 기법입니다.

# Layer normalization: 각 레이어의 출력을 정규화함으로써 학습 안정성을 높이는 기법입니다. 

 

따라서, 각 하위 레이어의 출력은 LayerNorm(x + Sublayer(x)) 로 나타낼 수 있습니다. 이러한 Residual connection을 위해, 하위 레이어와 임베딩 레이어는 동일하게 512차원의 출력을 생성해 냅니다. 

 

# Residual connection은 하위 레이어를 거친 값에 거치기 전 값(임베딩 레이어의 출력값)을 더해주는 방식이기 때문에, 두 값이 동일한 차원이어야 연산이 용이합니다.

 

Decoder:  Decoder 역시 마찬가지로 6개의 동일한 레이어로 구성되어 있습니다. 그러나 Encoder와 달리, Decoder에는 세 번째 하위 레이어가 추가됩니다. 해당 하위 레이어는 Encoder의 출력에 대한 Multi-head attention을 수행합니다. 또한, Decoder의 Self-attention을 담당하는 레이어는 해당 위치 이후의 위치를 참조하지 않도록 수정하였습니다.

 

# 설명이 다소 어렵게 되었는데, 출력을 하나씩 생성하는 과정에서 미래의 정보를 참조하지 않도록 수정했다고 이해하시면 될 것 같습니다. Decoder는 시퀀스를 순차적으로 생성해야 하는데, 이러한 조치를 취하지 않는다면 예측에 미래의 정보가 포함되기 때문에 정확성이 다소 떨어질 수 있기 때문입니다. 이 논문에서는 이러한 과정을 'Masking'이라고 표현하고 있습니다.

3.2 Attention

Attention 메커니즘은 벡터로 구성된 Query와 Key-Value 쌍을 출력과 매핑합니다. 출력은 값들의 가중치 합으로 계산됩니다. 이때, 각각의 값에 부여된 가중치는 Query와 해당 키의 Compatibility 함수에 의해 계산됩니다. 

 

# 본격적으로 이 논문에서 고안한 구조를 들어가기 전에, Attention 구조를 이해하고 가시는 게 좋습니다. Attention 자체는 이 논문이 처음으로 고안한 것이 아니기 때문에, 설명이 매우 간략하게 구성되어 있습니다. 우선 기본적인 사항만 짚고 넘어가려 합니다. 만약 Attention 구조에 대한 이해가 있으신 분들이라면 바로 3.2.1 Scaled Dot-Product Attention으로 넘어가셔도 좋습니다. 

 

Attention 구조의 핵심은 Query, Keys, Values 이 세 가지입니다. Attention 구조는 어떤 과정을 거쳐 서로 간의 관련성을 계산할까요?

 

"The cat walks on the frozen Han River"이라는 문장을 예시로 들겠습니다.

 

Query (Q): 특정 단어의 벡터 표현입니다. 예를 들어, "River"에 대한 Attention을 계산한다면 "River"이 Query가 됩니다. 

 

Keys (K): 입력으로 주어진 문장 내의 모든 단어 각각의 벡터 표현을 의미합니다. 이 문장에서는 "The", "cat", "walks", "on", "the", "frozen", "Han", "River"이 각각 Key로 사용됩니다. 간편한 설명을 위해 다음과 같이 표현하겠습니다. 

 

$$ \color{blue} [k_{1},\,k_{2},\,k_{3},\,k_{4},\,k_{5},\,k_{6},\,k_{7},\,k_{8}] $$

 

Values (V): 문장 내의 모든 단어의 벡터 표현입니다. 마찬가지로 "The", "cat", "walks", "on", "the", "frozen", "Han", "River"이 각각 Value로 사용됩니다.

 

$$ \color{blue} [v_{1},\,v_{2},\,v_{3},\,v_{4},\,v_{5},\,v_{6},\,v_{7},\,v_{8}] $$

 

여기서 "River" 이 Query라고 가정하겠습니다. (q)

 

먼저, 쿼리 q와 각 키의 유사도를 계산합니다. 유사도를 측정하는 방법은 다양합니다. 이 논문에서 사용된 유사도 측정 방법은 후술 하겠습니다. 다음과 같이 나타낼 수 있습니다. 

 

$$ \color{blue} f(q,k_{1}),\,f(q,k_{2}),\,f(q,k_{3}),\;...\;,f(q,k_{8}) $$

 

해당 과정을 거쳐 유사도 값을 Softmax 함수에 통과시키면 가중치를 얻을 수 있습니다. 가중치가 의미하는 바는, 해당 단어 (q)가 단어 k와 얼마나 밀접한 관련을 맺고 있는지로 이해하시면 됩니다..

 

$$ \color{blue} a_{1},\,a_{2},\,a_{3},\;...\;,a_{8} $$

 

이제, 각 단어의 실제 정보를 가지고 있는 v에 가중치 a를 곱하여 합산하면 최종 출력을 구할 수 있습니다. 표현식은 다음과 같습니다. 

 

$$ \color{blue} \sum_{i}a_{i}v_{i} $$

3.2.1 Scaled Dot-Product Attention

<그림 2 - Scaled Dot-Product Attention>

 

Key의 차원을 \(d_{k}\), Value의 차원을 \(d_{v}\)로 나타냅니다. Q와 모든 Key의 내적을 구하고, 각각의 값을 \(\sqrt{d_{k}}\)로 나누어줍니다. 이후 Softmax 함수를 거쳐 가중치를 얻습니다.

 

Query 집합에 대한 Attention 연산을 동시에 수행하기 위해, Query를 하나의 행렬 Q로 묶어 처리합니다. Key, Value 역시 마찬가지로 각각 행렬 K와 V로 묶습니다.

 

$$ Attention(Q,K,V)\,=\,softmax \left (\frac{QK^{T}} {\sqrt{d_{k}}}\right ) V $$

 

Additive Attention과 이론적인 복잡도는 동일하지만, 실제로는 Dot-product attention은 고도로 최적화된 행렬 곱 코드를 통해 훨씬 더 빠르고 공간 효율적으로 작동합니다. 여기에 \(\sqrt{d_{k}}\,\)을 분모로 취해주면서 Scailing을 진행하여 높은 k로 인해 발생할 수 있는 Gradient vanishing 문제를 예방합니다.



3.2.2 Multi-Head Attention

<그림 3 - Multi-Head Attention>

 

Q,K,V 전체에 단일 Attention만을 적용하는 것보다, 각각 \(d_{k}\), \(d_{k}\), \(d_{v}\) 의 차원으로 선형 투영하는게 유리하다는 것을 발견했습니다. 서로 다르게 학습된 선형 투형을 통해 h번 수행됩니다. 각각 투영된 Q,K,V는 병렬로 수행되어 \(d_{v}\)차원의 값을 얻고, 이 값들은 Concatenated 되어 다시 한번 투영됩니다.

 

단일 Attention head는 평균화로 인해 정보 결합이 억제되어 서로 다른 표현 공간을 동시에 주목하지 못하지만, Multi-Head Attention은 이것이 가능합니다.

 

# 선형 투영, Linear projection에 대해서 잠깐 짚어보고자 합니다.

 

우선, 선형 투영은 기본적으로 주어진 벡터를 다른 벡터 공간으로 변환하는 과정을 의미합니다. 그렇다면 이것을 왜 해야 하느냐,라는 궁금점이 드실 겁니다. 모든 딥러닝 모델은 복잡한 계산 과정 속에서 벡터를 사용합니다. 이때, 입력된 벡터를 원하는 차원으로 바꾸기 위해 선형 투영을 사용합니다. 따라서 투영된 출력 벡터를 y,투영 행렬을 W, 입력 벡터를 x라 한다면

 

$$ \color {blue} y\,=\,Wx $$

 

로 나타낼 수 있습니다. x가 a 차원, y가 b 차원이라면 W는 b x a 크기의 행렬이 됩니다. 

 

Transformer 모델은 \(d_{k}\,=\,d_{v}\,=d_{model}/h=64\)로 구성되었습니다. 각각의 헤드의 차원을 줄인 덕분에 충분한 차원성을 가지고서도 비슷한 컴퓨터 자원만을 필요로 하였습니다.

 

# 각기 다른 층에 선형 투영을 통해 입력 시퀀스를 표현하여 풍부하게 문장을 나타낼 수 있습니다. 이때 Attention을 여러 번 적용하며 발생하는 Computational cost는 선형 투영으로 줄어든 차원 때문에 상쇄됩니다.  

 

3.2.3 Applications of Attention in our Model

 

Transformer은 다음 세 가지 방식으로 Multi-Head Attention을 사용합니다

1. Encoder-decoder attention 층에서, Query는 이전의 Decoder 층에서,  Memory Key와 Value는 Encoder 층의 출력에서 발생합니다. 이러한 과정은 모든 Decoder가 입력 시퀀스의 모든 위치에 주목할 수 있게 합니다.

 

# 이 과정에서 Multi-Head Attention을 통해 시퀀스를 풍부하게 표현할 수 있습니다.

 

2. Encoder는 Self-attention 층을 갖고 있습니다. 각각의 위치에서 Encoder은 이전의 Encoder의 모든 위치에 주목할 수 있습니다.

 

# 즉, 동일한 시퀀스의 다른 위치와 상호 작용합니다. 따라서 모델은 입력 시퀀스의 각 요소와 다른 모든 요소와의 관계를 학습할 수 있습니다.

 

3. 2번의 사항은 Decoder에도 적용됩니다. 다만, 미래 (다음 시퀀스)의 정보를 Decoder가 참조하는 것을 막기 위해, Masking을 통해 해당 정보를 배제합니다.

3.3 Position-wise Feed-Forward Networks

각각의 위치에 대해 독립적이고 동일하게 적용되는 Fully connected feed-forward network가 Encoder과 Decoder에 적용됩니다. 이 과정은 ReLU 활성화 함수를 사용한 두 선형 변환으로 구성되어 있습니다.

 

이러한 선형 변환은 각기 다른 위치에 대해 동일하지만, 레이어에 따라 다른 파라미터를 사용합니다. 입력과 출력의 차원은 512, 내부 레이어의 차원은 2048입니다. 이 과정 사이에 커널 크기가 1인 Convolution을 적용하는 것과 유사하게 선형 변환을 사용합니다.

 

# 차원의 크기를 늘림으로써 모델이 더 다양한 차원에서 학습을 효과적으로 진행할 수 있도록 합니다.

3.4 Embeddings and Softmax

시퀀스 길이를 n, 표현 차원을 d, Convolution 커널 차원을 k, 각 토큰이 Attention을 적용할 범위를 r이라 한다면 복잡도는 다음과 같습니다.

 

표 1 - 복잡도 (원문 캡처)

 

# 해당 섹션에서는 임베딩 레이어의 스케일링과 가중치 공유에 대한 언급을 간략하게 하고 넘어갔습니다. 두 가지 기법은 어떠한 장점이 있을까요?

 

1. 임베딩 레이어 스케일링: 안정성을 높이고, 학습을 용이하게 합니다.

 

2. 가중치 공유: 모델의 파라미터 수를 줄이기 때문에 메모리 사용을 효율적으로 할 수 있습니다. 또한, 모델의 예측이 비교적 안정적입니다.

3.5 Positional Encoding

Recurrence와 Convolution을 배제한 모델이 시퀀스의 순서를 사용하도록 하기 위해, 위치 정보를 투영해 주었습니다. Encoder와 Decoder 층 아래에 Positional encoding을 더해주었습니다. 학습 중에 접한 시퀀스 길이보다 더 긴 시퀀스 길이를 처리하기 위해서 이 논문에서는 사인 함수를 사용하였습니다. 

 

# 사인 함수는 Periodic 하기 때문에, 시퀀스의 위치 정보를 주기적으로 인코딩할 수 있게 합니다. 


4. Why Self-Attention

다음 세 가지 요구사항으로 인해 Self-attention을 사용합니다.

 

1. 레이어당 전체 계산 복잡도

2. 병렬화할 수 있는 계산 양

3. 장기 의존성 간의 경로 길이

 

# 장기 의존성이 적용되는 경로 길이가 짧을수록 장기 의존성을 반영하기 유리합니다. 

 

또한, 문장의 구문적, 의미적 구조와 관련된 행동을 보입니다.

 

# Multi-Head Attention으로 인해 여러 측면의 시퀀스 표현이 가능하기 때문입니다.


마치며

첫 번째 국가권력급 논문이다 보니 다소 설명이 방대하였습니다. 혹시나 Transformer을 온전히 이해하시지 못했다면, 이 논문이 지속적으로 비교 대상으로 삼는 RNN 등의 기존 기법들을 추가적으로 공부하시는 것을 추천드립니다. 

 

Training, Results는 생략하였는데, 한 번쯤 스쳐 지나가듯이 읽어보셔도 좋을 것 같습니다. 

 

두 번째 국가권력급 논문 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding로 찾아뵙겠습니다. 감사합니다.