Posts List

[머신러닝/딥러닝] 10-3. Transformer Model

Transformer Model

"Attention is all you need"

위의 강렬한 문구는 Transformer model이 2017년 처음 발표됐을 때 그 논문 제목이다.

논문 제목처럼 Transformer model은 RNN을 사용하지 않고 Attention 만으로도 충분이 seq2seq 자연어 처리를 할 수 있음을 보여준다.  


[출처 : Wiki Docs, 딥러닝을 이용한 자연어 처리 입문]

위 구조가 바로 Transformer 모델의 구조이다. Encoder-Decoder 구조를 갖는다는 것 외에는 모르는 단어가 상당히 많은데, Self-Attention, Multi-head Attention, Positional Encoding 등 Transformer 모델의 구성요소와 동작원리에 대해서 알아보도록 하자.

Self-Attention

먼저 Dot-product attention에 대해서 알아보자.

각 value가 key에 매칭 되어 있다고 하자. Python의 Dictionary를 떠올려도 좋다.
※ dict{key1 : {value1}, key2 : {value2}, ..., keyt : {value_t}}로 구성된 dictionary가 있다고 생각하자.

어떤 query가 들어오면 dot-product attention은 value의 convex sum을 출력한다.

이 때 weight들은 query와 key의 dot-product를 0~1 사이 값으로 normalize한 값다.
즉, query와 key가 비슷하면 weight가 높게, 유사성이 낮으면 weight는 낮으며, 모든 weight의 합은 1이 된다.

전혀 새로운 개념이 아니다. Attention 포스팅에서다룬 내용도 s를 query로 가지고 key가 h1, ..., ht였던 dot-product attention과 동일하다. 그럼 self-attention은 어떤 함수일까?

바로 keyquery, value동일한 집합에 있는 것이다. 예를 들면 s_t와 s_1, ..., s_t간의 각각의 유사성을 convex sum형태로 표현한 것이다. 위 과정을 그림으로 나타내면 아래와 같다.

[출처 : Peter Bloem - Transformer]

위 예제에서 w_ij의 의미는 key x_i와 query x_j의 weight를 의미한다.
즉, y2는 x1-x2, x2-x2, x3-x2, x4-x2를 비교해 각 value들을 convex sum한 결과가 된다.

그런데 이 대로는 사실 쓸모가 없다. 왜냐하면 w_ij는 sequence(x1, ..., x4)만 있으면 자동으로 계산되는 상수나 마찬가지기 때문에다. 그래서 '학습'을 위해서 학습될 수 있는 parameter가 필요하다. (parameterize)

그래서 query, key, value에 각각 파라미터 Wq, Wk, Wv를 적용하면 위와 같이 표현할 수 있다. 이렇게 하면 학습을 통해 적절한 파라미터를 찾아서 자기 자신의 self-attention 을 학습할 수 있게 된다. 

이렇게 했을 때 어떤 효과가 있을까? 

위 예시는 'The', 'animal' ... 'tired' 스스로 self attention 한 결과이다. 예를 들면 'it'은 어떤 단어와 유사성이 가장 높았는지 self attention을 계산한 결과 it은 animal과 가장 높은 유사성을 가진 것을 알 수 있는데, 이런 효과도 대표적인 self-attention의 효과다.

Scaled Dot-Product Attention

Scaled Dot-Product Attention은 앞에서 배운 Dot-product attention과 거의 동일하다.

Dot-Product Attention은 기존 방법에 Key의 차원 D_k를 나눠서 scaling한 것이다.
(self attention이라면 Q, K, V의 차원이 모두 같다.)

※ 논문에서는 통상 Key의 차원이 매우 높기 때문에 (예를 들어 책 한권에 나오는 모든 단어가 key가 된다.) scaling을 하지 않으면 weight vector가 잘 계산되지 않는다고 한다.

지금까지 배운 것을 한번 시뮬레이션 해보자.

I, am, a, student라는 단어가 주어졌을 때 각각을 어떤 숫자로 vectorized 시켰다고 하자.

이 vector를 Wq, Wk, Wv로 parameterize시키면 I, am, a, student 각각의 Q, K, V 벡터를 얻을 수 있다.

그리고 'I'의 query를 각 단어에 scaled dot product self-attention을 해보자.

