Deep Learning/Natural Language Processing

[NLP] Transformer

언킴 2021. 10. 21. 11:21
반응형

Sequential Model을 처리하는데 있어서 다루기에 많은 문제들이 발생한다. 끝이 잘리거나, 중간중간 생략이 되거나, 밀리거나 하는 등의 문제가 생기기 때문에 RNN처럼 Sequential 하게 input이 들어가면 Permuted되거나 Omitted 되는 경우 단어를 다루기 힘들어진다. 이와 같은 문제로 인해 기존의 RNN의 문제를 보완하려고 self-attention이라는 것을 타이틀로 Transformer가 등장하게 되었다. (Attention is All you Need, NIPS, 2017) [논문]

 

 

Recurrent Neural Network(RNN)의 경우 input을 받아 hidden state를 거쳐 output이 나오며 many-to-one의 경우 이전 cell의 정보를 받아서 재귀적인 형식을 띈다. Transformer는 이와 같은 재귀적인 모형이 없고, Attention이라는 구조를 활용한 첫번째의 sequence transduction이다. 

 

 

Transformer는 기계번역 task를 수행하는 모델로 처음 등장했지만, 단순히 기계번역 뿐만 아니라 이미지 분류, 이미지 Detection 등 여러 분야에도 사용된다. 최근에는 Transformer의 Decoder부분을 활용한 방법으로 단어를 입력받으면 거기에 해당하는 이미지를 출력해주는 모델도 등장했다. 

 

 

아래와 같이 input으로 Sequence가 들어오고 output으로 Sequence가 나가는 구조를 보고 Seq2Seq라고 부른다. 오른쪽 그림을 볼때 input Sequence의 입력은 3개지만 output Sequence의 출력은 4개임을 볼 수 있다. 원래 RNN의 구조를 보면 단어가 3개 입력되었을 때 Recurrent layer가 총 3번 돌아가는 구조를 띈다. 하지만 Transformer의 Encoder는 재귀적으로 돌지 않고 한 번에 입력을 받아 Decoder에 입력해준다. 생성할 때에는 순서대로 만들기는 한다.

동일한 구조를 갖지만 Network Parameter가 다르게 학습되는 6개의 Encoder와 Decoder를 가진다. 그렇다면 n개의 단어가 어떻게 한 번에 처리될까? 그리고 Encoder와 Decoder사이에 어떤 정보를 주고받을까? 그리고 Decoder가 어떻게 Generate를 할 수 있는가? 에 대해서 알아보자.

 

 

Encoder 하나의 구조를 살펴보면 모든 input Sequencial data를 받아 Self-Attention을 거치고 Feed Forward Neural Network를 거쳐 다음 단의 Encoder의 input으로 들어가게 되며, 여기서 Self-Attention이라는게 이 Transformer가 왜 잘 작동되는지 보여주게 된다. 

 

 

 

입력으로 3개의 단어가 들어왔다고 가정하면 $x_1, x_2, x_3$ 형태로 각각 단어의 vector를 만들어줄 수 있을 것이다. 그리고 단어들은 Self-Attention을 거쳐서 $z_1, z_2, z_3$로 변환된다. 이 과정이 feed forward와 동일하다고 느낄 수 있지만 가장 큰 차이점은 $x_1$가 Self-Attention을 거치고 $z_1$로 출력될 때 $x_1$하나만 고려하는 것이 아니라 입력되는 Sequence 전체를 고려한다. 즉 $x_1, x_2, x_3$의 정보를 모두 고려해 $z_1$를 만들어 내는 것이다. 이와 동일한 방법으로 $z_1, z_2, z_3$를 만들어내고 그 후 Feed Forward Neural Network를 거쳐 다음 Encoder의 입력으로 들어가게 되는 것이다. 

 

 

우리가 문장을 해석할 때 그 단어 하나만 고려하여 해석을 하는 것이 아니라 문장 내 어떤 단어가 무엇을 지칭하는지, 무엇을 의미하는지를 파악해야지만 제대로된 이해를 할 수 있다. Self-Attention은 단어 하나가 입력되면 그 문장 전체를 가지고 그 단어와의 관계성을 파악해 더 잘 단어를 파악할 수 있다. 

 

