训练跑着的时候,只看 loss 曲线够吗?该看哪些仪表?
本课一问:训练一跑就是几万步。盯着一条 loss 曲线,它在往下走,就算训练正常吗?还有哪些读数该一起看?
这一课先不碰:训练完之后拿 benchmark 考分(第 2 课);小实验的结论怎么推到大模型(第 3 课);spike 为什么会发生、怎么按住 logit(C8 已经讲过,这里只读仪表、不再推机制)。
从已有出发
「小明把苹果给了小王」在锚点模型里是 5 个 token。还没训练时,每个位置的 loss 都应该约等于 ln 248,320 = 12.42(C0 第 5 课):那是训练曲线的第一个点,也是全课的第一块仪表。一次训练循环里,还有几处能「接表」:
- 前向算出每个位置的注意力分数和输出 logits——它们有多大,说明模型内部离 softmax 饱和还有多远(C8 第 4 课);
- loss 是整次训练盯得最多的数;
- 反向给出梯度——裁剪之前,把全部梯度合成一个长度 ‖g‖,就是 C5 第 6 课拿去和阈值比的那个数。
这一课为什么换例子。仪表读的是一整次训练的轨迹,一句话上看不出来。所以本课改用我们项目 04-实践项目 里真实跑过的 run:3.7M 参数、《三國志演義》语料、词表 2,048(开局应当约等于 ln 2,048 = 7.6246);每个 run 只改一项配置,参照是基线配置 ref_baseline。所有数字由页面从导出文件 c08-stability.json、c14-eval.json 现读。
先自己设计:只看 loss
最省事的读法:把 loss 曲线画出来,它在往下走就放心。下面这个 run 就是这样一条曲线——先只给你这一条:
- ① 朴素方案
- ② 它在哪失败
- ③ 改进方案
失败有两层:
- loss 是结果,不是状态。第 20 步两个 run 的 loss 分不出高低——差距小于同一个配置重跑几次的波动。可这时模型内部已经不一样了:注意力 logit 大了一个数量级,梯度范数在更早的第 6–10 步就冲了上去。loss 要等到状态坏到影响预测,才会反映出来。
- 一条曲线自己没有刻度。单看这一条,它从 7.685 一路单调降到 5.832,中间一次都没回升。「降到 5.83 算不算好」,只有和参照放在一起才知道(参照是 4.641)。而最大 logit、开局 loss 这类仪表自带刻度:logit 到几百,softmax 就近乎只看一个位置(C8 第 4 课);开局 loss 有标准答案 ln V。
试三件事(展开上面的改进方案):① 拖到第 20 步,读表格里四块仪表的「差 / 倍数」一列,再看「第一次报警」一列哪块最早;② 在「要检查的 run」里换成 c4_preln_nowarmup_lr1e-2(学习率 10⁻²、不 warmup):它的 loss 同样一路下降,第 20 步最大 logit 已是 212,第 1–5 步梯度范数峰值 18.4(参照 3.18);③ 换成 c8_qknorm_lr3e-2(开 QK-Norm、学习率 3×10⁻²):logit 那块始终不报警——QK-Norm 把它按住了——可最终 loss 还是比参照差,报警只来自梯度范数和 loss。一块仪表不响,不等于没事。
改进:四块仪表
① 开局自检:第 0 步的 loss 对 ln V
还没训练时,模型对 V 个 token 近似均匀地猜,loss 应当约等于 ln V(C0 第 5 课推过)。这是最便宜的一块仪表:第一个评估点一出来就能核对。Karpathy 在《A Recipe for Training Neural Networks》里把它列为训练前的第一批检查之一:「verify loss @ init」。
我们项目里每个 run 的第 0 步都记了下来。下表按「差多少」排序,条形长度按对数画:
除了改初始化的三个 run,其余 run 的差都在 0.01–0.13 之间(输出层的 logit 不是严格的 0,C0 第 5 课的实验台 ② 模拟过这件事);只有把初始化标准差调大的两个 run 远远偏离:std 0.2 时开局 12.51,高出 ln V 4.89;std 1.0 时开局 55.33,高出 47.71。
常见误解:「开局对上了 ln V,初始化就没问题。」c8_init0.002(初始化标准差 0.002)开局 7.6246,与 ln V 只差 -5.8e-5——比参照对得还准;可 400 步后它的验证 loss 是 5.352,比参照差 0.71。开局对上 ln V 只说明 logits 一开始接近均匀;权重太小、训练起步太慢,这块仪表看不见。它是必要条件,不是充分条件。
② 裁剪前的全局梯度范数
OLMo 2 在自己的训练日志里观察到两条规律:剧烈的梯度范数尖峰常常先于 loss 尖峰;梯度范数缓慢上涨,与尖峰越来越频繁相关 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条来自 OLMo-0424 与 OLMo 2 的训练日志与对照实验;是一个模型家族的观察,不是定理。C8 第 3 课已经讲过它背后的机制。 出处OLMo 2 §3 ↗需联网 。上面的回放里也是这样:学习率调大 10 倍的 run,第 6–10 步的梯度范数峰值 22.8,是参照同一区间 1.73 的 13.2 倍。按回放里写明的报警规则,梯度范数在第 10 步报警,最大 logit 在第 20 步,loss 要到第 40 步。
常见误解:「梯度范数越小,训练越稳。」两个出事的 run 在第 50 步之后,梯度范数(区间均值)的中位数分别是 0.357 和 0.247,都低于参照的 0.560。原因是注意力 logit 已经大到 softmax 近乎只看一个位置,饱和区的梯度本来就小(C8 第 4 课)。安静的梯度可能是「稳」,也可能是「卡死了」——要和 logit、loss 一起读。
③ 最大注意力 logit 与输出 logit
这块仪表不是在训练循环里顺手记的,而是每次评估时多做一次前向的「探针」:在 8 个固定的验证窗口上,取所有层、所有头、所有可见位置里 softmax 之前的最大值。形状是这样的:
| 维度 | 含义 | 真实规模 | 小规模 |
|---|---|---|---|
| H | 头数(n_head) | 8 | 3 |
| T | 验证窗口长度(block_size) | 256 | 5 |
| dh | 单头维度 = 256 ÷ 8 | 32 | 4 |
| 1 | 一个数 | 1 | 1 |
Wortsman 等人在小模型上用高学习率复现了大模型训练里的两类不稳定:注意力 logit 增长,和输出 logit 与 log 概率发散 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条小模型代理实验;两类不稳定与缓解手段在大模型上都出现过。 出处Wortsman et al. 2023 ↗需联网 ;Kimi K2 用原版 Muon 训练时,最大注意力 logit 很快超过 1,000,于是加了 QK-Clip(C5 第 7 课、C8 第 4 课)。所以这块仪表有现成的刻度:参照 run 的最大 logit 从 2.4 慢慢涨到 49.9;学习率调大 10 倍的 run 第 20 步就是 25.7,最高到 7,977。
④ 把「尖峰」变成一个可以比较的数:spike score
尖峰在曲线上一眼能看到,可「这个 run 比那个 run 尖峰多」要一个数。OLMo 2 的定义很简单:
试三件事:① 默认 W = 20、k = 5,读学习率调大 10 倍的 run 与参照的 spike score;② 把 k 调到 7(OLMo 2 的取值):我们每个 run 只有 80 个日志点,7σ 在这么短的序列上很难达到,几乎什么都标不出——阈值要和日志长度一起定;③ 换成 c8_init1(初始化 std 1.0):它的梯度范数峰值 51.0 出现在第 25 步,是参照的 16 倍,可 spike score 是 0——开局的尖峰没有历史可比。每块仪表都有它看不见的地方。
在演进地图上的位置
- 只看 loss(和 PPL)
- 仪表:开局对 ln V、梯度范数、最大 logit、spike score
- 公开 benchmark
- n-gram 去污染 + 干净子集
- 换一套没见过的题 / 按时间切分
- 交换性置换检验(可证检测)
- 非公开题 + 第三方预先定好的评测集
- 三层可信度 + 口径核对
- 多种子、信噪比
- 平滑指标 + 两步预测
证据三问
| 问 | 本课的回答 |
|---|---|
| ① 它解决什么问题? | loss 是结果,变坏时往往已经晚了;仪表读的是模型的状态,能更早报警,而且自带刻度 |
| ② 数学上为什么可能有效? | 均匀猜时 loss = ln V 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条−ln(1/V) = ln V(C0 第 5 课) 出处待补 ;logit 放大后 softmax 饱和、敏感度 ∝ logit 尺度 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条C8 第 3、4 课的求导 出处待补 ;梯度范数对少数大分量敏感是平方和的性质 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条‖g‖² = Σg²,最大的几项主导 出处待补 |
| ③ 实验上为什么最后选了它? | OLMo 2 的日志里梯度范数尖峰常先于 loss 尖峰 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条一个模型家族的观察 出处OLMo 2 §3 ↗需联网 ;Wortsman 在小模型上复现了 logit 增长导致的不稳定 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条小模型代理实验 出处Wortsman et al. 2023 ↗需联网 ;我们项目的回放里,学习率调大 10 倍时梯度范数与 logit 都比 loss 早报警 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条只在「3.7M 参数 + 0.5M token」的规模、单种子上成立;报警规则的阈值是我们自己定的。 出处项目真实日志 · 本章实验课 ↗ |
一句话
loss 是结果,仪表看状态:开局对 ln V,过程中盯裁剪前梯度范数和最大 logit,它们比 loss 更早报警,但要几块一起读。
先停在这里:记住四块仪表各自的刻度,以及「安静不等于没事」,进下一课。
再深一层:在回放里把 16 个带曲线的 run 挨个过一遍,找出一个「loss 报警了、其他仪表都没报」的 run——它说明什么?(提示:看 c8_qknorm_lr3e-3,它最后比参照还好。)
下一个缺口
训练仪表回答的是「训练有没有出事」。训练完了,模型到底会不会做题,要拿题来考——在公开 benchmark 上报一个分数,这个分数能信吗? → 第 2 课:benchmark 分数与污染
你可能会问
这一课还没有收到真实提问;你的提问会记到 05-问答记录/C14-L1.md。
🔍 大模型训练时,这些仪表真的有人在看吗?
公开报告里能看到三种做法。① 把仪表写进训练日志并公开:OLMo 2 公开了完整训练日志与数千个中间 checkpoint,报告第 3 节整节讲稳定性,spike score 就出自那里。② 在报告里只给结论:DeepSeek-V3 写的是全程没有不可恢复的 loss spike、没有回滚;Kimi K2 写的是 15.5T token 全程零 loss spike(C8 第 3、4 课)——这些属于自报,我们看不到仪表本身。③ 拿仪表做压力测试:Qwen3.8-Flash-Next 报告把学习率固定在最优值的 4 倍,数每万步出现多少次 loss 尖峰(C8 第 3 课)。第 2 课的岔路会专门讲这类「自报数字」该信几分。