기존에 사용되는 성능이 좋은 Sequence 변환 모델들은 복잡한 RNN, CNN을 기반으로 두고 있습니다. 이는 Sequence가 길어수록 메모리 문제로 인해 병렬적 처리를 어렵게 만듭니다. 입력과 출력 sequence 거리에 상관없이 dependencies를 모델링할 수 있게 해주는 Attention mechanism가 있으나, 이는 RNN과 함께 사용되어 효율적인 병렬화가 불가능합니다.
Seq2Seq 모델을 예를 들자면, encoder의 최종 output을 embedded vector로써 사용하여 Decoder에 넣어줄 때, emebedded vector의 크기를 제한해야 합니다. 이는 길이가 긴 Sequence 데이터를 처리할 때, 제한된 크기의 embedded vector에 모든 정보를 담아야 하기에 정보의 손실이 커지고 이에 따라 성능의 병목현상이 발생합니다.
그래서 전적으로 attention mechanism에만 의존하여 입력과 출력간의 global dependencies를 도출하는 모델 구조인 Transformer가 등장하게 되었습니다. Transformer는 훨씬 더 많은 병렬화를 가능하게 합니다.
모델 구조
Transformer 또한 다른 모델들처럼 Encoder-Decoder 구조를 가지고 있습니다.
내부에는 Self-attentionn과 Fc layer만으로 구성되어 있습니다.
Self-attention
Self-attention은 attention을 자신을 대상으로 수행한다는 것을 의미합니다.
자기 자신을 대상으로 수행하는 이유는 문장에서 단어들의 연관성을 알기 위해서 입니다.
이를 위해 Scaled Dot-Product Attention과 Multi-Head Attention 개념이 등장합니다.
1) Scaled Dot- Product Attention
Scaled Dot-Product attention은 최종 예측 수행에 필요한 Attention 행렬을 구하는 것이 목적입니다.
Attention 행렬은 위와 같이 계산됩니다. 위의 그림을 참고하면서 식에 대해서 알아보겠습니다.
우선 Input값으로 Query, Key, Value값이 들어옵니다. 이에 대한 내용은 이전 포스팅을 참고해주세요.
식을 보면 Q와 전치된 K가 내적 연산이 수행된 것을 볼 수 있습니다.
여기서 Q는 어떤 단어를 나타내는 vector이고, K는 문장 내 모든 단어들에 대한 vector입니다.
즉, 어떤 단어 Q에 대해 문장 내 모든 단어들의 Attention Score를 구하는 과정입니다.
문장 내 모든 단어를 Q로 사용하면 문장 내 단어들의 연관성을 알 수 있는 행렬이 만들어집니다.
이렇게 만들어진 행렬을 루트 d_k로 나누어주는 scaling 작업을 수행해줍니다.
여기서 d_k는 Q와 K의 dimension을 의미합니다.
scailing을 하는 이유는 차원이 커져 학습이 어려워지는 것을 막기 위한 것이라고 합니다.
softmax를 통해 Query단어가 모든 단어들과 어느정도의 연관성이 있는지를 확률 분포 형태로 만들어 줍니다. 그 후에 이를 Value 행렬과의 내적을 통해 기존 value벡터에 Query와 Key간의 연관성 정보가 더해진 vector를 만들어줍니다.
2) Multi-Head Attention
하나의 attention function을 사용하는 것 보다 queries, keys, values를 linear projection을 통해 mapping을 해주어 각 다른 값들을 입력으로 하는 여러개의 attention function들을 만드는 것이 더욱 효율적이라고 합니다. Multi-Head Attention은 모델이 서로 다른 위치에서 서로 다른 representation subspaces에 공동으로 주의를 기울일 수 있게 해줍니다.
논문에서는 h=8일때, d_k = d_v = d_model /h = 64를 사용하여, dimension이 줄어들어 single-head attention을 했을 때와 비교해봐도 비슷한 computational cost를 가진다고 합니다.
논문에서는 3종류의 multi-head attention을 사용합니다.
1) Encoder-Decoder attention
decoder에서 self-attention 다음으로 사용되는 layer로 queries는 이전 decoder layer에서 가져오고, key와 value는 encoder의 output에서 가져옵니다. 이는 decoder의 sequence vector들이 encoder의 sequence vector들과 어떤 연관성을 가지는지 학습합니다.
2) Encoder self-attention
모든 key, value, query는 encoder로부터 가져옵니다. encoder의 각 position은 encoder의 이전 layer에 있는 모든 position을 참고하고, 이는 해당 position과 모든 position간의 연관성 정보를 더해주게 됩니다.
3) Decoder self-attention
sequence model의 auto-regressive property를 보존하기 위해 masking vector를 사용하여 해당 position 이전의 vector들만을 참고합니다.
Positional Encoding
서론부분에서도 말했듯이 Transformer는 RNN을 전혀 사용하지 않고, attention mechanism만을 사용하여 만들기 때문에 문장의 Sequence 정보를 담아낼 수가 없습니다. 이를 위해 Sequence 정보를 추가해주는 Positional encoding 작업이 필요합니다. 논문에서는 다양한 PE 방식중 sin함수와 cos함수를 사용하였습니다.
pos는 위치, i는 embedding 차원을 의미합니다. embedding 차원이 짝수이면, sin함수를 사용하고, 홀수이면, cos함수를 사용하여 Positional embedding vector를 구합니다. 이를 단어 embedding vector와 더해주면 됩니다.
Why Self-Attention?
Self-Attention이 RNN과 CNN보다 좋은 이유가 무엇인지에 대해 설명합니다.
1) 하나의 레이어 당 연산 복잡도 감소
Self-Attention에서는 RNN은 하지 못한 병렬 처리 연산의 양을 대폭 늘려 학습 시간이 감소
2) Long term dependency 문제 해결
Transformer는 대응되는 토큰들간의 거리값이 다른 모델들에 비해 매우 짧기에 Long term dependency문제를 극복 가능하고, Sequence 변환 문제도 해결하였습니다.
3) 해석 가능한 모델
'Attention'이라는 가중치를 시각화하여 토큰들 간의 대응관계를 눈으로 직접 확인 가능합니다.
저는 Vision분야에 관심이 있어 NLP 공부를 하지 않았는데, Vision Transformer 이해를 위해 NLP의 Transformer를 공부하기로 계획을 세웠고, 이왕 하는김에 NLP분야의 큰 흐름이라도 알고 가볼까? 라는 생각으로 NLP분야의 대표적인 모델들에 대해서 정리를 해보았습니다.
공부를 하면 할수록 점점 Vision, NLP 분야의 경계가 점점 흐려진다는 느낌을 받네요. 언제 또 NLP에 대한 공부를 진행하게 될지는 모르지만, 요즘 핫한 GPT모델에 대해서도 리뷰하는 날이 올때까지 아디오스,,👍👍
'Deep Learning > NLP' 카테고리의 다른 글
GPT-1 (Improving Language Understanding by Generative Pre-Training) (0) | 2024.03.16 |
---|---|
BERT (Pre-training of Deep Bidirectional Transformers for Language Understanding) (2) | 2024.03.15 |
Attention (0) | 2023.10.27 |
Seq2Seq(Sequence to Sequence) (0) | 2023.10.27 |
LSTM(Long short Term Memory Network) (0) | 2023.10.26 |
댓글