本节摘要:SFT 的超参基调由一个数字决定:loss 起点约 1.3——基座已带强语言先验,SFT 教的是行为不是语言,因此力度要"轻":学习率取预训练的约 1/51/10、epoch 23 轮封顶、过拟合来得比预训练快得多。本节给出 124M 模型的超参量级表与调参次序(先 batch 与累积,再 lr,最后 epoch),然后教读 loss 曲线:健康的形状、过拟合的三个征兆(train 降 val 升、输出复读、回答变短变小),以及"该在第几个 checkpoint 收手"的经验法则。
阅读完本节,你应当能够:
回顾 1.1 节的两个起点:预训练从 10.4 起步(学语言),SFT 从约 1.3 起步(社区实测 nanochat 口径)。1.3 意味着基座对"对话里的下一个词"已经猜得八九不离十——可学的空间小,能毁的空间大。推论链:
起点低(先验强) ──► 大 lr 会把预训练权重冲离最优点(灾难性遗忘) ──► 数据量小(数万条 vs 预训练百亿 token)──► 多跑几轮必然过拟合 ──► 结论:小 lr、少轮数、盯紧验证集
124M 模型的量级表(经验区间,非精确值;1B+ 模型 lr 再减半左右):
| 超参 | 预训练量级(对照) | SFT 量级 | 说明 |
|---|---|---|---|
| 学习率(峰值) | ~6e-4 | 1e-5 ~ 5e-5 | 预训练的 1/51/10;warmup 短(几十几百步) |
| 调度 | cosine 衰减 | cosine 或线性衰减到 0 | 与预训练同形,只是全程更短 |
| epoch | 单轮大数据 | 2~3 轮封顶 | 第 2 个 epoch 后过拟合风险陡增 |
| 有效 batch | 数百~数千条序列 | 32~128 条序列 | 小了噪声大,大了白费显存 |
| 权重衰减 | 0.1 上下 | 0~0.1 | 小数据下别指望它救命 |
调参次序(次序错了会互相掩盖):
💡 一个反直觉的事实:SFT 对 lr 的容忍区间比预训练窄得多。预训练 lr 偏高 2 倍往往只是慢一点;SFT lr 偏高 2 倍,模型可能直接"忘了怎么说人话"——输出退化成乱码或无限复读。宁可偏小,不要贪快。
健康的 SFT loss 曲线(示意坐标,训练日志随手可画):
loss 1.5 │● 1.4 │ ● 1.3 │ ●● 1.2 │ ●●● 1.15│ ●●●●────●●●●●●──●●●●●●● train:快速下探后趋平 1.18│ ●●●●──●●──●●──●───▲ val:先降后回升 = 过拟合起点 └──────────────────────────────► step ~10% │ ~1 epoch ~2 epochs 快降区 │ 平台区 过拟合区
三个读图要点:
loss 曲线之外,生成行为的三征兆(每几百步存一次 checkpoint、抽问几个固定问题对照):
| 征兆 | 表现 | 对应病情 |
|---|---|---|
| 复读 | 同一句话在回答里连写数遍;换个问题还是那句 | 把训练集的表面统计背下来了 |
| 变短变小 | 回答越来越短、越来越"安全",最后单字作答 | 学到了"训练集回答都短"的捷径 |
| 逐字复述 | 抽训练集里的问题,回答与训练集一字不差 | 纯记忆,零泛化——epoch 到头了 |
处置三连:回退到上一个健康 checkpoint;epoch 减一;lr 减半重跑。"回退 checkpoint"之所以放在第一,是因为它零成本见效——这也是为什么实战脚本(3.3 节)每几百步必存档。
⚠️ 别被 train loss 的持续下降骗了:SFT 的 train loss 在 2 轮之后还在降是常态,降的每一分都可能来自记忆而非能力。验收只看 val 与生成抽检——第 5 章会把"生成抽检"升级成正式的评测集。
跑每次 SFT 前过一遍(本书工程纪律):
旋钮的读法有了,3.3 节把它们全部装进一份完整可跑的训练脚本,并备好故障排查表。