Transformer는 Sequence가 주어졌을 때 하나의 단어에 대해 Queries, Key, Value 총 3개의 vector를 만들어낸다. 3개의 vector를 통해서 입력되는 단어를 Enbedding해 새로운 단어로 바꾸어준다. 

 

 

 

그리고 Queries vector와 Key vector를 내적해 Score를 출력한다. $q_1^{|1 \times 3|}, (k_1^T)^{|3 \times 1|}$ 을 하기 때문에 하나의 scalar가 출력되고  $q_1\ \cdot \ k_1$와 $q_1\ \cdot \ k_2$간의 유사도를 구해서 두 단어 간의 얼마나 유사도가 있는지 score를 구하게 된다. 

 

내가 Encoding하고 싶어 하는 Queries Vector와 자기 자신을 포함한 나머지 단어의 Key vector를 다 구한 다음에 내적을 하는 형식으로 한다. 이것을 통해 enbedding하는 vector와 다른 단어들 간에 얼마만큼 interaction을 해야하는지 알아서 찾도록 하는 것이 바로 Attention이다.

 

Score를 계산한 다음 key vector의 demenstion의 square root를 취해 나온 값으로 나누어 normalization 해준 후 (논문에서는 key vector를 64차원으로 만들어주었기 때문에 $\sqrt{64}$로 나누어준다.)  softmat를 취해준다. 이때 key vector는 hyperparameter로 들어가 score 자체가 너무 커지지 않게 조절해주는 것이라 볼 수 있다. 

 

softmax를 거쳐 나온 Attention을 입력으로 넣은 단어와 다른 단어들의 가중치를 판단할 수 있고, 최종적으로 출력되는 값은 각각의 단어들에 대한 value weight sum 이 된다. 주의해야될 점은 Query vector와 key vector 간에는 내적을 수행해야되기 때문에 차원이 동일해야하지만, Value vector는 마지막에 나온 softmax의 값을 통해 곱해지기 때문에 차원이 같을 필요는 없다. 

 

최종적으로 Encoding된 vector의 output은 value vector의 차원과 동일하게 된다. 나중에 배울 multi-head attention의 경우에는 value vector의 차원가 달라지긴 하지만 현재의 경우에는 동일하다.

 

 

위와같이 각각의 입력에 대한 vector를 계산하게되면 엄청나게 복잡해보이지만 해당 vector를 합쳐 matrix form으로 바꾸어준다면 아래와 같이 많이 간단하게 된다. x를 2x4 matrix로 만들 수 있다 2의 경우 단어의 수를 말하고 4의 경우 우리가 만들어준 각 단어의 embedding의 길이가 된다.  위에서 장황하게 얘기한 내용이 matrix form으로 바꾸어주면 다음과 같이 축소된다.

 

 

 

그럼 왜 Transformer가 기존의 재귀함수보다 성능이 더 좋게 나오는 것일까? 예를 들어 이미지 하나가 주어졌다고 가정하면, 이미지 하나가 CNN이나 MLP 로 들어가면 input이 정해져있을 떄 output도 역시 고정되어있다. 하지만 Transformer는 하나의 입력이 정해져있고, Network가 정해져있다고 하더라도 encoding하려는 값과 주위 값에 의해 Encoding된 값이 달라지기 때문에 MLP보다 조금 더 flexible한 결과를 도출해낼 수 있기 때문이다. 그렇기 때문에 훨씬더 많은 것을 표현할 수 있다. 

 

Transformer도 한계가 있긴 하다. NLP를 예로들어 RNN을 수행할 때에는Sequence의 길이가 100,000일때 RNN을 100,000개 이어 붙히면 된다. 하지만 Transformer는 입력으로 받은 100,000개의 단어를 embedding을 거쳐서 100,000x100,000 개 즉 10억개의 연산을 진행해야 돼서 $n^2$의 computation이 필요하기 때문에 길이에 대해 한정적이다. BERT의 경우 입력의 길이가 512개로 제한이 된다. 이 문제를 보완한 모델로 Longformer라는 모델이 제안되었는데 이 모델은 다음에 다루어보자.

 

