논문 리뷰

Attention is all you need (NeurIPS, 2017) paper review

해파리냉채무침 2024. 2. 29. 18:22

BERT,GPT 등 언어 모델에서 큰 영향을 준 transformer 모델이 해당 논문에서 발표되었다. 밑바닥 부터 시작하는 딥러닝 2 책에서도 attention 파트에서 설명하고 있는 모델이다. 논문 이해 후 코드 리뷰로 넘어갈것이다. 해당 포스팅에서는 논문 설명만을 먼저 한다.  완전히 번역하기 보다는 내가 이해하고 싶어서 paraphrasing을 좀 했다는것 주의할것  

 

논문은 여기서 https://arxiv.org/pdf/1706.03762.pdf

Abstract

통상적인 시퀀스 변환 모델은 반복 또는 encoder와 decoder를 포함하는 CNN (합성곱 신경망)을 기반으로 한다.

이 논문에서는 attention 메커니즘을 기반으로 하는 간단한 아키텍처인 transformer를 제안한다. 이 모델은  convolution과 recurrence를 배제한다. 이 모델을 이용하여 번역작업을 한 결과, 품질이 뛰어나면서도 병렬화가 가능하고, 훈련 시간이 훨씬 더 적었다. 

 

Introduction

Recurrent 모델(RNN)은 입력 및 출력 시퀀의 기호 위치를 따라 계산을 수행한다. 계산되는 시간에 따라 위치를 정렬하고, 이전 은닉상태 ht-1과 위치 t에 대한 input 함수로써 은닉상태의 ht를 생성한다. 이러한 특성으로 인해 병렬화가 불가능하여 시퀀스 길이가 길어질수록 문제가 생긴다. (seq2seq 모델에서는 고정길이 벡터로 인해서 항상 같은 길이의 벡터를 생성해서 필요한 정보가 다 담기지 못하는 한계가 있음) 최근 연구에서는 인수분해 기법과 조건부 계산을 통해 효율을 크게 개선하는 방안이 제시되긴 했으나 순차 계산의 근본적인 제약은 여전히 남아 있음

attention 모델은 입력 또는 출력 시퀀스의 거리와 상관없이 종속성(dependency)를 모델링 할 수 있게 해준다. 몇몇의 경우에서 이러한 attention은 recurrent network(RNN)와 접합하여 사용되기도 한다. 

여기서는 RNN을 사용하지 않고 attention 메커니즘에 전적으로 의존하여 input과 output간 전역(global) 종속성을 도출한다.

Background

transformer에서는 작업 횟수가 일정하게 줄어들지만,  attetnion 가중치가 적용된 위치를 평균화 하기 때문에 유효한 해상도가 감소하게 된다. 이러한 문제를 Multi-Head Attention으로 대응한다. 

 

Model Architecture

 

대부분의 시퀀스 모델처럼 encoder- decoder의 구조로 이루어져있다. 

encoder는 N번만큼 중첩이 되고 encoder의 마지막 layer 값에서 출력된 값 z가 나오면, decoder의 입력으로 들어간다

이 transformer 모델은 전체 아키텍처를 따라 decoder와 encoder 양쪽에 stacked self-attention과  point-wise(각 같은 위치에 있는 요소를 개별적으로 연산) , fully connected layers(입력, 은닉, 출력 layer)을 사용한다. 

Encoder and Decoder Stacks

encoder: 6개의 layer로 구성되어 있고, 각 레이어 마다 2개의 sub layer가 있다. 

첫번째는 multi-head self-attention , 두번째는 위치에 따라 연결된  feed-forward network이다. 두개의 sub layer 주위에 잔여학습(residual learning)을 사용한다. (잔여학습은 resnet 네트워크에서 사용되고, 학습이 필요한 남아있는 잔여한 정보인 F(x)만 추가적으로 학습하는것이다.) 그 다음 layer 정규화를 한다. 각 하위 layer의 출력은 LayerNorm(x + Sublayer(x))로 이루어진다. 모든 embedding layer, sub layer 모두 dmodel(dimension)=512 크기의 output을 생성한다.

 

decoder: decoder도 동일하게 6개의 layer, 두개의 sub layer 외에도 multi-head attention을 수행하는 세번째 sub layer가 들어간다. encoder와 마찬가지로 잔여 학습에 대한 연결을 한 후, layer normalization을 한다. decoder의 self-attention sub-layer를 수정하여 위치가 다음 위치에 영향을 주는 것을 방지하도록 한다. 이 마스킹(Masked- head ㅡmulti attention)은 output embedding이 한 위치씩 positional encoding 된다(위치 정보를 포함하고 있는 matrix(positional encoding)와  embedding matrix가 element wise(원소별 합)이 된다) 위치 i에 대한 예측은 i보다 작은 위치(i-1)의 알려진 출력에 의존한다. 

