1.会接着写,为什么还不会按要求答

你把“周五15点开会”交给模型,要求只提取时间和地点。它可能继续编写通知,也可能补出“A会议室”,或者先写一段热情的解释。基础模型学过怎样预测后续文字,却未必稳定地把这段输入理解成“用户提出任务,现在该由助手完成”。

监督微调,简称SFT,就是从已有模型出发,用输入与示范回答继续训练,让指定回答在相应条件下变得更容易产生。它延续了下一token预测的计算方式,改变了训练数据及我们选择计分的位置。训练之后参数发生变化;只在聊天里贴几个例子,则是在改变本次上下文。

本章要追踪一条通知怎样变成训练信号,再判断这种信号能教会什么。先不讨论用多少显存,也不假定必须更新所有参数。SFT回答“用什么示范和目标学习”,下一章的LoRA回答“允许哪些参数怎样更新”。这两件事可以组合。

2.一条训练记录必须把任务说完整

先给标注员一份明确规则:提取时间、地点;保留原文中的时间表达;缺失项填“未提供”;不要自行推算日期;多场会议分别记录。否则,同一输入可能得到互相冲突的标准答案,模型会同时收到矛盾信号。

最简单的样本有请求和回答两部分。请求是“提取时间和地点。通知:周五15点开会”;示范回答是“时间:周五15点;地点:未提供”。任务规则可以放在请求里,也可以放在独立的系统消息里,但模型必须在输入中获得完成任务所需的条件。

常见对话数据会进一步记录role和content。role说明谁在说话,例如user是用户、assistant是助手;content存放对应内容。多轮对话是按时间排列的消息列表,而不是把所有话混成一个无边界段落。另一种prompt、completion格式,则把上下文和要学的续写分成两栏。TRL数据格式说明

假如用户第二轮说“只改地点,时间不变”,训练样本就需要保留相关前文。只存最后一句和答案,模型看不到原时间,所谓正确标签便依赖一个缺失条件。数据清洗不仅是删除乱码,还要检查任务是否可答、上下文是否齐全、回答是否忠实,以及不确定时该怎样表达。

3.对话模板不是装饰,而是输入协议

模型最终接收的是token序列,不会直接读取一张“用户”“助手”的界面。chat template,也就是对话模板,把消息列表转成带有角色和边界标记的序列。可以先用人能读懂的示意表示:用户开始、请求、用户结束、助手开始、示范回答、助手结束。

真实模型可能用特殊控制token表示这些边界。不同模型即使来自同一种基础架构,也可能使用不同模板。套错模板,相当于把内容放进模型不熟悉的结构里;若重复添加结束标记,还可能造成错误停顿。模板必须和分词器、训练配置、使用时的输入方式一起检查。Transformers对话模板说明

训练时已经有完整示范回答;使用时通常只给出请求及合适的助手起始结构,让模型继续生成。不能把完整答案误放进测试输入,再把正确输出算成能力。也不能因训练数据保存成JSON,就认为模型天然学会了输出JSON:保存格式与要模仿的回答格式是两回事。

模板还没有决定所有训练细节。它主要规定文本怎样排队;哪些位置算损失,是下一层选择。把序列打印出来,逐段标出角色、正文、结束标记和计分范围,比仅凭“数据加载成功”更能发现问题。

4.回答mask决定哪些预测会被计分

设整条序列中,每个待预测的目标位置都有一个计分开关m。计分取1,忽略取0;目标token的预测概率记作p。一个常见目标可以写成:损失=所有位置的m×负对数p之和,除以计分位置的数量。

为什么选这个目标?我们希望示范回答在请求条件下更可能出现。整段回答的条件概率,是在各个标准前缀下预测下一token概率的乘积;取负对数,把乘积变成逐项相加的惩罚。除以计分token数,是本例的归一化方式。若对多条样本先各自平均,再平均样本,与把所有有效token合在一起平均,长短回答的权重会不同;要像第07章那样先声明分母。

这里的mask是损失掩码,可以理解成阅卷表上哪些格子要打分。只训练回答时,请求位置不直接计分,但请求仍作为条件参与计算,回答仍可以通过注意力读取它。训练信号也可以沿这条条件计算路径影响可训练参数。“不要求模型复述题目”不等于“把题目从模型眼前擦掉”。

另一个叫因果掩码的机制,则负责阻止当前位置偷看未来。二者不能混为一谈:因果掩码决定能读哪些位置,损失掩码决定哪些预测进入目标。常见实现用标签值−100表示忽略计分,但这只是程序约定,不是某个真正的词表token。

在多轮对话中,可以对多个助手回复计分,也可以把前文全当条件,只学最后一次回复。要根据任务选择,不能把“助手消息损失”和“最后一条回答损失”自动当成同义词。TRL的SFT文档分别提供assistant_only_loss与completion_only_loss,并说明其适用数据格式;助手掩码还依赖模板支持。TRL监督微调说明

