추상
sequence 를 변환하는 모델은 엔코더와 디코더를 가지는 복잡한 RNN 이나 CNN 가 주된 것이고, 최고의 성능을 내는 것은 attention 메카니즘을 활용한 모델이었다.
이번에 소개하는 모델은 Transformer로 attention을 자신에게 적용한 메커니즘을 기반으로 한다.
Transformer는 학습 시간이 적고, 고성능으로 여러 번역 작업으로 BLEU의 새로운 기록을 세웠습니다.
Introduction
LSTM, GRU 등의 sequence 문제를 다루는 모델은 엔코더 디코더 구조로 지금까지 연구되어 왔다.
이러한 RNN 모델은 위치 $t$의 상태 $h_t$를 계산하기 위해 $h_{t-1}$의 계산을 선행해야 하기 때문에 병렬 연산이 불가능하여 계산이 비효율적이다.
이다.
factorization trick, conditional computation 연구를 통해 계산의 효율성을 어느 정도 해결했지만, 여전히 병렬 연산은 불가능하다.
attention 메커니즘은, sequence의 요소의 위치에 관계없이 멀리 떨어진 요소끼리라도 dependency를 학습할 수 있는 이점이 있지만, 일부를 제외한 모든 연구에서는 RNN과 함께 사용되고 있다.
이번 연구에서 제안한 Transformer는 RNN을 어텐션 메커니즘으로 완전히 대체한 모델입니다.
계산을 훨씬 병렬로 할 수 있고, 고속으로 글로벌 dependency를 학습할 수 있으므로 성능이 좋다.
배경
sequence 문제의 연산량을 줄이기 위한 노력은 CNN 기반 모델인 ConvS2S, ByteNet이기도 했다.
sequence의 두 요소 사이의 거리에 대해 ConvS2S는 선형 복잡도이고 ByteNet은 로그 복잡도 계산량이 필요했습니다.
Transformer는 상수 복잡성으로 계산량을 줄였습니다.
어텐션 메카니즘이 거리에 관계없이 사용되었기 때문에, 다양한 측면에서 분석된 representation 가 평균화되어 특징을 분해하는 것이 어려워집니다만, 후술하는 Multi-Head attention 의 개념을 통해 해결했습니다.
self-attention은 intra-attention이라고도 하며 하나의 sequence에서 representation을 계산하기 위해 위치와 연관된 attention 메커니즘을 말한다.
다양한 작업에서 좋은 성능을 보였다.
end-to-end memory network는 recurrent attention 메커니즘을 이용한 모델입니다.
간단한 Question Answering task로 좋은 성능을 보였다.
Transformer는 어텐션 메커니즘으로 RNN과 CNN을 완전히 대체한 최초의 모델입니다.
Model Architecture
대부분의 좋은 성능의 시퀀스 변환 모델은 인코더 디코더 구조입니다.
encoder 가 입력 sequence $(x_1, x_2, \cdots, x_n)$ 를 받고 $z=(z_1, z_2, \cdots, z_n)$ 로 바꾸면 decoder 가 $z$ 를 입력으로 받고 결과 $(y_1 , y_2 , \ cdots, y_m)$를 요소별로 출력하는 방법입니다.
각 단계마다 현재 위치의 출력을 추론하기 위해 이전 위치에서 생성 된 출력을 추가 정보로 활용하는 auto-regressive 모델입니다.
Transformer는 기본적으로 엔코더, 디코더 구조를 채용했다.
엔코더와 디코더에 self-attention이 쌓여 있고, 각 요소마다 fully connected layer가 있다.
Encoder: 6개의 동일한 레이어로 구성되며 각 레이어마다 2개의 하위 레이어로 구성됩니다.
첫 번째는 멀티헤드 셀프 어텐션 메커니즘이고 두 번째는 point-wise fully connected feed forward network입니다.
각 하위 레이어에는 앞뒤로 연결할 건너뛰기 연결이 있고 그 다음에는 레이어 normalization이 있습니다.
건너뛰기 연결을 연결하기 위한 포함된 레이어 포함 모델의 모든 레이어는 동일한 차원 $d_{model}$에 고정되어야 합니다.
보통 $d_{model}=512$이다.
Decoder: Encoder와 마찬가지로 6개의 동일한 레이어로 구성됩니다.
각 레이어마다 엔코더의 서브 레이어 2개를 가지면서, 한층 더 엔코더의 출력을 입력으로서 받기 위한 멀티 헤드 어텐션 메카니즘 서브 레이어가 또 하나 있는 구조다.
인코더와 마찬가지로 각 하위 레이어에는 건너뛰기 연결과 레이어 normalization이 있습니다.
Decoder의 self-attention은 마스킹 프로세스를 거쳐 위치 $i$의 단어를 예측하기 위해 다음 단어를 참고하지 않도록 하기 위해서다.
attention function은 query, key, value가 입력에 들어가 output을 내는 기능을 한다.
output은 value의 weighted sum으로 계산되며 각 value에 할당된 weight는 query와 key에 의해 계산됩니다.
query, key, value, output은 모두 벡터입니다.
Scaled Dot-Product Attention: Transformer를 구성하는 attention function이다.
여러 query, key, value를 한 번에 처리하기 위해 행렬 형태로 계산합니다.
표현식은 다음과 같습니다.
$Q$가 query, $K$가 key, $V$가 value이면 d_k}}) V$. 이때 $d_k$ 는 key 일행의 차원수를 말한다.
dot-product attention과 거의 동일하지만 $\sqrt{d_k}$로 나누는 것만으로도 차이가 있습니다.
$d_k$로 나누지 않으면 행렬 곱의 결과는 분산이 커지므로 절대 값이 커질 가능성이 높습니다.
일어난다.
이 효과를 상쇄하기 위해 $sqrt{d_k}$로 나눠준다.
덧붙여서, 일반적으로 자주(잘) 사용되는 attention function 에는 additive attention 와 dot-product attention 가 있습니다.
행렬 곱셈 연산이 매우 최적화되어 있기 때문이다.
그러나 dot-product의 단점도 있지만, $d_k$가 커지면 성능이 additive attention보다 나빠진다는 것이다.
따라서 Scaled Dot-Product Attention은 $\sqrt{d_k}$로 각 요소를 분할하는 것입니다.
Multi-Head Attention: 단순히 Scaled Dot-Product Attention을 사용하는 것보다 attention에 들어가는 $Q$, $K$, $V$에 linear layer를 통과시켜 각각 $d_k$, $d_k$, $d_v$로 차원을 바꾸어 독립 에 self -attention을 적용하고 concatenation하고 다시 한번 선형 레이어를 통과시킨 것이 성능이 좋다.
같은 입력에 대해 각 헤드마다 다양한 측면에서 관련성을 분석하기 때문이다.
또, 일반적으로 각 head 마다 들어가는 행렬은, 사이즈가 종래의 것보다 작지만, 작은 행렬을 복수개 독립해 실행할 수 있게 되어, 병렬 연산이 가능하게 되어, 계산 속도가 보다 빨라진다 . 통상은 head의 수 $h=8$로, $d_k=d_v=d_{model}/h=64$로 사용한다.
Transformer는 Multi-Head Attention을 세 가지 방법으로 적용합니다.
1. encoder-decoder attention layer: $K$,$V$는 인코더의 출력에서 얻어지고, $Q$는 이전 디코더의 이전 레이어의 출력에서 얻어집니다.
2. 인코더의 self-attention layer: $K$, $V$, $Q$는 모두 엔코더 앞의 레이어의 출력으로부터 얻을 수 있습니다.
3. decoder의 self-attention layer: $K$, $V$, $Q$ 모두 decoder의 이전 레이어 출력에서 얻습니다.
이 때, 출력 sequence 에서 앞에 위치하는 요소가 뒤에 위치하는 요소의 영향을 받으면 auto-regressive 의 특성을 만족하지 않기 때문에, 이것을 막기 위해서, Scaled Dot-Product Attention 내부에서 현재 위치 이후의 정보는 부정적인 무한대로 masking한다.
Position-wise Feed-Forward Network (FFN): 각 주의 레이어의 하위 레이어 중 하나에 속합니다.
구조는 두 개의 선형 레이어가 있으며 그 사이에 ReLU가 있는 형식입니다.
각 위치에 대해 독립적으로 수행됩니다.
즉, linear layer 대신 kernel 사이즈가 1인 convolution layer를 적용한 것과 같다.
FFN의 입력과 출력은 $d_{model}=512$차원이고, 중앙에 위치한 hidden layer는 $d_{ff}=2048$차원이다.
Embeddings and Softmax: 학습된 임베디드를 사용하였다.
엔코더와 디코더에서의 매립 레이어와, 디코더 마지막 소프트 맥스를 하기 전에 리니어 레이어에서의 가중치는 공유하도록 했다.
또한 $\sqrt{d_{model}}$ 로 분할하도록 했다.
Positional Encoding(PE): 기존 모델에서는 이전 디코더의 출력을 현재 디코더의 입력으로 받아서 자동 재전송할 수 있었지만 Transformer는 모든 위치의 시퀀스를 한 번에 입력하는 방법이므로 각 요소가 시퀀스 내에서 어디에 위치하는지에 대한 정보를 주입합니다.
시킬 필요가 있었다.
위치에 따라 다른 독특한 값 $PE_{(pos, i)}$ 를 정의해, embedding layer 의 출력에 더해 구현했다.
여기서, $pos$ 는 대응하는 요소가 sequence 내에서의 위치이고, $i$ 는 representation 의 dimension 입니다.
$PE$에서 적절한 다양한 함수를 시도했지만 채택된 표현식은 $PE_{(pos, 2i)}=sin(pos/10000^{2i/d_model}), PE_{(pos, 2i + 1)}=cos(pos/10000^{2i/d_model})$이다.
이렇게 하면 $PE_{pos}$에 비해 $PE_{pos+k}$와 같이 일정한 오프셋이 있어도 두 사이의 관계가 1차 함수로 표시되므로 모델이 상대적인 위치를 잘 배울 것이라고 생각했기 때문이다.
Why Self-Attention
왜 Self-Attention을 사용합니까? CNN이나 RNN의 방법과 비교해 보자. 세 가지 기준으로 비교했습니다.
첫째, 레이어당 계산 복잡도는 어느 정도입니까? 둘째, 얼마나 병렬 처리가 가능합니까? 이것은 필요한 시퀀스 조작의 최소 횟수로 측정됩니다.
셋째, 멀리 떨어진 두 위치의 dependency를 얼마나 잘 배울 수 있습니까? 이것은 레이어의 입력과 출력의 두 위치를 연결하는 경로의 최대 거리로 측정됩니다.
우선 Recurrent 모델과 비교해 봅시다.
Self-Attention 은 1 개의 sequence 를 한 번에 모델에 넣어 출력 sequence 를 얻기 위해 Sequential Operations 가 $O(1)$ 하지만 Recurrent 는 n 회 반복해야 하기 때문에 $O(n)$ 이다.
Complexity per Layer는 n이 d보다 작은 경우 Self-Attention이 Recurrent보다 빠릅니다.
대부분의 경우 n이 d보다 작고 매우 긴 시퀀스를 학습하면 인접한 r개만을 연결한 방식의 Self-Attention을 통해 계산 복잡도를 완화할 수 있을 것이다.
이렇게 하면 Maximum Path Length가 $O(n/r)$로 증가합니다.
지금 Convolutional 모델과 비교해 봅시다.
k가 n보다 작은 경우는 sequence 전체를 연결할 수 없기 때문에 $O(n/k)$ 만의 반복이 필요하다.
dilated convolution을 사용하면 $O(log_k(n))$로 줄일 수 있습니다.
일반적으로 Convolutional은 Recurrent보다 느리지 만 k의 복잡성이 곱하기 때문입니다.
그러나 seperable convolution 을 사용하면 $O(knd + nd^2)$ 로 줄일 수 있으며, 이때 $k=n$ 의 경우 Self-Attention 과 FFN 의 복잡도와 같다.
또한, Self-Attention은 해석 가능한 모델이라는 장점이 있습니다.
각 어텐션의 머리는 제대로 언어학, 문법적 구조를 배웁니다.