一、DPO的核心动机

DPO由Rafailov等人于2023年5月提出,旨在解决传统RLHF(基于PPO)的复杂性问题:

RLHF-PPO的痛点 DPO的解决方案
需要训练独立的奖励模型 无需奖励模型,直接从偏好数据学习
PPO训练不稳定(梯度爆炸、策略崩溃) 稳定的分类损失,类似SFT
需要在线采样(on-policy) 离线学习,直接使用偏好对
超参数敏感(学习率、KL系数等) 超参数少,主要调节β\beta
需加载4个模型(policy、ref、reward、critic) 只需2个模型(policy、ref)

核心洞察:语言模型本身可以隐式地作为奖励模型 。

二、DPO的数学推导

步骤1:RLHF的标准目标

RLHF的目标是找到最优策略π\pi^*,最大化期望奖励同时约束与参考策略πref\pi_{ref}的KL散度:

π=argmaxπExD,yπ(yx)[r(x,y)]βDKL[π(yx)πref(yx)]\pi^* = \arg\max_\pi \mathbb{E}_{x\sim D, y\sim\pi(y|x)}[r(x,y)] - \beta\mathbb{D}_{KL}[\pi(y|x) \| \pi_{ref}(y|x)]

其中β\beta控制偏离参考策略的程度。

步骤2:闭式解(关键突破)

上述约束优化问题有解析解

π(yx)=1Z(x)πref(yx)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)

其中Z(x)=yπref(yx)exp(1βr(x,y))Z(x) = \sum_y \pi_{ref}(y|x) \exp\left(\frac{1}{\beta}r(x,y)\right)是配分函数。

步骤3:奖励重参数化

将闭式解变形,用策略表示奖励

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

关键观察:在偏好比较中,配分函数Z(x)Z(x)会被消去(因为两个回答的Z(x)Z(x)相同)。

步骤4:代入Bradley-Terry模型

人类偏好概率的Bradley-Terry模型:

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

将重参数化的奖励代入:

P(ywylx)=σ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))P(y_w \succ y_l | x) = \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)

步骤5:DPO损失函数

对偏好数据D={(x,yw,yl)}\mathcal{D} = \{(x, y_w, y_l)\}取负对数似然:

LDPO(θ)=E(x,yw,yl)D[logσ(β(logπθ(ywx)πref(ywx)logπθ(ylx)πref(ylx)))]\mathcal{L}_{DPO}(\theta) = -\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}}\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]

简化形式

LDPO(θ)=logσ(β(logπθ(ywx)πθ(ylx)策略相对偏好logπref(ywx)πref(ylx)参考相对偏好))\mathcal{L}_{DPO}(\theta) = -\log\sigma\left(\beta \left(\underbrace{\log\frac{\pi_\theta(y_w|x)}{\pi_\theta(y_l|x)}}_{\text{策略相对偏好}} - \underbrace{\log\frac{\pi_{ref}(y_w|x)}{\pi_{ref}(y_l|x)}}_{\text{参考相对偏好}}\right)\right)


三、DPO的直观理解

损失函数的三重作用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def dpo_loss(policy_chosen_logps, policy_rejected_logps,
reference_chosen_logps, reference_rejected_logps, beta=0.1):
# 1. 计算策略的log概率差(chosen - rejected)
policy_logratios = policy_chosen_logps - policy_rejected_logps

# 2. 计算参考模型的log概率差
reference_logratios = reference_chosen_logps - reference_rejected_logps

# 3. 隐式奖励差 = 策略改进 - 参考基准
logits = policy_logratios - reference_logratios

# 4. 目标:让logits > 0,即策略比参考模型更偏好chosen
losses = -F.logsigmoid(beta * logits)
return losses.mean()

训练动态

  • 增加 chosen回答的生成概率
  • 降低 rejected回答的生成概率
  • 约束:不能偏离参考模型太远(通过β 和参考logits实现)

隐式奖励模型

DPO实际上学习了一个隐式奖励函数

rimplicit(x,y)=βlogπθ(yx)πref(yx)r_{implicit}(x,y)=β \log \frac{π_θ(y∣x)}{π_{ref}(y∣x)}

这与显式奖励模型不同,它直接由策略和参考策略的比率定义,无需单独训练。


四、DPO vs PPO 对比

