본문 바로가기

카테고리 없음

Attention is all you need 논문 리뷰

포스코 아카데미 들어와서 제일 잘한 게 영어논문스터디랑 알고리즘 스터디 들어온 건데 맨날 논문 읽는 거

거창하게 말하면 리뷰고, 그냥 해석? 및 느낀 점 등을 쓰려고 벼루기만 하다가 여유로워서(?! 프로젝트 기간인데 여유롭다 뭔가 잘못됐어......) 간단하게 해보려고 한다 ㅎㅎ 영어논문 자체를 스터디에 들어와서 처음 읽었고, 이게 4번째 논문이기때문에 논문초보인 나는 앤드류응교수님의 논문읽는방법을 참고해서 읽었다. 

 

1. Abstract

 

dominant sequence transduction는 인코더와 디코더를 포함한 복잡한 cnn이나 rnn 모델을 기반으로 한다.

최고의 성능을 보여주는 모델도 어텐션 메커니즘을 통해 인코더와 디코더를 연결해준다.

cnn이나 rnn없이 attention 메터니즘만을 사용한 transformer라는 모델을 소개할 것이다. 

기계변역 실험을 통해서 더 잘 병렬처리하고 , training 단계의 소요시간을 더 줄이면서 우수한 성능인 것을 보여주겠다.

 

 

2. Introduction

rnn , lstm , gru 등이 언어모델링이나 기계번역 같은 sequence modeling and transduction problems에서 SOTA를 달성해왔다. recurrent 언어모델과 인코더-디코더구조의 경계선을 뛰어넘기위해 (점점 좋아지기위해) 수많은 노력을 해오고있다. recurrent 언어모델은 인풋,아웃풋 시퀀스의 위치에 따라 연산을 한다. 연산과정에서 step에 따라 위치를 정렬하면서 , hidden state의 시퀀스 $h_{t}$를 생성한다. 이런 구조(rnn의 구조)는 병렬화가 안되는데 메모리가 많이 들기때문에 긴 문장에서는 critical하다. 최근에는 factorization tricks 과 conditional computation 을 사용하면서 계산효율도 좋아지고 모델 성능도 향상됐지만 그래도 아직은 시퀀스 계산에 대한 기존제약이 남아있다.

 attention 메커니즘은 많은 taskdml sequence modeling and transduction models 에서 꼭 필요한 존재다.

input, output sequence 안에서의 위치에 상관없이 독립적으로 모델링이 된다. (i love you, you i love와 같이)

 

 transformer 는 recurrence구조를 쓰지 않고, 인풋과 아웃풋이 서로 독립적일수 있도록 attention mechnism만 사용한 구조다. 더욱 병렬처리가 잘 되고 좋은 성능을 보였다 

 

 

 

 

-> rnn모델이 이것저것 다 해서 성능이 좋아지긴 했지만 , 아직은 한계가 많다.

 

 

 

 

3 Model Architecture

인코더는 input sequence (x1, ..., xn) 를 continuous representations z = (z1, ..., zn)에 맵핑을 합니다. 

디코더는 한 번에 하나씩 내뱉으면서 z를 통해서 output sequence (y1, ..., ym) 를 생성한다.

매번 step에서 모델은 다음 symbol 을 만들 때 , input으로 집어넣을 전에 생성된 symbol들을 쓰면서 auto-regressive한다.

transformer도 인코더와 디코더에 self-attention , pointwise(해석학 할 때나 들었던건데 휴) , fc를 쌓아서 이런 구조를 가진다.

3.1 Encoder and Decoder Stacks

인코더는 동일한 layer가 6개 쌓여있고 , 각 layer마다 2개의 sub-layer가 존재한다.

2개의 sub-layer는 첫번째가 multi-head self-attention mechanism이고 , 두번째는position-wise (위치마다?) fully connected feed-forward network이다. 각각 sub-layer에 residual connection을 추가하고 , normalization을 해줬다. 

각각의 sub-layer의 output은 LayerNorm(x + Sublayer(x))이고 , e residual connections을 썼기때문에 sub layer나 embedding layer나 512차원의 output을 만들어낸다.

 

