English interface selected · this article is currently written in Chinese.
监督微调在教模型什么:从文本续写到任务示范
English overview →具备清晰骨架、初步数学推导或工程验证,持续补充论据与实测。
数字花园
🌿 什么是数字花园与思想演进?
遵循 Maggie Appleton 与 Andy Matuschak 的常青笔记理念:这里不是按时间沉底的流水账,而是持续修剪打磨的知识生态。文章按成熟度经历:
- 🌱 萌芽 (Seedling): 发散灵感、读书摘录、开放猜想
- 🌿 演进 (Budding): 结构渐明、初步代码推导、积极修正
- 🌳 常青 (Evergreen): 逻辑闭环、持久经得起检验的基石
- 🔬 实验待证 (Speculative): 结合沙盒与仿真探针的理论探索
假设我们已经有一个能写通顺中文的模型。现在交给它一段实验记录,希望返回三个字段:模型名、学习率和训练步数。
它可能认真写出一段解释,也可能补上“通常建议训练一万步”。看起来像在帮忙,实际却没有完成提取任务。
原因未必是模型完全不懂这段文字。它需要知道这次应该怎样使用已有能力:只提取材料中的信息,按指定格式返回,缺失就留空,不补写实验建议。
监督微调,也就是 SFT,是用输入与示范输出继续训练模型,让它更倾向于产生我们需要的回答。 它仍然可以使用第二卷讲过的下一个 token 预测,但训练数据与计分位置发生了变化。
本卷围绕一个有限任务展开:从中文实验记录中提取结构化信息。所有名为 Cedar 的模型和记录都是自写教学样例,不是实际训练结果。
先看我们到底需要哪一种回答
输入材料如下:
本次使用 Cedar-30M,学习率为 2e-4。记录未说明训练步数。
任务要求是返回一个 JSON 对象:model 为字符串或 null,learning_rate 为数值或 null,steps 为整数或 null。没有明确记录的字段填 null,不要额外解释。
符合要求的示范可以是:
{"model":"Cedar-30M","learning_rate":0.0002,"steps":null}下面几种输出,都与它有区别:
| 输出表现 | 具体问题 |
|---|---|
| “这段记录使用了 Cedar-30M……” | 可能理解了内容,但格式不符合约定 |
JSON 正确,steps 却填了 10000 | 格式通过,补写了材料没有的信息 |
| 把学习率写成 0.002 | 数值转换错误 |
所有字段都填 null | 过度保守,遗漏已有信息 |
这四类错误需要不同证据和修复方式。只用一句“模型不听话”描述它们,会让数据改进失去方向。
从续写到示范,数学任务并没有突然换一种
第二卷的自回归目标是根据前缀预测后续 token。SFT 可以把任务要求和材料作为前缀,把示范回答作为要学习的后续。
设输入为 ,示范回答为 。模型给整个回答的条件概率可以拆为:
只监督回答时,单条记录的负对数目标是:
意思是:在给定要求和已有正确回答前缀的情况下,提高示范中的下一个 token 的概率。这里的 包含实际序列化后的提示和必要控制标记,不只是我们看到的自然语言材料。
多条样本合起来时,还要决定按 token 平均还是按样本平均。本篇只写单条求和形式,第三篇会专门处理监督范围与权重。
模型并不是先生成整份 JSON,再拿一个“正确/错误”分数更新。这种基本 SFT 使用的是示范回答中的逐 token 监督。JSON 是否能被解析,是我们额外设计的任务检查,不是交叉熵自动理解的业务规则。
示范数据同时教了内容和行为
对上面的样例,模型可能同时学到几件事:
- 字段提取:从材料中找出对应信息。
- 格式遵循:使用指定键名、括号和数值类型。
- 缺失处理:没有证据时输出
null。 - 输出边界:回答结束,不继续写说明或新问题。
这些信号并不完全可分。如果每条样本都包含很长的固定开场白,大量监督就会用于学习开场白;如果缺失值总与短输入绑定,模型也可能把“文字很短”误当成缺失判断的捷径。
所以示范不是把正确答案装进文件就结束。它定义了模型应该模仿什么,也可能包含我们没打算教的规律。
SFT 可以让模型学到新信息和新模式,不能简单说它“只改变格式”。但若目标是可靠利用输入材料,就不应把记住训练样本中的数值当作任务完成。新记录换了模型名和学习率,仍能根据材料正确提取,才更接近我们想要的行为。
为什么论文里的 SFT 结果不能随意移植
InstructGPT 的方法包含不同阶段:先用示范做 SFT,再训练奖励模型,之后通过 PPO 优化。论文分别讨论了这些模型和比较。不能看到完整流程的最终结果,就说“单独 SFT 已经带来同样收益”。InstructGPT,第 3 节
另一条研究线索是把多种任务写成自然语言指令再微调。FLAN 研究了这种训练对未见任务的迁移表现。这提示我们,指令数据的任务分布值得设计;它没有证明任意任务混合都能改善任意目标。Finetuned Language Models Are Zero-Shot Learners
回到我们的提取任务,最值得借用的是研究问题和对照方式:示范覆盖了哪些行为?评价是否包含未见模板和未见材料?模型获得的是更稳定的格式,还是内容准确率也提高?
没必要先复制论文中所有数据规模和训练轮数,才有资格回答一个小而明确的问题。
在训练之前,先判断是不是需要训练
如果输入格式固定,字段总在相同位置,规则解析可能已经足够。即使决定使用模型,也应先看原有模型加清晰提示能做到什么。
一个合理起点是三组方案:
| 方案 | 改变什么 | 主要回答的问题 |
|---|---|---|
| 原模型+明确要求 | 不改参数 | 模型现有能力是否已经够用 |
| 原模型+少量示范提示 | 在上下文中增加例子 | 只是缺少任务说明,还是仍不稳定 |
| SFT 模型+固定提示 | 用训练样本更新参数 | 参数更新能否在预算内稳定改善任务 |
这三组不天然是严格的一次单变量实验。加入示范提示会改变上下文长度,SFT 又增加训练成本。报告时应明确是在比较可部署方案,还是隔离参数更新的作用。
若要单独研究 SFT 的影响,至少保留原模型与 SFT 模型使用同一份提示、同一模板和同一生成设置的对照。示范提示方案可以作为额外基线,不要把所有差别都归功于微调。
任务定义模糊时,多加样本会放大分歧
“学习率”也可能存在歧义。材料写“峰值学习率为 2e-4,当前已衰减到 1e-5”,到底提取哪个?
这不是模型必须自行猜出的常识,而是任务规范尚未写清。若一半标注者选择峰值,另一半选择当前值,训练会接收到冲突示范。
可以选择只提取明确称为“本次配置学习率”的数值,或把字段拆成峰值与当前值。但必须先决定,再同步修改说明、示范和评价。不能训练时接受两种答案,评测时却只认可其中一种。
本卷的简单版本约定:每条材料只描述一项实验;若出现多个候选却无法按规则确定目标,单独归入歧义集,不强塞进正常样本。这样是为了让起步实验边界清楚,后面再扩展更复杂任务。
SFT 损失下降,不等于字段就正确
交叉熵会奖励示范序列的概率,但字段错误与 token 错误不是一一对应关系。
把 0.0002 写成 0.002,可能只差很少 token,却是重要的数值错误。另一方面,JSON 键顺序变化可能造成字符串不同,却不改变结构化内容。
因此,需要至少分开看三项:
- 可解析率:输出是否是合法 JSON。
- 结构符合率:键、类型和额外文本是否符合任务规范。
- 字段正确率:值是否由材料支持,缺失是否处理正确。
假设一百条样例里九十八条可解析,但只有七十条所有字段都对,不能用 98% 作为整个任务的成功率。这里是假设的计数示例,不是本站模型得分。
对于提取任务,验证损失有助于观察拟合,任务指标才更直接回答使用价值。两者不同步时,应保存输出检查错误类型,而不是任意挑一个更好看的指标。
怎样设计第一轮 SFT 比较
先准备一小批人工核对过的样本,覆盖正常数值、科学计数法、缺失字段和格式变化。按来源记录分组划分,不能把同一材料改写的几个版本分别放进训练和测试。
固定模型与分词器版本,保留原模型结果,再训练一个配置明确的 SFT 基线。先不同时比较多个 LoRA 秩、数据生成器和学习率策略,否则很难定位收益来源。
提前写下预测:例如 SFT 可能减少额外解释并改善 null 使用,但数值换算是否提升需要检查。对应地,分别统计格式错误、遗漏、补写和转换错误。
如果只在训练模板上变好,换一种表述就退化,下一步应补任务覆盖与划分检查,而不是马上增加训练轮数。若原模型的提示基线已经足够稳定,微调也可能没有值得承担的维护收益。
这是一份可执行的比较设计,本篇不宣称已经完成正式训练。后续几篇将把样本格式、监督位置和训练方法逐步补齐。
两个检查理解的问题
第一,模型输出了合法 JSON,却把未记录的步数填成一万。增加更多“格式正确”的样本,一定能修复吗?还需要怎样的示范和评价?
第二,SFT 模型比原模型表现好,但两者使用了不同聊天模板和不同提示示范。你能把提升全部归因于参数更新吗?怎样补一个更清楚的对照?
下一篇讨论一条指令样本应该包含什么。任务意图必须变成具体消息与 token 序列,才能进入训练。
文章概念网络
从章节进入正文概念。实线表示所属层级,虚线连接跨章节重复出现的概念,不代表因果关系。
56 / 56 个节点 · 正文标记术语与关键词概念
监督微调在教模型什么:从文本续写到任务示范
回到原文 ↗最后更新于 2026-10-20
引用本文
@article{2026-10-20-llm-training-sft-01-demonstrations,
author = {枫语},
title = {监督微调在教模型什么:从文本续写到任务示范},
journal = {枫语},
year = {2026},
month = {oct},
url = {https://meiluosi.github.io/posts/2026-10-20-llm-training-sft-01-demonstrations/}
}