DPO (Direct Preference Optimization) -- 直接偏好优化 - Clear Eyes, Full Heart
LOADING
5898 words
29 minutes
DPO (Direct Preference Optimization) -- 直接偏好优化

DPO (Direct Preference Optimization) — 直接偏好优化

Important

一、引言:从RLHF的工程困境到范式的根本转变

在上一篇文章中,我们详细讲解了PPO如何通过裁剪机制和KL散度约束,在大模型强化学习对齐中扮演核心角色。然而,PPO虽强,却有一个无法回避的问题:它太“重”了

DPO_vs_RLHF

1.1 标准RLHF的流程

标准RLHF流程的四阶段重负:

  1. 训练奖励模型(RM) :需要大量成对偏好数据训练一个独立的奖励模型
  2. 加载四个模型Actor、Critic、Reward Model、Reference Model需同时驻留显存(70B参数模型下,仅模型参数就需约560GB显存)
  3. 在线采样与优势计算:需要不断从策略中采样,用GAE计算优势函数
  4. 多轮PPO更新:超参数(ϵ,β,λ\epsilon, \beta, \lambda)的精细调优往往需要数周实验。整个过程对算力、工程能力和超参数调优的要求极高。

这种复杂性在学术界和工业界都催生了一个根本性的追问:我们真的需要先训练一个奖励模型,再用强化学习去优化它吗? 或者说,这种“先建模、再优化”的两阶段范式,是否是这个问题的唯一解?

1.2 DPO算法提出背景

2023年,斯坦福大学Rafael Rafailov团队在论文Direct Preference Optimization: Your Language Model is Secretly a Reward Model中给出了一个颠覆性的答案 —— 带KL散度约束的奖励最大化问题,其最优策略与奖励函数之间存在一一对应关系。因此,优化策略等价于优化奖励函数,无需显式构建奖励模型,更无需强化学习的采样循环。这篇论文的核心洞察正如其标题所言:“Your Language Model is Secretly a Reward Model”——你的语言模型本身就隐藏着一个奖励模型

DPO的核心思想极为简洁:直接优化语言模型以符合人类偏好,无需显式训练独立的奖励模型,也无需复杂的强化学习阶段。它将RLHF的多阶段流程替换为单个训练阶段,本质上是一个监督学习问题。

如果说PPO是“训练一个裁判(奖励模型),再让选手(策略)按照裁判的评分标准去训练”,那么DPO就是“直接给选手看冠军(偏好回答)和淘汰者(被拒绝回答)的对比录像,让它自己领悟评分标准”。前者需要一整套比赛和评分系统,后者仅需一组对比案例


二、DPO的核心原理

2.1 起点:带KL约束的RLHF优化目标

标准RLHF的优化目标是最大化带KL散度约束的奖励期望,核心是寻找一个策略 πθ\pi_\theta,在最大化奖励的同时,不偏离参考策略 πref\pi_{\text{ref}} 太远

LRLHF(πθ)=ExD,yπθ(x)[r(x,y)]βDKL(πθ(x)πref(x))\mathcal{L}_{\text{RLHF}}(\pi_\theta) = \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(\cdot|x)} \left[ r(x, y) \right] - \beta \cdot D_{\text{KL}}\left( \pi_\theta(\cdot|x) \parallel \pi_{\text{ref}}(\cdot|x) \right)

各符号的含义:

  • r(x,y)r(x, y)奖励函数,对”在输入xx下生成回答yy”的质量评分,通常由独立的奖励模型提供。鼓励模型生成高奖励的回答。
  • DKL(πθπref)D_{\text{KL}}(\pi_\theta \parallel \pi_{\text{ref}})KL散度,衡量两个策略分布的差异,防止模型在追求奖励时”走火入魔”。
  • β>0\beta > 0KL约束强度系数,控制对齐目标与保持能力之间的权衡。β\beta 越大,模型越保守,越接近 πref\pi_{\text{ref}}β\beta 越小,模型越激进,越追求奖励最大化

问题在于,这个目标函数包含对策略 πθ\pi_\theta 的采样期望,而采样操作是不可微的——这正是为什么我们需要PPO这样的强化学习算法来优化它。PPO本质上是在找一个数值解

2.2 关键洞察:从“数值解”到“闭式解”

DPO的突破性洞察在于:对于上述带KL约束的奖励最大化问题,其最优策略不仅存在,而且可以用奖励函数的闭式表达出来

注意,KL散度可以展开为:

