[控场AI]
· 9 分钟阅读· 4,796 字

SFT到底在训什么?拆解监督微调的核心逻辑

SFT到底在训什么?拆解监督微调的核心逻辑

SFT 本质是行为克隆,用示范数据对概率分布重新加权,教会模型指令协议而非新知识。

本文拆解了监督微调(SFT)的本质:它是在预训练模型上做行为克隆,通过大量"指令-理想回答"数据对,在概率分布上做大规模重新加权,让模型学会指令协议和助手风格,而非灌输新知识。训练损失与预训练一致,但只对回答部分计算损失,避免模型学会自问自答。SFT 的真正价值在于把提示工程成本从每个用户转移到一次性训练,并形成稳定的助手风格。其局限也很明显:专家数据昂贵、单一标准答案会绑定标注者偏好、只有正样本无法表达"A 比 B 好"的比较关系。数据质量比数量更重要,幻觉行为会被模型当作榜样学走。在流水线中,预训练装脑子、SFT 装嘴巴、RLHF 装分寸。

SFT(监督微调)是让预训练模型学会“好好说话”的关键一步,但它究竟在训练什么?本文基于B站技术分享,拆解SFT的定义、训练目标与设计逻辑,并直面其固有局限。

SFT是什么:给模型看正确答案的行为克隆

SFT,全称监督微调,研究人员会准备大量“指令-理想回答”的数据对。例如指令是“请用小学生能听懂的方式解释光合作用”,理想回答会避开“叶绿体”这类教科书术语,而是用“阳光是能量”的类比,同时覆盖原料(光、水、二氧化碳)和产物(养分、氧气),长度克制、没有多余开头。

一条好的SFT数据同时教好几件事:怎么理解约束、怎么组织语言、怎么控制长度、不胡说。本质上,SFT是行为克隆——不给模型讲道理,而是给它看几万条正确答案,让它自己悟。就像教小朋友用筷子,你不会讲杠杆原理,而是示范如何使用。

对应的数据形式是(X, Y)对:X是指令,Y是参考答案。训练目标就是看到指令X后,提高生成参考答案Y的概率。

训练目标:和预训练一样的损失函数,不同的数据

SFT的损失函数与预训练几乎一模一样:对Y的每一个token,给定指令和已生成部分,计算正确token的概率,取负对数求和。变的不是原理,而是数据。

实际训练时通常只对回答部分计算损失,指令部分的token会被遮挡掉。为什么?因为我们要它学会“怎么答”,不要它学会“怎么编题”。如果指令也算损失,模型会顺手把提问这个技能也练习了,然后你可能会遇到它自问自答,把问题复述一遍又续写新问题。

语言模型预测下一个token的基本原理没有动,优化器没换、架构没换、前向传播也没动,训练数据换成了更明确的结构:用户提出任务,助手执行任务。于是同一台续写机器反复练习一种新的pattern。

这里特别想强调:SFT不是往模型里装了一个聊天模块,它是在概率分布上做了一次大规模的重新加权。原来“蜗牛”后面接“选”的概率是0.3,接“答案”是0.1;SFT之后接“答案”变成0.9,别的路径还占,只是概率被压下去了。

做了一次大规模的重新加权

负对数似然(NLL)损失是这里的关键数学工具。给定模型对下一个 token 的预测概率分布 $p_\theta$,对参考答案中的每个 token $y_t$,损失为 $-\log p_\theta(y_t \mid X, y_{<t})$,即正确 token 概率的对数取负。概率越接近 1,损失越接近 0;模型越"意外",惩罚越大。把所有 token 的损失求和或平均,就得到整条回答的损失。这也是交叉熵损失在语言建模中的具体形式——最小化 NLL 等价于最大化模型对参考答案的似然,即让模型在参数空间中移动,使这些参考答案出现的概率变大。理解这一点,就能明白 SFT 为什么是"重新加权"而非"写入模块":它只是把梯度指向提高特定序列概率的方向。

为什么这样设计:教会模型指令协议与动词词典

预训练模型看到的是各种各样的文本,没有统一规矩。SFT用统一的数据结构告诉模型:这一段是用户的要求,接下来这一段是助手应该给出的回答。更重要的是,它顺便教会了模型一套“动词的词典”——总结意味着压缩信息,翻译意味着保持含义更换语言,解释意味着提供清楚说明,只输出JSON意味着专属格式,分三点回答意味着控制结构,不超过100字意味着控制长度,继续修改意味着参考前面的对话。

