Transformer : Attention IS All YOU NEED
원문 : https://arxiv.org/abs/1706.03762
개요
이번 포스팅에서는 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 구조의 기계번역 모델은 대부분 아래와 같은 방식으로 동작함
- Encoder(인코더)는 Input Seq(x1~xn)를 연속적인 임베딩 벡터 z = (z1,..., zn)로 변형
- Decoder는 벡터 z가 주어지면, y1~ym까지 총 m개의 토큰으로 구성된 출력 문장을 만들어 냄
RNN 구조를 따르는 모델들은 Auto-regressive 하게 Sequence 길이만큼 네트워크 입력이 주어짐
요약 : RNN계열 모델들은 전 단계에서 생성된 symbol을 이용해 다음번에 나올 출력 값을 만드는 방식
물론 Transformer도 Encoder, Decoder 파트로 나눠지고 Self-Attention을 사용해 이러한 전반적인 아키텍처를 활용함
동작 순서(왼쪽 : Encoder , 오른쪽 :Decoder)
- 상세 동작 방식은 뒤에 설명
Encoder part
- 문장 내 각각의 단어(Token)들의 위치 정보를 인코딩해서 입력하기 위해서 Positional Encoding 사용
- Input Embedding과 같은 차원으로 Positional Encoding은 합치기를 수행, 이 결과를 Embedding Vector로 사용
- Embedding Vector -> Query, Key, Value로 복제가 됨(Q, K, V). 그러니까 지금 Q, K, V는 다 같은 값
- Multi-Head Attention은 Self-Attention 방식으로 동작, 입력과 출력의 차원이 같음
- ADD(residual connection)과 Normalizaiton 수행
- Feed Forward Layer 거치고, 다시 ADD & Norm 수행
- 위 과정을 총 N번 수행(=N개의 인코더 Layer가 수행)
Decoder part
- Masked Multi-Head Attention에서는 Q, K, V값이 동일 -> Self-Attention 수행
- Multi-Head Attention에서는 Q값이 디코더에 있기 때문에(K, V값은 Encoder의 출력 값으로 받음) Encoder에서 어떤 단어를 참고하면 좋은지를 Attention 수행
- Encoder 파트와 동일하게 ADD & NORM -> Feed Forward Layer -> ADD & NORM 수행
- 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을 수행
Multi-Head Attention(우)는 각각의 Encoder과 Decoder에서 사용
이때, Multi-Head Attention은 내부적으로 Scaled Dot-Product Attention을 가지고 있음
그렇다면 Scaled Dot-Product Attention(왼쪽) 이란?
- Q, K, V가 입력으로 들어오면, 각각의 Q과 K에 대해서 질문(행렬곱)으로 이루어짐
- 또한 Softmax에 들어갈 값을 scaling 하기 위해 Scale layer를 사용함. Scaler layer는 K차원에 root를 씌운 값을 나눠줄 수 있는 형태로 사용
- Mask Vector는 필요시 사용
- Softmax를 취해서 각각의 K에 대해 얼마나 중요한지를 확률 형태로 변환
- 이 확률 값과 V를 곱해서 Attention Value값을 만들어 낼 수 있음
수식
- Q*K^T 계산, 차원이 같아서 행렬곱이 가능
- Sacle Vector(root (d_k))만큼 나누고, Softmax를 취함
- V(Value)와 행렬 곱
Attention Value값을 만든 후 (오른쪽 그림)
- 위의 과정이 각각의 h(Head)마다 서로 다르게 이루어지고 결과를 합침(Concat)
- 합친 후에 Linear layer를 거친 뒤 출력 값을 내보냄
- 실제 구현에서는 입력값이 들어오면 -> V, K, Q로 복제가 되어서 들어가며 -> 각각의 Linear Layer는 임베딩 차원을 V, K, Q의 차원으로 변환해줌
- 만약 입력으로 들어오는 차원이 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를 계산할 수 있는 것
'논문' 카테고리의 다른 글
[논문 구현] Sequence to Sequence Learning with Neural Networks (0) | 2022.08.02 |
---|---|
[논문 공부] GPT-1 :Improving Language Understanding by Generative Pre-Training (0) | 2022.07.31 |
[논문 공부] LSTM(Long Short-Term Memory)(feat. RNN) (0) | 2022.07.16 |
[논문 공부] Sequence to Sequence Learning with Neural Networks (0) | 2022.07.11 |
[모델공부]U-Net : Image segmentations (0) | 2022.01.10 |