DKL(ππref)=Eyπ(x)[logπ(yx)πref(yx)]D_{\text{KL}}(\pi \parallel \pi_{\text{ref}}) = \mathbb{E}_{y \sim \pi(\cdot|x)} \left[ \log \frac{\pi(y|x)}{\pi_{\text{ref}}(y|x)} \right]

代入原目标,构造拉格朗日函数求解:

L(π)=Eyπ(x)[r(x,y)βlogπ(yx)πref(yx)]\mathcal{L}(\pi) = \mathbb{E}_{y \sim \pi(\cdot|x)} \left[ r(x, y) - \beta \log \frac{\pi(y|x)}{\pi_{\text{ref}}(y|x)} \right]

通过变分法求解,对于每个输入 xx,最优策略 π\pi^* 应满足:

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

其中 Z(x)=yπref(yx)exp(1βr(x,y))Z(x) = \sum_y \pi_{\text{ref}}(y|x) \exp\left( \frac{1}{\beta} r(x, y) \right)配分函数(Partition Function) ,用于归一化概率分布。

这个公式的深刻含义:最优策略 π\pi^* 是在参考策略的基础上,按照指数比例向高奖励区域偏移的结果。β\beta 控制偏移的”温度”——β\beta 越小,偏移越集中到最高奖励的回答上;β\beta 越大,偏移越平缓,保留更多参考策略的多样性。

逆向看这个公式,奖励函数 rr 可以被 π\pi^*πref\pi_{\text{ref}} 表达:

r(x,y)=βlogπ(yx)πref(yx)+βlogZ(x)r(x, y) = \beta \log \frac{\pi^*(y|x)}{\pi_{\text{ref}}(y|x)} + \beta \log Z(x)

这个看似简单的数学变换,正是DPO”语言模型本身就是奖励模型”的第一个理论基础。它告诉我们:奖励函数与最优策略之间,存在着一一对应的关系

2.3 Bradley-Terry模型:将偏好转化为概率

在RLHF中,偏好数据通常以成对比较的形式收集:给定输入 xx,标注者从两个回答 (yw,yl)(y_w, y_l) 中选出更喜欢的一个(ywy_w表示”获胜”回答,yly_l表示”落败”回答)。

Bradley-Terry模型假设人类偏好遵循逻辑斯谛概率。该模型假设:对于一对回答 (yw,yl)(y_w, y_l),人类偏好 ywy_w 胜过 yly_l 的概率为:

P(ywylx)=σ(r(x,yw)r(x,yl))P(y_w \succ y_l \mid x) = \sigma\left( r(x, y_w) - r(x, y_l) \right)

其中 σ(t)=11+et\sigma(t) = \frac{1}{1 + e^{-t}} 是sigmoid函数。这个假设的直觉是:两个回答的奖励差异越大,人类偏好其中之一的概率就越高。如果 r(x,yw)r(x,yl)r(x, y_w) \gg r(x, y_l),偏好概率趋近于1;反之则趋近于0;若两者奖励相近,偏好概率约为0.5。

Bradley-Terry模型是DPO推导的第二个理论基础。它将隐式的人类偏好,映射为了一个可计算的概率表达式。

2.4 目标损失函数:将奖励参数化为策略

现在,将第 2.2 节的最优策略表达式代入 2.3 节的Bradley-Terry模型中。注意,配分函数 Z(x)Z(x) 在相减中完美抵消:

P(ywylx)=σ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))P(y_w \succ y_l \mid x) = \sigma\left( \beta \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right)

这个公式是DPO的核心方程。它的物理含义是:偏好概率可以直接由当前策略 πθ\pi_\theta 和参考策略 πref\pi_{\text{ref}} 的对数概率比来表示,完全不需要显式的奖励模型!

这个公式的直觉表明模型的偏好预测完全由以下机制决定:

  • 获胜回答 ywy_w,我们希望 πθ(ywx)πref(ywx)\pi_\theta(y_w|x) \gg \pi_{\text{ref}}(y_w|x)(模型相比参考模型,更倾向于生成这个好回答)
  • 落败回答 yly_l,我们希望 πθ(ylx)πref(ylx)\pi_\theta(y_l|x) \ll \pi_{\text{ref}}(y_l|x)(模型相比参考模型,更不倾向于生成这个坏回答)
  • 两者的比值差异越大,模型区分好坏的能力越强

于是,DPO的训练目标是最小化负对数似然损失

LDPO(πθ;πref)=E(x,yw,yl)D[logσ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))]\mathcal{L}_{\text{DPO}}(\pi_\theta; \pi_{\text{ref}}) = -\mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}} \left[ \log \sigma\left( \beta \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right) \right]

