← AI 놀이터 홈으로

🤖 나만의 미니 LLM (Mini Language Model)

백지 상태의 아기 신경망에게 문서를 먹여 '다음 단어 맞히기'를 가르쳐요. ChatGPT의 원리를 브라우저에서 진짜로 학습시켜 봅니다.

📖 따라하기 가이드 — 1 / 8 단계

Step 1. 백지 상태의 아기 LLM을 만나요

지금 화면의 모델은 아직 아무것도 몰라요 — 완전한 백지 상태예요. 단어를 입력해도 다음 단어를 거의 아무거나 찍어요 — 후보들의 확률이 고만고만하게 낮죠. 이 아기 LLM에게 이제 문서를 먹여서 똑똑하게 키울 거예요. 키우는 목표(다음 단어 맞히기)는 GPT와 똑같아요. 다만 진짜 GPT는 어텐션(트랜스포머)이라는 더 정교한 구조를 써요 — 🎯 어텐션 페이지에서 만날 수 있어요.

📚 1단계 — 학습시킬 문서

이 글을 모델에게 먹여요. 아래 예시 자료를 눌러 골라 보세요 (누르면 곧바로 백지 모델이 그 문서로 준비돼요). 직접 지우고 여러분의 글(일기, 좋아하는 노래 가사 등)을 붙여넣어도 돼요. 짧으면 통째로 외우고, 길고 반복이 많을수록 진짜 패턴을 배워요.

누르면 사전을 새로 만들고 백지 상태로 초기화돼요

🔮 3단계 — 다음 단어 예측하기

단어를 입력하면 모델이 최근 3개 단어를 보고 다음에 올 단어를 확률(%)로 예측해요.

💬 아기 LLM과 대화하기

말을 걸면 모델이 배운 단어로 다음 단어를 계속 이어 붙여 대답해요 (ChatGPT와 똑같은 방식!). 단, 이 아기는 질문을 "이해"하지 못해요. 그냥 배운 세계로 이어 말할 뿐이라, 학습 전엔 아무 말이나 하고 학습해도 엉뚱한 말을 해요. 그게 정상이에요 — 진짜 대화는 GPT처럼 어마어마한 데이터와 크기가 있어야 되거든요. 😄

아직 백지 상태예요. 지금 말 걸면 아무 말이나 마구 해요.
먼저 ▶ 학습시킨 뒤 다시 말 걸어 비교해 보세요!

🤖의 말은 여러분이 준 문서의 단어를 확률로 섞어 만든 거예요 — 뜻을 알고 하는 말이 아니에요.

📉 학습 곡선 — 얼마나 똑똑해졌나

읽는 법: 빨간 선이 손실이에요. 다음 단어를 틀리게 예측할수록 높아요. 학습이 진행되며 아래로 내려가면 모델이 문서의 패턴을 배우고 있다는 뜻이에요.

🎛️ 2단계 — 학습 조종하기

문맥 길이 N (몇 단어 보고 예측?)

최근 3개 단어를 문맥으로 봐요. 길수록 똑똑하지만 외울 게 많아져요 (GPT의 context window 개념).

📊 지금 상태

학습 반복 (epoch)
0 / 1200
현재 손실
—
사전 크기 (단어 수)
—
학습 예시 수
—
문서 단어 수
—
파라미터 수
—

파라미터는 모델이 학습으로 조절하는 "뇌세포 연결" 수예요. 우리 모델은 수천 개, GPT-4는 수천억 개가 넘는 것으로 추정돼요. 목표(다음 단어 맞히기)는 똑같지만, 진짜 GPT는 어텐션(트랜스포머)이라는 다른 구조를 써요 — 🎯 어텐션 페이지에서 확인해 보세요.

🧪 이렇게 실험해 보세요

  1. 학습 전(백지)에 예측해 보고, 학습 후와 %를 비교하세요.
  2. 문서를 딱 한 문장만 남기고 학습 → 그 문장만 100%로 외워버려요 (과적합!).
  3. 여러분의 일기나 가사를 붙여넣고 나만의 말투를 배우게 해보세요.
  4. N=1과 N=4를 비교 — 문맥이 길수록 예측이 또렷해지나요?
  5. 예시 자료를 동요·레시피·우주로 바꿔가며 학습해 보세요. 문서가 바뀌면 배우는 말투도 완전히 달라져요.
  6. 📜 진짜 긴 자료로 학습하면 손실이 천천히 내려가요. 외울 게 많아 "암기"가 어려워지거든요 (좋은 신호!).

🧮 수식과 파이썬

P(다음 단어 | 최근 N단어)
= softmax( W₂ · tanh(W₁ · [임베딩들] + b₁) + b₂ )
최근 N단어의 임베딩을 신경망에 넣어 다음 단어의 확률을 계산해요. 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)