DPO:Direct Preference Optimization
直接用 chosen/rejected 偏好对优化策略相对 reference 的概率差,不运行传统在线 RL 循环。
学习目标
- 从离线偏好对优化相对概率,避免将其描述成在线 MDP 采样算法。
- 独立复核“相对参考 margin 决定 DPO 偏好 logit”的输入、计算和解释。
- DPO 不要求标准在线采样循环或独立奖励模型。
为什么重要
从离线偏好对优化相对概率,避免将其描述成在线 MDP 采样算法。
学习前需要掌握
背景与问题
已有同一问题下的人类优选与拒绝回答时,可以直接提高相对偏好概率。DPO 利用带 KL 约束奖励优化的最优策略关系,把一类 RLHF 目标改写成偏好分类式损失,减少独立奖励模型和在线采样循环的需求。
概念定义
DPO 用当前策略与固定参考策略在优选、拒绝回答上的对数概率差,形成偏好 logit 并最小化负 log-sigmoid。标准训练输入是离线偏好对;它与在线 RL 有目标推导联系,但不应直接归入普通 on-policy 或 off-policy MDP 控制算法。
直观理解
不是要求绝对提高每份好答案的概率,而是要求相对参考策略,更偏向优选而不是拒绝答案。两条概率都变化时,真正起作用的是相对差距的变化。
核心原理
参考策略的优选与拒绝 log 概率都要扣除。若只用当前策略的差,就失去 DPO 中参考约束的目标含义。β 调节相对 logit 尺度,其影响需结合数据与优化过程,不能简化为任意训练下越大或越小越好。
序列对数概率通常由回答 token 的条件 log 概率求和,prompt 和 padding 掩码必须正确。长度归一化属于目标变体,会改变偏好关系的权重,不能默默平均后仍宣称与原式完全相同。
偏好数据可能有评审偏差、矛盾或覆盖不足。损失下降表示更符合已提供的比较,不保证事实性、安全性或未见问题质量;新策略生成的数据若再回流,应明确这是扩展的数据迭代流程。
数学表达
DPO loss
提高 chosen 相对 reference 的优势,并降低 rejected。
变量含义
y_wchosen response。y_lrejected response。π_ref冻结参考策略。β偏好间隔缩放/隐含 KL 强度相关参数。
计算步骤
- 1当前 margin 为 0.8,参考 margin 为 0.4。
- 2偏好 logit 为 0.1×(0.8−0.4)=0.04。
- 3单对损失为 −log sigmoid(0.04)≈0.673347;下方代码对两对取平均。
代码对应位置
示例 1DPO loss:chosen / rejected 与 reference 的对数概率差:根据 DPO 原论文目标计算一个偏好对损失,不训练 Reward Model、不采样在线轨迹。
变量解释
| 变量 | 含义 |
|---|---|
y_w | chosen response。 |
y_l | rejected response。 |
π_ref | 冻结参考策略。 |
β | 偏好间隔缩放/隐含 KL 强度相关参数。 |
完整数值示例
相对参考 margin 决定 DPO 偏好 logit
已知条件
- 当前优选和拒绝 log 概率为 −1.2、−2.0。
- 参考分别为 −1.4、−1.8,β=0.1。
计算步骤
- 当前 margin 为 0.8,参考 margin 为 0.4。
- 偏好 logit 为 0.1×(0.8−0.4)=0.04。
- 单对损失为 −log sigmoid(0.04)≈0.673347;下方代码对两对取平均。
计算结果
第一对的相对 logit 为 0.04;它比较的是相对参考的偏好变化。
处理前后对比
- DPO 不要求标准在线采样循环或独立奖励模型。
- 相同离线偏好对并不能提供任意未见回答的真实效用。
计算与实现步骤
- 准备 prompt/chosen/rejected
- 计算 policy 序列 log-prob
- 计算 reference log-prob
- 构造相对 margin
- log-sigmoid loss
- 离线优化并评测
代码实现
示例 1
DPO loss:chosen / rejected 与 reference 的对数概率差
example_01.py用途:根据 DPO 原论文目标计算一个偏好对损失,不训练 Reward Model、不采样在线轨迹。
import torch
import torch.nn.functional as F
beta = 0.1
policy_chosen = torch.tensor([-1.2, -0.8], requires_grad=True)
policy_rejected = torch.tensor([-2.0, -1.1], requires_grad=True)
reference_chosen = torch.tensor([-1.4, -0.9])
reference_rejected = torch.tensor([-1.8, -1.0])
policy_margin = policy_chosen - policy_rejected
reference_margin = reference_chosen - reference_rejected
logits = beta * (policy_margin - reference_margin)
loss = -F.logsigmoid(logits).mean()
loss.backward()
print('preference logits:', logits.detach())
print('DPO loss:', round(loss.item(), 4))代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
根据 DPO 原论文目标计算一个偏好对损失,不训练 Reward Model、不采样在线轨迹。
mean- 训练特征逐列均值。
loss- 当前预测与目标之间的损失值。
Step 1 · 1–2 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
import torch.nn.functional as FStep 2 · 4–8 行
策略偏好 margin 与 reference margin 的差经 beta 缩放。
beta = 0.1
policy_chosen = torch.tensor([-1.2, -0.8], requires_grad=True)
policy_rejected = torch.tensor([-2.0, -1.1], requires_grad=True)
reference_chosen = torch.tensor([-1.4, -0.9])
reference_rejected = torch.tensor([-1.8, -1.0])Step 3 · 10–16 行
只从训练数据逐列计算均值与标准差,对应标准化公式中的 μ 和 σ。
policy_margin = policy_chosen - policy_rejected
reference_margin = reference_chosen - reference_rejected
logits = beta * (policy_margin - reference_margin)
loss = -F.logsigmoid(logits).mean()
loss.backward()
print('preference logits:', logits.detach())
print('DPO loss:', round(loss.item(), 4))代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
平方误差代码对应均方损失。
预期输出或运行结果
preference logits: tensor([0.0400, 0.0200]) DPO loss: 0.6783
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 省略参考策略 margin,却仍称标准 DPO。
- 把 prompt 和 padding 的 token 误计入回答 log 概率。
- 把离线偏好损失下降等同于在线环境回报提高。
实际应用
- 序贯决策
- 控制与资源分配
常见错误
- 省略参考策略 margin,却仍称标准 DPO。
- 把 prompt 和 padding 的 token 误计入回答 log 概率。
- 把离线偏好损失下降等同于在线环境回报提高。
扩展内容说明
本页数值均为解释机制的构造案例,不能解读为真实训练或基准性能。定义和适用条件参见 Rafailov 等:Direct Preference Optimization: Your Language Model is Secretly a Reward Model。
算法属性与数据边界
目标函数
二分类式 DPO loss
Reference Policy
冻结 reference model
Reward Model
不显式训练独立 Reward Model
Preference Data
prompt + chosen + rejected 离线偏好对
KL 约束
通过相对 reference 的目标隐式体现
与 DQN、SAC 及相邻方法对照
- 不是传统在线 MDP RL
- 无需 rollout/replay buffer
- 高度依赖偏好数据覆盖与质量
失败模式、风险与性能
失败模式
- 省略参考策略 margin,却仍称标准 DPO。
- 把 prompt 和 padding 的 token 误计入回答 log 概率。
- 把离线偏好损失下降等同于在线环境回报提高。
风险
- 奖励函数与真实目标不一致会诱发奖励黑客。
- 部署策略的行动权限必须由环境和应用层约束。
性能考虑
- 样本效率、墙钟时间和显存占用需要分别报告。
- 应使用多个随机种子、置信区间和固定评测策略。
常见问题
DPO 是 on-policy 还是 off-policy RL?
标准 DPO 是离线偏好优化目标,不宜强行套入传统 MDP 采样分类。它的输入、目标和在线 PPO/GRPO 的生成评分循环不同。
网页是否会训练模型?
不会。所有图表使用固定种子或解析公式在浏览器本地计算,不执行页面中的示例代码。
推荐学习资料
Direct Preference Optimization
把带参考策略约束的偏好优化转写为直接训练 chosen/rejected 概率差的目标。
Rafailov et al. · arXiv / NeurIPS