'I'의 query와 'I', 'am', 'a', 'student'의 key의 dot-product를 구하고 scaling 해 주면 각 단어들간의 유사도(Attention score)가 계산된다.

이 attention score에 softmax를 취해 합이 1인 값으로 바꿔보니 'I'는 'I'와 'student'간 유사도 높은 것을 확인할 수 있다. 이 값들을 모두 더하면 Attention value (혹은 Context vector)가 최종적으로 도출되게 된다.

Multi-Head Attention

앞서 Q, K, V를 Linear transform으로 parameterized 시켜 학습할 수 있게 만들었었다. 그런데 1개씩의 파라미터로 모델이 충분한 복잡성을 못 가질 수도 있기 때문에 여러번 Linear transform 시켜줄 수 있다. 이 개념이 Multi-head attention이다.
※ CNN에서 1개 이미지를 1개 필터로 Conv.하는 것이 아니라 여러개의 필터를 사용해서 많은 feature map을 뽑는 것과 동일하다.

Multi-head attention은 위에서 언급한 것 처럼 학습 파라미터 수를 늘려 모델의 복잡도를 올리는 방법이고 num_head는 하이퍼파라미터가 된다. (논문에서는 num_head = 8로 설정했다.)

Multi-head attention을 앞서 보여줬던 예제에 적용하면 위 그림과 같다. 동일한 과정을 num_head만큼 수행하는 것을 활인할 수 있다.


Encoder 그림의 가장 핵심인 Multi-head self-attention을 이해했다면 인코더의 80%는 이해한 것이다. Position Encoding이나 Position-wise Feedfoward net은 encoder, decoder 모두에서 사용되는 기법이니 곧 설명할 예정이다.

다시 한번 전체 모습을 살펴보면 Transformer는 3개의 attention을 가지고 있다.

  • Encoder self-attention : Encoder에 입력된 단어들의 self-attention

  • Decoder self-attention : Decoder에서 예측한 단어들의 self-attention

  • Encoder-Decoder attention :
    당연히 [10-2. Attention] 과 같이 입력 문장과 예측 문장간의 Attention이 필요하다.
    이 때 Q는 decoder에서, K, V는 encoder의 output에서 온다.

우리는 위 3가지 중 1, 2번째인 self-attention의 원리에 대해서 알게된 것이다.
그리고 Encoder-Decoder attention은 [10-2. Attention]과 동일하다.

그럼 이제 Encoder, Decoder에서 공통적으로 가지고 있는 Position-wise FFNN과 Positional Encoding에 대해서만 알면 필요한 기술은 모두 배운것이다. 


Position-wise Feedforward Networks

Transformer 모델은 Encoder-Decoder로 나눠져 있긴 하지만, Encoder, Decoder자체가 마치 hidden layer 처럼 여러층을 쌓을 수 있다. 이 때 Encoder layer를 Encoder #1, #2 이렇게 표현해 보자.

그리고 각 인코더는 위 그림과 같이 Fully Connected layer들로 이어져 있다.

위 식에서 x는 multi-head self-attention에서 나온 matrix이다.

즉, transformer model의 FFN은 1개 은닉층을 가지는 neural net이며, 논문에서는 hidden layer의 크기를 2048로 설정했다.

이 때 모델의 복잡도가 너무 올라가는 것을 고려한 skip connection과 layer normalization이 적용된다. 

  • skip connection은 CNN 포스트의 ResNet과 정확히 같은 개념이며,
  • layer normalization역시 CNN 포스트의 Layer normalization과 동일한 개념이기 때문에 자세한 설명은 생략하도록 한다.

Positional Encoding

앞의 과정을 상기해보면, Transformer 모델은 input sequence의 단어를 마치 python의 dictionary형태로 저장해놓고 self attention을 수행하는 것을 알 수 있다. 그런데 여기서 문제점은 각 단어의 벡터가 key로 등록은 되는데 몇 번째 단어인지는 알 수가 없다.
예를 들어 위 그림에서 'am'을 key값으로 찾을 순 있지만 2번째 있는 단어라는 것은 알 수가 없는 것이다.

그래서 Transformation model에서는 Positional Encoding 값을 embedding(vectorized word)에 더해줌으로써 위치 정보를 만들어 준다. 이 과정을 시각화 하면 아래와 같다.