这个损失函数的直观理解:

  • 分子项 logπθ(ywx)πref(ywx)\log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)}:衡量当前模型生成“偏好回答”相比参考模型的相对概率提升
  • 分母项 logπθ(ylx)πref(ylx)\log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)}:衡量当前模型生成“被拒绝回答”相比参考模型的相对概率提升
  • 两者之差越大,说明模型越倾向于生成偏好回答而非被拒绝回答。
  • β\beta 控制着这个差异的缩放程度——β\beta越大,模型对偏好差异越敏感,优化会更快但可能牺牲多样性。
  • sigmoid + 负对数:将问题转化为一个标准的二元分类任务——模型要做的就是学会“区分”偏好和被拒绝的回答

损失函数的梯度分析:为了更深入理解DPO的优化行为,我们对损失函数关于策略参数 θ\theta 求梯度:

θLDPO=βE[σ(βΔ)(θlogπθ(ywx)θlogπθ(ylx))]\nabla_\theta \mathcal{L}_{\text{DPO}} = -\beta \cdot \mathbb{E}\left[ \sigma\left( \beta \cdot \Delta \right) \cdot \left( \nabla_\theta \log \pi_\theta(y_w|x) - \nabla_\theta \log \pi_\theta(y_l|x) \right) \right]

其中 Δ=logπθ(ywx)πref(ywx)logπθ(ylx)πref(ylx)\Delta = \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)}

梯度分析的关键分析:

  • Δ\Delta 很大(模型已经能很好地区分好/坏回答)时,σ(βΔ)0\sigma(\beta \cdot \Delta) \to 0,梯度趋于0——模型自动停止对已学会样本的过度优化,防止过拟合
  • Δ\Delta 很小(模型还无法区分)时,σ(βΔ)0.5\sigma(\beta \cdot \Delta) \approx 0.5,梯度最大——模型集中精力在困难样本上
  • 这种自适应加权机制是DPO的一大优势,使得训练过程更加稳定和高效

然而,梯度公式中也隐藏着一个重要问题:θlogπθ(ylx)\nabla_\theta \log \pi_\theta(y_l|x) 项的系数为负,意味着被拒绝回答的梯度方向是减大概率。当被拒绝回答本身在参考模型中有较高概率时,这个梯度信号会非常强,可能导致模型过度惩罚某些本来合理的回答。这正是DPO”被拒绝样本过度影响”问题的数学根源。

2.5 隐式奖励:语言模型内部的奖励编码

仔细观察上述公式,DPO虽然没有显式训练奖励模型,但它在训练过程中隐式地定义了一个奖励函数

rθ(x,y)=βlogπθ(yx)πref(yx)r_\theta(x, y) = \beta \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)}

这个隐式奖励有一个重要的自归一化特性:在任意输入 xx 下,所有可能的 yy 上的期望值 Eyπref[erθ(x,y)/β]=1\mathbb{E}_{y \sim \pi_{\text{ref}}}[e^{r_\theta(x,y)/\beta}] = 1,不需要像显式奖励模型那样额外做归一化处理。

这个隐式奖励函数衡量的是当前策略相比参考策略,在生成回答 yy 上的相对优势

  • 如果 πθ\pi_\theta 相比 πref\pi_{\text{ref}} 在生成 yy 上的概率提升了,则 rθ(x,y)>0r_\theta(x, y) > 0(奖励为正)
  • 如果 πθ\pi_\theta 相比 πref\pi_{\text{ref}} 在生成 yy 上的概率下降了,则 rθ(x,y)<0r_\theta(x, y) < 0(奖励为负)
  • 这正是论文标题的由来——策略模型本身就在隐式地编码一个奖励函数。它不需要额外训练,而是在偏好优化的过程中自然地涌现出来。

三、DPO的训练流程

