跳转至

第 3 章 监督微调:数据模板、损失与训练策略

开场问题:数据文件里明明是正常对话,为什么训完的模型会复述用户问题、输出角色标签,甚至刚开口就结束?

3.1 SFT 没有新的神秘算法

它仍然是第一册第 1 章的 next-token prediction。区别只在于序列由“system + user + assistant”拼成,而且通常只对 assistant 应答部分计算交叉熵 loss。

设输入 token 是 \(x_1,\ldots,x_T\),用 mask \(m_t\) 标记第 t 个 token 是否属于要学习的回答:

\[ \mathcal L_{\text{SFT}} =-\frac{\sum_t m_t \log p_\theta(x_t|x_{<t})}{\sum_t m_t} \]

公式最重要的不是交叉熵,而是 mask。system 和 user token 仍进入前向、提供条件,但不要求模型去预测它们。若把整段都算 loss,模型会花大量能力学习复述 prompt 和角色标记。

3.2 对话模板是模型协议

训练文本不是简单地用换行拼起来,而是类似:

<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
...<|im_end|>
<|im_start|>assistant
...<|im_end|>

具体 token 因模型而异。模板定义了角色边界、消息结束、工具调用和思考区域。训练、评测、部署必须使用同一模板。模板不一致的后果包括:模型不停生成、提前停止、把工具结果当用户指令、或者性能莫名下降。

不要把模板当 tokenizer 的装饰。它是模型在后训练中学到的通信协议,改一个特殊 token 就相当于换协议。

3.3 多轮对话的 label mask

多轮样本有两种常见训练方式:

  • 对所有 assistant 回合计算 loss:每轮回答都提供监督,token 利用率高。
  • 只对最后一轮计算 loss:避免早期回答中的瑕疵被反复学习,也更接近某些目标任务。

工具轨迹还要更细:模型生成的 tool call 应算 loss;外部工具返回的内容通常只作为上下文、不算 loss;最终 assistant 回复再算。若把工具返回也算 loss,模型会学着“伪造工具结果”。

每个数据管线都应该可视化若干样本:打印 token、角色和 mask,肉眼确认。很多所谓“训练不收敛”其实是 mask 偏了一位或把结束 token 漏掉。

3.4 Packing 与 loss 归一化

短对话直接 padding 到统一长度会浪费算力,所以会把多条样本 packing 到一条长序列。此时必须阻止不同样本相互注意,并正确重置位置。第二册第 5.5 节讲了系统实现,这里补算法侧的坑:loss 应按有效回答 token 归一化。

若先对每条样本取平均再对 batch 平均,一条只有 5 个回答 token 的样本和一条 2000 token 的轨迹权重相同;若全局按 token 平均,长样本权重更大。没有绝对正确的选项,但必须明确,因为它会显著改变数据配比。

3.5 学习率、epoch 与“少即是多”

后训练的目标不是重学语言,而是小幅移动行为。学习率通常显著低于预训练,训练 1–3 个 epoch 很常见。重复太多会出现:

  • 回答风格被数据集模板支配。
  • 失去开放式回答的多样性。
  • 对 system prompt 的变化变得脆弱。
  • 通用知识和能力下降。

不能只看训练 loss。它几乎必然持续下降;真正该看的是开发集各能力切片和与基座的 KL/输出变化。最好的 checkpoint 经常早于最后一个 epoch。

3.6 长度与截断是隐蔽的数据选择

样本超过训练长度时,不能从尾部随便截掉:这样可能只保留问题、丢掉答案,或者保留最终答案却丢掉它依赖的工具结果。

要按样本结构截断,例如优先删除最早的非关键历史、压缩工具输出、保留完整的当前问题和回答。统计“哪些类型样本更容易被截断”,否则长任务会在训练中被系统性降权。

3.7 SFT 能教什么,不能教什么

SFT 擅长模仿:格式、语气、流程、工具调用协议、常见解题模式。它不能稳定表达“答案 A 比 B 稍好”这种相对偏好;也很难超越示范质量——如果所有教师轨迹都采用一种次优解法,学生只会更坚定地复制。

SFT 仍然是所有后训练的地基。DPO 和 RL 不是跳过 SFT 的捷径,它们通常假设策略已经能产生格式正确、基本可用的回答。

核心问答

Q:为什么一般只对 assistant token 算 loss? user/system 是条件,不是要模型生成的目标。对它们训练会浪费梯度并鼓励复述 prompt。

Q:工具返回要算 loss 吗? 通常不算。那是环境观察,不是模型动作;算进去会鼓励模型自己编造返回值。

Q:SFT loss 越低,模型越好吗? 不是。低 loss 可能只是记住模板、过拟合风格或重复数据。以独立评测和旧能力回归为准。

Q:训练模板与部署模板差一点有多严重? 可能是灾难性的。角色边界和结束 token 属于模型协议,必须版本化并保持一致。