欲速不達

일을 급히 하고자 서두르면 도리어 이루지 못한다.

Fantastic AI, Fantastic World

DS | Data Science/ML | Machine Learning

[DL Basic] Transformer : Attention Is All You Need

_껀이_ 2022. 10. 5. 19:55
728x90
반응형

시퀀스 데이터는 순서와 문맥 등이 바뀌면 의미가 달라지기 때문에 모델링하기가 까다롭다. 

 

이러한 누락된 정보를 가진 시퀀스 데이터를 모델링하기 위해 고안된 방법이 Transformer이다.

 

1. Transformer

Transformer의 가장 큰 특징은 recurrent하게 모델이 반복되지 않고, attention을 활용하여 context 정보를 반영할 수 있게 구현한 것이다.

Transformer

Transformer의 구조는 크게 encoder와 decoder로 구성되어있고 encoder 부분에서 self-attention으로 input 데이터의 representation(Q,K,V)을 추출한다. 그 후 추출한 representation에서 K, V와 decoder에 적용하여 직전 스텝의 output을 input으로 하여 추출한 Q를 사용하여 현재 스텝의 output 값을 도출해내는 방식이다.

 

 

 

1-1) Self-Attention

self-attention은 자기 자신을 포함하여 입력되는 모든 데이터에 대한 관계성을 수식으로 표현한다. 

 

위의 이미지에서처럼 Input 데이터로 Thinking과 Machines의 단어가 들어왔을때, 우선 단어를 Embedding 값으로 변환하여 입력하게 된다. Embedding 값으로 입력되면, 일정한 Weight와 연산하여 Q (Queries), K (Keys), V (Values)를 만들어 낸다. Q,K,V는 단어마다 생성이 되고, 이를 활용하여 각각의 단어 사이의 관계성(유사도)을 계산하게 된다.

 

 

Q, K, V는 각각 다른 Weight를 단어의 Embedding 값에 곱하여 만들어진다. 이는 단어마다 Q, K, V가 도출되게 되며, 같은 Wq, Wk, Wv를 사용하여 변환된다. self-attention에서는 같은 단어의 Embedding값에서 계산되기 때문에, Q,K,V의 크기가 같다.

 

우선 Q와 K를 연산하여 Score를 만든다. Score는 기준이 되는 단어의 Embedding에서 도출한 Q (Q1)와 자기 자신을 포함한 모든 단어들의 K (K1, K2, ..., Kn)를 내적하여 얻은 스칼라 값이다. 이렇게 구해진 Score를 단어 Embedding 값의 차원으로 나누어준 후, Softmax를 취하여 각 단어에 대한 관계성의 비율로 나타내준다.

 

각 단어에 대한 관계성의 비율값이 정해지면, 각각의 V에 비율값을 곱한 것들을 모두 합한다. 즉, 비율값(가중치)를 V와 가중합을 통해 나온 결과값이 Z1이 된다. 이때 Z1이 해당 단어의 Representation 값이 된다.

 

이렇게 계산된 Representation을 시각화해보면 아래와 같이 표현된다.

위의 이미지는 it 이라는 단어에 대한 Representation을 색깔로 나타낸 이미지이다. 색깔이 짙을 수록 관계성이 강하다고 볼 수 있으며, it은 The와 animal에 강한 관계성을 보인다.

 

 

Scaled Dot-Product Attention

 

Representation Z를 계산하는 과정을 한번에 도식화하면 위의 이미지와 같다. 이때, Softmax는 row 방향으로 적용된다. Score가 row 방향으로 단어마다의 점수를 표현하고 있기 때문이다. 또, V(or Z)의 차원은 Q나 K와 같지 않아도 무방하다. 

 

이는 Transformer의 특징으로, 기존의 MLP는 Input 값의 크기가 고정되면 output 값의 크기도 고정시켰다. 즉, 표현력에서 한정된 가능성을 가진 것인데, Transformer에서는 Input 값의 크기와 output 값의 크기가 같지 않아도 연산 가능하게 함으로써 표현력이 증가했다고 볼 수 있다.

예시로 'je suis étudiant'라는 프랑스어 단어 3개를 Transformer에 입력하고 영단어로 번역했다고 가정했을때, 'I am a student'라는 4개의 영단어로 변환되는 것이다.

 

하지만 표현력이 커진만큼 computation량도 커지게 된다. 게다가 RNN과 달리 한번의 연산에서 모든 단어와의 attention 연산을 수행하는 것이기 때문에 bottleneck이 생길 위험이 매우 높아진다는 문제점이 있다.

 

 

 

1-2) Multi-Head Attention

self-attention이 자기 자신을 기준으로 Q,K,V를 계산하고 이를 이용하여 다른 데이터들과의 관계성을 계산하는 방식이라면, multi-head attention은 이러한 attention을 여러 개를 만들어 앙상블하는 방법이다.

예를 들어 N개의 head에서 N개의 attention 결과값 Z1,Z2,...Zn이 만들어졌다면 이를 concatenate하고 차원축소를 통해 output 값의 크기를 맞추어 출력하는 것이다. 

 

multi-head attention는 하나의 데이터를 여러 head로 계산함으로써 representation이 다양해진다는 점이 특징이다. 즉, 혼자 수학문제를 풀어낼때는 하나의 방식으로 풀지만 여러 사람이 풀게되면 다양한 방식의 풀이과정이 나온다는 것과 같다. 

 

논문에서는 여러 head에서 나온 z값들을 concatenate하고 나서 차원축소를 진행하지만 실제로 코드에서는 n개로 나누어 SDPA를 실행한 후에 합치는 과정으로 구현하게 된다.

 

 

 

1-3) Positional Encoding

앞서 이야기한 attention은 데이터의 위치, 순서, 문맥 등을 고려하지 않고 SDPA를 통한 값을 통해 관계성을 표현한다. 하지만 시퀀스 데이터에서는 위치, 순서, 문맥 등의 정보가 의미와 해석에 직결되기 때문에 이를 첨가해주어야 한다.

 

positional encoding은 context 정보를 bias로 하여 Embedding 값에 가중치를 더해주는 것으로 표현된다. 

위의 수식으로 구한 positional encoding을 수식으로 표현하면 아래의 이미지와 같이 오프셋이미지로 표현될 수 있고, 값의 범위는 0~1 사이의 값으로 나타나게 된다.

 

 

1-4) Masking

또, context 정보를 유지하기 위한 방법으로는 Masking을 사용하게 된다. decoder에서 단어들 간의 관계성을 계산할때, 모든 단어들과의 관계성을 찾는 것이 아니라 지금까지 나왔던, 현재 스텝 이전의 스텝의 output에 대해서만 계산을 하는 것이다. 

실제로 대화를 할때도, 미래에 어떤 대화가 나올지를 알고 하는 경우는 없기도 하고, 미래의 정보를 같이 계산해버리면 답을 알고 현재의 답을 고칠 수도 있기 때문이란 것을 직관적으로 이해할 수 있을 것이다.

 

 

 

이미지 출처 : 네이버커넥트 부스트캠프 AI Tech 강의자료, 구글링 등

728x90
반응형