维度 DPO PPO (RLHF)
训练稳定性 ⭐⭐⭐ 高(分类损失) ⭐⭐ 中(RL不稳定)
计算效率 ⭐⭐⭐ 只需2个模型 ⭐ 需4个模型
实现复杂度 ⭐⭐⭐ 简单(几行代码) ⭐⭐ 复杂
样本效率 ⭐⭐ 离线数据 ⭐⭐⭐ 在线采样
长文本/复杂任务 ⭐⭐ 可能过拟合 ⭐⭐⭐ 通常更好
超参数敏感度 ⭐⭐⭐ 低 ⭐ 高

适用场景

  • DPO:快速对齐、资源受限、对话/摘要等开放域任务
  • PPO:代码生成、数学推理等需要精细优化的任务

五、关键超参数与调优

β(温度/正则化系数)

β 效果 适用场景
(如0.5) 强约束,接近参考模型,安全但保守 防止模型崩溃、保持多样性
(如0.1-0.2) 平衡对齐强度和稳定性 通用场景
(如0.01) 弱约束,强烈优化偏好,易过拟合 数据质量极高时

调优建议

  • β=0.1 开始
  • 观察训练曲线:若chosen/rejected概率差迅速饱和到1,减小β
  • 若模型输出多样性下降明显,增大β

六、DPO的局限与改进

主要问题

  1. 分布偏移敏感:DPO是离线算法,对训练数据与参考模型输出的分布差异敏感
  2. 过拟合风险:容易过拟合到训练偏好对,泛化能力受限
  3. 长序列优化难:句子级损失难以捕捉token级细粒度信号
  4. 模式坍塌(Mode Collapse):可能收敛到狭窄的高奖励区域,丧失多样性

改进变体

方法 改进点 核心思想
IPO 解决过拟合 添加正则化约束,防止偏好分数过大
KTO 数据效率 只需二元反馈(好/坏),无需成对偏好
TDPO 细粒度优化 Token级DPO,控制每步KL散度
Online DPO 分布偏移 迭代生成新偏好对,在线学习
RTO 结合PPO优势 DPO提取token级奖励 + PPO优化

七、实践指南(HuggingFace TRL)

基础配置

Python

复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from trl import DPOTrainer, DPOConfig
from peft import LoraConfig

# LoRA配置(可选但推荐)
peft_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)

# DPO训练配置
training_args = DPOConfig(
output_dir="./dpo_output",
beta=0.1, # 关键超参数
learning_rate=5e-7, # 通常比SFT低
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
num_train_epochs=1,
logging_steps=10,
# 参考模型通过禁用adapter自动获得(PEFT场景)
)

trainer = DPOTrainer(
model=model, # 带adapter的模型
ref_model=None, # PEFT时自动使用base模型
args=training_args,
train_dataset=dataset,
tokenizer=tokenizer,
peft_config=peft_config,
)

trainer.train()

数据格式

Python

复制

1
2
3
4
5
6
# 必需字段
{
"prompt": "人类指令...",
"chosen": "优质回答...", # 偏好的回答
"rejected": "劣质回答..." # 非偏好的回答
}

八、面试核心要点

“DPO为什么不需要奖励模型?”

“DPO通过数学推导发现,RLHF的最优策略有闭式解,可以将奖励表示为策略与参考策略的对数比率。代入Bradley-Terry偏好模型后,配分函数Z(x) 被消去,得到仅依赖策略和参考模型的损失函数,因此无需显式训练奖励模型。”

“DPO的loss推导关键步骤?”

“1) 写出KL约束的奖励最大化目标;2) 求变分得到最优策略的闭式解;3) 反解出奖励的参数化形式;4) 代入Bradley-Terry模型;5) 取负对数似然得到DPO损失。”

“DPO vs PPO的选择?”

“DPO适合快速对齐和资源受限场景,实现简单稳定;PPO适合复杂任务和长序列优化。实践中可先用DPO做基础对齐,再用PPO或Online DPO进一步提升。”

“DPO的*β* 参数作用?”

β 控制与参考模型的KL散度惩罚强度。β 越大,策略越接近参考模型,多样性高但对齐弱;β 越小,对齐强但易过拟合。通常设为0.1,需根据数据质量和任务调整。”


九、总结

DPO代表了RLHF范式的重大简化,通过奖励重参数化技巧将复杂的强化学习问题转化为稳定的分类问题。其核心优势在于理论优雅、实现简单、训练稳定,但需注意分布偏移和过拟合问题。当前研究趋势是结合DPO的隐式奖励建模与在线学习(如Online DPO、RTO),以兼顾效率与性能。