개인공부&프로젝트

멀티헤드 어텐션 & 피드포워드

백악기작은펭귄 2025. 1. 4.
반응형

GPT: 멀티헤드 어텐션 & 피드포워드

최근 AI 연구에서 가장 주목받는 주제 중 하나는 GPT(Generative Pre-trained Transformer) 모델이다. GPT는 자연어 이해와 생성을 위한 언어 모델로, 입력 데이터를 처리하는 forward 메서드와 이를 바탕으로 텍스트를 생성하는 generate 메서드를 통해 작동한다. 이 과정에서 GPT는 어텐션 메커니즘과 신경망 구조를 활용해 언어의 문맥과 패턴을 효과적으로 학습한다.

 

이 글에서는 GPT의 핵심 요소인 멀티헤드 어텐션과 피드포워드 네트워크, 블록 설계 방법, 그리고 토크나이저 제작 과정을 중심으로 내용을 정리해 보았다.

 

멀티헤드 어텐션

어텐션 메커니즘(Attention Mechanism)은 GPT와 같은 트랜스포머 모델의 핵심 구성 요소 중 하나이다. 어텐션 메커니즘은 입력 데이터의 각 요소가 다른 요소와 어떤 관계를 맺는지 학습할 수 있도록 도와준다. 어텐션 과정은 크게 쿼리(Q), 키(K), 밸류(V)로 구성된다. 입력 데이터를 통해 생성된 Q, K, V는 스칼라 값을 기반으로 가중치를 계산하고, 이 가중치를 통해 최종 출력을 생성한다.

 

멀티헤드 어텐션(Multi-head Attention)은 이러한 어텐션 메커니즘을 여러 번 병렬적으로 수행하여 다양한 문맥적 관계를 학습한다. 각 헤드는 독립적으로 $Q,~ K,~ V$를 계산하며, 서로 다른 부분에서의 어텐션을 학습한다. 각 헤드의 출력은 결합 후 추가 가중치 행렬 $W_O$를 곱해 최종 어텐션 결과를 얻는다.

 

$$\text{MultiHead}(Q,~ K,~ V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W_O$$

 

여기서 hh는 헤드의 개수이며, 각 헤드는 다른 표현 공간에서 문맥을 학습한다.

class Head(nn.Module):
    def __init__(self, head_size):
        super().__init__()
        self.key = nn.Linear(n_embed, head_size, bias=False)
        self.query = nn.Linear(n_embed, head_size, bias=False)
        self.value = nn.Linear(n_embed, head_size, bias=False)
        self.register_buffer("tril", torch.tril(torch.ones(block_size, block_size)))

    def forward(self, inputs):
        batch_size, sequence_length, embedding_dim = inputs.shape
        keys = self.key(inputs)
        queries = self.query(inputs)
        weights = queries @ keys.transpose(-2, -1) * (embedding_dim ** -0.5)
        weights = weights.masked_fill(self.tril[:sequence_length, :sequence_length] == 0, float("-inf"))
        weights = F.softmax(weights, dim=-1)
        values = self.value(inputs)
        output = weights @ values
        return output

class MultiHeadAttention(nn.Module):
    def __init__(self, num_heads, head_size):
        super().__init__()
        self.heads = nn.ModuleList([Head(head_size) for _ in range(num_heads)])

    def forward(self,inputs):
        return torch.cat([head(inputs) for head in self.heads], dim=-1)

 

피드포워드 네트워크와 블록 구조

어텐션의 결과는 비선형 변환을 위해 피드포워드 네트워크(Feedforward Network)로 전달된다. 이 네트워크는 각 입력에 대해 독립적으로 작동하며, 두 개의 완전연결층과 활성화 함수(ReLU)로 구성된다. 전체 과정은 다음과 같다.

 

$$\text{FFN}(x) = \text{max}(0, xW_1 + b_1)W_2 + b_2$$

 

GPT 모델은 여러 개의 동일한 블록이 쌓여 있는 형태로 구성된다. 각 블록은 멀티헤드 어텐션, 레이어 정규화, 피드포워드 네트워크를 포함한다. 셀프 어텐션과 피드포워드 네트워크는 레이어 정규화와 입력과 출력을 더해 주는 방식인 잔차 연결(residual connection)을 통해 결합되어, 모델이 더 깊은 구조를 안정적으로 학습할 수 있도록 한다. 이러한 구성 요소는 반복적인 블록(block) 구조를 형성하며, 입력 데이터는 여러 블록을 거쳐 점차 더 높은 수준의 표현으로 변환된다.

 

토크나이저

GPT는 텍스트 데이터를 숫자로 변환하기 위해 토크나이저(tokenizer)를 사용한다. 토크나이저는 텍스트 데이터를 수치 데이터로 변환하는 도구로, GPT의 전처리 단계에서 핵심 역할을 한다. 이는 문장을 단어, 하위 단위, 또는 글자 수준으로 분할해 고유한 정수로 매핑한다. BPE(Byte Pair Encoding)와 같은 방법은 빈도 높은 하위 단위를 결합하여 어휘 크기를 효율적으로 관리하며, 희귀 단어를 처리할 수 있는 유연성을 제공한다.

반응형

댓글