M30:组装 Tiny Language Model 训练循环
Tiny LM 训练循环把 tokenizer、因果 decoder、错位标签、交叉熵和参数更新连成一条可检查的最小闭环。
内容类型:预习教材(不代表已完成)
日期:2026-09-22
阶段:P1 · AI Model Engineering 90
周次:W5 · 小语言模型预训练、数据与 scaling
节奏:周二最小实现
状态:教材已备;学习未完成
标签:Tiny LM、Batch、Shifted Labels、Cross-entropy、Overfit One Batch
一句话定义
Tiny LM 训练循环把 tokenizer、因果 decoder、错位标签、交叉熵和参数更新连成一条可检查的最小闭环。
学习目标
- 把 W3 tokenizer 与 W4 decoder 组合成输入到 logits 的路径。
- 正确构造 batch、context window、inputs 与 targets。
- 理解“先过拟合一个 batch”作为实现检查而非泛化目标。
- 建立不虚构 loss、吞吐或生成质量的运行记录模板。
核心知识
语料经 tokenizer 得到长 ID 流。给定 context 长度 T,可从某个起点截取 T+1 个 token:前 T 个作为 x,后 T 个作为 y,于是每个位置预测下一个 token。多个窗口堆叠为 [B,T]。模型输出 logits [B,T,V],交叉熵通常将前两维展平为 B×T,并与展平 target 对齐。
模型最小组件可包括 token embedding、位置表示、若干 causal Transformer blocks、最终 normalization 和 vocabulary projection。若输入 embedding 与输出 projection 权重绑定,可减少参数并共享词汇几何,但最小理解练习可先显式说明是否绑定。
训练循环的顺序是:取 batch → forward → loss → clear gradient → backward → 可选梯度裁剪 → optimizer.step → 记录。评估模式与训练模式要分开,尤其有 dropout 时;短训练可先不用复杂 scheduler、checkpoint 或分布式框架。
机制与单 Batch 过拟合
“过拟合一个 batch”固定同一小批数据反复更新,预期模型应显著记住这批 token 转移。如果完全无法下降,可能有 label shift、mask、shape、参数未注册、梯度或学习率问题。这是实现 smoke check,不证明数据管道正确、验证效果好或模型有语言能力。
需要特别检查 causal 条件:目标 token y_t 不应出现在位置 t 可见的输入中,只有 x_≤t。若输入与标签没有错位或 mask 泄漏,loss 可能虚假地很低。另一个基准是随机初始化时 cross-entropy 常在 log(V) 附近,但只作为数量级直觉,具体取决于初始化和分布,不能预填结果。
最小练习
- 选一段自写或许可明确的小文本,训练 tiny tokenizer 或使用已准备词表。
- 手工写出一个 T=4 窗口的 x/y 对齐,再扩成 B=2。
- 组装最小 decoder,使 logits shape 为 [B,T,V]。
- 固定单 batch,计划运行少量 step 并记录 loss;实际执行前结果栏为空。
- 做三项检查:未来扰动不影响过去 logits、参数有梯度、target ID 小于 V。
常见误区
- x 与 y 使用完全相同序列,没有后移一位。
- 将 [B,T,V] 与 [B,T] 直接以错误轴送入交叉熵。
- 单 batch loss 下降就开始评价模型泛化或生成质量。
- 一开始加入 mixed precision、checkpoint、scheduler,增加定位难度。
- 训练文本来源与许可不清,或把 secret、客户数据写入语料。
金融、Web3 与文档场景连接
可以用完全合成的交易说明或公开协议片段作为微型语料,只为理解训练闭环。禁止使用真实客户文档、私钥、未公开合约材料或任何 secret。tiny LM 的输出也不能被当作金融建议或事实来源。
自检问题
- 为什么每个窗口需要 T+1 个 token 才能构造 T 个训练对?
- Logits 和 targets 送入交叉熵前 shape 如何对应?
- 单 batch 过拟合能排查什么,不能证明什么?
- 哪三类泄漏会让训练 loss 虚假地变好?
专业课程对齐
- Stanford CS336:对应从零构建语言模型与训练循环,是 tokenizer、batch、Transformer、loss、optimizer 和 checkpoint 的主线参照。
- PyTorch Tutorials:对应 Dataset/DataLoader、模型训练与优化循环,核对梯度清零、反传、更新和 train/eval 状态。
- Hugging Face LLM Course:对应 causal language modeling pipeline,选读数据分块、tokenizer 和 logits 到生成的接口关系。
深入学习提示
先按 CS336 画出 token IDs [B,T] → embedding/decoder → logits [B,T,V] → shifted targets → cross-entropy,再用 PyTorch 官方循环逐行实现,Hugging Face 仅作高层接口对照。第一项结构检查是单 batch 过拟合:它用于验证数据对齐、梯度和容量,不代表泛化。观察 loss 是否显著下降、梯度是否有限、参数是否实际更新,并保存随机种子和配置;公式上确认交叉熵展平的是 B×T 个预测且 vocabulary 为类别轴。反例包括 target 未位移造成复制任务、未来泄漏、padding 参与 loss、忘记清梯度、生成时仍处于训练模式。先通过固定 batch,再扩到小语料;未实际运行时所有 loss、吞吐和样例字段必须留空。
学后填写区
- 语料来源与许可:____
- Batch 对齐示例:____
- Tiny training loop 位置:____
- 实际 loss/shape/梯度观察(运行后填):____
- 实际学习日期与用时:____