DPO (Direct Preference Optimization) 学习笔记

十月十三日更新

一、 核心思想:为何需要 DPO?

传统的基于人类反馈的强化学习(RLHF)通常是一个复杂的三阶段过程:

  1. 监督微调 (SFT):让模型具备基础能力。
  2. 训练奖励模型 (Reward Model, RM):用人类偏好数据(例如,回答A比回答B好)训练一个独立的模型,让它学会给回答打分。
  3. 强化学习 (RL):使用 PPO 等算法,让语言模型在奖励模型的指导下进行优化,以产生能获得更高分数的回答。

这个流程虽然有效,但存在一些问题:训练过程复杂、不稳定,且需要维护两个大型模型(语言模型和奖励模型)。奖励模型(RM)的准确性成为了整个流程的瓶颈,如果奖励模型的效果不佳,那么后续的所有强化学习阶段都会受此影响。

DPO 的核心思想 是一种范式转移:我们能否跳过显式训练奖励模型这一步,直接利用偏好数据来优化语言模型本身?

DPO 巧妙地证明了,我们可以通过一个简单的分类目标,直接优化语言模型,使其行为与人类偏好对齐。它将“拟合奖励模型”和“强化学习”这两个步骤合并成了一个等价的、更简单的损失函数

在这里插入图片描述

二、 关键概念与定义

在推导之前,我们先明确几个关键定义:

  • 策略 (Policy) π\piπ:指语言模型本身。我们希望优化的目标策略记为 πθ\pi_{\theta}πθ
  • 参考策略 (Reference Policy) πref\pi_{ref}πref:通常是经过 SFT 阶段的模型。它的作用是作为优化的起点和锚点,防止模型在优化过程中“能力退化”或偏离太远。
  • 人类偏好数据:数据集中的每个样本包含一个问题(prompt)xxx,一个被人类偏爱的回答(winner)ywy_wyw,和一个不被偏爱的回答(loser)yly_lyl。记为 (x,yw,yl)(x, y_w, y_l)(x,yw,yl)
  • 奖励函数 r(x,y)r(x, y)r(x,y):一个未知的、潜在的函数,它能够根据人类的偏好给出一个分数。在传统 RLHF 中,我们需要拟合它;在 DPO 中,我们绕过它。

三、 DPO 公式推导:从 RLHF 目标到分类损失

DPO 的推导从 RLHF 的通用目标出发,通过一系列数学变换,最终得到了一个简单的分类损失函数。

第一步:从带约束的强化学习目标出发

在 RLHF 中,我们的优化目标是最大化奖励,同时不与参考策略 πref\pi_{ref}πref 偏离太远。这个目标可以写成如下形式:

max⁡πEx∼D,y∼π(y∣x)[r(x,y)]−βDKL(π(y∣x)∣∣πref(y∣x))\max_{\pi} E_{x \sim D, y \sim \pi(y|x)}[r(x,y)] - \beta D_{KL}(\pi(y|x) || \pi_{ref}(y|x))πmaxExD,yπ(yx)[r(x,y)]βDKL(π(yx)∣∣πref(yx))

  • E[⋅]E[\cdot]E[] 项表示最大化期望奖励。
  • DKL(⋅)D_{KL}(\cdot)DKL() 项是 KL 散度,作为惩罚项,防止 π\piππref\pi_{ref}πref 相差过大。β\betaβ 是控制惩罚强度的超参数。

可以证明,这个优化问题的最优解 π∗(y∣x)\pi^*(y|x)π(yx) 具有以下形式:

π∗(y∣x)=1Z(x)πref(y∣x)exp⁡(1βr(x,y))\pi^*(y|x) = \frac{1}{Z(x)} \pi_{ref}(y|x) \exp\left(\frac{1}{\beta} r(x,y)\right)π(yx)=Z(x)1πref(yx)exp(β1r(x,y))

相关证明运用了拉格朗日乘子法和KKT约束条件,具体过程详见文末。

