본문 바로가기
Bigdata

GPT2로 이해하는 로봇이 학습하는 법

by 올엠 2026. 2. 3.
반응형

 

GPT-2: 이해하는 로봇이 학습하는 법

GPT-2 논문(Language Models are Unsupervised Multitask Learners)은 "다음에 올 단어를 예측하는 것만으로 모든 문제를 풀 수 있다"는 것을 증명했습니다.

1. Encode: 입력을 숫자로 바꾸는 세부 과정

단순한 숫자가 아니라, 단어의 의미위치를 결합하는 과정입니다.

(1) BPE (Byte Pair Encoding)

GPT-2는 단어를 무작정 쪼개지 않고, 가장 자주 나타나는 문자 쌍을 하나로 합쳐서 어휘 사전(Vocab)을 만듭니다. (약 50,257개 토큰)

(2) 코드 구현: Embedding & Position

# 768차원의 숫자로 변환하는 과정
self.wte = nn.Embedding(vocab_size, n_embd) # 단어 임베딩 (Word Token Embedding)
self.wpe = nn.Embedding(n_ctx, n_embd)      # 위치 임베딩 (Word Position Embedding)

def encode_step(input_ids):
    # input_ids: [나는, 학교, 에] -> [12, 455, 32]
    tokens = self.wte(input_ids) # 단어 의미 추출
    positions = self.wpe(torch.arange(input_ids.size(-1))) # 위치 값 추출
    return tokens + positions # 두 벡터를 더해서 최종 입력값 형성

2. Decode: 뇌 세포(Transformer)들의 연산 흐름

GPT-2는 디코더 블록을 12개(Small)에서 48개(Extra Large)까지 쌓아 올립니다.

(1) Masked Self-Attention (Causal Masking)

GPT-2의 핵심은 "과거만 보고 미래를 맞히는 것"입니다. 그래서 미래 단어를 계산에서 제외하는 마스크를 씌웁니다.

# Masking 코드 (과거 단어만 보게 함)
mask = torch.tril(torch.ones(n_ctx, n_ctx)) 
# 결과값 (삼각형 모양):
# [[1, 0, 0],
#  [1, 1, 0],
#  [1, 1, 1]] -> 0인 부분은 보지 못하게 가림

(2) Attention의 내부 함수 (Q, K, V)

단어들 사이의 관계를 점수로 매기는 과정입니다.

def attention(q, k, v, mask):
    # 1. Q와 K를 곱해서 단어 간 연관도 계산
    scores = torch.matmul(q, k.transpose(-1, -2)) / sqrt(d_k)
    # 2. 마스크 적용 (미래 단어 점수를 -무한대로)
    scores = scores.masked_fill(mask == 0, float('-inf'))
    # 3. 확률로 변환 후 V(정보값)와 곱하기
    return torch.matmul(F.softmax(scores, dim=-1), v)

(3) Feed-Forward & GELU 활성화 함수

GPT-2는 일반적인 ReLU 대신 GELU를 사용해 더 부드러운 의사결정을 내립니다.

GELU(Gaussian Error Linear Unit): 0.5 * x * (1 + tanh(sqrt(2/pi) * (x + 0.044715 * x^3)))
중학생용 설명: "입력값이 작으면 부드럽게 무시하고, 크면 확실하게 전달하는 필터"

3. 전체 흐름 요약 예시

입력: "오늘 날씨"
BPE 토큰화
WTE + WPE 합체
12개의 Decoder Block 통과
Layer Norm (최종 정돈)
Linear Head (점수 계산)
출력 확률: "좋다"(90%)
# 논문에 명시된 최종 예측 함수
def predict_next_token(x):
    x = self.transformer(x) # 위의 모든 과정을 수행
    logits = self.lm_head(x) # 전체 단어장(50,257개)에 대한 점수 환산
    return torch.argmax(logits, dim=-1) # 가장 높은 점수 단어 선택

상세 구현은 OpenAI 공식 레포지토리model.py를 참고하세요.

반응형