본문 바로가기

논문

[논문 공부] Transformer : Attention IS All YOU NEED

Transformer : Attention IS All YOU NEED

원문 : 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


개요

이번 포스팅에서는 Attention is All YOU NEED 논문을 공부합니다.

나는 사용했다 구글번역기 번역을 위해서


Reference

동빈나님 강의 : Attention is All you Need


들어가기 전

constituency parsing(구문 분석)

  • 문장을 중첩된 성분으로 나누어 문장 구조를 파악하는 방법

auto-regressive(자기 회귀 모형, AR)

  • 출력 변수가 자신의 이전 값과 확률적 항(불완전하게 예측 가능한 항)에 선형적으로 의존함을 지정

residual connection

  • layer를 거치는 동안 gradient vanishing 문제를 해결해주는 방법

Title : Attention IS All YOU NEED

Abstract

이 논문이 나오기 전까지는 Encoder와 Decoder를 포함한 CNN과 RNN을 기반으로 하는 Sequence 간 변형이 일어나는 모델을 neural network를 사용하는 것이 지배적이 었음

또한 Encoder와 Decoder 구조에 Attention 메커니즘을 활용했을 때 보다 성능이 좋아진 사실을 알 수 있음

이 논문에서는 recurrence 와 convolutions를 완전히 제거하고, 오직 Attention 메커니즘에 기반하는 'Transformer' 아키텍처를 제안한다.

Attention 메커니즘만 활용했기 때문에, 행렬곱을 이용해서 완전한 병렬처리가 가능함. recurrence 하게 Sequence를 처리했으면 병렬 처리는 힘듦

WMT2014 데이터셋을 사용해, 영어 -> 독일어, 영어 -> 불어로 변환하는 작업에서 훨씬 좋은 성능을 확인함

Transformer는 기계번역뿐만 아니라, Sequence 데이터를 처리하는 다양한 테스트에서 일반화가 가능하고 성능이 잘 나오는 것을 확인했으며, 대표적으로 구문분석 분야에서도 좋은 성능을 보였음

 

요약 : Attention 메커니즘만 사용한 신경망 모델인 'Transformer' 가지고 왔다.


1. Introduction

Recurrent 한 모델들(RNN, LSTM, GRU)은 Sequence Data 모델링을 위해서 효과적으로 사용되고 있고, Sequence에 포함되어있는 각 토큰에 대한 순서 정보를 먼저 정렬하고 반복적으로 입력으로 넣어 Hidden State값을 경신시키는 방식으로 동작함

이러한 순환 구조로 동작하는 모델인 경우, Sequence 길이(= 토큰 개수)만큼 신경망에 입력을 넣어야 하기 때문에 병렬적인 처리가 어려움.

즉 layer의 output(출력)을 행렬곱으로 바로 못 구하고, 번역에서는 문장의 길이만큼 입력을 수행해야 하기 때문에 이는 메모리 및 속도 측면에서 비효율성을 야기함

본 논문에서는 recurrence를 피하고 대신 입력과 출력 사이의 'global dependencies'를 이끌어내는 Attention 메커니즘에 전적으로 의존하는 모델 구조인 'Transformer'를 제안함

Attention 메커니즘을 사용하기 때문에 한 번의 행렬곱으로 위치정보가 포함된 시퀀스를 한 번에 처리할 수 있는 장점이 있음(= 순차적으로 입력을 넣지 않기 때문에 병렬 처리가 가능)

이러한 특징으로 인해 8개의 P100으로 학습했더니 12시간 만에 상당히 좋은 결과를 얻음

 

요약 : 그러니까 Attention 메커니즘만 사용하는 신경망 모델 소개한다고


2. Background

Self-Attention은 Target문장을 만들기 위해서, Source(input) 문장에서 Hidden 정보를 참고하는 것이 아니라, 특정 문장이 있으면 자기 자신의 문장 스스로에게 Attention을 수행해서 representation 러닝 할 수 있게 함

다시 말해 하나의 Sequence가 있는 경우, 각각의 토큰들이 서로에게 가중치를 부여하도록 해서 효과적으로 학습하는 것

 

요약 : 문장에 단어들이 서로에게 가중치를 부여함, RNN처럼 H값이 계속 갱신 XX


3. Model Architecture

자주 사용되는 Encoder, Decoder 구조의 기계번역 모델은 대부분 아래와 같은 방식으로 동작함

  1. Encoder(인코더)는 Input Seq(x1~xn)를 연속적인 임베딩 벡터 z = (z1,..., zn)로 변형
  2. Decoder는  벡터 z가 주어지면, y1~ym까지 총 m개의 토큰으로 구성된 출력 문장을 만들어 냄

RNN 구조를 따르는 모델들은 Auto-regressive 하게 Sequence 길이만큼 네트워크 입력이 주어짐

 

요약 : RNN계열 모델들은 전 단계에서 생성된 symbol을 이용해 다음번에 나올 출력 값을 만드는 방식

 

물론 Transformer도 Encoder, Decoder 파트로 나눠지고 Self-Attention을 사용해 이러한 전반적인  아키텍처를 활용함

 

Transformer - model architecture

동작 순서(왼쪽 : Encoder , 오른쪽 :Decoder)

  • 상세 동작 방식은 뒤에 설명