3.1 训练流程步骤

  1. 数据准备:收集偏好数据集 D={(xi,ywi,yli)}i=1N\mathcal{D} = \{(x_i, y_w^i, y_l^i)\}_{i=1}^N,其中 xix_i 是输入提示,ywiy_w^i标注者偏好的回答,yliy_l^i被拒绝的回答。
  2. 参考模型加载:加载SFT模型作为 πref\pi_{\text{ref}},并在训练中冻结其参数
  3. 策略模型初始化:使用同样的SFT模型初始化 πθ\pi_\theta —— 这是DPO的一个重要设计——两个模型从同一状态出发。
  4. 前向计算:对每个样本 (x,yw,yl)(x, y_w, y_l),分别用 πθ\pi_\thetaπref\pi_{\text{ref}} 计算四个对数概率:
    • logπθ(ywx)\log \pi_\theta(y_w|x)logπθ(ylx)\log \pi_\theta(y_l|x)
    • logπref(ywx)\log \pi_{\text{ref}}(y_w|x)logπref(ylx)\log \pi_{\text{ref}}(y_l|x)
  5. 损失计算:代入DPO损失函数,计算标量损失值。
  6. 反向传播:仅更新 πθ\pi_\theta 的参数,πref\pi_{\text{ref}} 保持冻结
  7. 迭代:重复步骤4-6直到收敛。

关键细节

  • 使用mask机制:只计算回答部分的loss,忽略prompt部分的token
  • 标签平滑(Label Smoothing) :通常将偏好标签设为0.9/0.1而非1.0/0.0,以提高泛化性
  • 梯度裁剪:建议使用1.0的梯度裁剪范数,防止梯度爆炸

3.2 核心伪代码

import torch
import torch.nn.functional as F
from transformers import AutoModelForCausalLM
# ==================== 初始化阶段 ====================
# 1. 加载参考模型 (通常是SFT后的模型,冻结)
model_ref = AutoModelForCausalLM.from_pretrained("sft_model")
for param in model_ref.parameters():
param.requires_grad = False
# 2. 加载待训练的策略模型 (从SFT模型初始化)
model_policy = AutoModelForCausalLM.from_pretrained("sft_model")
# 3. 加载偏好数据集: (prompt, chosen_response, rejected_response)
# chosen_response: 人类偏好的回答
# rejected_response: 人类不偏好的回答
dataset = load_preference_data("my_preference_data.jsonl")
# 超参数
BETA = 0.1 # KL惩罚系数,控制隐式奖励的缩放
LEARNING_RATE = 5e-6
BATCH_SIZE = 32
optimizer = torch.optim.AdamW(model_policy.parameters(), lr=LEARNING_RATE)
# ==================== 训练循环 ====================
model_policy.train()
for epoch in range(num_epochs):
for batch in dataloader(dataset, batch_size=BATCH_SIZE):
prompts, chosen, rejected = batch
# ----- Step 1: 前向传播 -----
# 计算策略模型在偏好回答和被拒绝回答上的对数概率
policy_chosen_logps = model_policy(prompts, chosen).log_probs # shape: (B,)
policy_rejected_logps = model_policy(prompts, rejected).log_probs
# 计算参考模型在偏好回答和被拒绝回答上的对数概率 (冻结,无梯度)
with torch.no_grad():
ref_chosen_logps = model_ref(prompts, chosen).log_probs
ref_rejected_logps = model_ref(prompts, rejected).log_probs
# ----- Step 2: 计算DPO损失 -----
# 计算隐式奖励之差
implicit_chosen_reward = BETA * (policy_chosen_logps - ref_chosen_logps)
implicit_rejected_reward = BETA * (policy_rejected_logps - ref_rejected_logps)
reward_diff = implicit_chosen_reward - implicit_rejected_reward
# DPO损失: 负对数sigmoid
# loss = -log(sigmoid(reward_diff))
loss = -F.logsigmoid(reward_diff).mean()
# 可选: 添加一个正则化项,控制策略与参考模型的绝对偏离
# 这有助于缓解DPO的过拟合问题
# kl_regularization = BETA * (policy_chosen_logps - ref_chosen_logps).pow(2).mean()
# loss = loss + 0.01 * kl_regularization
# ----- Step 3: 反向传播与优化 -----
optimizer.zero_grad()
loss.backward()
# 梯度裁剪,防止梯度爆炸
torch.nn.utils.clip_grad_norm_(model_policy.parameters(), max_norm=1.0)
optimizer.step()
# 监控指标
if step % 100 == 0:
# 计算当前batch的准确率: 模型是否正确区分偏好回答
accuracy = (reward_diff > 0).float().mean()
print(f"Loss: {loss.item():.4f}, Acc: {accuracy.item():.2f}")
# ==================== 推理阶段 ====================
# 训练完成后,model_policy即可用于生成符合人类偏好的回答
model_policy.eval()
response = model_policy.generate(prompt)

