워낙 유명한 논문이여서 이미 정리해놓은게 많지만... 나도 슬쩍
Vaswani, Ashish, et al. "Attention is all you need." Advances in neural information processing systems 30 (2017).
트랜스포머 모델의 학습은 대용량 데이터세트에서 매우 효율적이며 데이터의 양이 많은 기계 번역과 같은 작업에 적합하다. 언어 모델링 및 텍스트 분류와 같은 작업에서 매우 효과적인 것으로 나타났으며, 광범위한 자연어 처리 작업에서 높은 효율을 보인다.
트랜스포머 기반 모델들은 오토인코딩(Auto-Encoding), 자기 회귀(Auto-Regressive) 방식 또는 두 개의 조합으로 학습된다.
모델 | 학습구조 | 학습방법 | 학습 방향성 |
---|---|---|---|
BERT | 인코더 | 오토 인코딩 | 양방향 |
GPT | 디코더 | 자기 회귀 | 단방향 |
BART | 인코더 + 디코더 | 오토 인코딩 + 자기 회귀 | 양방향 + 단방향 |
ELECTRA | 인코더 + 판별기 | 오토 인코딩 + 대체 토큰 탐지 | 양방향 |
기존의 주요 sequence transduction(시퀀스 변환) 모델은 인코더와 디코더를 포함한 복잡한 RNN, CNN 모델이다. 가장 좋은 성능을 내는 모델도 attention mechanism을 통해 인코더와 디코더가 연결되어있다. 우리는 RNN과 CNN을 완전히 배제하고 Attention Mechanism만 사용한 새로운 네트워크 아키텍쳐인 Transformer를 제안한다. 두 개의 기계 번역 실험 결과, 이 모델이 품질 면에서 우수하고, 병렬화가 가능하며 훈련에 필요한 시간이 크게 줄어든다는 것을 보여준다. 우리 모델은 WMT 2014 영어-독일어 번역 작업에서 28.4 BLEU를 달성하며, 앙상블을 포함한 기존 최고 결과보다 2BLEU 이상 개선됐다. WMT2014 영어-프랑스어 번역 작업에서, Transformer는 3.5일 동안 8개의 GPU로 훈련(기존 최고의 모델들의 훈련 비용의 아주 작은 부분인)한 후 단일 모델 최고의 BLEU 점수인 41.0을 기록하였다.
sequence modeling과 sequence transduction 문제에서 RNN, LSTM, gated RNN이 SOTA를 달성해왔다. 순환 언어 모델과 오토인코더 아키텍쳐의 경계를 허물기 위한 많은 노력들이 지속해왔다.
Recurrent model은 일반적으로 입력과 출력의 시퀀스의 symbol position을 따라 계산된다. 계산 시간마다 위치를 정렬하면서, 이전의 hidden state()과 입력에 대한 position 함수로 hidden state()를 생성한다. 이런 순차적인 특성은 본질적으로 훈련 예제 간 병렬화를 불가능하게 만든다. 그리고 이는 시퀀스 길이가 길어질수록, 메모리 제약으로 인해 예제 간 배치가 제한되는 경우에 매우 중요한 문제다. 최근 연구는 factorization tricks과 conditional computation을 통해 계산 효율성을 많이 개선시켰고, 후자의 경우에는 모델의 성능도 향상시켰다. 하지만, sequential computation의 본질적인 제약(병렬화 불가)은 아직도 남아있다.
Attention Mechanism은 다양한 분야의 설득력있는 sequence modeling과 transduction model에서 필수품이 되었으며, 입력 또는 출력 시퀀스에서의 거리(기존 모델은 이 거리에 많이 의존)에 관계없이 의존성을 모델링 할 수 있게 한다. 하지만, 소수의 경우를 제외하고는 이 attention mechanism은 recurrent network에 함께 사용된다.
이번 연구에서 우리는 Transformer를 제안한다. 이 모델 아키텍쳐는 입력과 출력 간의 global dependency를 뽑아내기 위해 순환 모듈을 배제하고 대신에 attnetion mechanism에만 의존했다. Transformer는 상당히 많은 병렬화가 가능하고, 8대의 P100 GPU만으로 12시간보다 적은 훈련 시간 만에 새로운 SOTA를 달성하였다.
sequential computation을 줄이는 것이 목표인 것은 Extended Neural GPU, ByteNet, ConvS2S에서도 다뤄졌다. 이 연구들은 입력과 출력의 포지션에서 hidden representation을 병렬로 계산하기 위해 모두 CNN을 basic building block으로 사용했다. 이러한 모델들은 임의의(독단적인) 입력 또는 출력 위치 간의 신호를 연결시키기 위해 요구되는 작업의 수가 위치 간의 거리에 따라 증가한다(ConvS2S의 경우 선형적으로, ByteNet의 경우 로그로). 이로 인해 먼 위치 간의 dependency(종속성, 의존성)을 학습시키기 어려워진다. Transformer에서는 이를 일정한 작업 수로 줄였다. 비록, 평준화된 attention-weighted position 때문에 effective resolution(유효 해상도?→픽셀의 수인듯)가 낮아져 비용이 들긴 하지만, 이는 후에 말한 Multi-Head Attention으로 해결했다.
Self-attention(=intra-attention라고도 불림)은 단일 sequence에서 다른 position을 연결시켜 sequence의 표현을 계산하기 위한 attention mechanism이다. Self-attention은 문장 이해, 요약, 텍스트 독립… 등 다양한 NLP task에서 성공적으로 사용됐다.
End-end memory network는 sequence-aligned recurrence보다 recurrent attention mechanism에 기반한다. 그리고 이는 간단한 언어 질문 응답과 언어 모델 작업에서 성공적으로 사용된다.
하지만, 우리의 지식에서, Transformer는 sequence-aligned rnn/cnn 을 사용하지 않고 입력과 출력의 표현을 계산하기 위해 오로지 self-attention에만 의존하는 첫 transduction model 이다.
가장 경쟁력 있는 neural sequence transduction 모델은 대부분 encoder-decoder 구조를 가지고 있다. 여기서 encoder는 기호표현 상 의 input sequence를 연속적인 표현인 시퀀스로 매핑한다. z가 주어지면 디코더는 출력 시퀀스을 한 번에 하나씩 생성한다. 각 단계에서 모델은 auto-regressive(자기 회귀적)이다. 즉, 다음을 생성할 때, 이전에 생성된 결과물을 추가 input으로 넣는다.
Transformer는 인코더와 디코더 둘다 stacked self-attention과 point-wise, fully connected layer를 활용해 전반적인 아키텍쳐를 구성한다. (Fig1 왼쪽-인코더, 오른쪽-디코더)
Encoder
Decoder
Attention function은 query와 key-value 쌍을 출력에 매핑하는 것이다. (query, keys, values, 출력 모두 벡터이다.) 이 출력값은 value들의 weighted sum으로 계산되고, 각 값에 할당된 weight는 각 key에 상응하는 query의 compatibility function(호환성 함수???) 에 의해 계산된다.
우리는 특정 attention을 “Scaled Dot-Product Attention”이라고 부른다(Fig2). 입력은 차원의 쿼리와 키, 그리고 차원의 값으로 구성된다. 우리는 모든 키와 query 간 dot product를 계산하고, 각각을 로 나눈어 value마다 weight를 얻기 위해 softmax function을 취한다.
실제로, 우리는 일련의 쿼리 셋을 행렬 Q로 묶는 동시에 attention function을 계산한다. keys와 values도 행렬 K와 V로 함께 패킹된다. 우리는 출력 행렬을 다음과 같이 계산한다.
가장 일반적으로 사용되는 attention function들은 additive attention과 dot-product attention이다. dot-product attention은 의 스케일링을 제외하곤, 우리의 알고리즘과 동일하다. additive attention은 단일 은닉층이 있는 feed forward network를 사용하여 compatibility function (호환성 함수 - 찾아봐!!!!)를 계산한다. 두 방법은 이론 복잡도는 비슷하지만, 실제로는 dot-product attention이 최적화된 행렬 곱셈 코드(multiplication code)를 사용할 수 있기 때문에 더욱 빠르고, 공간 효율성이 좋다.
작은 값의 에 대해서는 두 방식 모두 유사한 성능을 보이지만, 더욱 큰 값의 에 대해서는 스케일링 없이 additive attention이 dot product attention을 능가한다. 우리는 큰 값의 에 대해서는 softmax function을 밀어낼만큼(무시할만큼) dot product가 매우 크게 커져서(분자가 너무 커지겠지!), 그레디언트가 작아지게 되는 것으로 생각한다. 이러한 현상을 해결하기 위해 우리는 dot product에 의 스케일링을 적용했다.
-dimensional keys, values, queries 와 함께 single attention function를 적용하는 대신, queries, keys, values를 h번 서로 다른 학습된 linear projection을 와 차원(이게 맞니?)* 에 linear하게 project를 하는게 더 효과적이라는 것을 찾았다. 이렇게 project된 queries, keys, values는 병렬적으로 attention function을 거치고, 차원의 출력 값을 만든다. 이 값들을 concatenate한 다음에, 다시 한 번 Project시켜 final value를 만든다.
Multi-head attention은 모델이 다른 position의 다른 representation subspace에서 정보에 공동으로(? jointly) 참조하는 것을 허용한다. 단일 attention head에서는, 평균화가 이들을 억제한다.(? 그래서 multi-head attention이 좋다는 뜻인듯.)
이 연구에서는 h = 8이고,
→ 각 head에서 차원을 줄이기 때문에, 전체 차원에 대한 전체 계산 비용은 single-head attention과 동일하다. (구현을 위한 Trick!, 구현과정에서 multihead attention의 overhead를 줄인다.)
Transformer는 3가지 다른 방법을 통해 multi-head attention을 사용한다.
인코더와 디코더의 각 layer에는 attention sub-layer 외에도 각 포지션에 독립적으로 동일하게 적용되는 fully connected feed-forward network가 포함되어 있다. 이는 ReLU 활성화함수가 있는 두개의 선형 변환으로 구성되어 있다.
선형 변환은 서로 다른 position에서 동일하지만, 레이어에서 레이어간 다른 parameter를 사용한다. 이를 표현하는 다른 방법은 커널 크기가 1인 2개의 convolution을 사용하는 것이다. 입력과 출력의 차원은 이며, 내부 레이어의 차원은 이다.
다른 sequence transduction model과 마찬가지로, 우리는 입력 토큰과 출력 토큰을 차원의 vector로 변환하기 위해 학습된 embedding을 사용한다. 또한, 우리는 디코터의 출력을 예측된 다음 토큰의 확률로 변환하기 위해 일반적으로 학습된(일반화된) linear transformation과 softmax function을 사용한다. transformer 모델에서, 우리는 2개의 임베딩 레이어와 pre-softmax 선형 변환 간에 같은 weight matrix를 공유한다. 임베딩 레이어에서는, weight들에 을 곱한다.
Transformer는 어떤 recurrence, convolution도 사용하지 않기 때문에, transformer 모델이 시퀀스의 순서를 사용하기 위해서는 우리는 반드시 sequence 내부 토큰의 상대적, 절대적 포지션에 대한 몇 가지 정보를 주입해야한다. 이를 위해, 우리는 인코더 및 디코더 스택의 맨 아래에 “positional encoding”을 입력 임베딩으로서 추가한다. → 위치에 대한 임베딩이 필요하다. (Positional Encoding 필요한 이유, Input Embedding Matrix와 Element wise로 더한다.) positional encoding은 임베딩과 같은 차원인 차원을 가지므로, 두 값이 더해질 수 있다. positional encoding은 학습된 것을 사용하거나, 고정된 것을 사용하는 등의 여러가지를 선택할 수 있다.
본 연구에서는, 우리는 다른 주기의(?) sine & cosine 함수를 사용한다.
여기서 pos는 위치를 나타내며 i는 차원이다. 즉, 위치 인코딩의 각 차원은 sinusoid(사인파)에 해당한다. 파장은 에서 까지의 등비수열을 형성한다. 이 함수를 선택한 이유는 고정된 오프셋 k에 대해 임의의 가 의 선형 함수로 표현될 수 있기 때문에 모델이 relative position(상대적인 위치)에 대해 쉽게 참조할 수 있을 것이라 가설을 세웠기 때문이다.
또한, 학습가능한 위치 임베딩(positional embedding)을 사용하는 실험도 진행했으며, 두 버전이 거의 동일한 결과를 냈다(Table 3 row[E] - 잉 이걸로 어떻게 봐). 우리는 훈련 중에 발견된 시퀀스 길이보다 더 긴 시퀀스에 대해 모델이 추론할 수 있도록 sine 함수를 선택했다.
→ sine/cos 같은 주기함수로 fix하여 위치 임베딩을 하는 경우가 있고, 학습 가능하게 임베딩 하는 경우가 있는데, 본 논문에서는 둘 다 해봤고, 성능차이는 별로 없다고 함. 다만, 더 긴 시퀀스가 들어왔을 때 주기함수로 fix된 위치 임베딩을 사용하는게 더 성능이 좋아서 주기함수 사용.
이 섹션에서 우리는 으로 표현되는 하나의 variable-length sequence(변수 길이 시퀀스)을 같은 길이 시퀀스 으로 매핑하는데 일반적으로 사용되는 recurrent와 convolution 레이어의 self-attention의 다양한 측면을 비교한다.() 이러한 레이어는 전형적인 인코더 또는 디코더 sequence transduction의 hidden layer이다. 우리의 self-attention 사용의 동기(?motivating)로 우리는 세가지의 사항을 고려했다.
하나는, 레이어당 총 계산복잡성이다. 다른 하나는 병렬화할 수 있는 계산량으로, sequential operation(작업)이 요구하는 최소의 숫자로 측정된다.
세번째는 네트워크에서 long-range dependency(장기 의존성-?) 사이의 길이이다(?????). long-range dependency를 학습하는 것은 많은 sequence transduction 작업에서 key challenge이다. 이러한 dependency를 학습하는데 영향을 미치는 주요 요인 중 하나는 네트워크에서 순회해야하는 forward와 backward의 path 길이이다. 입력과 출력 sequence에서 position 조합간의 길이가 짧을 수록, long-range dependency를 학습하기가 쉬워진다. 때문에, 우리는 다른 레이어 타입으로 구성된 네트워크에서 아무 입력과 출력 position 간의 maximum path length도 비교했다.
Table 1을 주목하면, self-attention layer는 모든 position을 일정한 수(상수)의 sequentially executed operation(순차적 실행 연산)으로 연결하는 반면, recurrent layer는 의 sequential operation(순차적 연산)을 요구한다. 계산 복잡성 측면에서, sequence length 이 representation 차원 보다 작다면(대부분의 NLP SOTA 모델에서 사용되는 케이스), self-attention layer는 recurrent layer보다 빠르다. 매우 긴 시퀀스를 다루는 작업의 계산 성능을 향상시키기 위해, self-attention은 각각의 output position를 중심으로 주변의 input seqeunce의 neighborhood size를 r로 제한할 수 있다. (뭔말인데;) 이는 maximum path의 길이 로 제한할 수 있다. 이는 maximum path length를 로 증가시킬 수 있다. 우리는 나중에 이 접근법에 더 조사할 계획이다.
인 kernel width 의 single convolution layer는 입력과 출력 position의 모든 쌍을 연결하지 않는다. 이를 위해 contiguous kernel(인접하는? 연속적인? 커널)의 경우에는 의 스택이 필요하고, dilated convolution(확장된 컨볼루션)의 경우에는 이 필요하다. 이는 네트워크 내의 모든 두 position 사이의 최장 경로를 증가시킨다. Convolution layer는 요소 때문에 일반적으로 Recurrent Layer보다 비용이 더 많이 든다. 하지만, 분리 가능한 합성곱은 복잡성을 로 줄인다. 하지만, 인 경우에도 분리 가능한 합성곱의 복잡성은 우리 모델에서 채택하는 self-attention layer와 point-wise feed-forward layer의 조합과 동일하다.
부차적인 이점으로, self-attention은 더욱 해석가능한 모델(interpretable model)을 생성할 수 있다. (→ 문장을 생성할 때 소스 문장에서 어떤 단어를 많이 참고했는지 시각화 가능하기 때문) 우리는 부록에서 우리 모델의 attention distribution을 분석하고, 제시하고, 논의한다. 개별적인 attention head는 다른 task를 명확하게 수행할 뿐만 아니라, 문장의 구문적, 의미적 구조를 잘 연관시키는 성질을 보이기도 한다.
English-German
English-French
세 가지 regularization을 사용함
Residual Dropout
Label Smoothing
→ BLEU와 PPL 평가 방법에 대해서 공부하기!
→ BLEU(BiLingual Evaluation Understudy)는 높을 수록 좋고, PPL(PerPLexity)는 낮을 수록 좋다. (PPL은 번역의 성능을 직접적으로 반영하는 수치라고 보기에는 어렵다.)
본 연구에서, 우리는 Transforemr를 제안했다. 이는 일반적으로 사용하는 multi-head self attention을 포함한 encoder-decoder 아키텍쳐의 recurrent layer 대신에, sequence transduction을 사용하지 않고, 완전히 attention만을 이용한 첫 모델이다.
번역 작업에서 Transformer는 recurrent, convolution layer보다 훨씬 빠르게 훈련된다. WMT 2014 English-German과 WMT 2014 English-French 변역 작업에서 SOTA를 달성했다.
우리는 어텐션 기반 모델을 다른 task에도 적용할 계획이다. 우리는 Transformer의 attention mechanism가 텍스트 처리 이외에도 image, audio and audio 등의 large inputs, outputs 문제를 효과적으로 제어할 것이다.
Transformer 논문은 워낙 유명하고, 중요한 논문인지라 잘 알아두는게 좋을 것 같다! 구현도 직접 해봐야지!
그나저나 velog는 latex 기반 수식은 인식을 못하는 것 같다... align해주고 싶었는데ㅠ
이미지 크기도 조절하는 방법...있겠지만 귀찮다... 하하