Supervised Fine Tuning
Supervised Fine-Tuning
一句话解释
SFT 用高质量输入—目标示范继续优化语言模型,使其学会指令遵循、回答格式、领域任务或工具行为。
典型数据
- 单轮:prompt / response
- 多轮:
messages=[system,user,assistant,...] - Tool use:tool schema、assistant tool call、tool observation、最终回答
- Causal LM 训练时,通常只对目标 assistant tokens 或指定区域计算 loss
把生成式 LLM SFT 简化成普通分类式 Input,Label 会丢失 chat template、序列化和 token-level loss mask 等关键细节。
方法选择
风险
- 小而偏的数据集可能导致过拟合和 Catastrophic Forgetting。
- Chat template 或 loss mask 错误会让模型学习到错误格式。
- “SFT 只教形式、不创造能力”不是绝对结论;效果依数据、基座和训练设置而定。
从样本到梯度
SFT 的真正接口不是一张 prompt/answer 表,而是一条可检查的数据路径:
1 | 原始对话/轨迹 |
任何一环出错,最终 loss 仍可能下降,却学到错误行为。例如把 user tokens 也纳入监督会让模型复述问题;tool observation 的角色标错会让模型伪造工具结果;padding 未屏蔽会把 batch 长度分布写进梯度。
数据质量要按行为验收
- 格式层:角色顺序、EOS、工具 schema 和多轮截断一致。
- 监督层:确认哪些 token 贡献 loss,短回答和长轨迹的权重是否符合意图。
- 内容层:去重、污染、事实时效、拒答边界和难例覆盖可追溯。
- 能力层:用未见过的指令、长上下文、工具调用和安全集做前后对照。
全参微调还是 PEFT,取决于容量需求与资源约束;SFT 本身并不保证知识更新或推理能力提升。相关基础:Autoregressive Generation。
参考:InstructGPT。
具体样本如何变成有效梯度
考虑一条工具调用样本:用户问“查询订单”,assistant 先输出工具 JSON,工具返回 observation,assistant 再给最终答复。序列化后不是三列文本,而是一串带 role token 的 IDs。通常只对 assistant 的 JSON 和最终答复计算 loss;用户问题与工具 observation 是条件输入。若把 observation 也设成 target,模型会学习伪造工具结果;若遗漏工具调用边界,它可能只学会用自然语言描述“我会查询”,却不会生成合法 schema。
对每个 batch,建议把 input_ids、labels、loss_mask 同时打印成可读 token。检查右移关系:位置 t 的 hidden 预测应对应 t+1 的 label;padding 和被忽略角色必须是 -100 或框架约定的 ignore index。一个常见的静默 bug 是截断发生在 assistant 答案中间,样本仍能 pad、loss 仍能下降,但模型只被训练成短答。
训练轮数和数据混合要用行为曲线决定
小领域数据集重复多个 epoch 往往先提升格式,再损伤通用能力;扩大数据不一定解决问题,因为重复或模板化样本只是增加相同梯度。将数据按任务、语言、长度、工具/非工具和难度分桶,分别报告 token 数与成功率,能看出“平均 loss 下降”究竟由哪一桶贡献。训练集内随机切分也会高估效果,模板近重复应在切分前去重。
如果目标是知识更新,SFT 需要与检索、事实回归和时效性数据一起设计;如果目标是行为规范,优先确保高覆盖的格式与拒答边界。SFT 不会自动给出可靠的在线规划能力,后者需要 Reasoning RL 或工具环境中的进一步反馈。