위 그림을 보면 오른쪽에 있는 단어일 수록 positional encoding 값도 오른쪽이 큰 것을 알 수 있다. 어떻게 해야 이런 값을 만들 수 있을까?

위 식은 단어위 위치 pos와 각 단어의 벡터의 index i가 주어졌을 때 Positional Encoding(PE)값을 구하는 방법이다. 식으로는 이해가 어려우니 예제를 한번 살펴보자.

위 예제는 각 단어를 4차원으로 embedding 한 것을 가정한 것이다. (논문에는 128차원으로 embedding 했다.) 그리고 각 단어 vector의 i번째 차원값은 sin과 cos의 변환하면서 계산되고, 계산 결과 위 그림처럼 출력된다. 이게 어떤 의미를 가질까? PE의 단순한 예를 하나 더 살펴보자.

만약 우리가 10진수를 2진수로 표현한다고 가정해 보자. 2진수의 자릿수를 10개 (=차원)으로 나타낸다고 하면 위 그림과 같이 변환할 수 있다.

i=1의 값은 1, 0, 1, 0 순으로 빠르게 변하고, i=2의 값은 1, 1, 0, 0, 1, 1 과 같이 조금 늦게, i=3인 값은 1, 1, 1, 1, 0, , ... 더 늦게 변화하는 것을 확인할 수 있다. 

즉, word를 이런 방식으로 표현하면 만약 같은 단어가 2번 나왔더라도 어디쯤 위치한 word인지 알 수가 있다.  

위 그림은 126차원으로 embedding된 50개의 단어을 Positional Encoding 시킨 결과이다. 

우리는 각 단어의 PE된 vector가 어떤 값을 갖는지는 알 필요가 없다. 하지만 컴퓨터에게는 이 vector로 하여금 각 단어의 위치정보를 알 수 있게 해준다.


지금까지 각 구성요소에 대해서 각각 살펴봤는데 이제 전체그림으로 조립해보자.

  • vectorized 된 단어들이 parameter를 가진 embedding으로 입력된다.
  • embedding된 단어가 위치 정보를 담을 수 있도록 Positional Encoding 된다.
  • 각 단어의 vector가 Self-Attention + FFNN 되는데, 일종의 "입력된 문장을 이해하는 과정"으로 볼 수 있다. 그리고 인코더는 num_layers만큼 쌓을 수 있다.
    ※ CNN으로 치면 Conv, Pooling을 반복하는 과정이다.
  • Encoder에서 출력된 Context vector를 통해 Decoder에서 단어를 예측하는데, 이 때는 Self-Attention이 아니라 Encoder-Decoder Attention을 수행한다.
  • 그리고 Decoder에서 예측된 단어들은 매번 Self-Attention을 통해, 일종의 "예측된 문장을 이해하는 과정"을 반복한다.


(Optional) Transformer Model의 attention 과정은 상당히 많은 연산량을 가진다.
그래서 이 연산량을 줄이기 위한 연구도 최근 진행되고 있는데, 관심이 있다면 Reformer:Efficient Transformer 으로 검색할 수 있다.

관련 논문 : Nikita Kitaev, Lukasz Kaiser, and Anselm Levskaya(2020), "Reformer: The efficient transformer", ICLR


(Optional) Transformer model의 원리를 이용해 독특한 문제를 풀 수 있다. 
지금까지 살펴본 모델은 Image to Sequence, Sequence to Sequence문제를 풀어봤었다.
Set transformer는 Set to Sequence문제를 풀기 위한 방법이다.

관련 논문 : Juho Lee, Yoonho Lee, Jungtaek Kim, Adam R. Kosiorek, Seungjin Choi, Yee Whye Teh(2019), "Set transformer : A framework for attention-based permutation-invariant neural networks", ICML
※ 이 강의를 해 주신 최승진 교수님과 김정택 조교가 저자로 등록되어 있다.


(Optional) Transformer model의 원리를 Image Recognition 문제에 적용할 수도 있다. Image를 Patch(일부 영역)의 Sequence로 볼 수도 있기 때문이다. 

관련 논문 : Alexey Dosovitskiy et al. (2020) "An Image is Worth 16x16 Words : Transformers for Image Recognition at Scale" Preprint arXiv:2010.11929


댓글 쓰기

0 댓글