M31:小数据训练 Baseline:读懂曲线、吞吐与内存
训练 baseline 是一组可重复的最小训练配置,用来建立“数据—模型—优化器—资源—结果”的参照点,而不是追求一次跑出漂亮指标。
内容类型:预习教材(不代表已完成)
日期:2026-09-23
阶段:P1 · AI Model Engineering 90
周次:W5 · 小语言模型预训练、数据与 scaling
节奏:周三引导练习
状态:教材已备;学习未完成
标签:tiny-lm、baseline、loss-curve、throughput、memory
一句话定义
训练 baseline 是一组可重复的最小训练配置,用来建立“数据—模型—优化器—资源—结果”的参照点,而不是追求一次跑出漂亮指标。
学习目标
- 能说清训练损失、验证损失、吞吐和内存分别回答什么问题。
- 能识别一条 baseline 至少需要保存哪些配置,避免曲线失去解释上下文。
- 能用小数据先验证训练管线,再讨论模型能力。
核心知识
- 训练损失反映模型对已见 batch 的拟合程度;它下降只说明优化正在发生,不等于泛化改善。
- 验证损失在不参与参数更新的数据上计算,是观察泛化与数据分布差异的窗口。验证集应保持固定,且不能被训练过程“偷看”。
- 吞吐常用 tokens/s 或 samples/s 表示。它受序列长度、batch、精度、设备和数据加载影响,只有控制其他变量时才可比较。
- 峰值内存由参数、梯度、优化器状态、激活和临时张量共同组成。训练通常比推理多出梯度与优化器状态。
- 一份可解释 baseline 至少应记录:随机种子、数据版本与切分、tokenizer、模型层数/宽度/头数、context、batch、优化器、学习率、训练步数、设备和精度。
先用一个 batch 过拟合是重要的管线检查:若一个极小样本都无法被记住,优先怀疑标签错位、mask、loss、梯度或参数更新,而不是直接扩大模型。
机制/推导
语言模型对每个位置预测下一个 token,平均交叉熵可写为:
[ L=-\frac{1}{N}\sum_{i=1}^{N}\log p_\theta(x_i\mid x_{<i}) ]
困惑度 PPL = exp(L),因此 loss 从 4 降到 3 的意义不是“提高 25%”,而是正确 token 的平均概率结构发生了指数尺度变化。曲线解释必须结合横轴:按 step 比较会混入 batch 差异,按已见 token 数比较通常更公平。
最小练习或观察步骤
- 选用课程中的 tiny LM 与一份很小、许可明确的文本数据。
- 固定 seed、tokenizer、context、batch 和学习率,将配置写入记录表。
- 先只训练单个 batch,检查 loss 是否能明显下降;不要预设它一定成功。
- 再恢复训练/验证切分,按固定间隔记录 train loss、validation loss、tokens/s 与峰值内存。
- 将曲线与异常事件对齐:例如数据加载中断、学习率变化或序列长度变化。
- 只写事实观察和不确定性,不用“模型学会了”替代证据。
常见误区
- 只保存最终 loss,不保存配置和中间曲线。
- 用训练集评估泛化,或反复依据验证集调参后仍把它当无偏证据。
- 把 GPU/CPU 利用率高直接等同于训练高效。
- 不区分 token 吞吐与样本吞吐,跨不同序列长度直接比较。
- 曲线不降就立刻扩大模型,而没有先检查数据、shift、mask 和梯度。
金融 / Web3 / 文档场景连接
在 AML 文本、链上地址描述或合同条款上训练小模型时,领域样本往往少且重复。baseline 的首要价值是暴露数据泄漏和记忆:若按文档片段随机切分,同一合同或同一案件可能同时进入训练与验证,验证曲线会过度乐观。应先按案件、客户、文档或时间边界切分。
自检问题
- train loss 下降而 validation loss 上升,至少有哪些可能原因?
- 为什么 tokens/s 比 samples/s 更适合比较语言模型训练吞吐?
- 单 batch 无法过拟合时,你会按什么顺序排查?
- 一份曲线缺少哪些配置后就难以复现?
专业课程对齐
- 精读 Stanford CS336: Language Modeling from Scratch 中训练循环、优化与资源计算相关讲次;把课程的 model/data/optimizer 配置项映射到本日 baseline 记录。
- 精读 PyTorch Tutorials 的性能、profiler 与自动混合精度主题,关注
optimizer.zero_grad→forward→loss→backward→step 路径与峰值内存采集边界。 - 选读 Hugging Face LLM Course 中 fine-tuning 和 Trainer 章节,只比较高层 API 如何保存 loss、eval 与 checkpoint 记录。
深入学习提示
阅读顺序是 CS336 训练循环→PyTorch profiler→HF 封装。精读时盯住交叉熵 -log p(x_t|x_<t) 及 PPL=exp(L),代码上追踪 batch 在 tokenizer、collator、model、loss 之间的 shape 变化。资源度量至少同时记 tokens/s、step time、allocated/reserved 峰值和已见 token 数;反例是仅用 samples/s 比较不同 context,或 train loss 下降就宣称泛化改善。
**研读产出:**先画一张“指标—回答的问题—不能支持的结论”表,例如训练损失回答优化是否发生,但不能单独证明未见数据上更好。再写出一份可复现配置快照,将数据版本、切分键、随机种子、tokenizer 哈希、模型 shape、优化器、学习率调度、精度、设备和软件版本放在曲线旁。最后预先定义异常处理:单 batch 都无法过拟合时,先检查 shift、mask、梯度与参数更新,不继续扩大模型。
学后填写区
- 实际使用的数据与许可:
- 关键配置:
- 观察到的曲线事实:
- 尚不能解释的现象:
- 下一次只想改变的一个变量: