[DL Basic] 5. Transformer
- -
RNN같이 Sequential하게 입력이 들어가야하는 경우에는 중간에 어떤 부분이 빠지거나 순서가 조금 바뀌어서 들어가게 되면 모델링하는 것이 어렵다.
그래서 등장하게 되는것이 transformer이다.
Transformer은 attention이라고 불리우는 구조를 활용한 것이 가장 큰 특징이다.
Transformer은 Sequential한 data를 처리하고 이 data를 encoding하는 방법으로 NMT 뿐만 아니라 이미지 분류, 탐지 등 여러 곳에서 사용된다.
영어 문장(Sequence) 이 주어지고 그것을 불어 문장(Sequence)으로 출력하는 것을 Sequence-to-Sequence Model이라고 한다.
- RNN의 경우 3개의 단어가 들어가면 3번 재귀적으로 돌게 되는데, Self-attention 구조에서는 n개의 단어를 한번에 처리할 수 있다.
- 동일한 구조의 encoder/decoder가 stack 되어있는 구조이지만 학습되는 파라미터는 다르다.
▮ N개의 단어를 Encoder가 어떻게 한 번에 처리하는지?
Self-attention 부분이 Encoder와 Decoder의 핵심이다.
아래와 같은 3개의 단어벡터가 input으로 들어간다고 가정하자.
벡터 $x_{1}$이 self-attention을 거쳐서 $z_{1}$으로 출력될 때 단순히 $x_{1}$의 정보만 활용하는 것이 아니라 $x_{2}$와 $x_{3}$의 정보를 같이 활용한다.
▮ Self-Attention at a high level
'The animal didn't cross the street because it was too tired'
it이 어떤 단어에 dependent하는지를 알아야 한다.
Transformer는 'it'이라는 단어를 encoding을 할 때, 다른 단어들과의 관계성을 보게 되고 위 그림처럼 학습된 결과를 보게 되면 'it'이 'animal'과 높은 관계가 있다고 학습이 되기 때문에 단어를 더 잘 표현할 수 있다.
▮ Self-Attention in Detail
만약 'Thinking'과 'Machine' 2개의 단어가 주어졌다고 가정해보자.
Self-Attention 구조는 Input이 주어졌을 때 3가지 벡터(Query,Key,Value)를 만들게 된다. (3개의 neural network가 있다고 보면 된다.)
Query, Key, Value 벡터들은 $x_{i}$이라는 첫 번째 단어의 Embedding 벡터를 새로운 벡터로 바꿔줄 것이다.
'Thinking'과 'Machines' 단어 2개가 주어져 있고, 'Thinking'이라는 단어를 Encoding하는 과정은 다음과 같다.
첫번째로 해주는 것은 Score 벡터를 만든다.
Score 벡터는 Encoding을 하고자하는 단어의 query 벡터와 n개의 단어들의 key 벡터들과 각각 내적을 한다.
→ i번 째 단어가 나머지 단어와 얼마나 관계가 있는지를 정량화하게 된다. (Attention!)
그 다음은 이것들을 Key vector의 dimension에 root를 씌워서 나누어주는 방식으로 Normalize 해준다.
score vector가 너무 커지지 않게 특정 range 안에 들어가주게 해주기 위해서 Normalize해준다.
그리고나서 Softmax를 취해줌으로써 0과 1 사이의 값으로 변환시켜준다.
'Thinking'이라는 단어는 자기 자신과의 interaction 정도는 0.88이 되고 'Machines'이라는 단어와의 interaction 정도는 0.12가 된다.
그렇게 구한 값을 Value 벡터에 곱해주고 최종적으로 weighted sum of value vectors한 것이 그 단어에 대한 encoding 벡터이다.
🔥 주의해야 할 점 🔥
항상 query 벡터와 key 벡터는 차원이 같아야 한다. (내적해야하기 때문)
그러나 value 벡터는 weighted sum만 해주므로 차원이 달라도 된다.
▮ Matrix Calculation of Self-Attention
위 그림에서 X는 (2x4) Matrix인데 이는 단어가 2개 있고 각 단어마다 4차원이라는 뜻이다.
Q, K, V를 찾아내는 $W^{Q}$, $W^{K}$, $W^{V}$ 가 존재한다. (MLP가 하나씩 있다.)
이 MLP는 encoding된 단어마다 shared된다.
그림에서는 2개의 단어가 주어졌으니까 2개의 Query, Key, Value 벡터가 나온 것이다.
그리고서 Query 벡터와 Key 벡터를 내적해서 Scalar값을 구한 뒤 Key Vector의 dimension의 루트값으로 나누어주고 Softmax를 취한 뒤 Value 벡터에 대해서 weighted Sum을 하면 임베딩 벡터가 나온다.
왜 Transformer가 잘 될까?
이미지 하나를 CNN이나 MLP로 dimension을 바꾸게 되면 filter나 weight는 고정이 되어 있기 때문에 output도 고정된다.
Transformer는 하나의 input이 고정되어 있다 하더라도 내가 encoding 하려는 단어와 그 옆에 있는 단어들에 따라서 encoding값이 달라지게 된다.
MLP보다 조금 더 flexible한 모델이기 때문에 표현력이 더 좋다고 할 수 있다.
그러나 n개의 단어가 주어지면 기본적으로 nXn짜리 Attention map을 만들어야 한다.
RNN의 경우 10000개의 Sequence가 주어지면 10000번 재귀적으로 돌리면 오래걸리겠지만 학습은 된다.그러나 Transformer는 10000개의 단어를 한번에 처리해야하기 때문에 10000X10000 matrix를 계산해야하고 length가 길어지면 길어질수록 처리하는데 한계가 존재한다.이런 단점이 존재하지만 그래도 훨씬 더 표현력이 좋은 네트워크 모델을 만들 수 있다.
▮ Multi-head Attention
Multi-head Attention은 embedding 된 vector에 대해서 Query, Key, Value를 하나만 만드는 것이 아니라 N개 만드는 방법이다.
N개의 Attention을 하면 N개의 encoding 벡터가 나올 것이다.
아래 그림의 경우 8개의 Head가 사용되었으므로 8개의 encoding 벡터가 나왔다.
고려해야할 것은 Encoding 된 값이 다음 layer로 넘어가게 되는데 그렇게 되기 위해서는 입력과 출력의 차원을 맞춰주어야 한다.
즉, Embedding된 dimension과 Encoding되어서 self-attention 값으로 나오는 벡터의 dimension이 같아야 한다.
위 그림에서 보면 8개의 벡터가 나왔는데, 한 개당 dimension이 10이라면 모든 attention값을 concatenate하면 80차원이 될 것이다.
입력과 출력의 차원을 맞춰주어야 하므로 80X10 matrix를 곱하여 10차원으로 줄여버린다.
근데 실제 구현체를 보면 이렇게 되어있지 않다.
원래 내 embedding dimension이 100이라고 하고, 10개의 head를 사용한다면,
100 dimension을 10개로 나눈다.
즉, 실제로 Query, Key, Value 벡터를 만들 때 각각 10 dimension을 이용한다.
▮ Representing The Order of The Sequence Using Positional Encoding
Embedding된 값에 특정 값을 더해주는 과정이다.
Transformer에 n개의 단어를 Sequential하게 넣어주었다고 하지만 사실 Sequential한 정보가 포함되어 있지는 않다.
Self-Attention의 동작을 생각해보면 ABCDE를 넣거나 BCEDA를 넣거나 각각의 Encoding 값은 달라지지 않는다.
그러나 실제 문장을 만들때는 어떤 단어가 어디서 나오는지 순서가 중요하다. 그래서 positional encoding 값을 더해준다.
Encoding Vector가 나오면 Layer Normalization을 하고 그 다음에 Feed Forward에 입력하고 다시 Normalization을 한다.
Encoder는 우리가 어떤 단어를 표현하는 것이었고, Decoder는 그걸 가지고 어떤 것을 생성해낸다.
중요한 점은 Encoder에서 Decoder로 어떤 정보가 전해지는지이다.
Transformer의 가장 상단의 Encoder는 Decoder에게 Key와 Value를 보내게 된다.
Encoder는 r 번째 단어를 만들 때 r 번째 단어의 query 벡터와 나머지 단어들의 key 벡터를 곱해서 attention을 만들고, 거기에 value 벡터를 weighted sum을 한다.
input에 있는 단어들을 decoder에 있는, 출력하고자하는 단어들에 대해서 attention을 만들려면 input에 있는 단어들의 key 벡터와 value 벡터가 필요하다.
그리고나서 decoder에 들어가는 단어들로부터 만들어지는 query 벡터와 Encoder로부터 입력으로 주어지는 단어들로 얻어지는 Key 벡터와 Value 벡터를 가지고 최종적인 값이 나오게 된다.
학습 단계에서는 정답을 다 알게 되면 의미가 없기 때문에 이전 단어들만 dependent하게 하고 뒤에 단어들은 dependent하지 않게 마스킹 처리를 해준다.
▮ The Final Linear and Softmax Layer
마지막 layer는 단어들의 분포를 만들어서 가장 확률이 높은 단어를 출력하는 방식이다.
부스트캠프 AI Tech 교육 자료를 참고하였습니다.
https://jalammar.github.io/illustrated-transformer/
'부스트캠프 AI Tech 4기' 카테고리의 다른 글
[Data viz] 1. 시각화의 요소 상태 & Matplotlib (1) | 2022.10.07 |
---|---|
[DL Basic] 6. Genrative Model (0) | 2022.10.06 |
[DL Basic] 4. Recurrent Neural Networks (0) | 2022.10.06 |
[DL Basic] 3. CNN (1) | 2022.10.05 |
[DL Basic] 2. Optimization (1) | 2022.10.04 |