Base Model当然认识“总结”这两个字,它在语料里见过几百万次。但它理解的是“总结”这个词的语义和上下文分布,而不是“现在有人对我说总结时,我应该执行一个压缩操作”。这个差别有点像:一个外国人背过菜单上的所有菜名,跟他能听懂服务员问“要不要加辣”并做出反应,是两回事。SFT教的不是词汇,而是语言在互动中的使用规则。

一个真实的观测是:输出JSON这类格式指令的遵循能力,几乎完全靠SFT阶段的数据堆出来——数据里有多少种格式,模型就大概能稳定输出多少种格式。Base Model已经会翻译、总结、写代码、提取信息、改写文字,但只有用户精心设计提示时才能稳定调用。SFT把复杂模板加多个事例压缩成一句自然语言指令。研究表明,在多个由自然语言指令描述的任务上微调,可以明显改善模型在未见任务上的零样本表现——模型学会的不是这些任务,而是“听指令”这项元技能。当然效果与模型规模、数据组成有关,某些论文指出指令微调对小模型可能是有害的:模型容量本就紧张,再让它花参数学习指令格式这套“礼仪”,就没地方装本事了,相当于让刚入门的实习生背三天公司行为规范,专业能力可能退步。

它的专业能力可能会退步

从产品角度讲,SFT的真正意义是把提示工程的成本从每一个用户身上转移到一次训练里。以前每个用户自己摸索提示词,现在是厂商一次性教好模型。这也是ChatGPT能够成功的关键——普通人不会写提示词,也不应该被要求会写。

SFT还能形成稳定的助手风格:先回答问题再补充解释、不随意续写用户的话、使用清晰的小标题、避免无关内容、根据用户水平调整表达、在缺少信息时提出说明、按照多轮上下文继续交流。这些东西能写进损失函数吗?不能——“清晰”没有梯度,“不啰嗦”也没有解析式。只能靠示范:你写三万条清晰的回答,模型就可以把“清晰”这个风格的统计特征吃进去。

**零样本泛化(zero-shot generalization)**指模型在没有见过某个具体任务训练样本的情况下,仅凭自然语言指令就能完成该任务。这与传统监督学习不同:传统方法为每个任务单独训练分类器,换任务就要重新标注和训练;而指令微调让模型在"指令-回答"格式上训练后,面对全新任务描述时也能调用已有能力。FLAN、T0 等工作系统验证了这一点——在大量自然语言指令任务上微调后,模型在未见任务上的零样本表现显著提升。其机制正是文章所说的"元技能":模型学到的不是具体任务映射,而是"看到指令就执行对应操作"这一通用行为模式。这也解释了为什么指令数据的任务多样性比单一任务的样本量更重要。

SFT的代价:贵、模糊、无偏好

问题一:贵。 简单任务普通标注人员就能写,但医学、法律、数学和复杂辩证问题往往需要专家。解释心电图异常得请医生,分析合同条款风险得请律师。从零编写一份高质量答案耗时很长,一道有点难度的数学题,专家写出完整步骤清晰的解答估计要半小时以上。三万条专家数据,平均每条二十分钟,按专家时薪算是一笔不小的费用——这就是全行业都在找替代方案的原因。

问题二:局限案。 一个问题可能有很多正确答案。“帮我写一份礼貌的请假邮件”没有唯一标准答案,可以正式可以亲切,可以三行可以三段。SFT通常只能提供一种或少数几种写法。当一个问题有五种同样好的答案,你只给模型看了第二种,这时你是在告诉模型第二种是对的、另外四种不是——本意是给样本,效果却是给了模型一个偏好。模型的风格会因为少数标注人员的口味而悄悄绑定。

你只给模型看了第二种

问题三:擅长模仿,不擅长表达细微偏好。 答案A内容完整但非常啰嗦,答案B简洁清楚但省略了一些细节,哪个好?你可能已经开始犹豫——你的犹豫证实了问题所在:这是一个权衡,没有对错。只给一个标准答案,模型难以理解简洁和完整性之间应该怎么权衡。SFT的损失函数只会说“照这个模板抄”,它不会理解“这个比那个好一点点”。SFT只有正样本没有负样本、没有排序,它把概率往一个点上推,但人类偏好本质上是一种比较关系——A比B好是一个排序结构,你没有办法用“抄这个”的语法表达“这个比那个好”。

