시퀀스 번역 모델들은 인코더 디코더를 포함한 복잡한 합성곱 신경망 혹은 순환 신경망을 기반으로 하는 것이 지배적인 흐름이다. 가장 좋은 성능을 내는 모델들은 또한 어텐션 메커니즘을 사용한다.
저자들이 제안하는 Transformer라는 모델은, 순환 혹은 합성곱 신경망(Recurrent or Conv)을 사용하지 않고, 오직 어텐션 메커니즘만 사용한 구조이다.
순환 모델은 일반적으로 입력 및 출력 시퀀스의 기호 위치를 따라 계산한다.
t 위치에 대한 이전 hidden state인 ht-1 및, 위치 t의 입력의 함수로 t 시점에 대한 hidden state인 시퀀스 ht를 생성한다.
이러한 순차적인 특성은 훈련 내에서 병렬화를 불가능하게 하며, 시퀀스 길이가 길어짐에 따라 메모리 제약으로 인해 데이터 간 배치가 제한된다.
본 연구에서는 순환을 회피하고 입력과 출력 간의 전역 종속성을 해결하는 어텐션 메커니즘에만 의존하는 모델 아키텍처인 Transformer를 제안한다. Transformer는 병렬화가 가능하다.
Self attention이란 시퀀스 표현을 계산하기 위해, 한 시퀀스의 다른 위치의 단어들에 대해 관계를 짓는 것을 의미한다.
Transformer는, RNN을 사용하지 않기 때문에 RNN의 long term dependency 문제가 없어졌다.
기존 Seq2Seq with Attention에서 사용된 query(정보를 찾고자 하는 질의어)의 정보는
특정 time step에서 Decoder의 Hidden state vector였다.
정보를 꺼내가려는 encoder의 hidden state vecor와는 분리가 되어 있었다.
Transformer에서는, 정보를 찾고자하는 주체와 꺼내가려는 소스 정보들이 동일시 된다.
이것이 self attention이라고 생각하면 되겠다.
Transformer 구조는 인코더와 디코더에 self attention과 pointwise, FC Layer를 쌓은 구조이다.
인코더는 6개의 같은 레이어로 구성된다.
각 레이어에는 2개의 서브 레이어가 존재하는데, 하나는 multi-head attention이고, 하나는 Feed Forward FC Layer이다.
두 서브레이어는 skip connection 구조를 사용한다.(add) 그 후 layer normalization(norm)을 사용한다.
Skip connection 구조를 사용하기위해 임베딩 레이어와 모든 서브 레이어는 차원이 같아야 하기 때문에, 512차원으로 통일했다.
디코더도 6개의 레이어로 구성되며, 인코더의 서브레이어 두개에 추가적으로 인코더-디코더 어텐션으로 인코더의 출력에 대한 multi-head attention을 수행하는 서브레이어 1개가 추가된 구조이다.
Masked self attention이란 현 위치의 단어보다, 나중에 등장하는 단어에 대한 개입을 막고자 연산을 추가했고, 이는 뒤에서 소개하겠다.
LG Aimers 4기에 참여 중인데, 마침 DL 강의에서 KAIST 주재걸 교수님의 강의 중 Transformer가 있어 강의 내용을 참고했다.
왼쪽의 I go home 이라는 세개의 단어로 구성된 시퀀스를 예시로, 시퀀스에서 각각 Key, Query, Value를 만들어낸다. 이때 키, 쿼리, 밸류를 만들 때는 라는 선형변환을 통해서 만든다.
이렇게 만든 쿼리 1,2,3이 있을 때, 쿼리1에 대해 키 1,2,3과 유사도를 계산해, 합이 1인 유사도 벡터를 만들고(Softmax), 이를 밸류 벡터와 연산해 쿼리 1에 대한 밸류값들을 추출할 수 있다.
쿼리2,3도 마찬가지의 단계를 거친다.
오른쪽의 Thinking Machines라는 시퀀스의 예시에서,
쿼리 벡터와 키 벡터의 내적을 통해 나온 유사도()는 위 예시에서 2x2의 벡터로 표현이 된다.
쿼리벡터에서 thinking에 해당하는 키벡터의 각 단어들의 유사도 값이 가령 0.88,0.12라고 하고, 쿼리벡터의 machine에 해당하는 키벡터들의 유사도를 계산해 소프트맥스를 취하면 0.92,0.08 의 값으로 구성된 2x2 벡터가 형성이 된다.
이렇게 유사도를 구해 나온 2x2 벡터와 해당 단어들에 대한 밸류 벡터와 내적을 통해 Z값을 구한다.
Z의 첫번째 행벡터는 첫번째 쿼리 벡터를 사용했을 때에 밸류 벡터들의 Attention weight를 사용해서 만들어진 가중평균의 최종 벡터가 되는 것.
다시 말해, 쿼리 벡터의 시퀀스항을 잘 인코딩한 output으로써의 Hidden state vector가 되는 것이다.
그렇다면 위에서, 로 왜 스케일링을 해주는 것일까?
는 Key Vector의 Dimension이다. 이때 와 Query의 Dimension이 같아야 내적이 가능하다.
가 10일 때와 100일 때의 차이점을 보자면,
고차원 벡터의 내적의 경우에 디멘션이 크면 클수록 디멘션 별로 원소값들이 곱해지고, 디멘션의 개수만큼 곱한 값들이 다 더해지는 형태이기에, 결국 더 많은 숫자들의 합이 된다.
고차원 벡터들의 내적값들은 그래서 분산이 커진다.
그 값들이 소프트맥스의 입력값으로 사용될 텐데, 전체 확률분포가 굉장히 커지는, peak의 현상이 나타나게 된다. (Peaked한 상태란, 특정 클래스들에 대한 확률이 다른 클래스보다 현저하게 높은 상태를 나타낸다.)
역전파에서 gradient가 잘 흐르지 않는 문제가 발생.
그러한 영향력을 없애기 위해 로 나눠서 일정한 분산을 갖도록 유도하는 것이 Scaled Dot 이라고 보면 되겠다.
아까의 예시에서, thinking이라는 단어의 Query Vector와, thinking, machines에 해당하는 key vector의 유사도(score)를 구한다.
스케일을 거치고 나온 벡터와, thinking과 machine에 해당하는 Value Vector의 내적값을 통해 최종 Z1이 추출되고, 이게 Thinking을 Query로 사용했을 때, 인코딩된 hidden state를 나타낸다.
단어에서 특정 기준(위치, 문맥, 대명사가 지칭하는 것 등)으로 추출될 수 있는 선형변환에 사용되는 벡터 에 대한 세트를 여러개 만들어서, 각 세트에 대해 어텐션을 수행하고, 아웃풋들을 나중에 Concat하는 형태로 정보를 합친다.
즉, 다양한 기준과 다양한 정보를 바탕으로 sequence를 인코딩하는 것이 Multi-head Attention이다.
첫번째 Key, Query, Value에 해당하는 세트는 , 두번째 세트는 이라고 할 때, 인코딩된 hidden state vector 이 나온다. 이렇게 나온 Z들을 디멘션 방향으로 concat을 하면,
위와 같은 thinking, machine이라는 단어에 대해 다양한 기준에 의해 인코딩한 self attention module의 아웃풋 벡터를 얻게 된다.
이때 헤드 수가 많아지면(더 다양한 기준으로 Attention을 한다면) concat했을 때의 디멘션 또한 커지게 된다.
이때 원하는 디멘션으로 아웃풋 벡터(예시: 최종 아웃풋 Z : 4차원)로 바꾸기 위해서 위와 같은 W0라는 추가적인 linear transformation을 거치게 된다.
위 트랜스포머 구조 중 Add and Norm Layer에서, Add는 skip Connection의 과정,
Norm은 layer norm 역할을 하는 과정이라고 생각하면 되겠다.
의 내적으로 나온 벡터를 보자.
Query Vector를 계산하는 과정에서, Query Vector에서 SOS와 Key Vector의 내적값을 구할 때, SOS 다음 단어인 '나는', '집에'에 해당하는 값들과도 Attention 가중치를 구하게 된다. (위 그림의 중간 Matrix의 빨간 화살표 부분을 보면 된다.)
SOS 다음 단어로 '나는' 이라는 단어를 예측해야 하는데, 이때 Attention 가중치에서 다음 단어도 같이 계산하게 되면, 당연히 '나는'에 대해 많은 가중치를 부여하게 된다.
즉, 손쉽게 예측할 수 있는 cheating의 문제가 발생될 수 있다.
Maked Self-Attention은 의 내적으로 나온 벡터들에서 Query Vector를 기준으로, 다음 time step에 나타나는 단어들을 보지 못하도록 로 변경 해준다.
이후 소프트맥스를 취하면 0으로 출력된다.
이후 진행하는 와 Value Vector의 내적에서는,
'나는' 이라는 단어에 대해서 인코딩을 진행할 때에는 '집에' 라는 뒷 단어에 대해서는 0의 값으로 연산을 하게 된다.
이때의 Query는 Decoder의 time step에서 인코딩 된 Vector들이 Query로 주어지게 되고,
Key, Value들은 Encoder의 hidden state vector들로 구성이 된다.
기존 Seq2Seq with attention에서 attention block의 역할이라고 한다.
Position-wise(단어들 별로) Feed Forward 네트워크를 통과한다.
각 Head들은 각각
512 차원으로 맞추기 위해, 두번의 선형 변환과 한번의 활성화 함수(ReLU)를 통과한다.
생략
순차적으로 시퀀스 단어들을 입력하는 것이 아닌, 시퀀스에 대해 한번에 연산을 하기 때문에, 위 예시에서 '나는 집에 간다'와 '집에 나는 간다'의 Key, Query, Value Vector에는 계산 상 차이가 없다. 또 레이어를 지나며 연산 과정을 거쳐도 계산 상의 차이가 별로 존재하지 않게 된다.
따라서 Transformer에서는 단어들의 위치 정보를 반영하기 위한 Positional Encoding을 진행하고, 레이어를 지나기 전에 Embedding된 단어들과 더해주고 이후 과정을 진행한다.
4개의 Dimension을 가지는 경우를 생각해볼 때, 위 그림처럼 4개의 서로다른 파형을 가지는 사인, 코사인 그래프를 그릴 수 있다.
어떤 단어가 1번째 위치에서 발생했다면, 그래프 x축에서 1이라는 위치상에서 4개의 다른 사인, 코사인의 값(y축)을 읽게 된다.
이 값들을 벡터로 만들어, 이 4차원 벡터는 각 위치에 따라 다른 값들을 가지게 되고, 따라서 서로다른 벡터로 구분이 될 수 있는 것이다.
사인 코사인 그래프는 특정 수행하고자하는 테스크에 따라서 학습이 가능하다.
Attention과 순차적, 합성곱 신경망을 비교한 표이다.
은 sequence length, 는 representation dimension, 는 Conv의 kernel size, 은 neighborhood in restricted self-attention의 크기를 의미한다.
레이어 당 계산량과 sequential operations, maximum path length 측면에서 비교했다.
Transformer는 RNN의 long term dependency 문제를 해결했지만, 연산량 측면에서 문제점이 존재한다.
Attention Score인 유사도를 구할 때, 즉 를 구할 때, 결국 그 크기는 이고, 결국 행렬을 다 계산하고 저장하는 과정에서 만큼의 메모리 사이즈가 필요해진다.
이 시퀀스의 제곱을 뜻한다.
Sequence 길이가 representation 차원 d 보다 작을 때는 빠르다.
매우 Sequence 길이가 길 때에는 길이를 제한할 수 있고, 추후 연구해 보겠다고 한다.
이전까지의 가장 좋았던 모델들과의 성능과 연산량을 비교한 표이다.
모델에 변화를 주면서 성능과 파라미터 수를 비교한 표이다.
트랜스포머와, self-attention block은 NLP 뿐 아니라 다양한 분야에서 시퀀스 인코더로 사용되고 있다.
BERT, GPT-2, GPT-3, XLNet, ALBERT, RoBERTa, Reformer, T5, ... 등의 NLP 작업에서 전이학습을 통해 큰 발전을 이끌었다.
비전, 추천시스템, drug discovery 등 다양한 분야에서 self-attention이 사용되고 있다.
Refrence
LgAimers 주재걸 교수님 강의