일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 강화학습
- two-stage detector
- AlexNet
- 그래프 이론
- opencv
- Mask Processing
- 머신러닝
- NLP
- C++
- image processing
- 딥러닝
- CNN
- DP
- One-Stage Detector
- Reinforcement Learning
- dynamic programming
- ubuntu
- real-time object detection
- YoLO
- MinHeap
- eecs 498
- 백준
- LSTM
- dfs
- MySQL
- Python
- machine learning
- r-cnn
- deep learning
- BFS
- Today
- Total
JINWOOJUNG
[ Transformer to LLaMA ] Transformer..01 본문
본 포스팅은 서울대학교 강필성 교수님의 Transformer to LLaMA 강의자료 및 강의를 기반으로
공부한 내용을 정리하는 포스팅입니다.
https://www.youtube.com/watch?v=Yk1tV_cXMMU&t=1021s
Transformer는 Attention Mechanism을 바탕으로 NLP, CV 등 다양한 분야에 새로운 발전을 이끌어 낸 딥러닝 모델입니다. 본 포스팅에 앞서, Attnetion Mechanism을 공부하지 않은 경우 아래 포스팅에서 먼저 공부 하시는 것을 추천합니다.
https://jinwoo-jung.tistory.com/148
[EECS 498] Lecture 17: Attention
본 포스팅은 Michigan Univ.의 EECS 498 강의를 수강하면서 공부한 내용을 정리하는 포스팅입니다.https://jinwoo-jung.tistory.com/147 [EECS 498] Lecture 16: Recurrent Neural Networks본 포스팅은 Michigan Univ.의 EECS 498
jinwoo-jung.com
Transformer를 공부하는데 있어서 강필설 교수님의 본 강의 뿐만 아니라, 앞서 다룬 Michigan Justin Johnson 교수님의 EECS 498의 Attention(Lecture 17) 및 서울대학교 이준석교수님의 Machine Learning&Deep Learning 1(Lecture 19,20) 역시 매우 뛰어난 강의의고, 3개의 강의를 모두 듣고 공부하며 최종적으로 정리하는 포스팅입니다.
Transformer이 등장하기 이전, WORD2VEC, GLOVE, FASTTEXT 등 Word Embedding Methods 들이 안정화되었다. 이후 2017년 Attention Mechanism을 기반으로 한 Transformer가 등장하면서, 이후에는 Transformer 기반의 Model들이 연구되고 있다. 단순히 NLP 분야에만 국한되는 것이 아닌, CV 분야로 확장된 ViT 등 다양하게 활용되고 있다.
Transformer
Transformer는 기존의 RNN처럼 1개의 Token씩 순차적으로 처리하는 것이 아닌, Attention의 병렬적 사용을 통해 효율적인 학습이 가능한 구조의 언어 모델이다. 왼쪽의 RNN Model의 경우 순차적으로 Token을 처리하지만, Transformer의 경우 Sequence의 모든 Word를 한번에 처리하는 것이 특징이다.
Transformer는 다음과 같이 Sequential Input을 입력으로 해서 Sequential Output을 만들어 내는 구조이다.
Transformer의 구조는 크게 Encoder와 Decoder 두 부분으로 구성되며, 이들은 서로 연결되어 정보를 전달한다. 논문에서는 Encoder와 Decoder 각각 6개의 동일한 레이어를 쌓은 구조를 사용하였다.
이때, 6개의 레이어 수는 실험적으로 설정된 값이며, 논문에서는 이 수가 최적이라는 논리적 근거를 제시하지 않는다. 실제로, 더 적거나 많은 레이어를 사용하여 성능을 비교하는 실험이 진행되기도 한다.
Encoder, Decoder Block 모두 Self-Attention, FFNN(Feed Forward Neural Network)가 사용되지만 약간의 차이가 존재한다.
Encoder는 입력 Sequence를 처리하는 부분이다. 즉, Sequnce Input을 모두 알고 있기 때문에 모든 Token들의 정보를 사용할 수 있다. 하지만, Decoder의 경우 Current Token 이후의 정보를 알 수 없다. 따라서 Masked Self-Attention을 거친 후, Encoder-Decoder Self-Attention을 통과하게 된다.
Transformer에서 Encoder와 Decoder의 Self-Attention 방식 차이를 이해하기 쉽게 설명하자면, ‘질문을 듣고 대답하는 상황’을 예로 들 수 있다.
Encoder는 질문을 모두 들은 상태이기 때문에, 전체 문장을 자유롭게 참고하여 정보를 처리할 수 있다. 즉, 모든 단어 간의 관계를 전방향으로 고려할 수 있는 Self-Attention을 사용한다. 반면, Decoder는 대답을 한 단어씩 순차적으로 생성해야 하기 때문에, 아직 말하지 않은 미래의 단어를 참고해서는 안 된다. 따라서 자기 앞에 있는 단어까지만 참고할 수 있는 Masked Self-Attention을 사용하게 된다.
자세한 Encoder, Decoder Block은 추후 자세하게 다뤄 볼 예정이다.
Transformer 동작 원리
Input Embedding
Input Embedding은 Sequence Input에 대해서 Sequence의 각 단어들을 Vector 형태로 변환하여 모델이 의미적 관계를 학습할 수 있도록 하는 과정이다. Encoder Part의 첫번째 Encoder Box의 Input으로 Word Embedding이 사용된다.
다음과 같이 개별 단어에 대해서 특정 차원의 Vector로 Embedding 되며, 논문에서는 512 차원의 Embedding을 수행하였다. 이때, Input Sequence의 길이는 Hyperparameter이다.즉, 사용자의 환경에 의해 결정된다.
첫번째 Encoder Block의 Input에서 사용되며, 나머지 Encoder Block의 Input은 하위 Encoder Block의 Output이 된다.
Position Encoding
Transformer는 한번에 Input Sequence의 모든 단어를 처리한다. 따라서, Sequence 내에서 각 단어의 위치 정보가 손실될 수 있다. 따라서, Input Sequence에서 단어들 간의 위치 관계를 표현하기 위해, Input Embedding에 Position Encoding을 더함으로써 최종적인 Input을 생성하게 된다.
Position Encoding은 결국 Input Sequence에서 단어들 간의 위치 관계를 표현하는 Vector이다. Input Embedding에 더해지기 때문에, Input Embedding과 동일한 크기를 가지게 된다.
그렇다면 좋은 Position Encoding은 어떤 특징을 가져야 할까?
- 모든 위치에서 Encoding Vector의 크기는 동일해야 한다.
Position Enocoding은 Input Embedding의 정보를 훼손하지 않으면서 동시에 위치 관계 정보를 추가하는 목적이다. 따라서 모든 위치에서 동일한 크기를 가지고 Input Embedding에 더해져야 한다.
- 두 단어 사이의 거리가 멀수록 해당 단어들의 포지션 인코딩간 거리는 멀어야 한다.
이 두 특징을 만족하는 Position Encoding을 위해, Transformer 논문에서는 아래와 같은 수식을 기반으로 계산하게 된다.
실제로 논문에서 제공한 시각자료를 기반으로 Position Encoding의 시각화 결과를 직관적으로 이해하기는 어렵다.
하지만, n=10, dim=10 일 때, 수식에 의해 계산된 각 단어의 Position Encoding Vector간의 거리를 계산 해 본 결과 다음과 같다. 거리를 살펴보면, 대각 행렬에서 멀어질수록 값이 커짐을 확인할 수 있다. 즉, 특정 단어와 거리가 먼 단어일수록 Position Encoding Vector의 차이가 크기 때문에 좋은 Position Encoding의 특징을 만족함을 확인할 수 있다.
n을 증가시켰을 때 결과는 다음과 같다. 이론상으론 멀수록 거리가 더 커야하지만, 주 대각선에서 멀어질수록 빨 -> 노 -> 초가 아닌 일부분은 섞여있음을 확인할 수 있다. 즉, 100% 위치 정보를 완벽하게 반영하지는 않지만, 전체적인 경향성이 그렇다고 이해하자.
Multi-head Attention
- Encoding Block
Position Encoding이 더해진 Word Embedding은 첫번째 Encoder Block의 Input으로 들어오게 된다. 각 Encoder Block은 아래와 같이 Self-Attention과 FFNN을 거치게 된다.
Self-Attention Layer는 주변 단어들을 고려하는 역할 즉, Sequence 내 다른 Word Embedding 간의 관계를 고려한다. 따라서 의존성이 존재하게 된다.
하지만, FFNN은 각 Position 마다 동일한 구조의 FFNN이 독립적으로 적용된다. 즉, 각 Position에 대해서 독립적으로 수행되기 때문에 의존성이 존재하지 않으며, Parallelization이 가능하다.
첫번째 Enocoder Block의 Output은 두번째 Encoder Block의 Input이 되며, 상위 Encoder Blocks 모두 동일하게 연결된다. 따라서 각 위치의 Vector의 차원은 일정하게 유지된다.
- Self-Attention
그렇다면 Self-Attention의 역할이 무엇일까?
Self-Attention은 Input Sequence의 다른 위치에 있는 단어들을 둘러보면서 특정 위치의 단어를 잘 설명/표현할 수 있게 하는 것이다. 아래 예시를 살펴보면, "It"이 문장 내에서 어떤 단어를 의미하는지를 Self-Attention을 통해 확인할 수 있으며, 관련성이 깊을수록 더 높은 Attention Score를 가지게 된다.
큰 틀에서 본 각 Head의 Self-Attention 동작 과정은 다음과 같다.
먼저 Input Embedding에 대해서 3가지 Vector를 생성한다. 논문에서는 $d_{model} = 512$로 제안하였으므로, $X \in \mathbb{R}^{seq\_len \times 512}$가 된다. 3가지 Vector는 Query, Key, Value로 아래와 같이 정의된다. 각 정의는 서로 다른 교수님께서 약간의 차이를 두고 정의하셨지만, 동일한 의미를 담고 있다.
- Query
- 다른 단어들을 고려하여 표현하고자 하는 대상이 되는 현재 단어에 대한 Embedding Vector
- 현재 찾고싶은 정보(단어)를 표현하는 Vector
- Key
- Qeury가 들어왔을 때 다른 단어들과 매칭을 하기 위해 사용되는 레이블로 사용되는 Embedding Vector
- Query가 원하는 정보(단어)가 Sequence 내에서 어디에 있는지
- Value
- Key와 연결된 실제 단어를 나타내는 Embedding
- Attention Weight를 기반으로 실제로 가져올 정보
Self-Attention이 작동할 때, 현재 단어가 "it"이라고 가정해보자. 이때 Query Vector는 현재 단어인 "it"의 임베딩에서 생성된 벡터로, 이 단어가 어떤 정보를 찾고자 하는지를 나타낸다.
이제 "it"과 관련된 정보를 찾기 위해, 입력 시퀀스에 있는 모든 단어들과 비교를 해야 한다. 이때 사용되는 것이 Key Vector이다. Key는 각 단어가 가진 정보의 레이블이나 정체성에 해당하며, 현재 Query가 어떤 단어에 주목해야 할지를 판단하는 기준이 된다.
Query와 Key를 내적해 유사도를 계산한 후, 이를 Softmax에 통과시켜 Attention Weight를 구한다. 이 값은 현재 단어가 시퀀스 내 다른 단어들에 얼마나 주목하는지를 나타내는 정도이다.
마지막으로, 실제로 주목한 단어들로부터 정보를 가져오는 역할은 Value Vector가 한다. Attention Weight를 각 단어의 Value Vector에 곱한 뒤, 이를 모두 더한 값이 현재 단어 "it"에 대한 최종 출력이 된다. 이 출력은 Self-Attention을 통해 문맥 정보를 반영한 표현으로, 이후 Transformer의 다음 계층으로 전달된다.
Query: “내가 지금 찾고 싶은 정보는?”
Key: “나는 어떤 정보를 담고 있어요!”
Value: “내가 실제로 가진 정보는 이거예요.”
Q,K,V Vector를 계싼하는 과정은 Matrix Multiplication을 통해 계산된다.
$X \in \mathbb{R}^{seq\_len \times 512}$이고, 각 Head 별 $Q,K,V \in \mathbb{R}^{seq\_len \times 64}$이기 때문에, $W^Q,W^K,W^V \in \mathbb{R}^{512 \times 64}$이 된다.
논문에서 제안 한 것처럼, 일반적으로 Q,K,V Vector는 Word Embedding 보다 적은 차원수를 갖도록 설계된다. 이는 Multi-head Self-Attention과 연관되어 있는데, 각 Head 당 Q,K,V Vector의 차원이 64 차원이고, 총 8개의 Head가 존재하므로, 각 Head의 Output을 이으면 512차원이 된다.
Query, Key, Value Vector를 생성한 뒤, 먼저 Query Vector와 Key Vector를 내적한 뒤, Softmax Function을 통해 Attention Score를 계산한다. 즉, 현재 표현하고자 하는 단어(Q)에 대해 어떤 단어들을 고려해야 하는지(K)를 알려주는 Score를 계산하는 것이다.
"it"에 대해서 다른 단어들과 얼마나 관계가 있는지 Score로 표현됨을 확인할 수 있으며, Softmax Function의 Output은 0~1의 Range를 가지기 때문에 Probability로 해석할 수 있다.
이때, Query Vector와 Key Vector를 내적한 값을 $\sqrt{d_k}$로 나눈뒤 Softmax를 통과시킴으로써 Gradient 전파를 안정적으로 수행할 수 있다.
최종적으로 Attention Weight와 Value Vector를 Weighted Sum 함으로써, 집중하고자 하는 Token의 값은 크게 유지하고, 불필요한 Token의 값을 매우 작게 만든다. 아래 예시에서 Attention Weight(Softmax)에 의해 각각의 Value($v_1, v_2, \cdots$)가 변형되며, 이들의 합이 $Z(z_1, z_2, \cdots)$가 된다.
따라서 Self-Attention의 Output $Z$는 $Z \in \mathbb{R}^{seq\_len \times 64}$이 된다.
실제로 위 과정 모두는 행렬 연산으로 수행된다.
전체적인 과정을 다르게 한번 더 살펴보면 다음과 같다.
- Multi-head Self-Attention
Transformer에서는 앞서 설명한 Self-Attention이 여러개 존재하는 Mutli-head Self-Attention 구조를 가진다. 즉, 한 Query Token에 대해서 다양한 관점으로 표현할 수 있는 능력(서로 다른 부분(목적으로) Attention)을 제공한다.
따라서 Multi-head Self-Attention 결과를 통합하기 위해, 각각의 Self-Attetion의 Output은 Concatenation된다. 따라서 $ \mathbb{R}^{seq\_len \times 512}$가 되고, Weight Matrix $W^O \in \mathbb{R}^{512 \times 512}$와의 연산을 통해 원래 입력 차원과 동일한 차원의 Output을 생성하게 된다.
따라서 최종적으로 다음과 같은 Multi-head Self-Attention이 수행된다.
그렇다면 실제로 Multi-head Self-Attention이 어떻게 적용될까?
아래와 같이 각각의 Head는 동일한 "it"이지만 서로 다른 목적(방향)으로 단어들을 Attention함을 확인할 수 있다. 즉, 다양한 관점에서 정보를 추출하고 이해할 수 있으며, 표현력이 향상된다.
Reference
https://jalammar.github.io/illustrated-transformer/
The Illustrated Transformer
Discussions: Hacker News (65 points, 4 comments), Reddit r/MachineLearning (29 points, 3 comments) Translations: Arabic, Chinese (Simplified) 1, Chinese (Simplified) 2, French 1, French 2, Italian, Japanese, Korean, Persian, Russian, Spanish 1, Spanish 2,
jalammar.github.io
'NLP, LLM, Multi-modal' 카테고리의 다른 글
[ Transformer to LLaMA ] Transformer..02 (0) | 2025.04.25 |
---|---|
[ NLP ] BLEU Score: 기계번역 평가지표 (0) | 2025.04.25 |
[ VLM ] VLM Tasks와 Benchmarks..(1) (0) | 2025.04.15 |
[ NLP ] 어간 추출(Stemming) & 표제어 추출(Lemmatization) (0) | 2025.04.14 |
[ NLP ] Cleaning & Normalization (0) | 2025.04.14 |