前言
在前面几期我们介绍了多种强化学习算法,其中我们介绍了 RLHF 框架,这一期的内容我们主要分享的是 DPO 框架,其实更可以称之为优化算法;不同于 RLHF 框架中采用奖励模型 + 策略优化的方式,DPO 直接省去这个过程,直接用 chosen / rejected 更新 Policy;下面我们详细的描述这个方法的来龙去脉;没有阅读之前内容的,可以直接点击下面的链接进行阅读:
用 GRPO 让 Qwen 学会自我评判——强化学习后训练入门-CSDN博客
从 GRPO 到 GSPO:Qwen 序列级强化学习后训练原理拆解-CSDN博客
大模型强化学习对齐:从 RLHF 框架到 PPO 算法原理-CSDN博客
DPO 算法
DPO 算法的全程是:Direct Preference Optimization,中文是:直接偏好优化
DPO 算法的输入数据流并不是类似传统 SFT 这种采用”提示词+标准回答“的形式,而是通过”提示词+chosen+rejected“这样的形式;为什么要这样?这个有关于 DPO 的设计思路:既然人类已经告诉我“回答 A 比回答 B 好”,为什么还要先训练奖励模型,再用优化策略做一遍强化学习?能不能直接学这个偏好?也就是说在这个优化算法的角度思考,我们要做到的是让 chosen response 的回答概率变大,让 rejected response 的概率变小;
算法区别
有了前面的介绍,我们可以先大概了解算法之间的区别;相对于 RLHF 框架,DPO 算法直接省去奖励模型和优化策略,直接用提前准备好的高质量偏好数据直接更新 Policy;那么有小伙伴可能会问:那这个和 SFT 微调有什么区别呢?在过去很多期文章中,我们对 SFT 可以理解为让模型学习模仿答案,而 DPO 算法学习的不只是 Chosen 好,而且 Chosen 应该比 Rejected 更值得生成;在这样的过程中,实际上就已经有一个优化的抉择;
算法流程
DPO 算法和 RLHF 类似,都是需要先做一遍 SFT,训练出一个微调模型,并且保存旧模型,也就是 Reference Model;原因很简单:DPO 不希望为了 Chosen / Rejected 数据,把模型彻底训歪;因此用一个旧模型做约束,防止模型越练越偏;
DPO 比较些什么?
假设 Chosen:
,Rejected:
,那么当前模型想要的是:

也就是说要让当前模型更喜欢 Chosen,但是 DPO 还在这个基础上多做一件事:不光比较当前模型的 Chosen / Rejected,还比较它们相对于 Reference Model 改变了多少?
DPO 损失函数
假设你有看过前面几期或有强化学习的算法基础,那么我们可以直接上 DPO 损失函数公式:
![L_{DPO} = -\\mathbb{E}\\left[\\log \\sigma\\left(\\beta\\left[\\log \\frac{\\pi_\\theta(y_w|x)}{\\pi_{ref}(y_w|x)} - \\log \\frac{\\pi_\\theta(y_l|x)}{\\pi_{ref}(y_l|x)}\\right]\\right)\\right]](https://www.171host.com/wp-content/uploads/2026/09/20260909212324-6aa1ce4c44190.png)
对数的内容可以理解为,训练后的模型,相对于原模型在某种偏好改变了多少?我们主要看看相减的过程,可以理解为:当前模型相比 Reference,是不是更加偏向 Chosen、更加远离 Rejected?也就是说我们希望两者的差值越大越好;再外一层的 sigmoid 函数,做的内容是输出概率值,最后做的是负对数似然;
DPO 详细区别
上面的介绍基本上把核心流程介绍完成,但是我们仔细想一想 DPO 算法真的是太夸张了,感觉啥都没有!下面我们看看它究竟到底没有啥
没有显式的奖励模型,对于经典的 RLHF 算法,是有一个确定的奖励模型输出得分,但是 DPO 是没有独立的奖励模型,但是理论上,它实际上蕴含了一个 implicit reward(隐式 Reward),这个过程可以从数学的角度上理解证明,下面是对其的数学分析:
从经典的 KL 正则化 RLHF 目标开始:
![\\max_{\\pi}\\ \\mathbb{E}_{y\\sim\\pi(y|x)}\\big[r(x,y)\\big] - \\beta D_{KL}\\big(\\pi(\\cdot|x)\\,\\|\\,\\pi_{\\mathrm{ref}}(\\cdot|x)\\big)](https://www.171host.com/wp-content/uploads/2026/09/20260909212324-6aa1ce4c627cf.png)
它的最优策略可以推出来:

把这个式子反过来解:

这里已经出现关键结论了:

也就是说:Reward 可以用当前策略相对于 Reference Model 对这个回答增加了多少偏好来表示
其实 DPO 算法在训练时不知道真正的优化模型,于是拿当前正在训练的模型去逼近它,因此可以定义隐式 Reward:

没有在线 Rollout,在之前学习 GRPO 的时候,我们知道模型会输出多组回答并打分,在训练中不断生成新的回答,也被称为:Online RL;在 DPO 算法中,已经在数据准备阶段就完成了,训练的时候直接使用,这更加偏向:Offline Preference Optimization;
没有 Advantage,在之前我们会通过奖励模型得到得分,并且经过优势函数得到 A;但是 DPO 算法是完全没有 A,因为在偏好数据已经告诉你了,因此方向已经明确了;
算法优缺点
优点
可以概括成三个方面:简单、稳定、省资源;
- 简单:全过程中没有任何额外网络和优化策略算法,训练流程像普通 fine-tuning
- 稳定:流程简单,不像在线 RL 那样步骤非常多
- 省资源:特别适合已经有高质量 Preference Data 的情况
缺点
最大的问题是它依赖已有 Preference Dataset,也就是我们要有非常高质的偏好数据;像类似 GRPO 算法,基本上模型是一个不断迭代探索的过程;
总结
相比 PPO、GRPO 这类先获得 Reward,再利用策略优化算法更新模型的方法,DPO 提供了另一种思路:如果最终目标本质上只是学习偏好关系,那么不一定需要把问题拆成 Reward Model + Policy Optimization 两个阶段,也可以直接从偏好数据构造优化目标
DPO 给我的最大启发并不是少了一个奖励模型,而是:先找到任务真正需要学习的信号,再判断中间模块是否真的必要 在经典 RLHF 中,人类真正提供的信息其实是“回答 A 比回答 B 更好”,Reward Model 只是把这种偏好转换成一个标量奖励,而 PPO 又根据这个奖励去更新 Policy。DPO 则进一步思考:既然原始监督信号就是相对偏好,能不能直接优化这种相对关系?最终就把原本较长的训练链路压缩成了 Preference → Policy。
这种思想可以迁移到其他算法设计中:当一个系统包含多个中间模块时,可以重新思考这些模块究竟是在解决核心问题,还是只是为了把一种信号转换成另一种信号。如果中间过程可以通过数学关系直接消除,就可能得到一个更简单、更稳定、更低成本的方法。
