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 等关键细节。

方法选择

  • 全参数微调:容量大,但训练显存与优化状态成本高。
  • PEFT:冻结大部分参数,只训练少量附加或重参数化参数。
  • LoRA / QLoRA:常见的参数高效方案。

风险

  • 小而偏的数据集可能导致过拟合和 Catastrophic Forgetting
  • Chat template 或 loss mask 错误会让模型学习到错误格式。
  • “SFT 只教形式、不创造能力”不是绝对结论;效果依数据、基座和训练设置而定。

从样本到梯度

SFT 的真正接口不是一张 prompt/answer 表,而是一条可检查的数据路径:

1
2
3
4
5
6
7
原始对话/轨迹
→ chat template 序列化
→ tokenizer 得到 input_ids 与边界
→ labels 对齐并设置 loss mask
→ causal shift
→ token-level cross entropy
→ 梯度累积与参数更新

任何一环出错,最终 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_idslabelsloss_mask 同时打印成可读 token。检查右移关系:位置 t 的 hidden 预测应对应 t+1 的 label;padding 和被忽略角色必须是 -100 或框架约定的 ignore index。一个常见的静默 bug 是截断发生在 assistant 答案中间,样本仍能 pad、loss 仍能下降,但模型只被训练成短答。

训练轮数和数据混合要用行为曲线决定

小领域数据集重复多个 epoch 往往先提升格式,再损伤通用能力;扩大数据不一定解决问题,因为重复或模板化样本只是增加相同梯度。将数据按任务、语言、长度、工具/非工具和难度分桶,分别报告 token 数与成功率,能看出“平均 loss 下降”究竟由哪一桶贡献。训练集内随机切分也会高估效果,模板近重复应在切分前去重。

如果目标是知识更新,SFT 需要与检索、事实回归和时效性数据一起设计;如果目标是行为规范,优先确保高覆盖的格式与拒答边界。SFT 不会自动给出可靠的在线规划能力,后者需要 Reasoning RL 或工具环境中的进一步反馈。