디코더도 동일한 6개의 layer가 쌓여있고 , 각 layer마다 3개의 sub-layer가 존재하는데 그 중 하나는 (encoder에는 없던 거 ) 인코더의 output을 multi-head attention 한다.  인코더와 비슷하게 디코더도 각각 sub-layer에 residual connection을 추가하고 , normalization을 해줬다. decoder stack의 self-attention sub-layer는 그 이후의 position이 어텐션되는 것을 막는다. 이게 바로 masking이고 , position i 를 예측해 output을 출력할때는 i보다 작은 즉 , 그 이전에 나온 output들에만 의존한다. (그 이후 output은 뭐가 나오든 신경x ) 

 

3.2 Attention

attention function은, Q, K ,V 모두 벡터일 때 , 쿼리 , 키-밸류 쌍을 output에 맵핑합니다. output은 value의 가중치합으로 계산되는데  , 각각의 value에 맞는 가중치는 query와 그에 맞는 key의 compatibility function에 의해 계산된다. 

3.2.1 Scaled Dot-Product Attention

query , key, value , key의 차원으로 구성된다 .   value의 weight을 구하기 위해  쿼리(A,B,C)에 대해서 모든 키(a,b,c)를 내적하고 ,  각각을 √ dk 로 나눈 후 softmax함수를 적용한다.  a set of queries를  matrix Q , matrices K , matrices V로 만든다.

자주 쓰이는 attention 메커니즘은 additive랑 dot-product attention 두가지다

dot-product attention은 $root{d_{k}}$로 나눠주는 거 말고는 transformer의 알고리즘과 도일하다 .

additive attention은 싱글 히든 레이어에 대해서 feedforwar network(ffn)을 사용하여 compatibility function을 사용한다.

둘 다 이론적으로 복잡한 건 똑같은데 , dot-product attention이 행렬연산에 최적화 돼 사용되기에 , 더 빠르고 공간효율적이다. (?메모리를 덜 먹는다는건가) . $d_{k}$가 작으면 두 메커니즘 모두 비슷하게 성능을 보이지만 , $d_{k}$가 크면 scaling을 하지 않으면 additive가 훨씬 뛰어난 성능을 보인다. $d_{k}$값이 크면 , dot product 값이 커져서 gradient가 극도로 작은 곳에서 softmax fuction을 취하게된다. 이 점을 방지하기위해 $d_{k}$로 나눠주는 거다. 

 

3.2.2 Multi-Head Attention

$d_{model}$차원의 Q,K,V를 가진 attention을 하나만 썼을 때보다 , 다르게 여러 번 했을 때 더 결과가 좋았다. 

각각의 projected된 쿼리 ,키 밸류에 대해서 병렬로 attention fuction을 해줬고  , $d_{v}$ 차원의 output value를 만들어냈다.  이들은 합쳐져서 한 번 더 projected 되고 , final value를 만들어낸다. (projected라는 게 가중치랑 곱해진단 뜻인가? 사영된다...? 뭐에 사영되지...?) multi head attention은 각자 다른 위치에서 각기 다른 정보들을 합한다.

이게 무슨 얘기인가 하면

single attention을 썻다면 it이라는거에 대해서 만약 the animal 이걸로만 바라봤을텐데,  

multi head attention을 통해 어떤 attention은 it에 대해서 the animal로 보고 어떤 attention은 cross the street으로 본다는거다. 

논문에서는 attention의 개수 ? head의 개수 ? ( h) = 8로 두어 $d_{k}$= $d_{v} $ = $d_{model}/ h$ = 64가 된다. 

각각의 head에서 차원들이 감소하기때문에 , 총 cost 비용은 full dimension일때의 single attention이랑 같다. 

 

3.2.3 Applications of Attention in our Model

transformer에서는 세가지 방법으로 썼다. 

1.  "encoder-decoder attention"에서는 query는 그 전의 decorder에서 오고,  key , value 는 encoder의 결과물이다. 디코더의 모든 포지션이 input sequence의 모든 포지션에 대해 참석할 수 있다. 

이런 어텐션 메커니즘은 기존 seq2seq모델과 동일하다. 

