[LLM] Transformer 2 (Encoder)
Transformer 1에서…
- Transformer가 Encoder-Decoder 구조로 되어있는 것을 살펴봤음.
- 입력된 자연어의 시퀀스(문장)에서 토큰(단어)를 텐서(숫자)로 변환하는 Embedding 과정이 있다는 것을 봤음.
- 입력된 자연어의 시퀀스(문장)에서 토큰(단서)의 순서 정보를 추가하는 Positional Encoding을 자세히 살펴봤음.
Encoder: Multi-Head Attention (Self-Attention)
- 입력 문장의 의미와 문맥을 이해한 후, 이를 정리된 정보로 변환하는 과정.
- 자연어로 구성된 입력 시퀀스(문장)는 먼저 Embedding과 Positional Encoding을 거쳐 텐서 형태로 변환되며, 이는 Encoder의 input으로 들어감.
- 이 입력은 Multi-Head Attention(Self-Attention) 매커니즘과 Feed Forward 과정을 거친 후, 최종적으로 행렬(Matrix) 형태의 출력으로 변환됨.
1. Core Attention Structures: Multi-Head & Scaled Dot-Product (Encoder의 핵심구조)
- Multi-Head Attention
- Transformer의 Encoder와 Decoder는 Multi-Head Attention 레이어를 핵심 구성요소로 포함하고 있음.
- Multi-Head Attention은 여러 개의 Scaled Dot-Product Attention을 병렬로 수행함으로써, 정보를 다양한 관점에서 처리할 수 있게 함.
- 즉, 각 Attention Head는 서로 다른 가중치 행렬을 사용하여 입력 간의 관계를 조금씩 다른 방식으로 학습함. 이를 통해 모델은 문맥의 다양한 의미를 포착할 수 있음.
- Scaled Dot-Product Attention
- Multi-Head Attention 내부에서 실제로 사용되는 핵심 Attention 매커니즘.
- Attention의 목적은 입력 간의 관계(연관성)를 계산하는 것. 특히, 어떤 단어가 문맥 내에서 다른 단어와 얼마나 관련 있는지를 정량적으로 계산함.
- Query(Q), Key(K), Value(V) 라는 세 가지 벡터를 사용해 단어들 간의 관계를 계산.
2. Generating the Query, Key, and Value matrices (Query, Key, Value 행렬 계산하기)
- 각 토큰(단어)들의 embedding vector에 Query, Key, Value Weight를 곱해서 각 토큰마다 Q, K, V 벡터를 얻음.
- Query (Q): 관심 있는 단어가 다른 단어들과 얼마나 관련 있는지 판단하기 위해 사용하는 벡터.
- Key (K): 문장 내 각 단어가 자기 자신을 설명하는 벡터로, Query와 내적(dot product)을 통해 유사도를 계산함.
- Value (V): 해당 단어가 가지고 있는 실제 정보가 담긴 벡터로 Attention 결과로 사용됨.
3. Self-Attention Mechanism
- Equation
여기서, $d_k$는 Query와 Key 벡터의 차원 수
2. Step-by-Step Attention Calculation ex) ‘나는 학생 이다’ 문장에서 ‘나는’이 다른 단어들과 가지는 관계를 계산.
- (1) 모든 토큰들의 Embedding vector에 Query, Key, Value weight matrix를 곱해
q
,k
,v
를 만듦.- “나는”: $x_1$ → $q_1$, $k_1$, $v_1$
- “학생”: $x_2$ → $q_2$, $k_2$, $v_2$
- “이다”: $x_3$ → $q_3$, $k_3$, $v_3$
(2) 관심 있는 단어의 Query($q_1$)와 모든 Key($k_1$, $k_2$, $k_3$)를 내적해서 유사도를 계산함. \[\begin{aligned} q_1 \cdot k_1^T &= 9 \\ q_1 \cdot k_2^T &= 6 \\ q_1 \cdot k_3^T &= 3 \end{aligned}\]
- (3) 각 Attention Score에 ${\sqrt{d_k}}$ 로 나누어주면서 스케일 조정을 함.
- (4) Scaled Attention Score에 Softmax를 적용해서 확률(Attention Weight)로 변환.
- softmax(6.36,4.24,2.12)≈(0.8816,0.1057,0.0127)
- $q_1$은 $k_1$과 가장 관련이 있는 것으로 판단할 수 있음.
- (5) Value vector에 Softmax값 곱하기.
- (6) 모든 가중된 Value 벡터를 더해서 $z_1$ 생성.
- $z_1$ = $v’_1$ + $v’_2$ + $v’_3$
- $z_1$ 은 “나는”이라는 단어가 문맥에서 어떤 의미를 갖는지를 나타냄. (의미, 순서, 관계 포함)
ex) ‘나는 학생 이다’ 문장에서 ‘학생’이 다른 단어들과 가지는 관계를 계산
(1) 관심 있는 단어의 Query($q_2$)와 모든 Key($k_1$, $k_2$, $k_3$)를 내적해서 유사도를 계산함. \[\begin{aligned} q_2 \cdot k_1^T &= 6 \\ q_2 \cdot k_2^T &= 9 \\ q_2 \cdot k_3^T &= 6 \end{aligned}\]
(3) 각 Attention Score에 ${\sqrt{d_k}}$ 로 나누어주면서 스케일 조정을 함.
- (4) Scaled Attention Score에 Softmax를 적용해서 확률(Attention Weight)로 변환.
- softmax(4.24,6.36,4.23)≈(0.0967,0.8066,0.0967)
- $q_2$은 $k_2$과 가장 관련이 있는 것으로 판단할 수 있음.
- (5) Value vector에 Softmax값 곱하기.
- (6) 모든 가중된 Value 벡터를 더해서 $z_1$ 생성.
- $z_2$ = $v’_1$ + $v’_2$ + $v’_3$
- $z_2$ 은 “학생”이라는 단어가 문맥에서 어떤 의미를 갖는지를 나타냄. (의미, 순서, 관계 포함)
3. In Reality: Matrix Computation (실제 계산과정: 행렬계산)
- 위에서는 이해를 위해 Vector로 쪼개서 계산을 했지만, 실제로는 Matrix 형태로 한번에 계산을 진행.
4. Meaning Of Multi-Head (Multi-Head란?)
- Multi-Head란 여러 개의 Attention Head를 병렬로 사용하는 매커니즘.
- 각 Head는 서로 다른 가중치 행렬(Weight Matrix)을 사용해 입력을 다른 방식으로 변환하고, 다른 관점에서 관계를 학습.
- 각 Head는 고유의 $W_Q^i$, $W_K^i$, $W_V^i$ 를 사용해 Query, Key, Value를 생성.
- Scaled Dot-Product Attention을 각 Head에서 독립적으로 수행한 후, 출력들을
Concat
(연결)하고, 다시 하나의 Linear Layer를 통과시켜 최종 결과를 생성.
- 단일 Head는 제한된 관점만 학습하므로, 복잡한 문맥 정보나 다양한 의미 관계를 포착하는 데 한계가 있음.
- Multi-Head를 사용하면, Head 1은 구문 구조에 집중할 수 있고, Head 2는 문법적 역할, Head 3는 단어 간 의미적 유사성에 집중하는 식.
5. Finalization: Concat
후 Linear 연산으로 통합
- 앞서 설명한 대로, Multi-Head Attention은 여러 개의 Attention Head를 병렬로 구성하여 입력 간의 관계를 다양한 관점에서 학습함.
- 개별 Head들의 출력을 합쳐, 모델의 다음 계층으로 전달할 output을 만들어야 함.
- 다양한 관점에서 학습한 정보를 하나의 의미 있는 표현으로 통합해주는 것이 이 단계의 핵심.
- (1) 각 Head의 결과를
Concat
- 생성된 출력 $z_{\text{head1}}$, $z_{\text{head2}}$, $z_{\text{head3}}$ 를 가로 방향으로 연결(Concatenate) 하여 하나의 긴 벡터(행렬)로 만듦
Equation \[Z_{\text{concat}} = \text{Concat}(z_0, z_1, \dots, z_{h-1}) \in \mathbb{R}^{h \cdot d_k}\]
- 여기서 $h$는 Head의 개수, $d_k$는 각 Head의 출력 차원입니다.
- (2) 선형 변환 (Linear Transformation)
- 연결된 벡터 $Z_{\text{concat}}$는 모델에 의해 학습된 출력 가중치 행렬 $W^O$와 곱해져 최종 출력 벡터 $Z$를 생성
- Equation
- 이 연산은 단순히 Head들을 결합하는 것이 아니라, 각 Head에서 얻은 정보를 어떤 비율로 조합할지 학습하는 과정.
- $W^O$는 학습 가능한 파라미터이며, 모델이 학습 도중 최적의 조합 방법을 스스로 찾아냄.
- (1) 각 Head의 결과를
- 최종 벡터 $Z$는 다음 레이어인 Feed-Forward Neural Network (FFN)으로 전달
Encoder: Residual Connection & Normalization
- Residual Connection의 배경
- Residual Connection은 “Deep Residual Learning for Image Recognition” (He et al., 2015) 에서 처음 제안됨.
- CNN의 깊이를 증가시키면 성능이 향상될 것으로 기대했지만, 오히려 정확도가 감소하고 성능 저하가 나타났음.
- 단순한 과적합(Overfitting)이 문제 아니며 조기 종료(Early Stopping) 같은 기법으로 해결되지 않음.
- 정확도 포화(Accuracy Saturation)와 출력값의 극단화로 인해 학습이 어려워짐.
- 뉴런 출력이 활성화 함수의 극단값(0 or 1)에 수렴하여 정보 표현력이 떨어짐.
- 해결책으로, 이전층의 출력을 그대로 유지하는 스킵 연결(Skip Connection)을 도입함.
- 개별 레이어를 순차적으로 통과시키는 대신, 여러 레이어를 하나의 블록으로 묶고, 그 주위를 우회하여 입력 정보를 전달함.
- 이를 통해 깊은 네트워크에서도 안정적인 학습과 성능 개선이 가능해짐.
- 이러한 구조가 반복되면, 수학적으로 다음과 같이 누적되는 형태로 표현할 수 있음.
2. Transformer에서 Residual Connection
- Transformer는 Self-Attention, Feed-Forward Network, LayerNorm 등을 반복적으로 쌓아 구성된 매우 깊은 딥러닝 아키텍처.
- 각 주요 구성 블록(self-attention, FFN 등) 뒤에 Residual Connection + LayerNorm 구조 사용.
3. Normalization
- Transformer에서는 Residual Connection 뒤에 Layer Normalization을 적용함.
- 모델이 깊어질수록 출력값의 분포가 불안정해질 수 있기 때문에, 이를 정규화하여 출력 값의 크기를 조절하고 학습을 안정화함
- Equation
μ: 평균, σ: 표준편차, γ,β: 학습 가능한 파라미터, ϵ: 분모 0 방지를 위한 작은 수
- Layer Normalization은 하나의 입력 벡터 내부 값들을 평균과 분산 기준으로 정규화함.
- 배치 크기에 영향을 받지 않기 때문에, Transformer와 같은 시퀀스 모델에 적합함.
Encoder: Feed Forward
- Self-Attention과 Residual Connection & Normalization을 거친 출력은 완전 연결층(Fully Connected Layer) 구조인 Feed Forward Neural Network(FFN)으로 전달됨.
- FFN은 각 토큰의 벡터를 독립적으로 처리하며, 일반적으로 다음과 같은 두 개의 Linear Layer와 비선형 활성화 함수(ReLu 등)로 구성됨.
- 모든 위치(Token)에 대해 동일한 FFN이 적용되므로 Position-wise Feed Forward 라고도 함.
- Attention이 “무엇에 집중할지”를 알려줬다면, FFN은 그 정보를 바탕으로 “어떻게 해석할지”를 학습
- FFN은 각 위치의 토큰 표현에 비선형 변환을 가해 표현력을 확장하고, 개별 토큰의 의미를 정교하게 가공하는 역할을 함.
- Equation
$W_1$, $W_2$: 학습 가능한 가중치 행렬, $b_1$, $b_2$: 편향(Bias) 벡터 max(0, -): ReLu 활성화 함수(비선형성 부여)
- (1) 첫 번째 Linear Layer
- 입력층 → 은닉층
- 연산: $xW_1 + b_1$
- (2) 두 번째 Linear Layer
- 은닉층 → 출력층
- 연산: $\text{ReLU}(xW_1 + b_1)W_2 + b_2$