SFT 训练时,一段完整的训练数据包含 system prompt、用户消息和助手回答。但 loss 只在助手回答的 token 上计算——system prompt 和用户消息的 token 被遮掉了。
为什么不算全部
预训练时,每一个 token 都计算 loss——模型在整段文本上学习语言规律。但 SFT 的目标不同:我们不是要模型学会生成用户的问题(那不是助手应该做的事),我们只要模型学会生成好的回答。
如果在用户消息上也算 loss,模型会尝试学习「预测用户会说什么」——这不仅没有用,还会干扰它学习「怎么回答」的目标。梯度信号被稀释了:一部分梯度在教模型预测用户输入,一部分在教模型写好回答。
实现方式
实际实现非常简单——用一个掩码(mask)把不需要算 loss 的位置标记出来:
tokens: [system] [你是 Sophia ...] [user] [请解释光合作用] [assistant] [光合作用是...]
mask: [0 ] [0 ] [0 ] [0 ] [0 ] [1 ]
mask 为 0 的位置不计算 loss,梯度为零——这些位置的 token 不参与参数更新。mask 为 1 的位置正常计算 loss 和梯度。
这叫 completion-only loss——只在模型「完成」(completion)的部分计算 loss。
对记忆任务的影响
Sophia 的技术报告特别提到了记忆相关对话的处理。在多轮对话中,如果某一轮助手的回答不依赖前面的对话历史——即使不看历史也能正确回答——那么这一轮对模型学习「记忆」毫无帮助。
因此,Sophia 的 SFT 数据设计中,会刻意确保后续轮次的回答必须依赖前面的信息。只有这样,模型才需要真正「记住」前面说了什么来生成正确的回答。
这个单元学了什么
五个章节覆盖了 SFT 的完整流程:
- 什么是 SFT(第 47 章节):从续写器到对话者的行为转变。
- 教师蒸馏(第 48 章节):用 Claude Haiku 生成训练数据。
- 语料合成(第 49 章节):行为脚本、验收程序、质量控制。
- 人格设计(第 50 章节):system prompt 定义行为风格。
- Completion-only loss(本章节):只在助手回答上算 loss。
SFT 让 Sophia 学会了「怎么回答」。但 SFT 只给了正面示范——只告诉模型「好的回答是什么样的」,没有告诉它「不好的回答是什么样的」。下一个单元来看怎么教模型区分好和坏——偏好优化。