数据来源与质量关卡

SFT数据来源大约有六条路:人类专家编写、普通标注人员按规范编写、从已有文本数据中整理、由更强的模型生成再筛选、对真实用户问题进行脱敏整理、将任务数据转换成自然语言指令。

人类专家编写最贵——当年OpenAI雇了几十人的标注团队,还专门筛选标注员。由更强模型生成是2023年之后的主流,行业叫“蒸馏”:砸几百条种子指令让强模型扩写成几万条,成本从几十万美元砍到几百美元,但有三个坑:误差继承(老师错了学生跟着错,而且错得更自信)、风格趋同(整个开源生态越来越像同一个人)、合规风险(很多商业模型明确禁止用其输出训练竞品模型)。

而且错得更自信

把任务数据转换成自然语言指令这条最省钱也最优雅:学术界几十年积累的标注数据集,比如情感分类、命名实体识别,本来是给小模型用的,现在加一个模板立刻变成SFT数据。

一条高质量SFT数据要过这些关:是否真正回答了用户问题、是否遵守格式、是否清晰易懂、是否包含虚构内容、是否过于啰嗦、是否符合安全要求、是否与目标用户群体匹配。这里有一个反直觉的事实:SFT数据里的幻觉会被模型当作榜样学走。如果标注员写答案时懒得查资料,随手编写一个参考文献,模型学到的不是那个具体的假文献,而是在这个位置自信地编一个看起来很像的东西——你教的是一种行为模式,不是事实。这就是严肃团队的SFT数据要过事实核查、成本也更高的原因。SFT的效果在很大程度上取决于数据质量而不是数据数量。

**知识蒸馏(knowledge distillation)**原本指让小模型模仿大模型的输出分布来压缩模型,但在 SFT 语境下,"蒸馏"常被泛化为用强模型生成训练数据来教弱模型(或同规模模型)。两者的关键区别在于:经典蒸馏传递的是软标签(概率分布),而 SFT 蒸馏传递的是硬样本(生成的文本)。因此它继承了教师模型的错误和风格,却无法传递教师的不确定性。这也是"误差继承"和"风格趋同"的根源——学生只看到教师"自信地说出"的答案,看不到教师内部"犹豫"的部分。商业模型的使用条款通常禁止此类蒸馏,因为生成数据本身被视为模型能力的延伸。

在流水线中的位置

把整条流水线串一遍:预训练让模型学习语言知识和大量文本模式,消耗了绝大部分算力,得到Base Model——一个饱含知识但不通人情世故的高手。SFT在算力上相比预训练可以忽略不计,但模型的性格却发生了天翻地覆的变化,它学会了直接回答、遵守格式和执行任务,得到初步的Chat Model——一个基本会说话的实习生,还不是靠谱的资深员工。

一个通俗的比喻:预训练给模型装脑子,SFT给模型装嘴巴,RLHF给模型装分寸。SFT表达不了以下事件:两个答案谁更好、正确性和简洁性如何权衡、用户偏好什么风格、哪些行为虽然常见但不应该生成。这引出了下一步:RLHF如何利用人类偏好,让模型学会在多个答案中选出更好的那一个。

RLHF(基于人类反馈的强化学习)是 SFT 之后的对齐阶段,典型流程分三步:先收集人类对同一提示下多个回答的偏好排序,训练一个奖励模型来预测"哪个回答更好";再用强化学习(如 PPO)优化语言模型,使其生成的回答获得更高奖励,同时用 KL 散度约束防止模型偏离 SFT 后的分布太远。与 SFT 只给正样本不同,RLHF 的核心输入是比较关系——A 优于 B——这恰好弥补了 SFT 无法表达"这个比那个好"的缺陷。代价是流程更复杂、训练更不稳定,且奖励模型本身可能被"钻空子"(reward hacking)。后来的 DPO 等方法试图绕过显式强化学习,直接在偏好数据上优化,但基本思想仍是用排序信号替代单一示范。

#SFT#监督微调#指令微调#行为克隆#大模型后训练#RLHF#预训练模型
分享:

相关推荐