要点总结

  1. 极简架构:训练循环中仅包含前向传播、损失计算、反向传播三步,与标准的有监督微调(SFT)无异。
  2. 离线训练:所有训练数据在训练开始前就已准备好,无需与环境交互采样,也无需动态生成数据
  3. 梯度流分析:损失的梯度会同时调整策略对 ywy_wyly_l 的概率——提升 ywy_w 的概率同时降低 yly_l 的概率,但来自 yly_l 的梯度往往占主导(这也是DPO梯度不平衡问题的根源)。
  4. 参考模型的作用:参考模型在整个训练过程中保持冻结,为策略模型提供了一个锚点防止策略在优化过程中偏离太远

四、DPO解决的问题与创新点

4.1 DPO解决的问题

  1. 解决了RLHF的工程复杂性:RLHF需要训练独立的奖励模型,再用PPO进行策略优化,流程复杂、超参数敏感。DPO将这一切压缩为一个简单的分类损失函数,只需前向和反向传播,无需采样、无需价值网络、无需裁剪。有估算表明,DPO相比RLHF可节省50-60%的计算成本
  2. 解决了训练不稳定的问题:PPO虽然通过裁剪机制保证了稳定性,但仍然面临奖励震荡、熵崩溃等问题。DPO从根本上避免了强化学习的不稳定性——它本质上是监督学习,优化过程平滑可预测
  3. 解决了超参数敏感的问题:PPO需要精细调优 ϵ\epsilonβ\betaλ\lambda、学习率等多个超参数。DPO的主要超参数仅有 β\beta 一个,对超参数的敏感性显著降低
  4. 实现了与RLHF理论上等价的目标:DPO并非一种“简化版”或“近似版”的RLHF。它在数学上隐式地优化了与RLHF完全相同的目标——带KL散度约束的奖励最大化。这意味着DPO在理论上与RLHF享有同样的优化目标,只是实现路径截然不同。

4.2 DPO的创新点

创新点说明
奖励模型参数化技巧通过数学推导将奖励函数表示为策略与参考模型的对数概率比,实现闭式求解,绕过了配分函数计算这一传统难题
从强化学习到监督学习的降维将RLHF的复杂优化问题转化为二元分类问题,大幅降低工程门槛和计算资源需求
隐式奖励机制策略模型本身成为奖励信号的载体,无需额外训练奖励模型,自然地编码了人类偏好
离线训练DPO完全基于静态的偏好数据集进行训练,无需在线采样,适用于无法与环境交互的场景
仅需两个模型相比PPO的四个模型,DPO只需Actor和Reference两个模型,显存占用减半

五、DPO的适用场景、优势与局限、演进方向

5.1 适应场景

  1. 资源受限的团队:算力和工程能力有限,无法支撑PPO的复杂流程。
  2. 快速迭代验证:需要快速测试偏好对齐效果,DPO的轻量级特性使其成为理想选择。
  3. 偏好明确的场景:当人类偏好相对明确、可以用成对数据充分表达时(如风格控制、安全性对齐)。
  4. 已有高质量偏好数据的场景:DPO的效果高度依赖数据质量,有现成高质量偏好数据时效率极高。
  5. 不需要细粒度奖励信号的场景:如果不需要为每个生成步骤提供精细的奖励反馈,DPO足够胜任。

5.2 核心优势

优势说明
极简高效将复杂的RLHF流程简化为一个损失函数,训练速度快、资源消耗低
训练稳定本质是监督学习,不存在强化学习的不稳定性问题
理论完备与RLHF优化相同的目标函数,有严格的数学证明
易于实现代码实现简单,门槛低,已被HuggingFace TRL等主流框架原生支持
保持基础能力在合适超参数下,DPO微调对模型的通用能力影响较小

5.3 核心局限

局限说明
依赖静态数据DPO是离线算法,无法像PPO那样在训练中动态采样、探索新策略,也无法利用在线交互的反馈
容易过拟合DPO往往会很快过拟合偏好数据集,尤其是在数据不够大或不够多样化时,导致泛化能力下降
对偏好数据质量高度敏感数据质量直接决定对齐效果,低质量数据(如标签噪声、偏见数据)会放大负面影响
梯度不平衡问题PPO对获胜和失败样本保持相对平衡的梯度更新,而DPO存在梯度不平衡——模型权重的更新不成比例地来自被拒绝样本,可能导致训练不稳定
缺乏细粒度控制DPO优化的是完整回答的偏好,缺乏提供token级别细粒度反馈的能力,在需要精细化控制的场景(如逐步推理)中表现不足
对初始化敏感研究表明DPO对模型初始化高度敏感,可能将概率质量意外地转移到无关或不良的回答上
长度偏差DPO倾向于生成更长的回答来“讨好”偏好信号,因为更长的回答往往有更高的累积对数概率

