Transformer는 시퀀스 데이터를 순차적으로 처리하는 기존의 RNN 구조를 버리고 내적을 통해 집중해야 하는 정보가 어떤 것인지 스스로 학습할 수 있게 하는 Attention Mechanism을 적극 활용한 모델이다.
Positional Encoding
Transformer에서는 순차적으로 처리하는 RNN과 달리 Attention을 통해 시퀀스 데이터가 한 번에 처리되기 때문에 순서에 대한 정보가 들어가지 않는다.
그래서 Transformer에서는 Positional Encoding 또는 Positional Embedding을 통해 얻은 위치 임베딩 벡터를 단어 임베딩 벡터에 더해 위치 정보를 담는다.
Positional Encoding은 다음의 두 공식을 통해 얻은 고정된 벡터를 사용하는 방식이다.
$$ PE_{(pos, 2i)} = sin\left( \frac{pos}{10000^{2i/d_{model}}}\right)$$
$$ PE_{(pos, 2i+1)} = cos\left( \frac{pos}{10000^{2i/d_{model}}}\right)$$
여기서 $pos$는 단어의 위치, $2i$와 $2i+1$은 차원을 뜻한다.
즉, 512차원을 가진 1번째 단어 임베딩이 있다면 0번째 차원에는 $PE_{(1, 0)}$, 1번째 차원에는 $PE_{(1, 1)}$, ..., 512번째 차원에는 $PE_{(1, 512)}$ 이런 식으로 위치 정보가 단어 임베딩 벡터에 더해진다.
Positional Embedding은 고정된 벡터가 아닌 단어 임베딩 벡터와 같이 학습가능한 위치 임베딩 벡터를 사용하는 방식이다.
구현할 때는 위치 정보보다 단어 정보에 더 집중할 수 있도록 단어 임베딩 벡터에 $\sqrt{512}$를 곱하고 위치 임베딩 벡터와 더한 후 사용한다.
Transformer의 Attention
기존의 Attention은 Decoder의 hidden state($s$)와 Encoder의 hidden state들($h$)과의 내적을 통해 다음 단어의 예측에 있어서 어떤 $h$가 중요한지 판단하는 메커니즘으로 자신($s$)과 다른 곳에서 온 벡터($h$)와의 Attention이기에 Cross-Attention이라고도 불린다.
Transformer에서는 기존의 Attention을 적용한 Seq2Seq의 문제점을 해결하기 위해 Self-Attention을 고안했다.
Self-Attention이란 자기 자신과의 Attention이라는 뜻으로, 말 그대로 시퀀스 데이터가 주어졌을 때 해당 데이터들이 자기 자신들끼리의 연산(내적)을 통해 서로 어떤 관계를 가지고 있는지 파악하는 것이다.
예를 들어 '나는 학생 입니다'라는 문장이 있다면, Self-Attention을 통해 '나는', '학생', '입니다'라는 세 단어가 각각 서로 어떤 관계를 가지고 있는지 파악할 수 있다.
Transformer는 Cross-Attention과 Self-Attention의 조합으로 구성되어 있다.
두 가지 언어에 대한 문장을 각각 Self-Attention을 통해 각 단어 간의 관계를 파악하고, 이렇게 파악한 두 언어의 단어들을 Cross-Attention을 통해 언어 간의 관계를 파악한다.
예를 들면 Self-Attention을 통해 '나는', '학생', '입니다' 세 단어를 한꺼번에 계산해 각 단어 간의 관계를 파악하고 Decoder에서도 'I', 'am', 'a', 'student'라는 네 단어를 한꺼번에 계산해 서로의 관계를 파악한다. 그 후 Cross-Attention을 통해 '나는', '학생', '입니다'와 'I', 'am', 'a', 'student' 간의 관계를 파악해 두 언어 간의 관계를 학습한다.
이는 위의 Transformer의 구조를 나타낸 사진에서도 확인할 수 있다.
왼쪽 Encoder의 Multi-Head Attention에서는 Self-Attention을 통해 한국어 문장의 단어들 간의 관계를 파악하고, 오른쪽 Decoder의 Masked Multi-Head Attention에서도 Self-Attention을 통해 영어 문장의 단어들 간의 관계를 파악한다.
그 후 Decoder의 Multi-Head Attention에서는 Masked Multi-Head Attention에서 Query를, Encoder의 Multi-Head Attention에서 Key, Value를 받아 Cross-Attention을 수행해 두 언어 간의 관계를 학습한다.
이때, Decoder에서의 Masked Multi-Head Attention은 정답 문장을 입력으로 받기 때문에 각각의 시점에 따라 단어들을 Masking 처리한 후 학습한다. 만약 'I', 'am', 'a', 'student' 전체 문장만을 학습한다면 추론 시 'I' 또는 'I am'이 주어졌을 때 예측할 수 없게 학습이 된다. 그래서 'I', 'I am', 'I am a', 'I am a student'처럼 각각의 시점 따라 단어들을 Masking 처리한 후 학습한다.
이와 같이 Transformer는 Seq2Seq와 같은 Encoder, Decoder 구조이지만 RNN을 버리고 Attention을 중점적으로 사용해 Gradient Vanishing, Long-term Dependencies 등의 문제들을 해결할 수 있었다.
Self-Attention
이전 포스트에서 기존의 Attention(Cross-Attention)은 Decoder의 hidden state($s_1$)가 Encoder의 어떤 hidden state($h$)에 집중해야 할지를 계산할 때 다음의 공식을 사용했다.
$$ c_1 = \langle s_1, h_1 \rangle * h_1 + \langle s_1, h_2 \rangle * h_2 + \langle s_1, h_3 \rangle * h_3 + \langle s_1, h_4 \rangle * h_4 $$
위의 식은 여러 $ \langle a, b \rangle * c$꼴의 조합으로 구성되어 있음을 볼 수 있는데, 이를 해석하자면 "a가 b와 얼마나 유사한 지 계산하고 그 정도만큼 c를 반영할 거야"라는 뜻이다.
즉, Decoder의 $s_1$과 비슷한 $h$를 비슷한 만큼 Context Vector에 반영한다는 말이다.
이렇게 Attention 계산에 사용되는 벡터들을 Q(Query), K(Key), V(Value)라고 하는데,
Query는 관계를 물어볼 기준 단어 벡터, Key는 물어본 Query와의 유사도를 계산할 단어 벡터들, Value는 물어본 Query에게 대답할 의미를 담은 벡터들이라고 할 수 있다.
위의 공식을 예로 들면 $s_1$은 Query, 내적 하는 $h_1, h_2, h_3, h_4$는 Key, 내적값과 곱해지는 $h_1, h_2, h_3, h_4$는 Value라고 할 수 있고 이를 해석하면 "Query와 Key가 얼마나 유사한 지 계산하고 그 정도만큼 Value를 반영할 거야"라고 할 수 있다.
이를 보기 쉽게 행렬로 표현하면 다음과 같다.
$$ Attention(Q, K, V) = QK^TV $$
Transformer에서는 내적값을 $\sqrt{d_k}$ ($d_k$는 Key 벡터의 차원)로 나누고 Softmax를 취한 후 Value와 곱한 아래의 공식을 사용하는데, 이는 Softmax를 취함으로써 전체 내적값의 합을 1로 고정하기 위함이고 $\sqrt{d_k}$는 Softmax의 Back Propagation시 미분값이 너무 작아지는 것을 방지하기 위함이다.
$$ Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V $$
이런 Attention은 Transformer의 곳곳에서 사용되는데 이를 위해 Context Vector를 Q, K, V로 변환하는 모든 Linear Layer들은 Query는 관계를 잘 물어보도록, Key는 얼마나 관련이 있는지 잘 알려주도록, Value는 의미를 잘 담을 수 있도록 학습된다. (Context Vector라고 해도 되는지 모르겠지만, 정보가 잘 담긴 벡터가 Encoder 또는 Decoder를 여러번 반복 통과하며 정보를 더 잘 담는 과정을 반복하므로 Context Vector라고 볼 수 있을 것 같다.)
Self-Attention은 자기 자신과의 Attention을 구해야 하므로 하나의 벡터를 3개의 Linear Layer를 통과시켜 얻은 Q, K, V 벡터를 사용하고, Cross-Attention은 각각 Encoder, Decoder에서 온 서로 다른 벡터를 Linear Layer를 통과시켜 얻은 Q, K, V 벡터를 사용한다.
Encoder의 Multi-Head Attention, Decoder의 Masked Multi-Head Attention에서 Self-Attention이 사용되고,
Decoder의 Multi-Head Attention에서 이 정보들이 취합되어 Cross-Attention을 통해 두 언어 간의 관계를 파악하는 것이다.
Multi-Head Attention
위의 그림을 보면 Q, K, V가 Linear를 거친 후 Attention 연산이 이뤄지는 것을 볼 수 있는데, 이 때문에 들어가는 Q, K, V가 다 다른 벡터라고 오해할 수 있다.
하지만 Self-Attention이라면 그림 상의 Q, K, V는 모두 같은 벡터이고 각각의 Linear Layer를 거치면서 진정한 Q, K, V 벡터로 변환되고, Decoder의 Multi-Head Attention(Cross-Attention)이라면 Encoder에서 온 벡터를 K, V로 변환하고 Decoder에서 온 벡터를 Q로 변환해 사용한다.
다시 강조하자면, Attention 연산은 단순히 연산일 뿐이고 이를 통해 Q, K, V를 만드는 Linear Layer를 잘 학습시키는 것이라고 할 수 있다.
Multi-Head Attention은 Q, K, V를 만드는 Linear Layer가 있는 Head를 여러 개 만들어 다양한 결과가 나올 수 있도록 한다.
이 결과들은 Concat 되어 다시 Linear Layer를 거친다.
예를 들어 'I am a student'에서 'I'에 대해 판단할 때, 어떤 Head는 'am'이 가장 관련 있다고 판단하고 어떤 Head는 'student'와 가장 관련 있다고 판단할 수 있다. Multi-Head Attention은 각 Head에서 나오는 여러 의견을 취합해 더 좋은 결과를 도출하는 효과를 얻을 수 있다.
'Deep Learning > Transformers' 카테고리의 다른 글
Transformer의 등장배경 (0) | 2023.08.30 |
---|