1. 기존 Seq2Seq 모델의 한계
기존의 Seq2Seq 모델은 Encoder-Decoder 구조로 구성되어있다. 여기서 Encoder는 Input Sequence를 하나의 벡터 표현으로 압축하고, Decoder는 이 벡터 표현을 통해 Output Sequence를 만들어내었다.
하지만 이러한 구조는 Encoder가 입력 시퀀스를 하나의 벡터로 압축하는 과정에서 입력 시퀀스의 정보가 일부 손실된다는 단점이 있었고, 이를 보정하기 위해 Attention이 사용되었다
그런데 Attention을 RNN의 보정을 위한 용도로서 사용하는 것이 아니라 Attention만으로 Encoder와 Decoder를 만들어보면 어떨까라는 Idea를 통해 Transformer가 탄생되었다.
2. Transformer 모델이란?
Transformer는 2017년 Google이 발표한 논문이 "Attention is all you need"에서 나온 모델로 기존의 seq2seq의 구조인 Encoder-Decoder를 따르면서도, 논문의 이름처럼 Attention만으로 구현한 모델이다
Transformer는 RNN을 사용하지 않지만 기존 Seq2Seq처럼 Encoder에서 Input Sequence를 입력 받고, Decoder에서 Output Sequence를 출력하는 Encoder-Decoder 구조를 유지한다.
이전 Seq2Seq 구조에서는 Encoder, Decoder에서 각각 하나의 RNN이 t개의 시점을 가지는 구조였다면 이번에는 Encoder와 Decoder라는 단위가 n_layers로 구성되는 구조이다(논문에서는 각각 6-layers 사용)
아래 그림은 Encoder로부터 정보를 전달받아 Decoder가 출력결과를 만들어내는 Transformer 구조이다.
Decoder는 기존의 Seq2Seq 구조처럼 시작 Symbol <sos>를 입력으로 받아 종료 Symbol <eos>가 나올 때까지 연산을 진행한다.
이는 RNN이 사용되지 않지만 여전히 Encoder-Decoder 구조는 유지되고 있음을 보여준다
Transformer는 단순히 각 단어의 Embedding Vector들을 입력받는 것이 아니라 Embedding Vector에서 조정된 값을 입력받는데 이를 Positional Encoding이라 한다
3. Positional Encoding(포지셔널 인코딩)
RNN이 자연어 처리에 유용했던 이유는 단어의 위치에 따라 단어를 순차적으로 입력받아 처리하는 RNN의 특성으로 인해 각 단어의 위치 정보(Positional Information)를 가질 수 있다는 점에 있다.
하지만 Transformer는 단어 입력을 순차적으로 받는 방식이 아니므로 단어의 위치 정보를 다른 방식으로 알려줄 필요가 있다. Transformer는 단어의 위치 정보를 얻기 위해서 각 단어의 임베딩 벡터에 위치정보들을 더하여 모델의 입력으로 사용하는데, 이를 Positional Encoding이라한다.
아래 그림은 입력으로 사용되는 Embedding Vector들이 Transformer의 입력으로 사용되기 전 Positional Encoding의 값이 더해지는 것을 보여준다.
Embedding Vector가 Encoder의 입력으로 사용되기 전 Positional Encoding 값이 더해지는 과정은 아래 그림과 같다.
Transformer는 Positional Encoding을 통해 Positional Information를 가진 값을 만들기 위해 아래의 두 함수를 이용한다.
$$\large{\begin{aligned}
PE_{(pos, 2i)} &= \sin{(\frac{pos}{10000^{2i/d_{model}}})}\\
PE_{(pos, 2i+1)} &= \cos{(\frac{pos}{10000^{2i/d_{model}}})}
\end{aligned}}$$
Transformer는 $\sin$과 $\cos$ 함수의 값을 Embedding Vector에 더해주므로서 단어의 Positional Information을 더해준다. Embedding Vector와 Positional Encoding의 덧셈은 사실 Embedding Vector가 모여 만들어진 문장 행렬과 Positional Encoding 행렬의 덧셈 연산으로 이루어진다
여기서 $pos$는 입력 문장에서의 Embedding Vector 위치를 나타내며, $i$는 Embedding Vector 내의 Index를 의미한다.
Embedding Vector 내의 각 차원의 Index가 짝수인 경우 $\sin$ 함수를 사용하고 홀수인 경우 $\cos$ 함수를 사용한다
$d_{model}$은 Transformer의 Embedding Vector의 차원을 의미하는 Hyperparameter이다. 위의 그림에서는 4로 표현되어 있지만 논문에서는 512의 값을 가진다
위와 같은 Positional Encoding 방법을 사용하면 순서 정보가 보존되는데, 예를들어 각 Embedding Vector에 Positional Encoding 값을 더하면 같은 단어라고 하더라도 문장 내의 위치에 따라 Transformer의 입력으로 들어가는 값이 달라지게 되기 때문이다.
4. Attention
Transformer에서는 Encoder의 Self-attention, Decoder의 Masked Self-Attention, Decoder의 Encoder-Decoder Attention 총 3가지의 Attention을 사용한다.
첫번째 그림인 Self-Attention은 Encoder에서 이루어지지만, 두번째 그림인 Masked Decoder Self-Attention과 세번째 그림인 Encoder-Attention 어텐션은 Decoder에서 이루어진다.
Self-Attention은 본질적으로 Query, Key, Value가 동일한 경우를 말한다. (여기서 동일하는 것은 벡터의 값이 같다는 것이 아니라 벡터의 출처가 같다는 의미이다)
반면, 세번째 그림 Encoder-Decoder 어텐션에서는 Query가 Decoder의 벡터인 반면에 Key와 Value가 Encoder의 벡터이므로 Self-Attention이라고 부르지 않는다.
- Encoder Self-attention : Q = K = V
- Masked Decoder Self-Attention : Q = K = V
- Encoder-Decoder Attention : Q : Decoder Vector / K = V : Encoder Vector
위 그림은 Transformer 아키텍처에서 세 가지 Attention이 각각 어디에서 이루어지는지를 보여준다. 3개의 Attention에 추가적으로 Multi-head라는 이름이 붙어져있는데 이는 Transformer가 Attention을 병렬적으로 수행한다는 것을 의미한다.
5. Encoder
Transformer는 Hyper parameter인 $num\_layes$ 개수의 Encoder 층을 쌓는다.(논문에는 6 - Layers 사용)
Encoder를 하나의 층이라는 개념으로 생각한다면, 하나의 Encoder 층은 총 2개의 Sub Layer으로 나누어진다. Self-Attention Layer와 Position - wise Feed Forward Neural Network Layer이다.
Multi-head는 앞서 말한대로 Self Attention을 병렬적으로 사용하였다는 의미이고, Position - wise Feed Forward Neural Network(FFNN)은 일반적인 FFNN을 의미한다.(Fully Connected Layer와 같다)
Encoder의 Self Attention과 Position - wise Feed Forward Neural Network를 한 글에 설명하기엔 내용이 많아 별도에 글에 작성하도록 하겠습니다.
아래 글을 참고해주세요.
6. Decoder
Encoder는 총 $num\_layers$만큼 총 연산을 순차적으로 한 후에 마지막 층의 Encoder 출력을 Decoder에게 전달한다.
Encoder 연산이 끝났으면 Decoder 연산이 시작되어 Decoder 또한 $num\_layers$만큼 연산을 하는데, 이때마다 Encoder가 보낸 출력을 각 Decoder 층 연산에 사용한다.
Decoder에서 수행되는 연산은 아래와 같다.
- Masked Multi-head Self-Attention Layer
- Decoder의 입력만을 대상으로 Self-Attention을 수행한다.
- 이때 Masking을 통해 Decoder가 오직 이전 토큰까지만 참조하도록 제한하여, 학습 중에는 미래 정보를 보지 않도록 합니다.
- Multi-head Attention (Encoder-Decoder Attention)
- Encoder의 출력을 가져와서, Encoder가 제공한 문맥 정보를 Decoder의 현재 출력에 통합한다.
- 여기서 Encoder의 출력을 Key와 Value로 사용하고, Decoder의 Masked Self-Attention 출력을 Query로 사용하여 Attention을 계산한다.
- Positon - wise Feed Forward Neural Network
- Encoder-Decoder Attention 결과를 통해 얻은 출력을 Feed Forward Network에 통과시키고, 최종 출력을 생성한다.
7. Decoder의 첫번째 Sub Layer : Masked Self - Attention
위의 그림과 같이 Decoder도 Encoder와 동일하게 Embedding Layer와 Positional Encoding을 거친 후의 문장 행렬이 입력된다.
Transformer 또한 Teacher Forcing을 사용하여 훈련되므로 학습과정에서 Decoder는 번역할 문장에 해당되는 <sos> je suis étudiant의 문장행렬을 한번에 입력받는다. 그리고 Decoder는 이 문장행렬로부터 각 시점의 단어를 예측하도록 훈련된다.
Seq2Seq의 Decoder에서 사용되는 RNN 계열의 신경망은 입력 단어를 매 시점마다 순차적으로 입력받으르모 다음 단어 예측에 현재 시점을 포함한 이전 시점에 입력된 단어들만 참고할 수 있다.
하지만 Transformer는 문장 행렬로 입력을 한번에 받으므로 현재 시점의 단어를 예측하고자 할 때, 입력 문장 행렬로부터 미래 시점의 단어까지도 참고할 수 있는 현상이 발생한다.
따라서 Transformer의 Decoder에서는 현재 시점의 예측에서 현재 시점보다 미래에 있는 단어들을 참고하지 못하도로 Look-ahead mask를 도입하였다.
Look-ahead maks는 Decoder의 첫번째 Sub Layer에서 이루어진다.
Decoder의 첫번째 Sub Layer인 Multi-head Attention 층은 Encoder의 첫번째 Sub Layer인 Multi-head Attention 층과 동일한 연산을 수행한다. 다른 점은 Attention Score 행렬에 Masking을 적용한다는 점이다.
위의 그림은 Self Attention을 통해 Attention Score를 얻는 그림이다. 이제 자기 자신보다 미래에 있는 단어들은 참고하지 못하도록 아래의 그림과 같이 Masking을 한다.
Masking이 된 후 Attention Score의 행렬의 각 행을 보면 자기 자신과 그 이전 단어들만 참고할 수 있음을 볼 수 있다. 그 외에는 근본적으로 Self-Attention이라는 점과 Multi-head Attention을 수행한다는 점에서 Encoder의 첫번째 Sub Layer와 같다.
8. Decoder의 두번째 Sub Layer : Encoder - Decoder Attention
Decoder의 두번째 Sub Layer는 Multi-head Attention을 수행한다는 점에서 이전의 Attention들과 공통점이 있지만 Self-Attention이 아니다.
두 개의 빨간 화살표는 각각 Key, Value를 의미하며, 이는 Encoder의 마지막 층에서 온 행렬로부터 얻는다. 반면 Query는 Decoder의 첫번째 Sub Layer의 결과 행렬로부터 얻는다.
Query가 Decoder 행렬, Key가 Encoder 행렬일 때, Attention Score 행렬을 구하는 과정은 아래 그림과 같다.
이후 과정은 앞서 Encoder의 Self - Attention에서 수행한 Multi - Head Attention과 동일한 과정을 거친 후 Position - wise Feed Forward를 진행하면 된다.(num_layers 만큼 반복)
'DL > NLP' 카테고리의 다른 글
[DL][NLP] Transformer Encoder 동작 과정(Multi Head Self Attention, Position-wise Feed Forward Neural Network(FFNN)) (1) | 2024.10.29 |
---|---|
[DL][NLP] Attention Mechanism(어텐션 메커니즘) (1) | 2024.10.28 |
[DL][NLP] Seq2Seq 예제 (Pytorch) (2) | 2024.10.28 |
[DL][NLP] Seq2Seq(Seqence to Sequence) 모델 (5) | 2024.10.28 |