백지 상태의 아기 신경망에게 문서를 먹여 '다음 단어 맞히기'를 가르쳐요. ChatGPT의 원리를 브라우저에서 진짜로 학습시켜 봅니다.
이 글을 모델에게 먹여요. 아래 예시 자료를 눌러 골라 보세요 (누르면 곧바로 백지 모델이 그 문서로 준비돼요). 직접 지우고 여러분의 글(일기, 좋아하는 노래 가사 등)을 붙여넣어도 돼요. 짧으면 통째로 외우고, 길고 반복이 많을수록 진짜 패턴을 배워요.
단어를 입력하면 모델이 최근 3개 단어를 보고 다음에 올 단어를 확률(%)로 예측해요.
말을 걸면 모델이 배운 단어로 다음 단어를 계속 이어 붙여 대답해요 (ChatGPT와 똑같은 방식!). 단, 이 아기는 질문을 "이해"하지 못해요. 그냥 배운 세계로 이어 말할 뿐이라, 학습 전엔 아무 말이나 하고 학습해도 엉뚱한 말을 해요. 그게 정상이에요 — 진짜 대화는 GPT처럼 어마어마한 데이터와 크기가 있어야 되거든요. 😄
🤖의 말은 여러분이 준 문서의 단어를 확률로 섞어 만든 거예요 — 뜻을 알고 하는 말이 아니에요.
읽는 법: 빨간 선이 손실이에요. 다음 단어를 틀리게 예측할수록 높아요. 학습이 진행되며 아래로 내려가면 모델이 문서의 패턴을 배우고 있다는 뜻이에요.
최근 3개 단어를 문맥으로 봐요. 길수록 똑똑하지만 외울 게 많아져요 (GPT의 context window 개념).
파라미터는 모델이 학습으로 조절하는 "뇌세포 연결" 수예요. 우리 모델은 수천 개, GPT-4는 수천억 개가 넘는 것으로 추정돼요. 목표(다음 단어 맞히기)는 똑같지만, 진짜 GPT는 어텐션(트랜스포머)이라는 다른 구조를 써요 — 🎯 어텐션 페이지에서 확인해 보세요.
import torch, torch.nn as nn
# 1) 문서를 단어로 쪼개고 사전을 만든다
words = document.split()
vocab = {w: i for i, w in enumerate(sorted(set(words)))}
ids = [vocab[w] for w in words]
N, D, H, V = 3, 8, 16, len(vocab) # 문맥 길이, 임베딩·은닉 차원, 어휘 수
# 2) 백지 상태 미니 LLM (임베딩 → tanh → softmax)
class MiniLM(nn.Module):
def __init__(self):
super().__init__()
self.emb = nn.Embedding(V, D)
self.fc1 = nn.Linear(N * D, H)
self.fc2 = nn.Linear(H, V)
def forward(self, ctx): # ctx: (batch, N)
x = self.emb(ctx).flatten(1)
h = torch.tanh(self.fc1(x))
return self.fc2(h) # 로짓 (softmax 전)
model = MiniLM()
opt = torch.optim.SGD(model.parameters(), lr=0.5)
# 3) 최근 N단어 → 다음 단어 맞히기로 학습
X = torch.tensor([ids[i-N:i] for i in range(N, len(ids))])
Y = torch.tensor([ids[i] for i in range(N, len(ids))])
for epoch in range(1000):
logits = model(X)
loss = nn.functional.cross_entropy(logits, Y) # 다음 단어 맞히기 손실
opt.zero_grad(); loss.backward(); opt.step() # 역전파로 조금씩 똑똑해짐
# 4) 예측: "토끼는 당근을" 다음에 올 단어의 확률
ctx = torch.tensor([[vocab[w] for w in "토끼는 당근을 먹어요".split()[-N:]]])
probs = model(ctx).softmax(-1)