
Transformer 바닥부터 이해하기 - 1. Attention 이해하기
Attention의 내부를 뜯어보고 이해하기 위한 포스트를 작성합니다. Attention을 이해하기 위한 기반 지식Encoder-decoder ArchitectureAttention을 이해하기 위해서는 Encoder-decoder 아키텍처에 대해서 이해를 해
ray5273.tistory.com
이전 글인 Attention 이해하기에 이어서 이제는 제대로 Transformer를 이해해봅시다.
혹시나 이전글을 읽지 않으셨다면 읽고 이 글을 읽으시면 이해가 훨씬 잘 될것입니다.
Introduction
이전 포스트에서 언급했듯 Transformer는 seq-to-seq model입니다.
- 임의의 길이의 input sequence를 임의의 길이의 output sequence로 출력해주는 목적이 있죠
2. 또한 Encoder-decoder 아키텍처를 채용하고있습니다.
실제로는 가장 최초의 Transformer 모델은 아래와 같이 6개의 encoder와 6개의 decoder를 가지고 있었습니다.
그러면 Encoder와 Decoder의 내부를 조금 더 뜯어보도록 하겠습니다.
Encoder
6개의 모든 Encoder는 각각 아래와 같은 동일한 구조를 이루고 있습니다.
self attention layer와 feed-forward layer로 구성되어있죠.
1. Self-attention layer
- 이 layer는 아주 쉽게 말하자면 짧은 기억을 가지고 있는 메모리입니다.
- encoder로 하여금 input sentence의 다른 단어를 보도록 하는 역할을 가지고 있습니다.
2. Feed-forward neural network layer (FFNN)
- 이 layer는 self-attention layer와 반대로 장기 기억을 보존할 수 있도록 하는 메모리입니다.
- 입력 시퀀스의 모든 위치(단어)에 동일한 FFNN (동일한 가중치)가 독립적으로 적용됩니다.
- 즉, 파라미터 공유(parameter sharing)을 하고 있다는 것입니다.
- 예를 들면 Transformer는 "I love AI" 라는 문장에 대해서 아래와 같이 처리하고있다는 것 입니다.
그리고 이런 X(I), X(Love), X(AI)로 표현되는 숫자 벡터 값들을 embedding vector라고 하는데 이제 설명해보려고 합 니다.
그리고 문자열을 embedding vector로 전환해주는 동작을 word embedding이라고 합니다.
Word Embedding
간략하게 요약하면 컴퓨터가 계산을 쉽게 할 수 있도록 단어를 숫자로 표현해준다는 것입니다.
그 단어가 가지고 있는 특징까지 숫자에 포함해서 말이죠
따라서, 비슷한 단어는 비슷한 값으로 표현이 된다는게 가장 중요한 특징입니다.
좌표의 위치적인 특성과 문법적인 관계가 녹아있다는 것인데요.
아래와 같이 queen의 성질에서 woman을 빼고, man을 더하면 king의 값에 가까워지는게 특징이라는 것입니다.
e.g. V(queen) - V(woman) + V(man) = V(king)
이 정도만 이해하고 Decoder로 넘어가보겠습니다.
Decoder
decoder의 경우 encoder와는 다르게 하나의 Layer가 더 있어서 3개의 layer로 구성되어 있습니다.
1. Feed forward layer (FFNN) : encoder와 동일
2. Encoder-Decoder attention layer : attention layer (encoder와 다른점) 이자 cross attention layer
- Decoder가 출력 단어를 생성할때, 입력(input) 문장의 어떤 부분이 가장 중요한지를 집중할 수 있도록 도와줍니다.
- 즉, Decoder는 이전 단계에서 생성한 출력 뿐만아니라, 인코더에서 넘어온 입력 문장의 정보도 함께 보는데 이 layer를 참조한다는것입니다.
3. Self-Attention layer : encoder와 동일
이제는 그러면 Self-Attention Layer의 값들은 어떻게 만들어지는지를 알아보겠습니다.
Self-Attention Layer
Step1 - Encoder input에 대해 QKV 3개의 벡터를 각각 생성합니다.
각 input에 대한 Query, Key, Value 벡터를 각각 초기화 및 생성합니다.
이 벡터들은 학습 될 대상입니다.
또한 특징은 QKV 벡터들은 Embedding vector보다는 사이즈가 작습니다.
Step 2 - 각 단어에 대해서 self-attention score를 계산합니다.
이를 통해 각 단어가 다른 단어를 얼마나 Attention을 하고있는지를 계산합니다.
attention score는 query vector와 key vector를 내적(dot product) 해서 구할 수 있습니다.
score = (Query vector) dot product (Key vector)
Step 3 - attention score를 정규화 합니다.
Step 2에서 계산된 attention 값들을 조금 더 학습하기 좋게 안정화 하기 위해서 정규화를 합니다. (일반적으로 AI 학습 자주 사용하는 기법입니다.)
Softmax 함수를 통해서 계산하는데 아래와 같은 식을 쓴다고 그냥 받아들이시면 될거같습니다.
그래서 normalized된 attention score를 도출했습니다.
Step 4 - self-attention layer의 output 을 계산합니다.
최종적으로는 Value vector와 행렬 곱연산 (X)를 하여 selt-attention (그림에서의 z(n)들) 값을 도출해냅니다.
모든 연산의 결과를 그림으로 요약하면 아래와 같습니다.
다음은 multi-head attention이라는 것입니다.
Multi-head attention
이 부분도 많이 쓰는 기법입니다.
하나의 Encoder 내에서 여러개의 Attention을 한다는 의미입니다
따라서, Attention layer가 여러개라는 의미죠.
여러개의 attention layer를 둠으로써 각 attention layer가 서로 다른 해석 방법을 가질 수 있도록 하는것이죠.
이를 통해서 동일한 문장에 대해 다양한 해석을 할 수 있게 되는 것입니다.
최초의 Transformer는 하나의 encoder 내에 8개의 head attention layer를 쌓았습니다.
즉, encoder는 6개고, encoder layer 내에 8개의 attention layer가 있으니 48개의 attention layer가 encoder에 있는것입니다.
조금 더 쉽게 말하면 하나의 문장에 대해서 48개의 해석 방식을 시도 해 봤으니, 이를 통해 학습된 LLM은 문맥 파악을 아주 잘 하게 되는것입니다!
Positional Encoding
그 다음으로는 Positional Encoding이라는 개념이 있습니다.
이게 왜 중요하냐면 기존의 word embedding의 문제가 있기 때문입니다.
아래의 예시를 보면 두 문장은 서로 다르지만 Self-Attention은 본질적으로 두 문장을 구분하지 못합니다.
- "나는 축구를 좋아합니다."
- "축구를 나는 좋아합니다."
"축구를"을 Embedding vector로 변환하면 값이 똑같기 때문이죠.
그래서 각 단어가 문장 내에서 어떤 위치에 있는지 정보를 부여하기 위해 Positional Encoding(PE) 이 필요합니다.
이 PE 값들은 학습된 값일 수 있고 고정된 값일 수 있습니다.
그래서 Transformer에 넣어주는 값은 아래와 같이 Input Embedding + Positional Encoding 값이 합쳐진 값이 입력됩니다.
Transformer에서는 단어의 위치(pos)에 따라 아래와 같은 수식을 사용합니다.
수식의 의미
- pos : 단어의 위치 (문장의 몇 번째 단어인지0
- i : embedding dimension의 인덱스
- d_model : 모델에서 사용하는 embedding dimension(벡터 크기)
아래는 Transformer PE 계산된 값의 예시입니다.
Residuals and Layer Norm
Residual Connection (== skip connection)은 신경망에서 특정 레이어의 입력 값을 바로 다음 레이어로 전달해서 레이어를 건너 뛰는 구조를 말합니다.
Transformer에서 사용한 이유
- Transformer와 같은 깊은 신경망 구조에서는 깊이가 깊어질수록 Gradient가 잘 흐르지 않아 학습이 어려워지는 문제(Vanishing Gradient) 가 발생합니다.
- Residual Connections는 이전 레이어의 입력값을 더함으로써 Gradient가 레이어를 역전파(backpropagation)할 때 원활히 흐르게 도와줍니다.
- 따라서, 아무리 깊은 Layer를 쌓아도 이 Residual(Skip) connection 덕분에 학습이 잘 되게되는 좋은 효과가 있습니다.
그래서 이 skip layer 및 normalization 동작하는 layer를 self-attention과 Feed-forward layer 사이에 넣어주면 효과가 좋다고 합니다.
Decoder 아키텍처
이제는 드디어 Decoder 아키텍처로 왔습니다.
이전의 내용에서 Encoder와 Decoder의 차이는 Encoder-Decoder attention layer 유무의 차이가 있다고 했었죠
그림으로 먼저 보자면 Encoder에서 만들어낸 vector를 Decoder의 Encoder-decoder attention으로 값을 넘겨줍니다.
또한, 다른 점은 self-attention에도 일부 있습니다.
그 차이는 일반 self-attention을 쓰는게 아니라 masked self-attention을 쓴다는 것입니다.
- Decoder는 문장을 생성해주는 역할을 하죠.
- 그런데 문장을 생성할때는 생성할 예정인 단어를 미리 보고 생성하면 안됩니다. 어떻게 보면 당연하죠
- 기존의 self-attention은 문장 전체를 보기때문에 생성 예정인 단어도 보고있다고 봐야합니다.
- 그래서 masking이라는 기법을 적용해서 생성 예정인 단어와 문장들은 아예 보지 못하게 하는것입니다.
아래와 같은 예시를 보면 이해가 더 잘될 것입니다.
최종적으로 목표인 GenAI로 가기 위해서는 Decoder에서 나온 값들을 결국은 다시 우리가 사용하는 언어(영어, 한국어 등)으로 바꾸어야합니다.
그 동작을 Language Modeling head라는 부분에서 수행합니다.
Language Modeling (LM) head
2개의 component로 이루어져있습니다.
- linear layer (vector -> logit)
- decoder의 output값인 float 형태의 vector들을 logit으로 바꿔야합니다.
- logit은 생성하기 위한 후보 단어를 정하기 위한 점수라고 이해하면 됩니다.
- 따라서, logit의 길이는 vocabulary 크기와 동일합니다.
- softmax layer (logits -> probability vector)
- linear layer에서 생성한 logit을 확률 vector로 만듭니다.
- 이를 통해서 어떤 단어를 다음 단어로 선택할지에 대한 확률 벡터를 만드는것이죠.
그리고 LM에서는 Temperature라는 개념이 있어서 설명을 하려고합니다.
Temperature
AI 모델들을 사용하려다보면 Temperature 값을 주는 부분이 있습니다. (0~1사이의 값)
예전에 Microsoft Bing의 Copilot이 처음 나왔을 당시에 아래와 같은 3가지 옵션이 있었죠.
"창의적인, 균형있는, 정밀한"
이 옵션들은 Temperature 값을 통해서 정의 된 것입니다.
창의적이면 1.0에 가까운 Temperature를 주고, 정밀하면 0에 가까운 Temperature를 할당하는 방식입니다.
이 개념의 근원은 물리학인데요.
온도를 높이면 Random성을 높여주는 특징이 있어 이를 차용한것입니다.
Temperature 자체는 hyper-parameter입니다. (사용자가 직접 할당하는 값)
그리고 단어 선택에 있어서 Softmax로 확률을 만들때 Temperature를 부여하는 식은 아래의 형태와 같습니다.
최종적으로 배운것들을 합쳐보면 아래와 같은 그림이 되는것입니다.
'CS 지식 > AI 관련' 카테고리의 다른 글
Transformer 바닥부터 이해하기 - 1. Attention 이해하기 (0) | 2025.03.08 |
---|---|
Word Embedding에 관련된 질문 그리고 해답 찾기 (0) | 2025.03.05 |
Effective LLMs and MoE (Mixture of Experts) (0) | 2025.02.12 |
Transformer 바닥부터 이해하기 - 0. Transformer 이전의 NLP 역사들 (0) | 2025.02.12 |
Multimodal AI에 대한 여러 의견과 주요 모델들 (2) | 2025.02.09 |
개발 및 IT 관련 포스팅을 작성 하는 블로그입니다.
IT 기술 및 개인 개발에 대한 내용을 작성하는 블로그입니다. 많은 분들과 소통하며 의견을 나누고 싶습니다.