其中Z(x)Z(x)Z(x) 是一个配分函数,用于确保所有可能回答 yyy 的概率之和为1。它的具体形式是:
Z(x)=∑yπref(y∣x)exp⁡(1βr(x,y))Z(x) = \sum_{y} \pi_{ref}(y|x) \exp\left(\frac{1}{\beta} r(x,y)\right)Z(x)=yπref(yx)exp(β1r(x,y))

这个公式非常关键,它建立了最优策略 π∗\pi^*π、参考策略 πref\pi_{ref}πref 和潜在奖励函数 r(x,y)r(x,y)r(x,y) 之间的桥梁

第二步:反解奖励函数

既然我们知道了最优策略和参考策略的关系,我们可以反过来,从这个关系中解出奖励函数 r(x,y)r(x,y)r(x,y)

对上面的最优策略公式稍作变换:
exp⁡(1βr(x,y))=π∗(y∣x)⋅Z(x)⋅1πref(y∣x)\exp\left(\frac{1}{\beta} r(x,y)\right) = \pi^*(y|x) \cdot Z(x) \cdot \frac{1}{\pi_{ref}(y|x)}exp(β1r(x,y))=π(yx)Z(x)πref(yx)1
两边取对数:
1βr(x,y)=log⁡(π∗(y∣x)πref(y∣x))+log⁡Z(x)\frac{1}{\beta} r(x,y) = \log\left(\frac{\pi^*(y|x)}{\pi_{ref}(y|x)}\right) + \log Z(x)β1r(x,y)=log(πref(yx)π(yx))+logZ(x)
最终得到:
r(x,y)=βlog⁡(π∗(y∣x)πref(y∣x))+βlog⁡Z(x)r(x,y) = \beta \log\left(\frac{\pi^*(y|x)}{\pi_{ref}(y|x)}\right) + \beta \log Z(x)r(x,y)=βlog(πref(yx)π(yx))+βlogZ(x)

这个公式告诉我们,任何语言模型策略(这里指最优策略 π∗\pi^*π)都可以被看作是相对于参考策略 πref\pi_{ref}πref 的一个隐式奖励函数。奖励分数与两个策略对同一个回答的概率比值的对数成正比。

第三步:将奖励函数与人类偏好关联

现在,我们把人类偏好数据 (x,yw,yl)(x, y_w, y_l)(x,yw,yl) 引入。我们假设人类的偏好符合 Bradley-Terry 模型。该模型指出,人类更偏爱 ywy_wyw 而不是 yly_lyl 的概率 P(yw≻yl∣x)P(y_w \succ y_l | x)P(ywylx) 可以由它们各自的奖励分数差通过一个 logistic 函数来建模:

P(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))P(y_w \succ y_l | x) = \sigma(r(x, y_w) - r(x, y_l))P(ywylx)=σ(r(x,yw)r(x,yl))

其中 σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}σ(z)=1+ez1 是 logistic sigmoid 函数,

具体为什么使用这个公式见文章后。

现在,我们将第二步中反解出的奖励函数表达式代入上式:

r(x,yw)−r(x,yl)=[βlog⁡π∗(yw∣x)πref(yw∣x)+βlog⁡Z(x)]−[βlog⁡π∗(yl∣x)πref(yl∣x)+βlog⁡Z(x)]r(x, y_w) - r(x, y_l) = \left[ \beta \log\frac{\pi^*(y_w|x)}{\pi_{ref}(y_w|x)} + \beta \log Z(x) \right] - \left[ \beta \log\frac{\pi^*(y_l|x)}{\pi_{ref}(y_l|x)} + \beta \log Z(x) \right]r(x,yw)r(x,yl)=[βlogπref(ywx)π(ywx)+βlogZ(x)][βlogπref(ylx)π(ylx)+βlogZ(x)]

代入后 配分函数 log⁡Z(x)\log Z(x)logZ(x) 在相减的过程中被完美地消掉了, 这极大地简化了问题。

r(x,yw)−r(x,yl)=β(log⁡π∗(yw∣x)πref(yw∣x)−log⁡π∗(yl∣x)πref(yl∣x))r(x, y_w) - r(x, y_l) = \beta \left( \log\frac{\pi^*(y_w|x)}{\pi_{ref}(y_w|x)} - \log\frac{\pi^*(y_l|x)}{\pi_{ref}(y_l|x)} \right)r(x,yw)r(x,yl)=β(logπref(ywx)π(ywx)logπref(ylx)π(ylx))