5.4 演进方向

  1. 问题一:过拟合与正则化不足。 DPO容易在偏好数据上过拟合,尤其是在数据规模有限时。这催生了IPO(Identity Preference Optimization)——在DPO基础上引入正则化项,通过显式的KL散度控制来避免模型快速过拟合,提高了鲁棒性。
  2. 问题二:成对数据的获取成本。 DPO依赖成对的“好-坏”对比数据,获取成本高,且存在标注者主观偏差。这催生了KTO(Kahneman-Tversky Optimization)——借鉴行为经济学的前景理论,仅需二元反馈(好或坏),无需成对数据,在标注成本上降低了50%。
  3. 问题三:长度偏差与生成质量。 DPO倾向于生成更长的回答来“讨好”偏好信号,因为更长的序列有更高的累积似然。这催生了SimPO——引入长度归一化机制,在保持偏好的同时控制生成长度,改善了生成质量。
  4. 问题四:被拒绝样本的过度影响。 DPO的梯度更新不成比例地来自被拒绝样本,这可能导致训练不稳定和策略坍缩。这催生了Bounded-DPO(BDPO)——在保持DPO优化结构的同时通过梯度裁剪机制限制被拒绝样本的影响。
  5. 问题五:单偏好维度。 DPO只能处理单一的偏好信号,无法同时优化多个目标(如有用性、安全性、有趣性)。未来的一个重要方向是将多目标优化纳入DPO框架,使其能够处理更复杂的对齐需求。

六、DPO vs PPO 系统性对比

维度PPODPO
模型数量4个(Actor + Critic + Reward + Reference)2个(Actor + Reference)
训练方式在线强化学习(需与环境交互采样)离线监督学习(静态数据集)
奖励信号显式奖励模型打分隐式奖励(策略-参考对数概率比)
超参数(ε, β, λ, lr, GAE参数等)(主要是β)
稳定性中等(需精细调优,有崩溃风险)(本质是监督学习,收敛平滑)
灵活性高(可动态探索、支持细粒度token级反馈)低(依赖静态数据,整体偏好优化)
样本效率中(在线采样成本高,但数据复用)高(离线数据可多次遍历)
计算成本极高(四模型显存+采样开销)(两模型,节省50-60%成本)
适用场景复杂需求、严格约束、对质量要求极高的场景快速验证、资源受限、偏好明确的场景
理论基础信任域策略优化隐式KL约束奖励最大化

Note

如果说PPO回答的是“如何在追求目标时保持稳定”的问题,那么DPO回答的则是一个更为根本的问题:我们能否绕过“先建模型再优化”的两步走,直接让模型从偏好中学习?

DPO通过一个精妙的数学推导给出了肯定的答案:

RLHF优化问题闭式解最优策略 ⇔ 奖励函数代入BT模型二元分类损失\boxed{\text{RLHF优化问题}} \xrightarrow{\text{闭式解}} \boxed{\text{最优策略 ⇔ 奖励函数}} \xrightarrow{\text{代入BT模型}} \boxed{\text{二元分类损失}}

这个推导过程将强化学习问题降维为监督学习问题,让大模型对齐从一个需要四模型协同、在线采样、精细调参的复杂工程,变成了一个只需两个模型、静态数据、简单交叉熵的训练流程。

DPO的出现,标志着大模型对齐领域的一个重要范式转变:从“用强化学习优化奖励”到“直接学习偏好”。它让更多团队能够以可承受的成本参与到模型对齐的实践中来,极大地推动了整个领域的发展。

然而,DPO并非万能灵药。它的离线特性、对数据质量的依赖、以及对复杂推理任务的局限,决定了它目前还无法完全取代PPO。

在实际工程中,PPO和DPO更像是一对互补的工具——PPO适合对质量要求极高、资源充足的场景(如顶尖闭源模型的最终对齐);DPO适合快速迭代、资源受限的场景(如开源模型的偏好微调、学术研究)。理解两者的本质差异和各自的适用边界,才是选择对齐方案的正确思路

DPO (Direct Preference Optimization) -- 直接偏好优化
/posts/ai_alignment/dpo/
Author
Zhang Haoyi
Published at
2026-07-06
License
CC BY-NC-SA 4.0
分享:

Some information may be outdated

Directory
Albums
Diary
Posts
Projects
Skills
Timeline
Categories
Tags
Table of Contents