从零训练 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。