监督微调
监督微调用输入与目标输出示例更新模型参数,让模型更倾向于产生示范中的回答或行动方式。
理解与应用
监督微调(SFT)是在已有模型上,用整理好的输入与目标输出继续训练。对常见的因果语言模型,常用训练目标是提高目标 token 在相应上下文中的概率。把几个示例写进提示只改变本次输入,而 SFT 会改变模型参数,使示例中的模式有机会迁移到后续请求。
假设报销助手需要把各种退回说明整理成“原因、需补材料、下一步”三个字段。训练数据可以包含真实风格但经过授权与整理的退回文本,以及审校过的目标结构。模型学习的是如何识别原因并组织输出,而不是凭空获得公司最新制度。若错误主要来自制度更新,用检索提供当前文件通常比不断重训更贴近问题本身。
示范怎样进入损失函数也很重要。有的训练只对助手回答部分计算损失,有的包含更大范围的序列;对话模板、角色标记或截断位置出错,都可能让实际训练对象偏离预期。验证集还应按来源或相近样本分开,避免同一条退回记录换几个字同时出现在训练与验证中。SFT 可以更新全部参数,也可以配合 LoRA 等方法只更新少量参数,这是训练目标与参数更新方式两个不同维度。损失下降说明对训练示例拟合得更好,能否正确处理新记录、是否出现遗忘,还要靠独立任务验证。
动手试一试:只对目标回答计算损失
概率由人工指定,代码展示回答区遮罩怎样决定损失计算范围。改变前两项概率不会改变这里的损失;这只是训练目标的算术示例,没有进行参数更新。
将代码保存为 example.py,使用 Python 3.10+ 运行 python3 example.py。仅使用标准库,无需密钥,不会调用外部模型。
Python 代码
from math import log
# 前两项代表提示 token,后两项代表目标回答 token。
probabilities = [0.2, 0.4, 0.8, 0.5]
answer_mask = [0, 0, 1, 1]
selected = [p for p, keep in zip(probabilities, answer_mask) if keep]
loss = -sum(log(p) for p in selected) / len(selected)
print("参与训练的 token 数:", len(selected))
print("平均负对数似然:", round(loss, 3))运行结果
参与训练的 token 数: 2 平均负对数似然: 0.458
常见误区
- 示例中的错误、越权调用和无依据承诺,也可能成为模型模仿的模式。
- 训练损失低不等于新任务表现好,尤其是在近重复数据泄漏到验证集时。
- SFT 描述学习方式,LoRA 描述参数更新方式,两者可以一起使用。
前置与延伸
建议先读
相关概念
参考与版本
Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。
- TRL:SFT Trainer ↗
核对因果语言模型监督训练及 completion/assistant loss 的数据遮罩选项;示例不运行真实模型训练。 · 核验:2026-10-10
- Training language models to follow instructions with human feedback ↗
作者原始论文区分监督微调、偏好奖励模型和后续强化学习阶段;不把它们合并为同一训练方法。 · 核验:2026-10-10