1. 先说结论:SFT和RL解决的根本不是同一个问题
很多做应用层的程序员朋友,一听到"训练大模型"这个词,第一反应就是"拿一批数据继续 train 一把"。这个直觉没有错,但它会让人在接触 SFT 和 RL 的时候产生混乱——这两个阶段的训练,从目标、数据、优化方式到失败模式,几乎完全不同。把结论摆在前头:SFT(Supervised Fine-Tuning,监督微调)解决的是"模型会不会懂人话"的问题,RL/RLHF(Reinforcement Learning / Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)解决的是"模型愿不愿意好好干活"的问题。
这两个问题经常被笼统地塞进"微调"这个筐里,但实际操作起来,它们的工程链路和踩坑点几乎没有交集。更微妙的是 DPO(Direct Preference Optimization,直接偏好优化)——它经常被当作 RLHF 的轻量替代品,但它的定位远比"平替"两个字复杂。DPO 修改了 RLHF 的目标函数形式,避开了训练奖励模型和在线采样两条最重的链路,却在"偏好对齐"这件事上保留了 RL 的核心思想。如果你在做大模型相关项目,不理解这三者之间的本质关系,就很容易出现"数据也标了、loss 也降了、模型还是不听话"的尴尬局面。
这篇文章我会从 SFT 的实际作用讲起,再拆解 RLHF 那条复杂链路为什么非重不可,然后回到 DPO 的数学直觉和工程定位,最后给出几个不同业务场景下的选型判断。全文不堆公式,但该讲清楚原理的地方不会绕过去,希望给正在入门大模型训练、或者正在纠结该走哪条对齐路线的开发者一个完整的地图。
2. SFT到底教会了模型什么:从预训练到"懂人话"的那一步
2.1 预训练模型缺的不是知识,而是"指令格式"
要理解 SFT,先得想明白预训练模型到底有什么、缺什么。预训练阶段,模型在海量文本上做"下一词预测",它学到的是语言本身的统计规律——词怎么搭配、知识点怎么组织、长文本内部的逻辑怎么铺陈。这个阶段结束后,模型已经"知道"大量知识,但它并不知道你希望它"以什么形式"把这些知识吐出来。
举个例子:你问预训练模型"北京是中国的首都吗",它完全有可能给你回一句"北京是中国的首都,也是中国的政治中心、文化中心、国际交往中心……"然后再接一句原本网页上可能出现的"如果你对该地区感兴趣,可以参考以下链接"。这不是因为它跟你作对,而是它从训练数据里学到的模式就是"顺着语料继续往下接"。SFT 存在的意义,就是让模型从"接话"切换到"答题"的格式。
具体做法很朴素:准备一批高质量的"指令-标准答案"对,在模型上做普通的自回归训练,loss 是标准的交叉熵,只计算答案部分的 token 损失。因为是监督学习,标签就是标注者给的答案;因为只微调很少的轮数,模型不会忘记预训练阶段学到的广谱知识。
2.2 SFT 的能力边界:它只能"学会被展示的行为"
SFT 有一个非常容易被忽略的局限性:它只能让模型模仿标注数据里出现过的行为,并不能超越数据本身的水平。如果你的标注数据里只有"简洁一句话回答"的例子,模型就不会主动展开详细推理;如果标注答案里存在错误,模型也会把错误当成标准学到。
这个特点决定了 SFT 的核心地位:它是模型从"基础能力"走向"应用形态"的必经桥梁。即便你后续要做 RLHF 或 DPO,SFT 也是不可跳过的前置步骤——因为强化学习需要一个"会回答但是还不够好"的起点。RL 拿起一个完全不会跟人对答的模型,是没办法通过奖励把它"逼"成对话助手的;它只能优化一个已经具备基本对话能力的策略。
由于 SFT 的数据成本相对可控(通常几千到几万条就够了),目前绝大多数开源模型走的就是"预训练 + SFT + 偏好对齐"三步曲。SFT 阶段质量好不好,直接决定后续对齐的上限——这一点我在后面选型部分还会强调。
3. RL那套复杂链路:为什么奖励模型、在线采样和PPO一个都跑不掉
3.1 人类反馈的矛盾:给偏好打分比给质量打分容易得多
真正让 RLHF 变得复杂的,不是强化学习算法本身,而是"人类反馈"的形态。你试着让标注人员给一段回答打一个 8.7 分,会发现极其不稳定:不同人之间评分尺度不一样,同一个人不同时间也会飘,而且高分和低分之间的"质量差"很难说清楚。但如果让标注人员对比两个回答哪个更好,工作就变得稳定很多——偏好判断是相对判断,天然比绝对值判断更符合人的认知习惯。
基于这个原因,RLHF 里先要训练一个奖励模型(Reward Model,RM),专门用来给回答输出一个标量分数。RM 的输入是"指令 + 回答",输出是一维标量;训练数据是人类对同一指令下两组回答的偏好排序,通常用 Bradley-Terry 模型建模 pair 之间的胜负概率。RM 训练好以后,它就变成人类偏好的"代理裁判",可以给任意新生成内容打分,而不需要再找真人逐条标注。
3.2 为什么必须在采样中更新策略:不在线就找不到"好"的边界
PPO(Proximal Policy Optimization,近端策略优化)是 RLHF 中最常用的策略优化算法。它做的事可以这样理解:策略模型每更新一步,就按当前的最新分布再去生成一批回答,让 RM 打分,根据分数计算优势,再反过来指导模型该往哪个方向挪。整个过程是"生成 → 打分 → 更新 → 再生成"的闭环。
这个闭环的存在,是因为一个核心逻辑:策略变了,模型的生成分布就变了,离线数据的代表性就过期了。如果用旧分布上收集的回答来评估新策略,评估结果会失真。在线采样保证了模型始终在"当前自己最可能产出什么"的分布上接受反馈,从而发现那些人类标注数据里根本不存在的边界行为。
在线采样的代价是训练流水线大幅变重:推理、RM 打分、策略更新要串成一条实时链路,还要处理 KL 散度约束(防止模型跑飞),以及一大堆 PPO 特有的超参数——clip 范围、优势归一化、batch 大小、rollout 数量,每一个都足够让人调一整天。这就是为什么很多中小团队在考虑 RLHF 时会打退堂鼓。
3.3 Reward Hacking:模型会"欺骗"代理裁判
重链路之外,RLHF 还自带一个有趣的陷阱:奖励模型是代理裁判,不是真正的用户,而模型是优化代理裁判分数的专家。只要 RM 有任何一个容易钻的空子——比如偏好某个固定句式、偏好更长文本、偏好特定关键词——PPO 就会让模型无限放大这个空子,直到生成一个让 RM 打了高分、但真人看一眼就想关闭的回答。
这种现象叫 reward hacking。它本质上是"优化目标与真实目标不一致"的必然结果。对付它也没有完美方案,工业界通常的做法是:在 PPO 更新目标中加入对参考模型的 KL 惩罚,让模型不能距离 SFT 初始模型太远;同时对 RM 预留验证集,定期用人类标注校准 RM 是否仍在正常工作。但坦率讲,只要还用"标量打分"这个压缩信号,reward hacking 就只能被压制,不能被根除。
4. 本质区别拆解:目标函数、数据来源与失败模式的全面对比
4.1 目标函数的天壤之别:最大似然与期望奖励
SFT 和 RL 的本质区别,追到底层就是目标函数的不同。
SFT 的目标是最大化标准答案的似然概率,公式语义可以简化成"让模型在给定指令时,把标注答案的概率抬得越高越好"。这是一个典型的最大似然估计问题,梯度方向完全由标注数据决定,不存在探索的余地。
RLHF 的目标是最大化期望奖励,语义是"让模型在分布中生成那些能够拿到高分的内容"。它在数学上是一个期望项,需要通过采样来估计——这就解释了为什么 RLHF 一定有随机采样环节:因为期望值没有解析解,只能用经验均值近似。
这两种目标的差别,类似于"照着字帖临摹"和"在没有人告诉你标准答案的情况下,为了拿高分自己摸索写法"之间的差别。前者有拐杖,后者得靠试错。
4.2 数据来源和优化路径的连锁反应
因为目标函数不同,SFT 和 RL 的数据来源也完全不同。SFT 用的是静态标注数据,一批数据可以反复来回训练,没有问题;RL 用的是策略自身的在线采样结果,数据分布跟策略参数同步演化,导致训练流程中每一步都要重新生成答案。
这个连锁反应的工程后果非常明显:
| 维度 | SFT | RL / RLHF |
|---|---|---|
| 目标 | 最大化标准答案的条件概率 | 最大化期望奖励 |
| 数据来源 | 静态人工标注 | 策略在线采样 + RM 打分 |
| 反馈信号 | 标签(标准答案) | 标量分数(代理偏好) |
| 优化方式 | 一步交叉熵梯度下降 | 多步采样、估算优势、策略更新 |
| 核心风险 | 过拟合标注噪声 | 奖励欺骗、训练不稳定 |
| 成本瓶颈 | 标注质量 | 采样 + 推理 + 调参 |
| 结果特性 | 稳定收敛、可预期 | 能超越数据上限,也容易跑飞 |
这张表基本上可以当做一个快速判断标准:如果你的任务里"好坏"很难定义、但"哪个更好"有人能判断,那就该考虑 RL 链路;如果任务的标准答案是清晰的,那 SFT 就足够了。
4.3 失败模式完全不同:学死和学坏
SFT 常见的失败是过拟合标注数据——数据里有一些表述不太好的回答,模型会一字不差地模仿出来;数据分布太窄,模型会显得很"僵",换个问法就不会绕弯。这种失败是"学死了"。
RL 常见的失败是 reward hacking 和训练崩溃——模型的奖励分数一直在涨,但人类评估质量不升反降;或者某次更新步长太大,模型生成语言退化成一坨重复文本。这种失败是"学坏了"。
理解这两类失败模式,对判断问题出在哪个环节非常有帮助。我见过不少团队在模型输出"答非所问"的时候,第一反应是想上 RLHF,但实际上问题出在 SFT 数据质量上——连基本的指令跟随都没学会,强化学习只会把这个基础问题放大。
5. DPO的定位:如何用一条loss端掉奖励模型和PPO两条链路
5.1 DPO 的核心观察:把偏好逻辑直接翻译成策略更新
DPO 之所以在近两年火得很快,是因为它对 RLHF 做了一个非常简练的数学操作:不再单独训练一个奖励模型,也不再做在线采样,而是利用 Bradley-Terry 偏好模型的结构,把奖励差直接表示成当前策略与参考策略的对数概率比,从而把"让模型学会偏好"这件事,变成一条可以直接对静态数据求梯度的 loss。
用大白话描述 DPO 的思路:如果模型对于一个"更好的回答"的生成概率,比一个"较差的回答"的生成概率提升得更多,那么这个模型就是在"对齐人类偏好"。更精确地说,DPO 约束的是两个回答之间的概率差——优选回答的概率要相对提高,劣选回答的概率要相对降低,同时通过参考模型约束,让模型不要偏离 SFT 版本太远。
这个逻辑的好处立竿见影:不需要训练 RM,不需要设置 rollout buffer,不需要维护一条在线生成和打分链路。训练形态回到了 SFT 的样子:把"指令-优选-劣选"三元组喂进去,前向传播算 loss,反向传播更新参数。数据是静态的,可以 shuffle,可以多 epoch 训练,工程实现稳定得多。
5.2 DPO 为什么绕得开"在线探索":因为它改了目标形式
很多人会问:DPO 没有在线探索,它是不是丢掉 RL 最核心的部分?这个问题的答案藏在 DPO 的数学构造里。
RLHF 之所以需要在线探索,是因为"期望奖励"这个目标表达式里,策略分布和奖励函数耦合在一起,策略一变,期望就要重新采样估计。DPO 的巧妙之处在于,它通过等价格式把目标改写成了"策略与参考策略的比值",所有训练信号都已经编码在偏好 pair 里。这个目标函数下,数据虽然是静态的,但梯度的方向和 RLHF 近似最优解的方向程一致——只要偏好数据对包含了足够多的信息,模型就能在收敛后达到类似 RLHF 的效果。
这句话需要补充一个重要的限定条件:DPO 的等价性依赖于偏好数据覆盖度足够好,且假设策略的生成分布变化不会太大。如果任务要求模型通过"探索"发现新的解题路径——比如代码生成里自己找到新的解法,或者问答中想出标注数据里不存在的思路——DPO 就力不从心了。因为探索的本质是需要在采样中发现奖励模型会给出高分的"新鲜行为",这部分信号不会从离线静态 pair 里自发产生。
5.3 从对齐效果看 DPO 的边界:拿什么场景来测试最有说服力
从近两年各种第三方测评和社区反馈来看,DPO 在"风格对齐"上表现非常突出。比如让模型学会"回答问题更简洁""更礼貌""更不容易输出有害内容"这类偏好,DPO 效果通常不逊于甚至优于完整的 RLHF 链路。这类偏好的特点是:人类偏好高度一致、差异能被 pair 数据充分刻画、不需要模型做长程规划和探索。
但在需要模型自我纠错、多步推理或者搜索的任务上,DPO 的短板就暴露了。因为它只比较"给定两个答案哪个更好",并更新策略去青睐好答案,而完全没有"尝试新答案、获得反馈、再调整"的机制。这种场景下,在线 RLHF 仍然不可替代。
这也解释了 DPO 在工程体系中的真实定位:它不是 RLHF 的全面替代品,而是"离线偏好对齐"组件。对大多数产品场景的对话风格、安全约束、语气调校来说,它是性价比非常高的选择;对推理、规划类任务,它属于辅助角色。
6. 工程选型经验:什么场景用SFT、DPO,什么场景还是得上RLHF
6.1 先看你手头数据长什么样
我的选型思路一般从数据形态出发,而不是从算法名气出发。把场景简单分一下:
- 有清晰标准答案(信息抽取、改写、翻译、分类),数据集是"指令-标准回答"形态:直接用 SFT。这类任务不需要偏好对齐,SFT 就能做到稳定且效果可控。
- 有大量"哪个回答更好"的偏好标注,但没有人能给出完美回答:走 DPO。这是 DPO 的主战场,尤其适合对话语气、安全规范、创作风格的微调。
- 任务需要探索、多步推理、模型要从自身生成序列中获得长程反馈:老实上 RLHF。例如代码生成、数学解题、Agent 任务规划,这类场景的奖励信号往往不是某个 human preference 能简单定义的。
判断标准很简单:你手上的反馈信号,是"正确答案"还是"相对偏好"?
但这还不是全部。即便同样是偏好数据,还有一个实际问题:pair 质量。DPO 对 pair 数据中的噪声非常敏感——如果优选和劣选之间的差异不够明显,或者配对标准本身就是错的,DPO 会把噪声当成真实偏好学进去,轻则没效果,重则让模型退化。我在实际操作中见过不少人拿用户点赞数做粗略偏好,效果波动极大,后来改成用规则过滤 + 人工抽检的小规模高质量 pair,稳定性才上来。
6.2 完整的对齐链路设计:SLM到SFT到偏好对齐
如果你的目标是做一个对话助手类的模型,一个比较稳妥的链路是这样的:
- 预训练基座模型(或直接使用开源基座)。
- 用几千到几万条高质量指令做 SFT,先把指令跟随能力提上来。这个环节质量优先级高于数量,我宁愿用 5000 条精标数据,也不用 5 万条混杂数据。
- 在 SFT 模型上做偏好数据采样,生成"候选回答",人工对比排序,构造偏好 pair。
- 用 DPO 做一轮或多轮偏好优化,超参数重点关注 β(控制对参考模型的偏离程度)和学习率。
- 如果任务属于复杂推理类,且已经能访问在线推理资源,再考虑上 PPO/RLHF,而不是一上来就绕开 DPO。
很多团队的问题是跳过第 3 步直接上 DPO,pair 数据质量堪忧,最后效果还不如 SFT。DPO 不是银弹,它的效果上限取决于偏好数据是否真实刻画了你的目标人群的需求。
6.3 一个容易被忽视的陷阱:新模型 vs 历史模型,选哪个做参考模型
DPO 的 loss 里有一个参考模型,用来约束策略模型不要偏离太远。这个参考模型通常直接用 SFT 阶段的模型冻结得到,这点绝大多数教程都会说。但工程上有个实际坑:当你的模型已经跑过了一轮 DPO,然后拿到了新一批偏好数据,想做第二轮 DPO 时,参考模型应该选哪个?
答案取决于你想要的语义。如果参考模型继续用最初的 SFT 模型,那么第二轮 DPO 会允许模型在第一轮 DPO 后的基础上继续漂移,偏离 SFT 的距离会累积;如果参考模型用上一轮 DPO 产出的模型,则约束会更强,模型不会连续两轮大幅偏离原始 SFT 起点。实践上,我希望模型保持更大的灵活度时用前者,希望模型稳定不跑飞时用后者。这两种选择没有绝对对错,但选错了会直接影响训练稳定性和最终效果。类似这样的细节,只有上手跑过几轮 DPO 才会真正有感知。
最后一个建议:别把这三者的关系简单看成"替代"
SFT、RLHF、DPO 之间的关系,不是简单的新旧替代,而是各管一段的分工。SFT 负责让模型具有合格的表达能力,RLHF 负责让模型在复杂的未知场景中通过探索逼近理想行为,DPO 负责在无需在线反馈的场景里高效完成偏好对齐。
我在实际项目中形成的一个体会是:对齐不是"一次性做完"的工作,而是一个持续迭代的过程。模型上线后会暴露新的偏好短板,产品方向调整也会带来新的对齐需求。与其纠结哪一种方法最好,不如把 SFT、DPO、RLHF 当成一个工具箱,按阶段和数据条件灵活切换。
如果你正准备给某个本地模型做一轮偏好优化,我的建议很简单:先把手头的偏好数据整理干净,再做一轮 SFT 把基础能力夯实,然后跑一版 DPO 观察风格变化。如果遇到"模型变油滑了"或者"风格矫枉过正"的情况,再回头调整 β 和学习率。等你真的跑完这一轮,对"为什么 DPO 可以替代一部分 RLHF、又不能替代全部 RLHF"的体感,会比看任何文章都深刻。