Attention

아래 자료를 보고 추가적으로  additive attention,  dot-product (multiplicative) attention 에 대해 더 공부했다.

https://ctkim.tistory.com/entry/Attention-Mechanism

 

어텐션 메커니즘 (Attention Mechanism)이란?

1. Attention Mechanism란? seq2seq 모델은 기존의 RNN 모델과 같이 고정된 길이의 벡터를 입력으로 받아 고정된 길이의 벡터를 출력하는 구조를 가지고 있습니다. 그러나 이 구조는 고정된 길이의 벡터

ctkim.tistory.com

 

attention 함수는 key와 value를 출력에 매핑하는 것으로 설명된다. 쿼리와 키, output은 모두 vector 이다. 

output은 value의 가중치 합이다.각 값에 할당된 가중치는 해당 key와 query의 호환성 함수에 의해 계산된다.

 

Scaled Dot-Product Attention

Scaled Dot-Product Attention은 query와  key의 차원 dk,  value의 차원 dv로 이루어져있다.

모든 query와 key의 transpose를 행렬곱한 다음, sqrt(dmodel(=512))로 나누고, value 값을 곱하고 softmax를 적용한다 

https://github.com/ndb796/Deep-Learning-Paper-Review-and-Practice/blob/master/lecture_notes/Transformer.pdf

통상적으로 쓰이는 attention 함수는 additive attention과 dot-product (multiplicative) attention이

additive attention 단일 은닉층이 있는 feed-forward network를 사용하여 호환성 함수를 계산한다. 이론적 복잡성은 비슷하지만,  dot-product attention이 행렬 곱셈을 사용하여 구현할 수 있기 때문에 실제로는 훨씬 빠르고 효율적이다. dk(dimension of key)값이 작은 경우에는 두 attention의 성능이 비슷하지만, dk값이 큰 경우에는 dot-product attention이 더 뛰어나다. 

 

multi- head attention

key와 value, query들을 각각의 단일 attention으로수행하는것 보단 query와 , key value를 h차원으로 선형적으로 투영하여 각각의 dk과 dv를 얻는 것이 더 효과적이다. 이렇게 예상되는 query, key 및 value의 각 버전에 대해 attention 함수를 병렬로 수행하여 dv 차원의 출력 값을 생성한다. multi- head attention은 서로 다른 표현 공간에서 정보를 동시에 주목하게 해준다( 각 attention head는 입력 데이터의 다른 특성에 주목하게 되므로, 모델은 데이터의 다양한 표현을 동시에 학습할 수 있다) 단일 attention head를 사용할 경우, 여러 위치의 정보를 평균화하게 되어 다양한 표현 공간의 정보를 동시에 주목하는 것이 어렵다

 

https://github.com/ndb796/Deep-Learning-Paper-Review-and-Practice/blob/master/lecture_notes/Transformer.pdf

이 논문에서 h=8, dk = dv = dmodel/h = 64로 두었다. 각 head의 차원이 줄었기 때문에 (512-> 64) 총 cost는 전체 차원을 가진 single-head attention(single attention을 concat한 것)과 비슷하다. 

Multihead(Q,K,V)를 한 후에 차원이 동일하게 유지된다. 

https://github.com/ndb796/Deep-Learning-Paper-Review-and-Practice/blob/master/lecture_notes/Transformer.pdf

 

Applications of Attention in our Model

transformer 모델은 multi -head attention을 3가지의 방법으로 사용한다.

- encoder- decoder attention: query는 이전 디코더 계층, 메모리  key와 value은 인코더의 출력에서 가져옴. 이렇게 하면 디코더의 모든 위치가 input 시퀀스의 모든 위치에 액세스할 수 있게 한다. 

 

-encoder self - attention: 모든 key, value, query가 같은 위치(이 경우 encoder의 이전 레이어의 출력)에서 나온다. encoder의 각 위치는 이전 encoder 레이어에 있는 모든 위치에 액세스할 수 있다.

- Masked Decoder Self-Attention: decoder의 self attention 계층은 해당 위치+ decoder의 모든 위치에 attend 할 수 있도록 한다. auto-regressive(자기 회귀모델, 변수의 과거 값의 선형 조합을 이용하여 관심 있는 변수를 예측 )를 유지하려면 디코더에서 왼쪽으로 정보가 흐르는 것을 방지해야한다. (앞쪽 출력만 참고하도록 해야함) scaled dot-product attention 의 입력의 모든값을  mask matrix 값으로 음수 무한(-∞)의 값을 넣어 softmax 함수의 출력이 0에 가까워지도록 한다. 

 