Encoder part
  1. 문장 내 각각의 단어(Token)들의 위치 정보를 인코딩해서 입력하기 위해서 Positional Encoding 사용
  2. Input Embedding과 같은 차원으로 Positional Encoding은 합치기를 수행, 이 결과를 Embedding Vector로 사용
  3. Embedding Vector -> Query, Key, Value로 복제가 됨(Q, K, V). 그러니까 지금 Q, K, V는 다 같은 값
  4. Multi-Head Attention은 Self-Attention 방식으로 동작, 입력과 출력의 차원이 같음
  5. ADD(residual connection)과 Normalizaiton 수행
  6. Feed Forward Layer 거치고, 다시 ADD & Norm 수행
  7. 위 과정을 총 N번 수행(=N개의 인코더 Layer가 수행)
Decoder part
  1. Masked Multi-Head Attention에서는 Q, K, V값이 동일 -> Self-Attention 수행
  2. Multi-Head Attention에서는 Q값이 디코더에 있기 때문에(K, V값은 Encoder의 출력 값으로 받음) Encoder에서 어떤 단어를 참고하면 좋은지를 Attention 수행
  3. Encoder 파트와 동일하게 ADD & NORM -> Feed Forward Layer -> ADD & NORM 수행
  4. Linear layer를 거쳐 softmax 취함

3.1 Encoder and Decoder Stacks 

Encoder

6개 encoder layer를 중첩해서 사용

residual connection을 이용해 Normalization을 거치기 전, 그 입력값으로 identity mapping 할 수 있게 해 줌

Embedding Vector 차원은 512

 

Decoder

6개 Decoder layer 중첩해서 사용, Encoder layer 수랑 동일하게 해서 multi-head attention 수행 시 encoder 출력 값에 대해서 Attention을 수행할 수 있게 함

Encoder layer처럼 residual connection을 이용해 학습 난이도를 낮춤

Mask를 사용해 등장한 단어들만 참고할 수 있는 형태의 multi-head Attention을 사용


3.2 Attention

하나의 Q(Query)가 특정 Query에게 물어보는 것과 동일함.

Query : 질문하는 주체

Key : attention을 수행할 대상

쉽게 말해,

'먹는다'라는 하나의 단어가 생성되기 위해서는 '나는 국밥을 먹는다'라는 문장에 포함된 단어 중에 어떤 단어가 가장 중요했는지 물어보는 방식으로 각각의 Query가 Key에 대해서 Attention을 수행

Scaled Dot-Product Attention & Multi-Head Attention

Multi-Head Attention(우)는 각각의 Encoder과 Decoder에서 사용

이때, Multi-Head Attention은 내부적으로 Scaled Dot-Product Attention을 가지고 있음

그렇다면 Scaled Dot-Product Attention(왼쪽) 이란?
  1. Q, K, V가 입력으로 들어오면, 각각의 Q과 K에 대해서 질문(행렬곱)으로 이루어짐
  2. 또한 Softmax에 들어갈 값을 scaling 하기 위해 Scale layer를 사용함. Scaler layer는 K차원에 root를 씌운 값을 나눠줄 수 있는 형태로 사용
  3. Mask Vector는 필요시 사용
  4. Softmax를 취해서 각각의 K에 대해 얼마나 중요한지를 확률 형태로 변환
  5. 이 확률 값과 V를 곱해서 Attention Value값을 만들어 낼 수 있음

수식

  • Q*K^T 계산, 차원이 같아서 행렬곱이 가능
  • Sacle Vector(root (d_k))만큼 나누고, Softmax를 취함
  • V(Value)와 행렬 곱
Attention Value값을 만든 후 (오른쪽 그림)
  1. 위의 과정이 각각의 h(Head)마다 서로 다르게 이루어지고 결과를 합침(Concat)
  2. 합친 후에 Linear layer를 거친 뒤 출력 값을 내보냄
  3. 실제 구현에서는 입력값이 들어오면 -> V, K, Q로 복제가 되어서 들어가며 -> 각각의 Linear Layer는 임베딩 차원을 V, K, Q의 차원으로 변환해줌
  4. 만약 입력으로 들어오는 차원이 512, h가 8이면, 각각의 Linear는 64차원으로 매핑

3.2.2 Multi-Head Attention

  • Head가 여러 개라서 Multi-Head Attention
  • 각각의 head_1, head_2... head_n에 대해서 Attention을 수행한 값을 Concate
  • Concate 한 값을 Output값으로 내보내기 위해 W^O와 행렬곱 수행

  • 각각 i값은 head에 대한 인덱스 값
  • d_model : 기존의 임베딩 차원
  • 본 논문에서는 d_model =512, h=8로 설정해서, Q Vector의 차원을 64라고 설정

3.3 Position-wise Feed-Forward Networks

  • Encoder, Decoder 레이어네는 fully connected feed-forward network가 포함되어 있음
  • Position-wise : 개별 단어마다 적용됨
  • Network : Linear transformation -> ReLU -> Linear transformation 구조로 이루어짐
FFN : 순환 연결이 없는 네트워크, 즉 순환 네트워크(RNN)의 반대
FFN vs fully connected FFN

4. Why Self-Attention : 왜 Self-Attention 이 더 유리한지

아래와 같은 장점이 있음

  • 각각의 Layer마다 계산 복잡도가 줄어드는 장점
  • Recurrence를 제거해서 병렬 처리 가능
  • 장기 의존성 문제도 해결
  • 추가적으로 Attention 메커니즘 자체가 뉴럴 네트워크를 보다 설명 가능한 형태로 만들어주는 장점이 있음. 왜냐하면 각각의 단어가 어떤 단어에 영향을 많이 받았는지를 확인할 수 있기 때문

5. Conclusion

핵심은 Encoder와 Decoder에서 Attention만 사용하기 때문에 병렬화가 가능해지고 Q(Query)와 연관성을 가진 V를 계산할 수 있는 것