PERSONAL AI LAB从零开始,真正训练自己的模型30 天实验计划
MODULE 13 · PROGRESS 0%

从零训练 Mini GPT:把黑盒彻底拆开

亲手实现字符/token embedding、causal self-attention、block、loss、训练循环和生成。

13.1 为什么还要从零写一次

你不可能用个人设备训练出前沿模型,但自己写一个 10M–50M 参数 Mini GPT 会让所有抽象概念落地。你会第一次看到 vocab_size、block_size、embedding_dim、num_heads、num_layers 如何真正组成参数量。

13.2 数据与 Tokenizer

最简单可以从字符级 tokenizer 开始:给每个字符一个整数 ID。它效率很低,但最适合教学。随后再换成 BPE tokenizer,你就能理解为什么真正模型不会简单地“一字一个 token”。

13.3 训练样本

从一段 token 序列中截取 block_size 长度的 x,再把目标 y 向右移动一位。模型在每一个位置同时预测下一个 token。一个 batch 就是很多这样的片段。

13.4 Self-Attention 实现

实现 qkv 线性投影,计算 q@k.transpose,应用 causal mask,softmax,再乘 v。你会亲眼看到 attention matrix 的形状通常包含 batch、head、sequence、sequence。

13.5 训练与生成

训练阶段 forward 返回 logits 和 cross entropy loss;生成阶段把当前上下文喂给模型,取最后一个位置 logits,采样新 token,拼接回上下文,循环。所谓“一个字一个字冒出来”就是这样发生的。

13.6 你应该观察什么

记录训练 loss、验证 loss、每隔固定 step 的样本文本。如果训练 loss 降而验证 loss 升,说明过拟合;如果输出长期完全随机,检查数据、target shift、mask、学习率和模型容量。

本课最小代码 / 结构

# 最关键的训练目标
# x:  [t0, t1, t2, t3]
# y:  [t1, t2, t3, t4]
logits, loss = model(x, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()

动手实验:不做完不算学完

常见错误 / 排错提醒

  • 把完整网络代码复制运行却逐行不懂
  • target 没右移
  • 忘 causal mask
  • 只保存模型不保存 tokenizer 映射

本课验收产物

EXP-008-mini-gpt:一个真正从随机权重训练出来、能生成文本的小 GPT。