51

Completion-only loss——只算她说的部分

阅读约 3 分钟第 51/60 课

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 的完整流程:

  1. 什么是 SFT(第 47 章节):从续写器到对话者的行为转变。
  2. 教师蒸馏(第 48 章节):用 Claude Haiku 生成训练数据。
  3. 语料合成(第 49 章节):行为脚本、验收程序、质量控制。
  4. 人格设计(第 50 章节):system prompt 定义行为风格。
  5. Completion-only loss(本章节):只在助手回答上算 loss。

SFT 让 Sophia 学会了「怎么回答」。但 SFT 只给了正面示范——只告诉模型「好的回答是什么样的」,没有告诉它「不好的回答是什么样的」。下一个单元来看怎么教模型区分好和坏——偏好优化。