[TIL] Transformer

hyewon·2021년 12월 29일
0

TIL

목록 보기
42/59

Transforemr

트랜스포머는 기계 번역을 위한 새로운 모델로 Attention 매커니즘을 극대화해 뛰어난 번역 성능을 기록한 모델이다. 트랜스포머는 RNN 기반 모델이 가진 구조적 단점을 해결하기 위해 등장한 모델이다. 모든 토큰을 동시에 입력 받아서 병렬 연산하기 때문에 GPU 연산에 최적화 되어 있다.

위는 트랜스포머의 구조를 간단하게 시각화한 그림이다. Encoder와 Decoder로 표현된 사각형을 각각 인코더 블록과 디코더 블록이라고 부른다.

인코더 블록

  1. Self Attention
  2. Feed Forward

디코더 블록

  1. Masked Self (Head) Attention
  2. Encoder-Decoder Attention
  3. Feed Forward



Positional Encoding (위치 인코딩)

트랜스포머에서는 병렬화를 위해서 모든 단어 벡터를 동시에 입력 받는데 이때 단어의 위치 정보를 제공하기 위한 벡터를 따로 제공해줘야지 어떤 단어가 어디에 위치하는지 알 수 있게 된다.

이러한 위치 정보를 제공할 수 있는 벡터를 만드는 과정을 바로 Positional Encoding 이라고 한다.




Self-Attention

트랜스포머의 구조 그림에서 Self Attention에 해당하는 부분이 바로 빨간 네모 부분이다. Self Attention은 트랜스포머의 주요 메커니즘이다.

Self Attention은 입력된 문장의 의미(≒ 입력된 문장의 내부 관계)를 파악한다. Self Attention에서 사용하는 Query와 Key, Value는 모두 인코더에서 온 것들이다. 이때 사용되는 Query, Key, Value는 모두 가중치 벡터이며 이 벡터들을 대상으로 Attention을 적용한다.



연산 과정

우선 가중치 행렬로부터 각 단어의 Query, Key, Value (q, k, v) 벡터를 만들어낸다.

그리고 분석하고자 하는 단어의 q 벡터와 문장 내 모든 단어의 k 벡터를 내적해 각 단어와의 유사도를 구한다.


그리고 softmax의 출력값과 v 벡터를 곱해준 뒤 더하면 해당 단어에 대한 Self-Attention 출력값을 얻을 수 있다.



위의 그림들은 하나의 단어에 대해서만 예시가 나와있지만 실제로는 아래의 그림처럼 모든 단어가 한번에 연산이 일어나게 된다.


Multi-Head Attention

Multi-Head Attention은 Self Attention을 동시에 병렬적으로 실행하는 것이다. 각 Head마다 다른 Attention 결과가 나오기 때문에 앙상블과 유사한 효과를 얻을 수 있다.


Masked Self-Attention

Masked Self-Attention은 디코더 블록에서 사용되는 특수한 Self Attention이다.

디코더는 왼쪽 단어를 보고 오른쪽 단어를 예측하기 때문에 타깃 단어 이후에 위치한 단어를 보지 않고 예측해야한다. 즉 타킷 단어 뒤에 위치한 단어는 Self-Attention에 영향을 주지 않도록 아래 그림의 오른쪽처럼 마스킹(masking)을 해줘야 한다.

마스킹은 softmax 함수를 취해주기 전에 가려주고자 하는 요소에만 마이너스 무한대에 해당하는 매우 작은 수(ex. -1e9(-10억))를 더해주면 된다. 이렇게 마스킹 된 값은 softmax를 취했을 때 0이 나오게 되므로 Value를 계산할 때는 전혀 반영이 되지 않는다.




Encoder-Decoder Attention

Encoder-Decoder Attention은 번역할 문장(≒인코더에 입력된 문장)과 번역된 문장(≒디코더에 입력된 문장)의 정보 관계를 엮어주는 부분이다.

Encoder-Decoder Attention에서도 Query, Key, Value를 사용하는데 여기서 Query는 Masked Attention의 결과를 활용해서 만들어낸다. 그리고 Key와 Value는 인코더의 출력값을 활용해서 만든다. 이 점을 제외하고는 Self Attention의 연산 과정과 동일하게 이루어진다.

profile
우당탕탕 코린이

0개의 댓글