민프
[AI | ML] [LLM] 2-2. LLM의 동작원리 - Transformer (Attention is All you need 논문리뷰) (feat. Self-Attention, Multi-Head Encoder..) 본문
[AI | ML] [LLM] 2-2. LLM의 동작원리 - Transformer (Attention is All you need 논문리뷰) (feat. Self-Attention, Multi-Head Encoder..)
민프야 2024. 12. 18. 19:39이번 포스팅에서는 Attention is All you need논문을 기반으로 Transformer에 대해서 알아보겠습니다.
결론적으로 논문에서 말하는 Transformer는 이전에 포스팅했던 Attention을 기반으로 만들어서 기존의 언어 모델 RNN, LSTM 등...의 한계점을 극복할 수 있었습니다.
어떤 문제가 있었는지부터 차근차근 알아보도록 하겠습니다.
1. 연구의 배경: 기존 모델의 한계
기존의 RNN, LSTM 기반 Seq2Seq 모델은 텍스트를 시퀀스 단위로 처리했어요. 즉, 입력 문장을 처음부터 끝까지 순서대로 읽어야 했습니다. 하지만 이 구조에는 몇 가지 치명적인 단점이 있었죠
- 순차적 처리로 병렬화가 불가능
- RNN은 하나의 단어를 처리한 후에야 다음 단어를 처리할 수 있어서 학습 속도가 느렸습니다.
- 장기 의존성 문제
- 문장이 길어질수록 초반의 정보가 후반으로 갈수록 희미해지는 문제가 발생했어요. (고정 Context Vector문제)
- 학습 비용이 크다
- 더 긴 시퀀스를 학습하려면 엄청난 시간이 소요되었습니다.
그래서 등장한 것이 바로 Attention 메커니즘입니다. Attention은 입력 문장의 모든 단어를 한 번에 참조하면서 필요한 부분에 집중하는 기법이에요.
2. Transformer의 핵심: Attention만으로 이루어진 모델
Transformer는 기존의 RNN이나 CNN을 완전히 버리고 Attention 메커니즘만으로 문장을 처리하는 모델입니다.
- Self-Attention: 문장의 각 단어가 다른 단어와의 관계를 스스로 학습.
- Multi-Head Attention: 여러 개의 Attention을 동시에 수행해 다양한 패턴을 학습.
- 병렬 처리: 모든 단어를 한 번에 처리하기 때문에 학습 속도가 비약적으로 증가.
자 그럼 어떻게 Attention 메커니즘만으로 이루어져 동작을 하게 되는지 Transformer의 구조에 대해서 알아보도록 하겠습니다.
3. Transformer의 구조
Transformer는 Seq2Seq의 Encoder-Decoder구조를 계승하여서 크게 Encoder와 Decoder로 구성되어 있습니다.
Transformer는 입력 시퀀스를 받아 출력 시퀀스를 생성하는 모델입니다.
- 왼쪽: Encoder (N개의 레이어 반복)
- 오른쪽: Decoder (N개의 레이어 반복)
입력과 출력
- Inputs: 입력 문장은 Input Embedding 레이어를 통해 고유한 벡터 표현으로 변환됩니다.
- Outputs (shifted right): 출력 문장은 Output Embedding을 거쳐 Decoder에 입력됩니다.
(이때 shifted right는 다음 단어를 예측하는 작업에서 이전 단어만을 참조하도록 하는 장치입니다.)
1. Encoder: 입력 문장을 처리 (왼쪽)
Encoder는 입력 문장을 N개의 레이어를 통해 처리합니다. 각 레이어는 두 가지 핵심 블록으로 구성되어 있습니다:
1-1 Multi-Head Self-Attention
- Self-Attention: 입력 문장의 각 단어가 다른 모든 단어와의 관계를 학습합니다.
- 이를 통해 문장 내 단어 간의 의존 관계를 파악합니다.
- 예: “The cat sat on the mat”에서 “cat”은 “sat”과 밀접한 관계를 가지게 됩니다.
- Multi-Head: 여러 개의 Attention 헤드를 동시에 사용합니다.
- 각 헤드는 다른 시각에서 단어 간의 관계를 학습하므로, 더 풍부한 표현을 얻을 수 있습니다.
여기에서 Self-Attention이 언급이 되었는데요
Self-Attention에 대해서 알아보겠습니다.
1-1-1. Self-Attention이란?
Self-Attention은 하나의 문장(시퀀스) 내에서 각 단어가 다른 단어와의 관계를 학습하는 메커니즘입니다.
- 목적: 문장 내에서 특정 단어가 다른 단어와 얼마나 연관되어 있는지를 계산합니다.
- 사용 위치: Encoder와 Decoder에서 모두 사용됩니다. (아키텍쳐 참고)
예를 들어 문장 “The cat sat on the mat”가 있을 때,
- “sat”라는 단어는 문맥상 “cat”과 가장 밀접한 관계를 가지므로, “cat”에 더 높은 가중치를 부여합니다.
Self-Attention은 이런 관계를 동적으로 계산하고 문장의 의미적 연결성을 학습합니다.
1-1-2. Self-Attention의 동작 원리
Self-Attention은 기존 Encoder-Decoder Attention과 같이 Query(Q), Key(K), Value(V)의 개념을 기반으로 동작합니다.
해당 Q, K, V는 모두 같은 시퀀스에서 생성됩니다.
- 입력: 문장의 단어 임베딩 벡터
- 출력: 문장 내에서 각 단어의 문맥이 반영된 벡터
단계 1: 단어 임베딩 → Query, Key, Value 생성
문장 “The cat sat on the mat”의 각 단어를 임베딩 벡터로 변환합니다.
- Q : Query 벡터 (어떤 단어가 중요한지를 판단하기 위한 질문).
- K : Key 벡터 (각 단어의 답변 후보).
- V : Value 벡터 (실제 출력에 반영되는 단어 정보).
단계 2: Query와 Key를 사용해 Attention Score 계산
Query와 Key 간의 유사도를 계산합니다.
기존 Attention에서는 "Feedforward Neural Network" 을 사용했지만 Self-Attention에서는 내적(dot product)으로 계산합니다.
- 유사도는 내적(dot product)을 통해 구해집니다
- Qi : 문장 내 i번째 단어의 Query 벡터
- Kj : 문장 내 j번째 단어의 Key 벡터
각 단어가 다른 단어와 얼마나 관련이 있는지를 나타내는 Attention Score가 계산됩니다.
즉,
- 높은 값 → 두 벡터(단어)가 서로 밀접하게 연관되어 있음.
- 낮은 값 → 두 벡터의 관계가 약함.
단계 3: Softmax를 통해 가중치 계산
Attention Score를 Softmax 함수에 통과시켜 확률 분포(가중치)로 변환합니다:
- QK^T : Query와 Key의 내적(dot product)을 통해 유사도 점수를 계산 (2단계때 한 부분)
- softmax : 유사도 점수를 확률 분포로 변환
- V(Value) : 벡터에 가중치를 곱해 최종 출력을 생성합니다.
따라서 결론적으로 예시문장 “The cat sat on the mat”의 단어들이 서로를 참조하며 관계를 학습합니다
예를 들어서)
예시문장 : The cat sat on the mat 으로 설명해보자면
-1. 각 단어 임베딩 X 에 가중치 행렬 W_Q, W_K, W_V 를 곱해 Q , K , V 를 만들어주니깐 아래와 같은 테이블이 나올 수 있습니다.
단어 | Query (Q) | Key (K) | Value (V) |
The | [0.2, 0.1, 0.3] | [0.3, 0.4, 0.2] | [0.1, 0.2, 0.3] |
cat | [0.4, 0.1, 0.5] | [0.5, 0.2, 0.4] | [0.5, 0.1, 0.4] |
sat | [0.3, 0.6, 0.4] | [0.2, 0.7, 0.3] | [0.2, 0.7, 0.3] |
on | [0.5, 0.4, 0.6] | [0.4, 0.3, 0.8] | [0.4, 0.3, 0.8] |
mat | [0.3, 0.5, 0.2] | [0.3, 0.5, 0.6] | [0.3, 0.5, 0.6] |
-2. “sat”를 기준으로 Self-Attention 연산을 해보자면
“sat”라는 단어를 기준으로 Q 가 다른 단어들의 K 와 유사도를 계산합니다
1. Attention Score 계산
Query( Q )와 Key( K )의 내적(dot product)을 통해 유사도 점수를 계산합니다.
예:
- Q_sat: “sat”와 “cat”의 유사도
- Q_sat: “sat”와 “on”의 유사도
2. Softmax를 적용하여 가중치 계산
유사도 점수를 Softmax 함수에 넣어 가중치를 만듭니다.
- “sat”와 “cat”의 유사도가 높으면 더 큰 가중치가 부여됩니다.
3. Value에 가중치를 곱하고 합산
최종 Attention Output은 다른 단어들의 Value 벡터에 가중치를 곱하고 합산한 값입니다.
4. 결과
“sat”라는 단어는 문장 내에서 “cat”과의 연관성이 높다고 판단하면
- “cat”의 Value 벡터가 더 크게 반영됩니다.
- 다른 단어들은 연관성이 적기 때문에 가중치가 작게 부여됩니다.
이 과정이 Multi-Head Attention으로 확장되면 다양한 시각에서 단어들의 관계를 동시에 학습하게 되어 더 강력한 성능을 발휘하게 되는데요
이어서 Multi-Head Attention에 대해서도 말씀드려보겠습니다.
1-1-1. Multi-Head Attention 이란?
Multi-Head Attention은 위에서 설명한 Self-Attention을 여러 번 동시에 수행하는 방식입니다.
이렇게 하면 단어 간의 관계를 여러 관점(Head)에서 학습할 수 있어 모델의 성능이 크게 향상됩니다.
1-1-2. Multi-Head Attention 동작원리
그럼 어떻게 여러 관점(Head)에서 학습을 할 수 있는건지
논문에서 나온 아래 공식을 보며 어떻게 동작을 하는지 알아보겠습니다.
여기서
- Q, K, V : 입력 단어의 Query, Key, Value 행렬입니다. (Attention)
- head_i : i번째 Attention Head에서 수행된 Self-Attention 결과입니다.
- 각 Head는 서로 다른 가중치 행렬 W_i^Q, W_i^K, W_i^V 를 사용합니다.
- W_i^Q, W_i^K, W_i^V : i번째 Head의 가중치 행렬입니다.
- KW_i^K : Key를 i번째 Head의 가중치로 변환한 값.
- VW_i^V : Value를 i번째 Head의 가중치로 변환한 값.
- QW_i^Q : Query를 i번째 Head의 가중치로 변환한 값.
- Concat: 각 Attention Head의 출력을 이어붙이는(Concatenate) 연산입니다.
- • W^O : 최종 출력을 위해 선형 변환을 수행하는 가중치 행렬입니다.
정리해보자면 아래와 같습니다.
1. 입력 변환
입력 Q, K, V 에 각 Head의 가중치 행렬 W_i^Q, W_i^K, W_i^V 를 곱해 Query, Key, Value를 생성합니다.
2. 각 Attention 수행
각 Head는 위에서 생성된 Q_i, K_i, V_i 를 사용해 Scaled Dot-Product Attention을 수행합니다.
• 이 단계에서 각 Head는 다른 시각으로 단어 간의 관계를 학습합니다.
3. 출력 결합
모든 Head의 출력을 Concatenate(연결)합니다.
4. 최종 선형 변환
결합된 출력을 선형 변환 W^O 에 통과시켜 최종 Attention 출력을 만듭니다.
쉽게 예시를 들어보겠습니다.
예시 문장: “The cat sat on the mat.”
• Head 1: 문장 내에서 단어 간의 위치 관계를 학습합니다.
• “sat” → “cat”과 연결됨 (행동의 주체).
• Head 2: 의미적 관계를 학습합니다.
• “sat” → “mat”과 연결됨 (행동의 대상).
• Head 3: 더 멀리 떨어진 단어 간의 관계를 학습할 수 있습니다.
각 Head가 서로 다른 방식으로 단어의 관계를 파악하므로, 최종적으로 더 정교한 문맥 표현이 가능합니다.
여기에서 Selft-Attention은 기존 Attention이랑 어떤 차이가 있는지 궁금하실텐데요
간단하게 말씀드려보겠습니다.
1-1-1. Self-Attention과 기존 Encoder-Decoder Attention의 차이
(차이점에서 "집중" 이라는 단어가 많이 나오는데 어떻게 집중을 하는지 궁금하시는 분은 이전 포스팅을 참고하셔서 Attention의 동작원리를 보시면 될 것 같습니다)
1. 기존 Encoder-Decoder Attention: 서로 다른 시퀀스 간의 관계에 집중
일반 Attention은 Encoder와 Decoder 사이에서 사용됩니다.
• 목적: 출력 단어를 생성할 때, 입력 문장(시퀀스)의 특정 부분에 집중합니다.
• 사용 위치: Encoder-Decoder Attention 단계에서 사용됩니다.
예시: 기계 번역
영어 문장 “I love you”를 프랑스어 “Je t’aime”로 번역한다고 해봅시다
1. Decoder가 “Je”를 생성할 때, Encoder가 처리한 입력 문장의 “I”에 집중합니다.
2. Decoder가 “t’“를 생성할 때, “love”에 집중합니다.
즉, 일반 Attention은 입력 문장의 단어(Encoder)와 출력 단어(Decoder) 간의 관계를 학습합니다.
2. Self-Attention: 같은 시퀀스 내의 관계에 집중
Self-Attention은 하나의 시퀀스 안에서 단어들 간의 관계를 학습합니다.
• 목적: 문장의 각 단어가 같은 문장 내의 다른 단어들과 어떤 관계를 맺는지를 학습합니다.
• 사용 위치
• Encoder: 입력 문장 내 단어들 간의 관계를 학습.
• Decoder: 출력 문장 내 단어들 간의 관계를 학습.
예시: 문장 내 단어 간의 관계
입력 문장: “The animal didn’t cross the road because it was tired.”
여기서 “it”이 무엇을 의미하는지 파악해야 합니다.
1. Self-Attention은 “it”과 가장 관련 있는 단어인 “animal”을 찾아냅니다.
2. “road”나 “cross”와 같은 다른 단어도 함께 분석하지만, “animal”에 가장 높은 가중치를 줍니다.
즉, Self-Attention은 같은 문장 내에서 단어들이 서로 얼마나 중요한지, 어떻게 연관되는지를 계산합니다.
3. 정리
구분 일반 Attention Self-Attention 작동 대상 서로 다른 시퀀스 (입력 -> 출력) 같은 시퀀스 내 단어들 사용 위치 Encoder-Decoder Attetention 단계 단어 간 관계를 학습해 문맥을 이해 Attention Score 공식 Feedforward Neural Network Dot product
1-2. Feed Forward Network
- 각 Attention 레이어의 출력을 비선형 변환을 통해 더욱 복잡한 표현으로 학습합니다.
- 구조: 두 개의 선형 변환과 하나의 ReLU 활성화 함수를 포함합니다.
(3) Add & Norm (Residual Connection + Layer Normalization)
- ADD : 각 블록의 입력과 출력을 더하는 잔여학습(Residual Connection)을 사용합니다.
- 잔여학습(Residual Connection)이란 어떠한 값을 레이어를 거쳐서(아키텍쳐에서는 Multi-Head Attention) 반복적으로 단순하게 갱신하는 것 이 아니라 특정 레이어를 건너뛰어서 복사가 된 값을 그대로 입력시켜주는 것을 의미합니다.
- 이렇게 해줌으로써 기존 정보를 제외한 잔여 정보를 학습하게 됩니다.
- 이를 통해 학습 과정에서 기울기 소실 문제를 완화하고, 깊은 네트워크를 학습할 수 있습니다.
- 잔여학습(Residual Connection)이란 어떠한 값을 레이어를 거쳐서(아키텍쳐에서는 Multi-Head Attention) 반복적으로 단순하게 갱신하는 것 이 아니라 특정 레이어를 건너뛰어서 복사가 된 값을 그대로 입력시켜주는 것을 의미합니다.
- Norm : 그 후, Layer Normalization을 통해 출력을 정규화합니다.
Decoder: 출력 문장을 생성 (오른쪽)
Decoder는 Encoder의 출력을 참조하여 출력 시퀀스를 생성합니다. 각 레이어는 세 가지 핵심 블록으로 이루어져 있습니다:
(1) Masked Multi-Head Self-Attention
- 출력 시퀀스 내 단어들 간의 관계를 학습합니다.
- 마스킹(Masking)을 통해 미래 단어를 참조하지 못하도록 방지합니다.
- 왜? 미래단어를 참조하지 못하도록 하는 걸까요?
- Decoder는 왼쪽에서 오른쪽으로 순차적으로 단어를 생성해야 합니다.
- 예를 들어, 출력 문장이 **“Je t’aime”**일 때
- 첫 단어 “Je”를 생성할 때는 아직 “t’“와 “aime”를 보지 못해야 합니다.
- 두 번째 단어 “t’“를 생성할 때는 “aime”만 숨겨져야 합니다.
- 이를 위해 마스킹된 Attention이 적용되며, 현재까지의 단어만 참조하게 됩니다.
- 왜? 미래단어를 참조하지 못하도록 하는 걸까요?
(2) Multi-Head Attention (Encoder-Decoder Attention)
- 입력 시퀀스(Encoder의 출력, 아래 사진 빨간색 라인 참고)와 출력 시퀀스 간의 관계를 학습합니다.
- 이를 통해 Decoder가 입력 문장의 특정 부분에 집중하게 됩니다.
- 즉 Encoder에서 받아온 입력 단어의 정보들과 출력하려는 단어 사이의 관계를 학습하는 것 입니다.
- 예를 들어서
- 입력 문장: “I love you”
- 출력 문장: “Je t’aime” 일 때
- 1. Decoder가 **“Je”**를 생성할 때
- Query는 **“Je”**에 해당하는 벡터입니다.
- Key와 Value는 Encoder가 출력한 “I”, “love”, “you”의 벡터들입니다.
- Attention은 **“I”**에 집중해 “Je”를 생성합니다.
- 2. Decoder가 “t’”를 생성할 때
- Attention은 Encoder의 출력에서 **“love”**에 집중해 “t’“를 생성합니다.
- Query는 **“t’”**에 해당하는 벡터입니다.
- 1. Decoder가 **“Je”**를 생성할 때
(3) Feed Forward Network
- Encoder와 동일하게 비선형 변환을 통해 출력을 더 복잡하게 변환합니다.
(4) Add & Norm (Residual Connection + Layer Normalization)
- Encoder와 마찬가지로 Residual Connection과 Layer Normalization을 사용해 학습을 안정화합니다.
이렇게 Transformer까지 알아보았는데요
이제 Transformer를 기반으로 이후에 나온 GPT, BERT에 나온 대규모 모델을 이용해 제가 만들어보고싶은 앱에 LLM을 적용해봐야겠습니다.
이번 포스팅은 조금 난해하게 보일수도 있는데 위에서부터 아래까지 연결이 쭉 되는 내용이라
차근차근 읽어보시면 될 것 같습니다.
참고링크
https://arxiv.org/abs/1706.03762
Attention Is All You Need
The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new
arxiv.org
https://www.youtube.com/watch?v=AA621UofTUA&t=572s
'[AI | ML]' 카테고리의 다른 글
[AI | ML] [LLM] 2-1. LLM의 동작원리 - Seq2Seq, attention (0) | 2024.12.17 |
---|---|
[AI | ML] [LLM] 1. LLM(Large Language Model)이란? (feat. LLM의 역사) (1) | 2024.12.12 |
[AI | ML] [분류기] Random Forest에 대해서 알아보자 - 3. Random Forest 편 (마지막) (11) | 2024.10.28 |
[AI | ML] [분류기] Random Forest에 대해서 알아보자 - 2. 배깅편(bagging) (2) | 2024.10.28 |
[AI | ML] [분류기] Random Forest에 대해서 알아보자 - 1. 보팅편(Voting) (8) | 2024.10.28 |