Transformer 와 Attention (1)
Attention 은 최근 딥러닝 분야에서 CV, NLP, Recsys 분야를 가리지 않고 널리 쓰이는 아키텍쳐입니다.
농담삼아서 일단 Attention 을 집어넣으면 딥러닝 성능이 마법처럼 올라간다고 말하기도 합니다. 이런 유용함 덕분에 최근 화제가 되고 있는 Chat-GPT 나 생성모델인 Stable Diffution 등 다양한 모델에서 사용되고 있습니다.
이번 포스팅에서는 attention 이 널리 알려지게 된 Transformer 에 대해 살펴보고, Attention 구조를 중점으로 공부해보겠습니다.
1. Transformer?
Transformer 는 $Attention$ $is$ $all$ $you$ $need$ $(2017)$ 에서 소개된 오직 Attention 아키텍쳐만 이용한 Encoder-Decoder 로 구성된 기계번역을 위한 모델입니다. 기존에 사용하던 RNN 모델을 대체하기 위해 제안되었습니다.

여기서 먼저 눈여겨봐야 할 점은 '번역'을 하기위해 'Encoder-Decoder 구조'를 사용한다는 점 입니다.
번역이란, 특정 언어를 동일한 의미의 다른 언어로 옮기는 것을 의미합니다. 그리고 동일한 의미의 문장을 만들기 위해 Encoder-Decoder 를 사용했습니다.
이 두 가지를 살펴보면, 결론적으로 Transformer 는 AutoEncoder 에 기반한 모델이라는 것을 알 수 있습니다.
2. AutoEncoder 와 RNN
Autoencoder 에 대해 간략하게 정의하면, 입력 $x$ 와 출력 $y$가 같은 모델입니다.

AutoEncoder 는 Encoder 와 Decoder 로 구성되어 있는 모델입니다. Encoder 에서는 Input Data $x$ 를 Encoder 를 이용해 압축된 값 $z$ 를 얻습니다. Decoder 에서는 압축된 값 $z$ 에서 Input Data $x$ 와 같은 크기의 $y$ 를 출력합니다. 정리하자면, Encoder 는 입력값 $x$ 를 잘 압축하고, Decoder 는 입력값 $x$ 에서 출력 $y$ 로 잘 복원하는 역할을 합니다.
그렇다면 z 는 어떤 값을 가질지 생각해보면, 입력값 $x$ 를 잘 요약한 값을 가질 것이라 생각이 듭니다. 이런 $z$ 를 Latent Vector 라 합니다.

이를 번역의 관점에서 바라보면, Encoder는 번역하고자 하는 문장 $x$ 의 의미를 잘 압축해서 latent Vector 인 $z$ 를 만들것이고, Decoder는 $z$ 를 잘 복원하여 옮기고자 하는 언어의 문장으로 만들 것입니다.
Transformer 모델의 등장 이전에 자주 쓰이던 RNN 모델도 마찬가지로 Encoder-Decoder 구조로 이루어져 있습니다. 이를 이용하여 문장을 번역을 했습니다.