이렇게 Sequence의 길이가 길어질수록 메모리가 많이 필요해 한계가 있긴 하짐나 그로 인해 flexible하고 많은 것을 표현할 수 있는 Network를 만들 수 있다는 더 큰 장점이 있기 때문에 여러 분야에 많이 사용되어진다. 

 

 

multi-head attention

MHA는 앞에 있는 Attention을 여러 번 수행하는 것이다. 우리는 Attention을 통해서 하나의 Query, key, value vector를 만든다는 것을 확인했다. MHA는 이러한 Query, key, value vector를 여러개 만드는 것이다. 실제 Transformer에서는 총 8개의 attention이 사용되었다. 이 경우에는 하나의 입력 값이 있으면 총 8개의 embedding vector가 나오게된다. 

 

우리가 여기서 고려해야할 점은 Transformer구조를 보았을 때 encoder가 여러개 stack 되어있는 형태를 갖고 있기 때문에 입력과 출력의 차원을 맞춰주어야 한다. 만약 입력으로 $X^{|m \times n|}$이 주어졌다고 하면 마지막 출력되는 값은 mxn차원을 가진 matrix가 총 8개 나오게 될 것이다. 이 matrix를 전부 concatenate 해준 후 8*n x n 형태의 Weight를 외적해줌으로써 다시 mxn의 차원을 가지는 matrix로 출력해준다.

 

 

원래의 이론은 이렇게 해서 하는 것이 맞지만 실제 구현한 것을 보면 만약에 80 차원의 입력이 주어지면 이 차원을 10개로 나누어 실제 Query, key vector를 만드는 구조는 10차원짜리의 matrix를 가지고 만들게 되는 것이다.

 

이후 positional embedding이 추가 된다. Transformer 구조를 살펴보면 Sequencial의 정보를 self-attention에서 같이 계산해 넣어주지만 위치에 대한 정보는 반영되지 않기 때문이다. 왜냐하면 A, B, C, D의 입력을 넣을 때 A라는 단어를 임베딩할 경우 A, B, C, D가 사용되고, A, D, C, B를 입력으로 넣는다 할때도 A, B, C, D의 정보를 가지고 embedding을 해도 마지막에 출력되는 score의 값은 변화하지 않는다. 

 

이미지의 경우 pixel의 위치가 중요하고, NLP의 경우에도 단어의 위치가 중요하기 때문에 positinal embedding을 해주는 과정이 요구된다. position embedding은 그냥 주어진 어떤 vector에다가 어떠한 값을 규칙적으로 더해주는 것을 의미한다. 

 

그 후 출력된 값에 대해서 LayerNorm을 통해 Normalize해주고 feed forward를 해주는 과정을 반복하게 된다. encoder는 각각의 단어가 어떤 의미를 보이는지 표현하는 단계였고, decoder는 encoder의 출력을 가지고 새로운 문장 혹은 이미지를 생성해내는 단계다. 

 

encoder에서는 decoder에 key vector와 value vector를 보내준다. 그 후 decoder에 들어간 단어들로 만들어진 query vector와 encoder에서 받은 key, value vector를 가지고 유사도를 계산해 score를 출력해내는 과정을 수행해 최종 출력을 뽑아준다. 

 

학습을 할 때에는 입력과 출력의 단어를 알고 있기 때문에 모든 문장을 알고 있는 상태에서 학습을 진행하는 것은 의미가 없기 때문에 masking이라는 기법을 통해 mask token을 만들어 성능을 높인다.  마지막에는 Linear과 softmax를 거쳐 출력해준다. 

 

 

Transformer를 가지고 ViT(Vision Transformer)와 Dall-e 등 여러 task의 모델들이 등장했다.

'Deep Learning > Natural Language Processing' 카테고리의 다른 글

[NLP] Stemming and Lemmatization  (0) 2022.01.18
[NLP] Tokenization  (0) 2022.01.18
[NLP] Lexical Analysis  (0) 2021.07.20
[NLP] INTRODUCTION  (2) 2021.06.26
[NLP] BERT  (0) 2021.06.26