Position-wise Feed-Forward Networks

encoder와 decoder의 각 레이어에는 attention sub layer 외에도 완전히 연결(fully connected)된 feedforward network가 포함되어 있다. 각 위치에 개별적으로 동일하게 적용된다. 두개의 선형변환으로 구성되며, 선형변환 사이에 ReLU 활성화 함수로 구성된다. 

FFN(x) = max(0, xW1 + b1)W2 + b2

 

선형 변환(행렬 곱셈과 편향 추가)이 입력의 각 위치(각 단어 또는 토큰)에 독립적으로 적용된다. 이는 모든 위치가 동일한 변환을 공유하지만, 각 위치에서는 서로 다른 입력 데이터에 적용된다.  레이어마다 다른 파라미터를 사용한다. 커널 크기가 1x1 합성곱 두개로 볼 수 있다. 1x1 합성곱은 각 위치에서 독립적으로 적용되며, 채널 간에 정보를 섞는다. Pointwise Feed-Forward Networks의 입력과 출력 차원이 512이고, 내부 레이어의 차원이 2048이다. 네트워크가 입력을 먼저 2048차원 공간으로 확장하고, 그 다음 다시 512차원 공간으로 줄이는 구조를 가지고 있음

 

Embeddings and Softmax

다른 sequence 변환 모델과 마찬가지로, 학습된 임베딩을 사용하여 input 토큰과 output 토큰을 차원 dmodel의 벡터로 변환한다. 일반적인 학습된 선형 변환과 소프트맥스 함수를 사용하여 decoder로 출력을 하고 토큰 확률로 변환한다. 소프트맥스 이전 선형 변환 간에 동일한 가중치 행렬을 공유한다. 임베딩 레이어에서는 이러한 가중치에 √dmodel을 곱한다.

 

Positional Encoding

RNN과 컨볼루션 신경망이 없기 때문에 시퀀스의 순서를 활용하려면 토큰의 상대적 또는 절대적 위치에 대한 정보를 주입해야 한다. embedding matrix에 위치 정보를 포함하고 있는 임베딩을 element wise(원소별 합)을 한다.

pos는 위치, i는 차원이다. positional encoding의 각 차원은 사인(sin) 곡선에 해당한다. 파장은 2π에서 10000 - 2π까지의 기하학적 진행을 형성한다. 고정된 오프셋 k에 대해  P Epos+k는 P Epos의 선형 함수로 표현할 수 있기 때문이다.

https://mathbang.net/529#gsc.tab=0

sinusoidal version( 사인과 코사인 함수를 이용한 포지션 인코딩 방식 )을 선택한 이유는 모델이 훈련 중에 발생하는 시퀀스 길이보다 더 긴 시퀀스 길이로 추정할 수 있기 때문이다. 특정 위치에서의 인코딩 값이 주기적인 패턴을 가지며, 이는 다양한 길이의 시퀀스를 처리하는 데 유용하다.

 

Why Self-Attention

RNN이 아닌 self- attention을 사용하는 이유에 대해서 서술한다. 길어서 포스팅 작성자 마음대로 요약했다. 

 

self-atttention은 계산 복잡성이 더 낮다. 만약 시퀀스 길이 n이 차원 d보다 작으면 self attention이 RNN보다 빠르다.

또한 모든 위치를 시간의 순차 연산으로 연결할 수 있다.(= 병렬 계산을 할 수 있다) RNN은 순차연산이 필요하다.

입력과 출력 시퀀스의 모든 위치 조합 사이의 경로가 짧을수록 장거리 의존성을 학습하는 것이 더 쉽다. self attention은 이러한 길이를 최소화한다. 

추가로 CNN 계층은 모든 입력과 출력 위치의 쌍을 연결하지 않아 네트워크 내 위치 사이의 경로가 길게 생기게 된다.

 

Training

Optimizer

최적화 함수로 adam optimizer를 썼고, 파라미터는 β1 = 0.9, β2 = 0.98 ε는 10^-9로 설정했다. 

 

처음 warmup_steps(=4000) 훈련 단계 동안 학습률은 선형적으로 증가하고, 그 이후에는 단계 수의 역제곱근에 비례하여 감소한다. 

Regularization

잔차 드롭아웃 -> 각 sub layer의 output에 dropout을 적용하고, 이를 sub layer의 input에 더하고 정규화한다. 

encoder와 decoder 의 embedding과 positional encoding에도 드롭아웃을 적용한다. 베이스 모델에서는 드롭아웃 비율 Pdrop을 0.1로 설정하였다.