RL 学习笔记 #13 直接偏好优化(DPO)理论
本文最后更新于:2025年3月7日 下午
以 PPO 为代表的经典 RLHF 流程中,存在两个显著缺陷:
- 奖励模型偏差:PPO 需要训练一个 RM,奖励建模误差可能会通过 RL 传导到策略网络。
- 训练流程复杂:PPO 需要交替训练 Actor 和 Critic 网络,加载多个模型,涉及大量超参数调整(如 clip 阈值、GAE 参数等),导致实现成本极高。
DPO(Direct Preference Optimization)的提出正是为了解决这些问题。其核心思想是绕过奖励模型建模,直接利用人类偏好数据优化策略网络。这种方法的革命性在于发现:语言模型本身可以视为一个隐式的奖励函数,通过数学变换可以直接建立策略与偏好的映射关系。
附上一些参考资料:
猛猿老师的文章:人人都能看懂的 DPO 数学原理
DPO 论文:Direct Preference Optimization: Your Language Model is Secretly a Reward Model
DPO 理论推导
给定一个预训练语言模型 \(\pi_{\text{ref}}(y\mid x)\),以及一个人类偏好数据集 \(\mathcal{D} = \{(x, y_w, y_l)\}\),其中 \(y_w\) 是人类偏好的回答,\(y_l\) 是人类不偏好的回答。我们的目标是找到一个新的策略 \(\pi_{\theta}(y\mid x)\) 来最大化与人类偏好的一致性。
不管是 PPO 还是 DPO,我们的优化目标通常是一个正则化(Behavior-Regularized)的 RL 问题: \[ \max_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(y|x)}[r(x, y)] - \beta \mathbb{D}_{\mathrm{KL}}(\pi_\theta(y\mid x) \parallel \pi_{\text{ref}}(y\mid x)) \] 其中: - \(r(x, y)\) 是奖励函数,评估响应 \(y\) 对于输入 \(x\) 的质量; - \(\beta\) 是控制 KL 散度惩罚强度的超参数; - \(\mathbb{D}_{\mathrm{KL}}\) 是 KL 散度,防止优化后的策略 \(\pi_\theta\) 与参考策略 \(\pi_{\text{ref}}\) 相差太远,两个模型都初始化自 SFT 模型。
最优奖励与最优策略模型
现在我们尽可能去简化这个优化目标,考虑到 KL 散度的表达式: \[ \mathbb{D}_{\mathrm{KL}}\left[\pi(y \mid x) \| \pi_{\mathrm{ref}}(y \mid x)\right]=\mathbb{E}_{y \sim \pi(y \mid x)}\left[\log \frac{\pi(y \mid x)}{\pi_{\mathrm{ref}}(y \mid x)}\right] \] 优化目标可以改写为: \[ \max _\pi \mathbb{E}_{x \sim \mathcal{D}} \mathbb{E}_{y \sim \pi(y \mid x)}\left[r(x, y)-\beta \log \frac{\pi(y \mid x)}{\pi_{\mathrm{ref}}(y \mid x)}\right] \] 除以 \(\beta\),再取反,因此 \(\max\) 改为 \(\min\) 得到: \[ \min _\pi \mathbb{E}_{x \sim \mathcal{D}} \mathbb{E}_{y \sim \pi(y \mid x)}\left[\log \frac{\pi(y \mid x)}{\pi_{\mathrm{ref}}(y \mid x)}-\frac{1}{\beta} r(x, y)\right] \] 将 \(\frac{1}{\beta} r(x, y)\) 改为 \(\log \exp\left(\frac{1}{\beta} r(x, y)\right)\) 后可以将两项合并: \[ \min _\pi \mathbb{E}_{x \sim \mathcal{D}} \mathbb{E}_{y \sim \pi(y \mid x)}\left[\log \frac{\pi(y \mid x)}{\pi_{\mathrm{ref}}(y \mid x) \exp \left(\frac{1}{\beta} r(x, y)\right)}\right] \] 根据这里的分母,我们人为定义一个配分函数(Partition Function): \[ Z(x) = \sum_{y} \pi_{\mathrm{ref}}(y \mid x) \exp \left(\frac{1}{\beta} r(x, y)\right) \] 其中 \(\sum_{y}\) 表示在给定某个 Prompt \(x\) 的前提下,参考模型可能生成的所有 \(y\),因此有 \(\sum_{y} \pi_{\mathrm{ref}}(y \mid x)=1\)。由这个定义可知,\(Z(x)\) 是关于 \(x\) 的函数,且和我们准备优化的模型 \(\pi\) 没有关系。
暂时可以理解这个式子是为了跟分母对齐而凑出来的归一化因子,但实际上这种配分函数在逆强化学习、离线强化学习中大量存在,涉及到比较麻烦的理论推导,这里就不展开解释了。
为了引入 \(Z(x)\),将优化目标进一步变形为: \[ \min _\pi \mathbb{E}_{x \sim \mathcal{D}} \mathbb{E}_{y \sim \pi(y \mid x)}\left[\log \frac{\pi(y \mid x)}{\frac{1}{Z(x)} \pi_{\mathrm{ref}}(y \mid x) \exp \left(\frac{1}{\beta} r(x, y)\right)}-\log Z(x)\right] \] 对于式子的左半部分,可以发现它非常像 KL 散度的形式(即衡量了两个分布之间的相似性),因此我们将分母再定义为 \(\pi^*(y \mid x)\): \[ \pi^*(y \mid x)=\frac{1}{Z(x)} \pi_{\mathrm{ref}}(y \mid x) \exp \left(\frac{1}{\beta} r(x, y)\right) \] 可以证明上述 \(\pi^*\) 的满足概率分布大于 \(0\) 且和为 \(1\) 的定义,是一个合法的概率分布——这也是我们将 \(Z(x)\) 定义为这个形式的原因!
此时,将期望移入括号,优化目标进一步改写为: \[ \begin{aligned} & \min _\pi \mathbb{E}_{x \sim \mathcal{D}}\left[\mathbb{E}_{y \sim \pi(y \mid x)}\left[\log \frac{\pi(y \mid x)}{\pi^*(y \mid x)}\right]-\log Z(x)\right] \\ & = \min _\pi \mathbb{E}_{x \sim \mathcal{D}}\left[\mathbb{D}_{\mathrm{KL}}\left(\pi(y \mid x) \parallel \pi^*(y \mid x)\right)-\log Z(x)\right] \end{aligned} \] 前面我们说过和 \(Z(x)\) 和我们准备优化的模型 \(\pi\) 没有关系,所以在 \(\min_{\pi}\) 中可以将第二项忽略。那么现在我们只需要关心 KL 散度这一项。我们知道 KL 散度在两个分布完全相等时达到最小,由此我们可以写出模型的显式解: \[ \pi(y \mid x)=\pi^*(y \mid x)=\frac{1}{Z(x)} \pi_{\mathrm{ref}}(y \mid x) \exp \left(\frac{1}{\beta} r(x, y)\right) \] 因为以上推导都是在假设我们有一个固定的奖励函数 \(r\) 的基础上进行的,所以我们可以加一个下标来强调这一点: \[ \pi_r(y \mid x)=\frac{1}{Z(x)} \pi_{\mathrm{ref}}(y \mid x) \exp \left(\frac{1}{\beta} r(x, y)\right) \] 可是,在正常的对齐训练中,这个奖励函数 \(r(x, y)\) 可不是任意的,它是我们先用数据训练出来的最优奖励模型,然后在这个最优奖励模型的基础上,我们再通过训练去找到最优策略模型。最优奖励模型和基于它训练出的最优的对齐模型依然满足上式,我们分别设它们为 \(r^*(x, y)\) 和 \(\pi^*(y \mid x)\),则有: \[ \pi^*(y \mid x)=\frac{1}{Z(x)} \pi_{\mathrm{ref}}(y \mid x) \exp \left(\frac{1}{\beta} r^*(x, y)\right) \]
建立策略到偏好的映射
虽然我们现在得到了策略模型的显式解 \(\pi_r(y \mid x)\),但是我们却很难直接利用起这个显式解形式,原因如下:
- \(Z(x)\) 的值很难估计。根据 \(Z(x)\) 的形式可知,想要估计它,就需要对一个 Prompt \(x\) 采样足够多的回答 \(y\)。这个代价是十分昂贵的。
- 回顾最开始我们的目标:省略训练奖励模型这个步骤,直接优化策略模型。而目前我们得到的的显式解仍然需要一个确定的奖励函数 \(r\)。
所以现在我们继续来迭代。考虑到第二个原因,我们可以先从 \(\pi^*\) 的显式解中推出最优奖励模型 \(r^*\) 的形式: \[ r^*(x, y)=\beta \log \frac{\pi^*(y \mid x)}{\pi_{\mathrm{ref}}(y \mid x)}+\beta \log Z(x) \] 既然有这层映射关系,我们就可以直接将 \(\pi^*\) 代入到奖励模型的训练优化目标中去,从而实现「明面上训练奖励模型,实际上却一步到位训练出了对齐模型」!
所以现在回到奖励模型的训练优化目标——在介绍 PPO 的时候我们曾提过,我们通常使用「偏好排序」这种数据标注方式来对奖励模型进行训练,一般有两种偏好排序方法:
- 只生成 \(2\) 个回答,
<prompt x, chosen y1, reject y2>
,即对于一个 Prompt,我们生成 2 个回答,人工对这两个回答的偏好做排序,我们希望奖励模型对 Chosen 回答的给分尽量高于对 Reject 回答的给分。 - 生成 \(K > 2\) 个回答,
<prompt x, y1, ..., yK>
,假设人工标注后的偏好排序组合为 \(\tau\),那么我们希望奖励模型对 \(\tau\) 这个排序的总得分要大于其余任何可能的偏好排序。
在某些框架(比如 InstructGPT)的训练中,当生成的回答 \(>2\) 个时,会将回答两两配对,这样就可以和只生成 \(2\) 个回答时的目标函数做统一。但在更一般的场景中,对于 \(>2\) 个回答的场景,我们是把每一种可能的回答偏好排序当成一个整体数据进行处理的,然后希望真值排序的得分最高,DPO 的推导就是基于后者进行的。
接下来,我们也对 \(K=2\) 和 \(K>2\) 这两种情况下 DPO 最终的目标函数形式进行推导。
Bradley-Terry (BT) 偏好模型
我们希望一个好的奖励模型对 Chosen 回答的给分尽量高于对 Reject 回答的给分,这其实表示了一种相对偏好。1952 年提出的统计模型 Bradley-Terry (BT) Model 可用于分析成对数据间的相对优势或者偏好,其被广泛应用于体育比赛分析、市场研究等场景。
在该模型下,我们假设有两个回答 \(y_w\) 和 \(y_l\),人类偏好 \(y_w\) 而非 \(y_l\) 的概率可以表示为: \[ P(y_w \succ y_l\mid x) = \frac{\exp[r(x, y_w)]}{\exp[r(x, y_w)] + \exp[r(x, y_l)]} \] 现在,我们希望对于整个标注数据集 \(\mathcal{D} = \{(x, y_w, y_l)\}\),Chosen 打败 Reject 的期望概率尽量大,所以奖励函数的总体优化目标可以设计成负对数似然(Negative Log-Likelihood,NLL): \[ L_R\left(r_\phi, D\right)=-\mathbb{E}_{\left(x, y_w, y_l\right) \sim D}\left[\log P\left(y_w \succ y_l \mid x\right)\right] \] 将 \(P\) 的具体形式代入化简,则有: \[ \begin{aligned} L_R\left(r_\phi, D\right) & =-\mathbb{E}_{\left(x, y_w, y_l\right) \sim D}\left[\log P\left(y_w \succ y_l \mid x\right)\right] \\ & =-\mathbb{E}_{\left(x, y_w, y_l\right) \sim D}\left[\log \frac{\exp \left[r\left(x, y_w\right)\right]}{\exp \left[r\left(x, y_w\right)\right]+\exp \left[r\left(x, y_l\right)\right]}\right] \\ & =-\mathbb{E}_{\left(x, y_w, y_l\right) \sim D}\left[\log \frac{1}{1+\frac{\exp \left[r\left(x, y_l\right)\right]}{\exp \left[r\left(x, y_w\right)\right]}}\right] \\ & =-\mathbb{E}_{\left(x, y_w, y_l\right) \sim D}\left[\log \frac{1}{1+e^{-\left(r\left(x, y_w\right)-r\left(x, y_l\right)\right)}}\right] \\ & =-\mathbb{E}_{\left(x, y_w, y_l\right) \sim D}\left[\log \sigma\left(r\left(x, y_w\right)-r\left(x, y_l\right)\right)\right] \end{aligned} \]
其中 \(\sigma\) 是 sigmoid 函数。这时我们震惊地发现:最后一个式子就是 OpenAI 2020 年论文《Learning to Summarize with Human Feedback》介绍 PPO 的成对排序损失(Pairwise Ranking Loss): \[ \mathcal{L}^{\text{RM}} = \log \sigma(r(x, y_w) - r(x, y_l)) \]
这个公式表明,两个回答之间的相对偏好与它们奖励值的差异成正比。
现在,我们将前面求出的最优奖励模型 \(r^*\) 代入 Bradley-Terry 偏好模型,可以得到: \[ \begin{aligned} P(y_w \succ y_l \mid x) & = \sigma(r^*(x, y_w) - r^*(x, y_l))\\ &= \sigma\left(\beta \log \frac{\pi^*(y_w\mid x)}{\pi_{\text{ref}}(y_w\mid x)} + \beta \log Z(x) - \beta \log \frac{\pi^*(y_l\mid x)}{\pi_{\text{ref}}(y_l\mid x)} - \beta \log Z(x)\right)\\ \end{aligned} \] 注意到 \(\log Z(x)\) 项相互抵消,我们得到: \[ P^*(y_w \succ y_l \mid x) = \sigma\left(\beta \log \frac{\pi^*(y_w\mid x)}{\pi_{\text{ref}}(y_w\mid x)} - \beta \log \frac{\pi^*(y_l\mid x)}{\pi_{\text{ref}}(y_l\mid x)}\right) \]
到这里,我们已经把训练奖励模型的目标函数转化成只和策略模型 \(\pi\) 相关了!也就是说,我们可以一步到位,绕开训练奖励模型的过程,直接用标注好的成对偏好数据,像 SFT 一样直接训练策略模型了。
Plackett-Luce 偏好模型
现在,如果我不想使用成对偏好数据,而是对于一个 Prompt,我给 \(K>2\) 个回答进行偏好排序,在这种方式下,我要怎么设计奖励模型优化目标呢?
类似于 BT 模型的一个 Plackett-Luce 模型可以对多数据的偏好排序进行建模:假设 \(\tau\) 为人工标注出的真值排序,我们希望其能够打败其余任何一种可能的偏好排序,这一概率可以表示成: \[ P\left(\tau \mid y_1, \ldots, y_K, x\right)=\prod_{k=1}^K \frac{\exp \left[r\left(x, y_{\tau(k)}\right)\right]}{\sum_{j=k}^K \exp \left[r\left(x, y_{\tau(j)}\right)\right]} \] 其中,\(\tau_k\) 表示人类标注的偏好序列 \(\tau\) 中的第 \(k\) 个数据,序列 \(\tau\) 中的 \(K\) 个回答已经按照偏好从高到低进行排序。
这个公式从直观上理解的话:
对于真值 \(\tau\) 中的第一个回答 \(\tau_1\) ,它是人工标注的偏好最高的数据,我们当然希望它的得分在 \(\tau_1 \sim \tau_K\) 中占大头;
对于真值 \(\tau\) 中的第一个回答 \(\tau_2\) ,我们当然希望它的得分在 \(\tau_2 \sim \tau_K\) 中占大头;
对于真值 \(\tau\) 中的第一个回答 \(\tau_3\) ,我们当然希望它的得分在 \(\tau_3 \sim \tau_K\) 中占大头;
以此类推,则不难理解上述在 Plackett-Luce 模型下概率的表达方式。
同样,我们把最优奖励函数 \(r^*(x, y)\) 代入上面的 P 中,则有:
\[ P\left(\tau \mid y_1, \ldots, y_K, x\right)=\prod_{k=1}^K \frac{\exp \left[r^*\left(x, y_{\tau(k)}\right)\right]}{\sum_{j=k}^K \exp \left[r^*\left(x, y_{\tau(j)}\right)\right]} \]
然后我们再用 \(\pi^*\) 去表示 \(r^*\) ,则有(这里我们可以把 \(Z(x)\) 省略掉,因为正如前文所说,它和对齐模型 \(\pi\) 没有关系):
\[ P^*\left(\tau \mid y_1, \ldots, y_K, x\right)=\prod_{k=1}^K \frac{\exp \left(\beta \log \frac{\pi^*\left(y_{\tau(k)} \mid x\right)}{\pi_{\mathrm{ref}}\left(y_{\tau(k)} \mid x\right)}\right)}{\sum_{j=k}^K \exp \left(\beta \log \frac{\pi^*\left(y_{\tau(j)} \mid x\right)}{\pi_{\mathrm{ref}}\left(y_{\tau(j)} \mid x\right)}\right)} \]
DPO 实现细节
损失函数推导
通过极大似然估计,我们将 BT 模型的优化目标转化为二元交叉熵损失: \[ \mathcal{L}_{\text{DPO}}(\theta) = -\mathbb{E}_{(x,y_w,y_l) \sim D} \left[ \log \sigma \left( \beta \log \frac{\pi_\theta(y_w\mid x)}{\pi_{\text{ref}}(y_w\mid x)} - \beta \log \frac{\pi_\theta(y_l\mid x)}{\pi_{\text{ref}}(y_l\mid x)} \right) \right] \] 这个损失函数具有三个关键特性:
- 隐式奖励建模:通过策略网络与参考策略的比值隐式学习奖励函数,避免显式奖励模型的偏差;
- 数据高效性:直接利用成对偏好数据,无需从策略网络中采样(对比 PPO 需要 on-policy 采样);
- 动态权重调节:\(\beta\) 控制策略更新幅度,防止过度偏离参考策略(类似 PPO 中的 KL 约束)。
链式法则求梯度可以得到: \[ \nabla_\theta \mathcal{L}_{\mathrm{DPO}}\left(\theta \right)= -\beta \mathbb{E}_{\left(x, y_w, y_l\right) \sim D}[\underbrace{\sigma\left(\hat{r}_\theta\left(x, y_l\right)-\hat{r}_\theta\left(x, y_w\right)\right)}_{\text {higher weight when reward estimate is wrong }}[\underbrace{\nabla_\theta \log \pi\left(y_w \mid x\right)}_{\text {increase likelihood of } y_w}-\underbrace{\nabla_\theta \log \pi\left(y_l \mid x\right)}_{\text {decrease likelihood of } y_l}]] \] 其中 \(\hat{r}_\theta\left(x, y\right)=\beta \log \frac{\pi_\theta(y\mid x)}{\pi_{\text{ref}}(y\mid x)}\),注意这一项是 \(l-w\),表示当隐式奖励估计错误时,会用更大的幅度去纠正策略模型。
有了这个损失函数后,理想的结果就是,Chosen 回答概率上升,Reject 回答概率下降,从而达到跟人类偏好对齐的自的。当然实践过程中可能会到 Chosen 和 Reject 的概率都下降的情况,毕竟 DPO 只约束差值。之后会介绍一些改进工作,包含了相应的优化。
DPO Loss 简易实现
DPO 原论文附录给出了 DPO Loss 的简易实现:
1 |
|
讨论:Online vs. Offline,On-Policy vs. Off-Policy
引用知乎上 @Wei Xiong 的说法:
我们用 Offline 指代从一个给定的偏好数据集中学习,并且在学习中,我们无法进一步让 Human 给出偏好信号,而相应的 Online 指的是我们可以在训练过程中让 Human 为我们标数据。
换言之,区分 online / offline 最关键的在于 preference signal 采集的模式不同。因此,下面的这些算法都是 offline 的:
- DPO 直接在给定的数据集上进行偏好学习:offline
- 我们从一个给定的数据集训练得到一个奖励函数,并使用 PPO 优化这个奖励函数:offline
- 我们从一个给定的数据集训练得到一个奖励函数,并使用 rejection sampling finetuning 优化:offline
一个相关的概念是 on-policy 与 off-policy,我们用 on-policy 指代那些采集数据的策略与要改进的策略是同一个策略的情况,而 off-policy 指代那些使用某个行为策略采集数据,但是用以改进另一个策略的算法。
换言之,区分 on-policy / off-policy 最关键的在于 responses 采集的模型不同。我们给出以下例子:
- DPO 是 off-policy 的
- 我们从一个给定的数据集训练得到一个奖励函数,并使用 PPO 优化这个奖励函数:on-policy
总而言之,对于 DPO 而言,没有争议,就是 offline、off-policy 算法。因为他使用离线的偏好数据集(不与环境交互,甚至没有采样环节)。
而对于 PPO 就比较灵活: - 如果从偏好信号采集的角度,PPO 在 System level 上是不与环境交互的,只从固定的 RM 获取,所以认为是 offline【主流观点】;但有些人也会认为 PPO 是实时从 RM 处获取偏好,所以也是 online。 - 从采样和更新策略角度,对于整个训练过程,PPO 使用一个策略模型采样并更新之,所以是 on-policy【主流观点】;但是如果细到每个 step,由于 rollout 模型跟 training 模型不一定一致(存在延迟),PPO 也可以说是 off-policy。
讨论:DPO 的局限性
参考资料:
- DPO vs PPO:深度解读谁是 LLM Alignment 的未来 - 知乎
- 为什么我们应该做 online RLHF/DPO? - 知乎
- DPO 的局限性 - 知乎
- 论文:Is DPO Superior to PPO for LLM Alignment? A Comprehensive Study.
- 论文:Towards Analyzing and Understanding the Limitations of DPO: A Theoretical Perspective.
以下截取一些简单易懂的局限性进行分析:
- 训练目标不一致:DPO 的训练目标实际上是 RM 的训练目标,只不过将其迁移到了策略模型上。而 RM 的训练目标其实是让模型拥有 Evaluate 能力(拉开好坏响应的 Margin),但我们希望策略模型拥有的是 Generate 能力 ——「模型的 Evaluate 能力和 Generate 能力到底是不是相互促进的?」这个前提成立与否,才是 DPO 有效的关键。在训练 DPO 时,基本都遇到过 good_sentence 和 bad_sentence 的 Loss 都上升的尴尬现象,这就表示模型的 Generate 能力不一定同步上升了,往往需要魔改 Loss 才能有效。
- 缺少在线采样:PPO 通过在线采样将 RM 的 Evaluate 能力转化为 Generate 能力让策略模型学习。这种 Online 方式让模型能够探索出更多的结果并获取来自真实世界的反馈,也能有更大的 Generate 空间来优化。因此,一些 Online-DPO 迭代策略,就是通过用 DPO 采样多个 path 后构造偏好对,从而引入采样和探索机制来增大策略空间。
- 场景适应性限制:DPO 在生成多样性要求高的任务(如创意写作)中表现较弱,因为其偏好学习偏向「安全回答」。此外,其标注方式也注定其只能用于偏好关系简单且静态的任务(如文本风格迁移、简单对话生成)。