머신러닝

Transformer 구조 이해

move84 2025. 4. 14. 22:53
반응형

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은 다음과 같은 단계를 거쳐 수행됩니다.

  1. Query, Key, Value를 각각 다른 linear projection에 통과시킵니다.
  2. 각 head에서 Attention score를 계산합니다.
  3. Attention score에 softmax 함수를 적용하여 확률 분포를 얻습니다.
  4. Value에 Attention score를 가중치로 곱하여 head의 출력을 계산합니다.
  5. 모든 head의 출력을 연결합니다.
  6. 연결된 출력을 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의 핵심 구성 요소를 이해하는 것은 자연어 처리 모델을 개발하고 활용하는 데 매우 중요합니다.


요약:

  1. Attention 메커니즘 (Attention Mechanism): 문장 내 단어 간의 관계를 파악하는 핵심 기술.
  2. Encoder-Decoder 구조 (Encoder-Decoder Structure): 입력 문장을 처리하고 출력 문장을 생성하는 기본 구조.
  3. Positional Encoding: 단어의 위치 정보를 모델에 전달하는 방법.
  4. Multi-Head Attention: 다양한 관점에서 입력 문장을 분석하는 기술.
  5. 자연어 처리 (Natural Language Processing): 컴퓨터가 인간의 언어를 이해하고 처리하는 분야.
  6. Pre-trained Language Model: 대규모 데이터셋으로 사전 학습된 언어 모델.
반응형