Transformer 구조 이해
Transformer는 자연어 처리(NLP) 분야에서 혁명적인 변화를 가져온 딥러닝 모델입니다. 이 모델은 Attention 메커니즘을 사용하여 문장 내 단어 간의 관계를 효과적으로 파악하며, 기존의 순환 신경망(RNN) 기반 모델의 한계를 극복했습니다. 이 글에서는 Transformer의 기본 구조와 핵심 구성 요소에 대해 자세히 알아보겠습니다.
💡 Attention 메커니즘
Attention 메커니즘은 Transformer의 핵심 구성 요소 중 하나입니다. 이는 입력 문장의 각 단어가 출력 문장의 어떤 단어와 관련이 있는지 가중치를 부여하여 표현합니다. 기존의 seq2seq 모델에서는 고정된 크기의 context vector에 모든 정보를 압축해야 했기 때문에 정보 손실이 발생할 수 있었습니다. Attention 메커니즘은 이러한 문제를 해결하고, 각 time step마다 입력 문장의 모든 단어에 대한 정보를 활용할 수 있게 합니다.
Attention은 Query(Q), Key(K), Value(V)라는 세 가지 요소를 사용하여 계산됩니다. Query는 현재 출력 단어와 관련된 정보를 나타내고, Key는 입력 단어의 정보를 나타내며, Value는 입력 단어의 실제 값을 나타냅니다. Attention score는 Query와 Key의 유사도를 계산하여 얻어지며, 이 score를 사용하여 Value에 가중치를 부여합니다.
🧱 Transformer의 기본 구조
Transformer는 Encoder와 Decoder로 구성됩니다. Encoder는 입력 문장을 처리하여 context vector를 생성하고, Decoder는 이 context vector를 사용하여 출력 문장을 생성합니다. Encoder와 Decoder는 여러 개의 layer로 구성되며, 각 layer는 Attention 메커니즘과 feed-forward 신경망으로 구성됩니다.
Encoder의 각 layer는 Multi-Head Attention과 Add & Norm, Feed Forward Network, Add & Norm으로 구성됩니다. Multi-Head Attention은 여러 개의 Attention head를 사용하여 입력 문장의 다양한 측면을 고려할 수 있도록 합니다. Add & Norm은 residual connection과 layer normalization을 수행하여 학습을 안정화하고 성능을 향상시킵니다. Feed Forward Network는 비선형 변환을 수행하여 모델의 표현력을 높입니다.
Decoder의 각 layer는 Masked Multi-Head Attention, Add & Norm, Multi-Head Attention, Add & Norm, Feed Forward Network, Add & Norm으로 구성됩니다. Masked Multi-Head Attention은 Decoder가 현재 time step 이전의 단어만 참조할 수 있도록 masking을 적용합니다. Multi-Head Attention은 Encoder의 출력과 Decoder의 입력을 사용하여 Attention을 계산합니다.
🏋️♀️ Positional Encoding
Transformer는 RNN과 달리 순서 정보를 처리하기 위해 Positional Encoding을 사용합니다. Positional Encoding은 각 단어의 위치 정보를 벡터 형태로 표현하여 입력에 더해줍니다. 이는 모델이 단어의 순서를 파악하고 문맥을 이해하는 데 도움을 줍니다.
Positional Encoding은 sine 함수와 cosine 함수를 사용하여 생성됩니다. 각 위치 (pos)에 대해 다음과 같은 공식을 사용하여 Positional Encoding 벡터를 계산합니다.
[
PE(pos, 2i) = sin(\frac{pos}{10000^{2i/d_{model}}})
]
[
PE(pos, 2i+1) = cos(\frac{pos}{10000^{2i/d_{model}}})
]
여기서 (d_{model})은 모델의 차원(dimension)을 나타내며, (i)는 차원의 index를 나타냅니다.
⚙️ Multi-Head Attention
Multi-Head Attention은 Attention 메커니즘을 여러 번 병렬적으로 수행하여 다양한 관점에서 입력 문장을 분석합니다. 각 Attention head는 서로 다른 Query, Key, Value를 사용하여 Attention score를 계산하고, 그 결과를 연결(concatenate)하여 최종 출력을 생성합니다.
Multi-Head Attention은 다음과 같은 단계를 거쳐 수행됩니다.
- Query, Key, Value를 각각 다른 linear projection에 통과시킵니다.
- 각 head에서 Attention score를 계산합니다.
- Attention score에 softmax 함수를 적용하여 확률 분포를 얻습니다.
- Value에 Attention score를 가중치로 곱하여 head의 출력을 계산합니다.
- 모든 head의 출력을 연결합니다.
- 연결된 출력을 linear projection에 통과시켜 최종 출력을 생성합니다.
1 empty line before code block.
import torch
import torch.nn as nn
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
super(MultiHeadAttention, self).__init__()
self.d_model = d_model
self.num_heads = num_heads
self.d_k = d_model // num_heads
self.W_Q = nn.Linear(d_model, d_model)
self.W_K = nn.Linear(d_model, d_model)
self.W_V = nn.Linear(d_model, d_model)
self.W_O = nn.Linear(d_model, d_model)
def scaled_dot_product_attention(self, Q, K, V, mask=None):
attn_scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.d_k)
if mask is not None:
attn_scores = attn_scores.masked_fill(mask == 0, -1e9)
attn_probs = torch.softmax(attn_scores, dim=-1)
output = torch.matmul(attn_probs, V)
return output
def split_heads(self, x):
batch_size, seq_length, d_model = x.size()
return x.view(batch_size, seq_length, self.num_heads, self.d_k).transpose(1, 2)
def combine_heads(self, x):
batch_size, _, seq_length, d_k = x.size()
return x.transpose(1, 2).contiguous().view(batch_size, seq_length, self.d_model)
def forward(self, Q, K, V, mask=None):
Q = self.split_heads(self.W_Q(Q))
K = self.split_heads(self.W_K(K))
V = self.split_heads(self.W_V(V))
attn_output = self.scaled_dot_product_attention(Q, K, V, mask)
output = self.W_O(self.combine_heads(attn_output))
return output
🎯 Transformer의 활용
Transformer는 다양한 자연어 처리 task에서 뛰어난 성능을 보입니다. 예를 들어, 기계 번역, 텍스트 요약, 질의응답, 감성 분석 등 다양한 분야에서 활용되고 있습니다. 특히, BERT, GPT와 같은 pre-trained language model은 Transformer를 기반으로 구축되었으며, 대규모 데이터셋으로 사전 학습된 후 fine-tuning을 통해 다양한 task에 적용될 수 있습니다.
예를 들어, BERT는 Transformer의 Encoder 부분을 사용하여 문장의 문맥을 파악하고, GPT는 Transformer의 Decoder 부분을 사용하여 텍스트를 생성합니다. 이러한 모델들은 자연어 처리 분야에서 state-of-the-art 성능을 달성하고 있으며, 다양한 산업 분야에서 활용되고 있습니다.
Transformer는 Attention 메커니즘을 기반으로 하여 기존의 RNN 기반 모델의 한계를 극복하고 자연어 처리 분야에서 혁명적인 변화를 가져왔습니다. Attention 메커니즘, Encoder-Decoder 구조, Positional Encoding, Multi-Head Attention 등 Transformer의 핵심 구성 요소를 이해하는 것은 자연어 처리 모델을 개발하고 활용하는 데 매우 중요합니다.
요약:
- Attention 메커니즘 (Attention Mechanism): 문장 내 단어 간의 관계를 파악하는 핵심 기술.
- Encoder-Decoder 구조 (Encoder-Decoder Structure): 입력 문장을 처리하고 출력 문장을 생성하는 기본 구조.
- Positional Encoding: 단어의 위치 정보를 모델에 전달하는 방법.
- Multi-Head Attention: 다양한 관점에서 입력 문장을 분석하는 기술.
- 자연어 처리 (Natural Language Processing): 컴퓨터가 인간의 언어를 이해하고 처리하는 분야.
- Pre-trained Language Model: 대규모 데이터셋으로 사전 학습된 언어 모델.