5.用三个token亲手算一次

为避免把汉字误当真实分词结果,假设一个极简示范回答包含三个教学token,依次叫A、B、C;这里省略停止标记的计算。P代表请求和助手起始标记。模型预测A时看到P,预测B时看到P和标准A,预测C时看到P、标准A与标准B。

把P展开为两个仅为画图而设的token P₁、P₂,整条序列是P₁/P₂/A/B/C。用于这四次预测的输入是P₁/P₂/A/B,目标是P₂/A/B/C。只学回答时,四个目标的loss mask是0/1/1/1。注意A的损失对齐到输入P₂所在的输出位置,不能把“回答token在输入中出现的列”直接当作它自己的预测列。

13|SFT:怎样用示范把基础模型教成助手:图1

图1|把请求P为图示展开成P₁、P₂:输入与下一位目标错开,loss mask与目标对齐。P₂的预测不计分,A、B、C计分。两个P token是教学压缩表示,不是实际请求长度或真实分词。

这种使用标准回答前缀的办法叫teacher forcing。即使模型在预测A的位置最看好另一个词,训练B时通常仍给它标准A。整条示范可以一次送入网络,通过因果掩码并行算各位置;这不代表预测A时能偷看A、B、C。

假设三个标准token的概率分别为0.50、0.25、0.80,对应负对数损失约为0.6931、1.3863、0.2231。只对这三个位置求平均,得到0.7675。程序再用汇总损失反向传播,最后由优化器更新可训练参数。

三个概率连乘是0.10,表示这个简化三token序列在对应标准前缀条件下的概率。它不是通知事实正确率,也不是部署后有10%的请求能答对。若把三个目标概率都减半,平均损失增加约0.6931,达到1.4607。这可以用普通计算器复核,不需要运行模型。

再单独核对可见性:预测A的输出来自P₂位置,只能读P₁、P₂;预测B来自A位置,可以读到标准A;预测C来自B位置,可以读到标准A、B。于是“P₂本身不计分”与“P₂可以被回答读取”同时成立。损失掩码没有删除请求的计算路径,回答损失仍可沿依赖回到可训练参数。

13|SFT:怎样用示范把基础模型教成助手:图2

图2|同一四位置例,因果mask控制每行能读的输入列;loss mask另在目标行选择计分项。三个回答损失平均为0.7675,反向信号沿实际计算依赖回传;橙色反向箭头不表示去修改离散token。

使用时模型接到的却是自己已经生成的前缀。一次早期错误可能让后续进入训练里少见的状态。因此,还要让模型在留出请求上真正生成完整回答。标准前缀下的损失下降,并不能代替完整任务评测。

6.更多样本,不一定意味着更多覆盖

现在拿纸写五条通知:时间地点齐全;地点缺失;时间先写14点又更正为15点;一条包含两场会议;内容只讨论开会意向、尚无安排。先按统一规则写示范,再请另一人独立标注,检查分歧在哪里。

如果“地点缺失”一类全被标成A会议室,那么正确执行损失最小化,反而可能让模型更擅长无依据补全。假设九成训练记录都带这个地点,机械输出它可能看起来很有竞争力。这样的统计捷径不需要模型真正读懂每条通知。

还可以做一个对照:保持句式不变,只更换时间;保持时间不变,删除地点;把更正语句移到末尾。你是在检查究竟哪些变化应该改变答案,哪些变化不应该改变答案。十种改写若都来自同一原始通知,仍不能替代十种真正不同的业务条件。

这与软件测试中的契约和变形测试相通:删去地点,预期只把地点字段改为“未提供”,时间应保留;同义改写,预期语义结果不变;更正时间,预期时间更新而无关字段不变。此处验证的是任务关系,不能仅以JSON可解析代替字段忠实。对话模板管序列接口,loss mask管学习目标,任务评测管实际行为,三层应分别检查。

覆盖也不等于把每个类别强行放到相同比例。罕见但代价高的错误值得单独补充;常见输入仍需足够代表性。给样本分组记录来源和类型,才能知道增加一批数据是在补缺口,还是只是重复原来的容易题。

泛化的意思,是在没参与训练的新输入上继续按规则工作。为检验它,应让同一原始通知及其近似改写留在同一数据划分里;验证集用于选方案,测试集用于最后检查。若每看一次测试失败就回头改数据,这组题便逐渐变成了调参材料。

13|SFT:怎样用示范把基础模型教成助手:图3

图3|从“周五15点,A会议室”出发,删地点应只改变地点字段,改时间应只改变时间字段。同源改写整体留在同一数据分组;字段正确、无依据补全、格式与旧能力分别验收。

