기존 sequence transduction model들은 인코더와 디코더를 포함한 복잡한 recurrent나 cnn에 기반함
가장 성능이 좋은 모델 또한 attention mechanism으로 인코더와 디코더를 연결한 구조임
Transformer는 온전히 attention mechanism에만 기반한 구조(recurrence나 convolution은 사용x)
→ 더 parallelizable하고, 훨씬 적은 학습 시간이 걸림
RNN, LSTM, GRU는 sequence modeling과 language modeling, machine translation등의 transduction problem에서 SOTA를 달성
Recurrent mode은 입력과 출력의 symbol position에 따라 계산을 수행: 시간에 따라 hidden state를 생성하며 이 때 이전 timestep의 hidden state와 현재 timestep의 input을 활용하기 때문에 문제가 됨
→ 이는 근본적으로 훈련 example들을 병렬화하여 처리할 수 없음
→ 더 긴 sequence를 처리하기 어려워짐 (메모리는 한정되어 있기 때문)
최근 연구에서 factorization trick과 conditional computation을 통해 계산 효율성을 많이 개선
→ 그러나 여전히 근본적인 sequential computation의 문제는 남아있음
Attention mechanism은 입력과 출력 sequence의 사이의 거리에 상관없이 dependency를 모델링함으로써 다양한 과제에서의 sequence modeling과 transduction problem에서 매우 중요한 부분이 되었지만, 거의 대부분의 경우 recurrent network와 함께 사용됨
input과 output간 global dependency를 뽑아내기 위해 recurrence를 사용하지 않고, attention mechanism만을 사용한 Transformer 모델 제안: parallelization이 가능해 적은 시간으로 translation quality에서 SOTA를 달성
sequential computation을 줄이는 것은 Extended Neural GPU, ByteNet, ConvS2S에서도 다뤄짐
→ Transformer에서는 Multi-Head Attention을 사용해 상수 시간으로 줄어들게 함
Self-attention(=intra-attention)
End-to-end memory network
→ Transformer는 온전히 self-attention에만 의존한 최초의 transduction model(sequence-aligned RNN이나 Convolution을 사용하지 않음)
Transformer는 크게 encoder와 decoder로 나뉘며, encoder는 입력인 symbol representations (x1,…,xn)을 continuous representations z=(z1,…,zn)으로 매핑
z가 주어지면, decoder는 한번에 한 원소씩 출력하여 sequence (y1,…,yn)를 생성
다음 단계의 symbol을 생성할 때 이전 단계에서 생성된 symbol을 추가 입력으로 받는 자동회귀(auto-regressive)
Encoder
Decoder
Attention function = Query+(key-value) → output
입력은 d_k차원의 query,key / d_v차원의 value로 구성
query와 key의 모든 내적을 계산하고, 각각을 √d_k로 나누고, value의 가중치를 얻기 위해 softmax 적용
실제로는, query들에 대해 동시에 계산하기 위해 이를 행렬 Q로 묶고, 모든 key와 value 역시 각각 행렬 K와 V로 표현
가장 널리 쓰이는 attention function
d_model 차원 query, key, value로 단일 attention function을 쓰는 것보다
query, key, value를 h번의 linear projection을 통해 각각 d_k,d_k,d_v차원으로 변환한 뒤,
각각 다르게 h번 학습시키는 것이 더 효율적
→ 각각 따로 계산된 값들은 병렬적으로 attention function을 거쳐 d_v차원의 결과를 만들고, 이 값을 concat한 후 한번 더 선형 함수에 통과시켜(projected) 최종 출력값을 생성
h=8, d_k=d_v=d_model/h=64로 사용
각 head의 차원이 줄었기 때문에 단일 head attention과 계산량은 비슷
multi-head attention을 3가지 방법으로 사용
encoder와 decoder은 fully connected feed-forward network를 가짐: 각 position에 따로따로, 동일하게 적용됨
point-wise convolution→ReLU→point-wise convolution으로 진행
input, output의 dimesion은 512이고, hidden layer의 dimension은 2048
학습된 임베딩을 사용: input 토큰과 output 토큰을 d_model 의 벡터 차원으로 변환
decoder output을 예측된 다음 토큰의 확률로 변환하기 위해 linear과 softmax를 사용
(두 개의 임베딩 layer와 pre-softmax 선형 변환 사이에 같은 weight의 matrix를 공유)
임베딩 layer에서는 weight들에 sqrt{d_model+2}를 곱해줌
이 모델은 recurrence도 convolution도 사용되지 않기 때문에 sequence에 있는 원소들의 위치에 대한 정보를 따로 넣어야 함
인코더와 디코더 stack 아래의 input 임베딩에 Positional Encoding 을 추가
Positional Encoding은 input 임베딩처럼, 같은 차원 (d_model)을 가져서, 둘을 더할 수 있음
다양한 positional encoding 방법 중에, transformer는 다른 주기의 sine, cosine function을 사용
모델이 상대적인 position으로 쉽게 배울 수 있을거라 가정하여 위 function을 사용함
학습된 Positional Embedding을 사용해 실험을 해보았고, 두 방식은 거의 같은 결과를 보임
self-attention과 recurrent, convolutional layer을 비교
English-German
English-French
Residual Dropout:각 sub-layer의 output에 dropout을 적용 / embedding의 합과 positional encoding에 dropout을 적용 (0.1)
Label Smoothing: 학습 중 라벨스무딩 적용(0.1)
English-German translation task에서 big model이 SOTA를 달성
English-French tranlation task에서 big model이 SOTA를 달성
다양한 구성 요소의 중요성을 평가하기 위해 다양한 방식으로 기본 모델을 변경
English-German translation development set을 사용
(A): head가 많아질수록 score 낮아짐 / key, value dimension 변경해도 상수 시간을 갖음
(B): attention key size(d_k)를 줄이면 model quailty가 낮아짐
(C): bigger model이 더 나음
(D): dropout은 over-fitting을 피할 수 있음
(E): learned positional embedding으로 바꿨더니 똑같았음
다른 task에도 일반화 할 수 있는지 평가하기 위해 English Constituency Parsing(구문분석) 실험 진행
→ recurrent, convolution보다 더 빠르게 학습 가능(RNN Grammar 제외)
구체적인 tuning 없이도 SOTA 달성 성능을 보임
Transformer는 recurrence와 convolution을 모두 제거한, 오직 attention에만 의존하는 새로운 종류의 모델
→ 계산량을 줄이고 병렬화를 적용해 학습 속도가 훨씬 빠를 뿐만 아니라 그 성능 또한 state-of-the-art를 달성하는 수준
→ 이러한 attention에 기반한 모델은 다른 task들에 적용할 수 있음 (텍스트뿐만 아니라 이미지, 오디오나 비디오 등의 상대적으로 큰 input-output을 요구하는 task들에 효과적으로 사용할 수 있을 것)