第四步:构建最终的 DPO 损失函数

我们的目标是让我们的模型 πθ\pi_{\theta}πθ 尽可能地接近这个理论上的最优策略 π∗\pi^*π。所以,我们用 πθ\pi_{\theta}πθ 来替换 π∗\pi^*π,然后最大化所有人类偏好数据的对数似然。

最大化 P(yw≻yl∣x)P(y_w \succ y_l | x)P(ywylx) 等价于最小化它的负对数似然:

LDPO(πθ,πref)=−E(x,yw,yl)∼D[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))]L_{DPO}(\pi_{\theta}, \pi_{ref}) = -E_{(x, y_w, y_l) \sim D} \left[ \log \sigma \left( \beta \log\frac{\pi_{\theta}(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log\frac{\pi_{\theta}(y_l|x)}{\pi_{ref}(y_l|x)} \right) \right]LDPO(πθ,πref)=E(x,yw,yl)D[logσ(βlogπref(ywx)πθ(ywx)βlogπref(ylx)πθ(ylx))]

这就是最终 DPO 损失函数。我们来解读一下这个损失函数:

  • 它是一个分类损失。形式上,它非常像一个二元交叉熵损失。
  • log⁡πθ(yw∣x)πref(yw∣x)\log\frac{\pi_{\theta}(y_w|x)}{\pi_{ref}(y_w|x)}logπref(ywx)πθ(ywx):可以看作是我们的模型 πθ\pi_{\theta}πθ 认为“更优回答” ywy_wyw 相对于参考模型的“优势”或“改进幅度”。
  • log⁡πθ(yl∣x)πref(yl∣x)\log\frac{\pi_{\theta}(y_l|x)}{\pi_{ref}(y_l|x)}logπref(ylx)πθ(ylx):同理,是模型认为“更差回答” yly_lyl 的“改进幅度”。
  • 核心优化目标:为了最小化这个损失函数,模型必须最大化偏好回答 ywy_wyw 的相对概率,同时最小化非偏好回答 yly_lyl 的相对概率

通过优化这个简单的损失函数,我们间接地、但数学上等价地完成了传统 RLHF 中复杂的奖励建模和强化学习两个步骤。


四、详细公式推导

1. 最优策略 π∗\pi^*π 公式推导

对于目标函数 J(π)=Ex∼D,y∼π(y∣x)[r(x,y)]−βDKL(π(y∣x)∣∣πref(y∣x))J(\pi) = E_{x \sim D, y \sim \pi(y|x)}[r(x,y)] - \beta D_{KL}(\pi(y|x) || \pi_{ref}(y|x))J(π)=ExD,yπ(yx)[r(x,y)]βDKL(π(yx)∣∣πref(yx)),在其约束条件(π\piπ 必须是一个有效的概率分布,即 ∑yπ(y∣x)=1\sum_y \pi(y|x) = 1yπ(yx)=1)下的最优解 π∗\pi^*π 是什么。

推导方法:
这是一个在函数空间内寻找最优函数的问题,并且带有一个等式约束。解决这类问题的标准方法是拉格朗日乘子法

为了简化,我们固定一个 prompt xxx,寻找最优的策略函数 π(y∣x)\pi(y|x)π(yx)。目标函数可以写为:
J(π)=∑yπ(y∣x)r(x,y)−β∑yπ(y∣x)log⁡π(y∣x)πref(y∣x)J(\pi) = \sum_y \pi(y|x)r(x,y) - \beta \sum_y \pi(y|x) \log\frac{\pi(y|x)}{\pi_{ref}(y|x)}J(π)=yπ(yx)r(x,y)βyπ(yx)logπref(yx)π(yx)
约束条件是:∑yπ(y∣x)−1=0\sum_y \pi(y|x) - 1 = 0yπ(yx)1=0

步骤 1: 构建拉格朗日函数

我们将目标函数与约束条件结合,构建拉格朗日函数 L(π,λ)L(\pi, \lambda)L(π,λ)
L(π,λ)=(∑yπ(y∣x)r(x,y)−β∑yπ(y∣x)log⁡π(y∣x)πref(y∣x))−λ(∑yπ(y∣x)−1)L(\pi, \lambda) = \left( \sum_y \pi(y|x)r(x,y) - \beta \sum_y \pi(y|x) \log\frac{\pi(y|x)}{\pi_{ref}(y|x)} \right) - \lambda \left( \sum_y \pi(y|x) - 1 \right)L(π,λ)=(yπ(yx)r(x,y)βyπ(yx)logπref(yx)π(yx))λ(yπ(yx)1)
其中 λ\lambdaλ 是拉格朗日乘子。我们的目标是找到使 LLL 取得极大值的 π\piπ

步骤 2: 对 π(y∣x)\pi(y|x)π(yx) 求偏导

为了找到极值点,我们将 LLL 对每一个 π(y∣x)\pi(y|x)π(yx) 求偏导,并令其等于 0。我们把 π(y∣x)\pi(y|x)π(yx) 看作一个自变量。
∂L∂π(y∣x)=0\frac{\partial L}{\partial \pi(y|x)} = 0π(yx)L=0

我们逐项进行求导:

  • ∂∂π(y∣x)(∑yπ(y∣x)r(x,y))=r(x,y)\frac{\partial}{\partial \pi(y|x)} \left( \sum_y \pi(y|x)r(x,y) \right) = r(x,y)π(yx)(yπ(yx)r(x,y))=r(x,y)
  • ∂∂π(y∣x)(−β∑yπ(y∣x)log⁡π(y∣x)πref(y∣x))\frac{\partial}{\partial \pi(y|x)} \left( -\beta \sum_y \pi(y|x) \log\frac{\pi(y|x)}{\pi_{ref}(y|x)} \right)π(yx)(βyπ(yx)logπref(yx)π(yx)): 这一项需要用到链式法则和乘法法则。
    • log⁡π(y∣x)πref(y∣x)=log⁡π(y∣x)−log⁡πref(y∣x)\log\frac{\pi(y|x)}{\pi_{ref}(y|x)} = \log\pi(y|x) - \log\pi_{ref}(y|x)logπref(yx)π(yx)=logπ(yx)logπref(yx)
    • ddz(zlog⁡z)=log⁡z+1\frac{d}{dz}(z \log z) = \log z + 1dzd(zlogz)=logz+1
    • 所以,∂∂π(y∣x)(−βπ(y∣x)(log⁡π(y∣x)−log⁡πref(y∣x)))=−β(log⁡π(y∣x)−log⁡πref(y∣x)+1)=−β(log⁡π(y∣x)πref(y∣x)+1)\frac{\partial}{\partial \pi(y|x)} \left(-\beta \pi(y|x)(\log\pi(y|x) - \log\pi_{ref}(y|x))\right) = -\beta (\log\pi(y|x) - \log\pi_{ref}(y|x) + 1) = -\beta \left(\log\frac{\pi(y|x)}{\pi_{ref}(y|x)} + 1\right)π(yx)(βπ(yx)(logπ(yx)logπref(yx)))=β(logπ(yx)logπref(yx)+1)=β(logπref(yx)π(yx)+1)
  • ∂∂π(y∣x)(−λ(∑yπ(y∣x)−1))=−λ\frac{\partial}{\partial \pi(y|x)} \left( -\lambda (\sum_y \pi(y|x) - 1) \right) = -\lambdaπ(yx)(λ(yπ(yx)1))=λ

将所有导数项合并,得到:
∂L∂π(y∣x)=r(x,y)−β(log⁡π(y∣x)πref(y∣x)+1)−λ=0\frac{\partial L}{\partial \pi(y|x)} = r(x,y) - \beta \left(\log\frac{\pi(y|x)}{\pi_{ref}(y|x)} + 1\right) - \lambda = 0π(yx)L=r(x,y)β(logπref(yx)π(yx)+1)λ=0

步骤 3: 求解 π(y∣x)\pi(y|x)π(yx)

现在我们从上式中解出 π(y∣x)\pi(y|x)π(yx)
r(x,y)−β−λ=βlog⁡π(y∣x)πref(y∣x)r(x,y) - \beta - \lambda = \beta \log\frac{\pi(y|x)}{\pi_{ref}(y|x)}r(x,y)βλ=βlogπref(yx)π(yx)r(x,y)−β−λβ=log⁡π(y∣x)πref(y∣x)\frac{r(x,y) - \beta - \lambda}{\beta} = \log\frac{\pi(y|x)}{\pi_{ref}(y|x)}βr(x,y)βλ=logπref(yx)π(yx)1βr(x,y)−1−λβ=log⁡π(y∣x)πref(y∣x)\frac{1}{\beta}r(x,y) - 1 - \frac{\lambda}{\beta} = \log\frac{\pi(y|x)}{\pi_{ref}(y|x)}β1r(x,y)1βλ=logπref(yx)π(yx)

两边同时取指数:
exp⁡(1βr(x,y)−1−λβ)=π(y∣x)πref(y∣x)\exp\left(\frac{1}{\beta}r(x,y) - 1 - \frac{\lambda}{\beta}\right) = \frac{\pi(y|x)}{\pi_{ref}(y|x)}exp(β1r(x,y)1βλ)=πref(yx)π(yx)
π(y∣x)=πref(y∣x)exp⁡(1βr(x,y))exp⁡(−1−λβ)\pi(y|x) = \pi_{ref}(y|x) \exp\left(\frac{1}{\beta}r(x,y)\right) \exp\left(-1 - \frac{\lambda}{\beta}\right)π(yx)=πref(yx)exp(β1r(x,y))exp(1βλ)

步骤 4: 利用约束条件确定常数项

观察上式,exp⁡(−1−λβ)\exp\left(-1 - \frac{\lambda}{\beta}\right)exp(1βλ) 这一项是一个与 yyy 无关的常数(因为 λ\lambdaλ 是一个常数)。这个常数的作用就是进行归一化,以满足我们的约束条件 ∑yπ(y∣x)=1\sum_y \pi(y|x) = 1yπ(yx)=1

我们将这个常数项记为 1/Z(x)1/Z(x)1/Z(x),这里的 Z(x)Z(x)Z(x) 就是配分函数。它只与 xxx 有关,因为 λ\lambdaλ 是为固定的 xxx 而计算的。
所以,最优策略 π∗(y∣x)\pi^*(y|x)π(yx) 的形式就是:
π∗(y∣x)=1Z(x)πref(y∣x)exp⁡(1βr(x,y))\pi^*(y|x) = \frac{1}{Z(x)} \pi_{ref}(y|x) \exp\left(\frac{1}{\beta} r(x,y)\right)π(yx)=Z(x)1πref(yx)exp(β1r(x,y))
其中 Z(x)=∑yπref(y∣x)exp⁡(1βr(x,y))Z(x) = \sum_y \pi_{ref}(y|x) \exp\left(\frac{1}{\beta} r(x,y)\right)Z(x)=yπref(yx)exp(β1r(x,y)),以确保 ∑yπ∗(y∣x)=1\sum_y \pi^*(y|x) = 1yπ(yx)=1


2. Bradley-Terry 模型与 Logistic Sigmoid 函数的推导

为什么人类对两个选项的偏好概率,可以用它们潜在奖励分数的差值,通过 logistic sigmoid 函数来建模?即 P(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))P(y_w \succ y_l | x) = \sigma(r(x, y_w) - r(x, y_l))P(ywylx)=σ(r(x,yw)r(x,yl)) 是如何得出的。

这个模型的得出并非凭空捏造,它源于选择理论中的一个基本公理,并有一种非常直观和自然的推导方式。

推导方法:基于 Luce’s Choice Axiom

Luce’s Choice Axiom (卢斯选择公理) 是描述理性选择行为的一个基本原则。对于一个包含多个选项的集合,选择其中任一选项的概率,正比于该选项的“价值”或“强度”。

步骤 1: 定义价值/强度

假设每一个回答 yyy 都有一个潜在的、不可观测的、正数“价值”评分,我们记为 v(y)v(y)v(y)。这个 v(y)v(y)v(y) 直接关联到我们所说的奖励 r(x,y)r(x,y)r(x,y)。一个非常自然且常用的关联方式是指数关系
v(y)=exp⁡(r(x,y))v(y) = \exp(r(x,y))v(y)=exp(r(x,y))
选择指数关系有两个好处:

  1. 保证价值为正:无论奖励 rrr 是正还是负,其指数 exp⁡(r)\exp(r)exp(r) 永远是正数,符合价值的定义。
  2. 数学性质良好:指数和对数运算在后续推导中非常方便。

步骤 2: 应用 Luce’s Choice Axiom

根据卢斯选择公理,在两个选项 ywy_wywyly_lyl 中,选择 ywy_wyw 的概率等于 ywy_wyw 的价值占两者总价值的比例:
P(yw≻yl∣x)=v(yw)v(yw)+v(yl)P(y_w \succ y_l | x) = \frac{v(y_w)}{v(y_w) + v(y_l)}P(ywylx)=v(yw)+v(yl)v(yw)

步骤 3: 代入指数价值并化简

现在,我们将 v(y)=exp⁡(r(x,y))v(y) = \exp(r(x,y))v(y)=exp(r(x,y)) 代入上式:
P(yw≻yl∣x)=exp⁡(r(x,yw))exp⁡(r(x,yw))+exp⁡(r(x,yl))P(y_w \succ y_l | x) = \frac{\exp(r(x, y_w))}{\exp(r(x, y_w)) + \exp(r(x, y_l))}P(ywylx)=exp(r(x,yw))+exp(r(x,yl))exp(r(x,yw))

为了得到我们熟悉的形式,我们对这个分式的分子和分母同时除以分子本身,即 exp⁡(r(x,yw))\exp(r(x, y_w))exp(r(x,yw))
P(yw≻yl∣x)=exp⁡(r(x,yw))exp⁡(r(x,yw))exp⁡(r(x,yw))exp⁡(r(x,yw))+exp⁡(r(x,yl))exp⁡(r(x,yw))=11+exp⁡(r(x,yl)−r(x,yw))P(y_w \succ y_l | x) = \frac{\frac{\exp(r(x, y_w))}{\exp(r(x, y_w))}}{\frac{\exp(r(x, y_w))}{\exp(r(x, y_w))} + \frac{\exp(r(x, y_l))}{\exp(r(x, y_w))}}= \frac{1}{1 + \exp(r(x, y_l) - r(x, y_w))}P(ywylx)=exp(r(x,yw))exp(r(x,yw))+exp(r(x,yw))exp(r(x,yl))exp(r(x,yw))exp(r(x,yw))=1+exp(r(x,yl)r(x,yw))1

步骤 4: 关联 Logistic Sigmoid 函数

我们知道 logistic sigmoid 函数的定义是 σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}σ(z)=1+ez1
观察上一步的结果,我们可以做一个简单的变换:
r(x,yl)−r(x,yw)=−(r(x,yw)−r(x,yl))r(x, y_l) - r(x, y_w) = - (r(x, y_w) - r(x, y_l))r(x,yl)r(x,yw)=(r(x,yw)r(x,yl))所以,P(yw≻yl∣x)=11+exp⁡(−(r(x,yw)−r(x,yl)))P(y_w \succ y_l | x) = \frac{1}{1 + \exp(-(r(x, y_w) - r(x, y_l)))}P(ywylx)=1+exp((r(x,yw)r(x,yl)))1
z=r(x,yw)−r(x,yl)z = r(x, y_w) - r(x, y_l)z=r(x,yw)r(x,yl),上式就变成了:P(yw≻yl∣x)=11+e−z=σ(z)=σ(r(x,yw)−r(x,yl))P(y_w \succ y_l | x) = \frac{1}{1 + e^{-z}} = \sigma(z) = \sigma(r(x, y_w) - r(x, y_l))P(ywylx)=1+ez1=σ(z)=σ(r(x,yw)r(x,yl))

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