2. 인코더는 self-attention을 사용한다.  모두 다 이전 encoder layer의 결과물로 키 쿼리 밸류가 같은 곳에서 나온다.  인코더의 각각의 포지션은 인코더의 이전 레이어의 모든 포지션에 참석할 수 있다.

3. 유사하게 , 디코더의 self attention layer도  디코더의 모든 포지션이 참가할 수 있다.  현재 position 이후를 masking out한다.

 

3.3 Position-wise Feed-Forward Networks

attention sub-layer에 더해 인코더 디코더에 있는 각각의 layer들은 각각의 position에 대해서 fully- connected feed forward network(fc-ffn)를 포함한다.  두 개의 linear transformation 사이에 RELU activate함수가 들어간다.

즉 , linear transformation을 한 후 relu를 하고 다시 linear transformation한다는 뜻이당. 요러케

레이어끼리는 서로 다른 parameter를 쓰지만., 한 layer에서 만큼은 서로 다른 position이더라도 같은 linear transformation (w1, w2, b1, b2)를 사용한다. 다른 말로 하면 kernel 이 1짜리인 convolution을 두개 썼다는 얘기다.

인풋,아웃풋의 차원은 512이고 안에 있는 inner-layer는 2048차원이다.

 

3.4 Embeddings and Softmax

다른 시퀀스 변환 모델들과 유사하게 , 인풋토큰과 아웃풋토큰을 $d_{model}$만큼의 차원을 가진 벡터로 바꾸기 위해 학습된 embedding을 쓴다. 또한 디코더 아웃풋이 예측된 다음 토큰의 확률을 계산하기위해 학습된 linear transformation and softmax function을 쓴다. 

두 개의 embedding layer와 이전 softmax linear transformation은 같은 가중치 메트릭스를 쓴다.  embedding layer에선 이 가중치에 $root{d_{model})$을 나눠준다. 3.5 Positional Encoding

 

3.5 Positional Encoding

recurrence , convolution을 안 쓰기때문에, 모델에 sequence의 순서(I - 1 , LOVE - 2 , YO

U -3 같이)를 만들기 위해서 시퀀스 내 토큰의 상대적 혹은 젇래적인 위치에 대한 정보를 추가해줘야한다. 

encoder , decoder stack의 맨 아래에 있는 input embedding에 positional encoding을 추가한다.

embedding 과 같이 $d_{model}$ 차원을 가지고 두 개는 합쳐진다. (input embedding 벡터 + positional encoding 벡터)

 

pos는 위치고 i는 dimension이다. 

positional encoding의 각각의 dimension에 대해서 sinusoid가 대응한다. 

The wavelengths form a geometric progression (그냥 sin,cos함수 생각했을 때 x축의 범위 정도인 거 같다)는 2$pi$에서 10000 x 2$pi$다. sin, cos을 이용한 식을 쓴 이유는 상대적인 position을 더 잘 학습할 수 있기때문이다.

우리는 학습된 positional embedding를 가지고 실험해봤는데 , 두 버전다 거의 비슷한 결과를 만들어낸 걸 확인했다. 

trainig 시 만났던 제일 긴 길이보다 더 긴 길이를 test시에 만나도 잘 적응하기 때문에 sinusodial version을 선택했다.

 

4 Why Self-Attention

(x1, ..., xn) 을 같은 길이의 (z1, ..., zn)으로 맵핑하는데 recurrent and convolutional가 아닌 sellf-attention을 사용한 이유 세가지를 설명하겠다.

첫번째는 레이어당 총 계산 복잡도가 줄어들었다,

두번째는 많은 계산들을 sequential operations이 필요한 최소의 수만큼 병렬화가능해졌다. 

세번째는 긴 길이의 문장들도 dependency를 잘 학습할 수 있게 됐다.

많은 sequence  transduction tasks에서 긴 길이의 dependency는 핵심 도전? 이다. 이런 dependency를 학습하는 능력에 영향을 미치는 한가지 key는 네트워크에서의 forward와 backward이 길이다. 인풋,아웃풋 시퀀스에서 forward와 backward이 길이가 짧아질수록 긴 문장의 dependency를 학습하는 것은 더 쉬워진다.