还有一项容易漏掉的检查是截断:长通知若被切掉更正时间,标签却仍保留更正后的答案,样本就变成了让模型猜不可见信息。若回答部分全被截掉,只对回答计分的设置甚至可能没有有效目标。应抽查实际送进训练的序列,不能只看原始文件。重复数据和自动生成的示范也要核对来源与事实,生成得快并不能降低标注责任。

7.FLAN与可检查的数据接口

2021年的FLAN研究把一个1370亿参数的预训练模型,放到超过60个用自然语言指令表达的任务上微调,并在未用于指令微调的任务类型上评估。这是“任务迁移”的一个公开案例:训练不必只围绕某一张固定题单,任务与表达方式的组合也能帮助模型适应新指令。FLAN原论文

这个结果支持在相应实验条件下研究跨任务泛化,不能推出几条示范就能创造任何新能力。基础模型已学到的表示、示范覆盖及目标任务难度仍会影响结果。FLAN也不是所有后来助手模型训练流程的统一名称。

把视线移到可检查的实际数据接口,Qwen官方LLaMA-Factory说明列出Alpaca与ShareGPT格式。前者包含instruction、可选input和output,后者用conversations记录说话者与内容。这些字段是样本如何被读入的约定,仍要经过正确映射与模板才能形成训练序列。Qwen数据准备说明

截至2026年10月6日核验的TRL在线文档,以Qwen3-0.6B-Base和指令对话数据展示SFT入口,并分别说明回答损失与适配器训练。读这种示例要分清基座、数据、模板、损失范围和参数更新方式。官方用某个模型演示接口,不能据此断言那个模型原始发布时采用了相同数据和配方。TRL指令微调示例

8.学会新习惯,也可能挤掉旧能力

同一组参数服务于很多任务。只在很窄的数据上持续更新,可能改善通知提取,却让其他能力退步。明显的旧能力损失常被称为灾难性遗忘;它不是每次微调都会发生,也不能只靠新任务分数发现。持续微调遗忘研究

控制学习率与训练时长、保留适当的通用数据、扩大可靠覆盖,都可以作为实验选项,但没有一种设置自动保证不遗忘。较少更新参数也不是免检证书:下一章的LoRA仍然会改变模型输出。

因此,训练前要留下原模型加提示词的基线,训练后同时比较字段正确率、无依据补全率、格式合规率与原有能力。如果格式从凌乱变整齐,内容却更爱编造,不能用一个合并总分把问题盖住。训练损失很低,也可能只是记住了答案或利用了模板捷径。

最后问值不值得:偶尔一次的要求,先改提示;频繁变化的资料,先提供当前证据;长期重复且已有可靠示范的行为,才适合认真比较SFT。SFT可以学习如何利用检索资料,但无法单凭训练保证每次自动获得最新信息。

本章练习

题目

问题1|对齐输入与两个mask

给序列P₁/P₂/A/B/C,只计回答A、B、C且省略停止标记,写出四项输入、目标、loss mask;预测B时可以读哪些输入?

问题2|计算回答目标

A、B、C在标准前缀下的概率为0.50、0.25、0.80,求整段概率与平均负对数损失。若都减半,平均损失增加多少?这是否等于任务成功率变化?

问题3|设计可解释的验收

原通知为“周五15点,A会议室”,删去地点时答案哪些字段应变、哪些应不变?同源的一百种改写如何划分?标准A后预测B很准,还应补什么评测?

思考提示

提示1|对应问题1

每个输出预测下一项,loss mask对齐目标;因果mask看输出来自哪一行。

提示2|对应问题2

先乘后取负对数,或逐项取负对数再求和;平均分母是3。

提示3|对应问题3

分别控制输入变化、隔离来源与前缀来源;每种检查回答不同问题。

参考答案与解析

答案1|对应问题1

输入为P₁/P₂/A/B,目标为P₂/A/B/C,loss mask为0/1/1/1。预测B的输出在A所在行,可读P₁、P₂、A,不能读未来的B。请求目标不计分仍可作为条件,且条件计算路径仍可能影响可训练参数梯度。

答案2|对应问题2

整段概率0.50×0.25×0.80=0.10;平均损失为(0.693147+1.386294+0.223144)÷3=0.767528…,约0.7675。概率均减半时每项损失增加ln2≈0.6931,平均也增加同样数值到1.460676…,约1.4607。这些是标准序列的条件概率与训练损失,不是事实正确率或任务成功率。

答案3|对应问题3

地点应从“A会议室”改为“未提供”,时间“周五15点”应保持不变。同源的一百种改写应作为同一组,避免跨入训练与测试;还要留出不同来源和条件。标准前缀下预测B准确,不能覆盖先生成错A的情况,应在留出请求上生成完整回答,并分别核对字段、无依据补全、格式与旧能力。

下一章

示范已经变成了明确的目标,但更新全部大矩阵会保存大量梯度与优化器状态。下一章沿同一条会议通知追问:能否固定原矩阵,只训练一条较小的支路,把所需改变送进模型?