RNN은 연속적으로 입력을 받아들이고 latent Vector 를 업데이트 해서 시퀀스 형태의 데이터를 처리하기에 적합하여 널리 사용되었습니다. 그러나 병렬화가 불가능해 대규모 데이터셋을 이용한 학습이 불가능하다는 점과 long distance depenndency 문제, 즉 시퀀스에서 멀리 떨어진 항목들 관의 관계성은 gradient vanishing/exploding 문제로 학습이 잘 안되는 문제가 있습니다.
Transformer 는 이런 단점을 해결하기 위해 RNN 구조를 제거하고 Attention 구조만을 사용했습니다.
3. Attention
Attention 메커니즘이 Transformer 에서 처음 소개된 것은 아니지만, Transformer 모델로 인해 그 유용성이 입증되며 널리 사용되기 시작했습니다.
Attention 메커니즘에 대해 정의하자면, 벡터 간 유사도를 계산하여 벡터의 정보를 계산하는 과정이라고 말할 수 있습니다. 이를 위해 Query, Key, Value 가 소개되고, 이를 통해 유사도(similarity) 를 구하여 스코어(Score) 를 계산합니다.
먼저 Query, Key, Value 에 대해 알아봅시다.
4. Query, Key, Value
Query, Key, Value 은 처음 들으면 매우 생소합니다. 저도 처음 배울때 '???' 생각만 했습니다. 심지어 Transformer 의 Encoder 에서 사용되는 self attention 을 할 때는 동일한 vector 를 사용해서 Query, Key, Value 를 만든다고 할 때는 혼란의 끝을 달렸습니다. 그래서 처음 배울때는 attention 에 대해 이해를 못하고 그냥 외우고 말았습니다.
왜 Query, Key, Value 라고 할까요? 뭐든지 의미를 알면 이해하기 쉬운 법입니다.
우선 Key, Value 부터 봅시다. Key, Value 만 보면 뭔가 친숙하지 않나요? 파이썬 Dictionary 자료구조에서 많이 봤습니다. 파이썬 Dict 자료구조는 알다싶이 Key-Value 쌍을 저장하는 구조로, Key 로 호출하면 Value 가 나옵니다.
Query 의 의미는 '질문' 입니다. '특정 vector 와 비슷한 key 가 있나요?' 하고 질문을 한다는 의미입니다. 질문이 들어오면, 유사한 Key 를 찾아 유사한 만큼의 확률로 값을 계산하게 됩니다.
그리고 각각의 Value 들에 유사도를 곱하여 가중합을 하여 Attention Value 를 계산하게 됩니다.
I am a student 라는 문장을 예로 들면,
- [Query] : I 는 어떤 단어와 비슷하지?
- [Key] 유사도 : 0.8 student, 0.1 am ...
- student 의 Key 는 Query 와 0.8 만큼 유사하니 student 의 Value 를 0.8 만큼 반영할께요
- I 의 Attention Value == 0.8 student + 0.1 am + ...
정리하면
1. 질문(Query) 가 들어오면
2. Query 에 대해 각각의 Key 와 유사도를 계산하고
3. 각각의 유사도와 Value 의 가중합을 하여 Attention Value 를 계산한다.
Query, Key, Value 는 Embedded Vector 에서 각각 학습가능한 레이어(nn.Linear 등) 을 통해 생성합니다.
그러면 유사도를 구하는 Score 함수를 어떻게 계산하는지 알아보도록 하겠습니다.
5. 유사도를 구하는 Score 함수
Transformer 모델에서는 유사도를 구하는 Score 함수로 Scaled Dot Product Attention 함수를 사용합니다. Query 와 Key 의 내적(Dot Product)을 통해 Score 를 계산합니다.

이를 통해 간단하게 Query 와 Key 사이의 유사도를 구할 수 있습니다.
이후 Key 의 차원으로 나눈 뒤, Softmax 함수를 취한 후 Value 를 곱하게 됩니다.

정리하면,
1. 내적(dot product) 을 통해 유사도 계산
2. 유사도를 Key vector 의 차원으로 나누어서 Normalize
3. Softmax 연산을 하여 어텐션 분포(Attention Distribution)를 구함
4. 어텐션 분포를 Value 와 곱하여 Attention Value 계산
여기까지 Transfomer 의 개념과 Encoder-Decoder 구조, Attention 에 대해서 다루어 보았습니다. 다음 포스팅에서는 Encoder 에서 쓰이는 Self Attention 과 Decoder 에서 쓰이는 Cross Attention 에 대해 다뤄보겠습니다.
Transfomer 와 Attention (2)
'DeepLeaning > 이론' 카테고리의 다른 글
| [논문리뷰] A ConvNet for the 2020s, ConvNeXt 리뷰 (0) | 2023.08.02 |
|---|---|
| [논문리뷰]Deep Residual Learning for Image Recognition(2015), ResNet 리뷰 (0) | 2023.07.17 |
| Transformer 와 Attention (2) (0) | 2023.06.29 |



