跳转至

十六:强化学习:DPO 与 ORPO

来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484085&idx=1&sn=cfb4a319457e6d32867a791cbd925293&chksm=f01eb1ccc76938da97805b10bd46545585a979ff5a12f9aba3146bce72de727cc1998d2021c5#rd

1. 学习定位

前两天已经学习了传统 PPO、RLHF-PPO 和 GRPO。第十六天进入偏好优化中的另一条主线:DPO(Direct Preference Optimization)以及 ORPO(Odds Ratio Preference Optimization)。 DPO 的核心是:把带 KL 约束的 RLHF 最优策略形式代入偏好模型,直接得到一个二分类式的偏好损失。它不需要显式训练 reward model,也不需要 PPO 式在线采样和 value head。 本日知识链路:

RLHF-PPO:
  preference data -> reward model -> PPO optimize policy with KL

DPO:
  preference pair -> direct classification loss
  no explicit reward model
  no online RL rollout
  keep reference model in objective

ORPO:
  SFT NLL + odds-ratio preference loss
  no separate reference model
  monolithic alignment objective

2. 偏好数据格式

DPO 和 ORPO 通常使用 pairwise preference data:

(x, y_w, y_l)
其中: - x:prompt 或 instruction。

  • y_w:chosen / winner / preferred response。

  • y_l:rejected / loser / dispreferred response。

这类数据不要求给出绝对分数,只要求判断同一个 prompt 下两个回答哪个更好。它适合人类偏好标注,也适合 AI judge 或规则系统生成偏好对。

3. RLHF-PPO 回顾

标准 RLHF-PPO 通常包含三步:

1. SFT:
   用示范数据训练初始策略,让模型初步学会遵循人类指令输出规范文本,是后续 RM 与 PPO 的基准锚定模型。。

2. Reward Model:
   用偏好对训练 r_phi(x,y)。

3. PPO:
   maximize E[r_phi(x,y)] - beta KL(pi_theta || pi_ref)
它的主要成本和风险: - 需要训练 reward model。

  • 需要在线采样 response。

  • PPO 工程复杂,需要 value head、KL、advantage、mask。

  • reward model 可能被过度优化。

  • 训练稳定性依赖大量超参数。

DPO 的目标是绕开 reward model + PPO 的复杂链路。

4. KL 约束 RLHF 目标

DPO 从一个 KL 约束的 RLHF 目标出发:

maximize_pi E_{y ~ pi(.|x)}[r(x,y)]
  - beta KL(pi(.|x) || pi_ref(.|x))
其中: - r(x,y):真实或隐式 reward。

  • pi_ref:reference policy,通常是 SFT 模型。

  • beta:控制 policy 偏离 reference 的强度。

img

这个目标的最优策略满足:

pi*(y|x) = 1/Z(x) * pi_ref(y|x) * exp(r(x,y) / beta)
如何求解的笔者也懒得推了,感兴趣的可以研究研究。

img

这个公式的直观含义是:对于同一个提示词 x,最优模型生成某个回复 y 的概率,是在原始概率 pi_ref(y|x) 的基础上,乘以一个由奖励决定的放大系数 exp(r(x,y) / beta)。奖励越高,这个回复出现的概率就被放大得越多。 等价地:

r(x,y) = beta log[pi*(y|x) / pi_ref(y|x)] + beta log Z(x)

img

这是一个重大发现! 它意味着:所谓的“奖励得分”,其实就等价于新模型相对于旧模型,把这句话的生成概率提高了多少(即对数项)。如果你想给一句话打高分,其实也就是让新模型更倾向于说这句话。

DPO 的关键洞察是:偏好比较只需要 reward 差,log Z(x) 在同一个 prompt 下会抵消。如何消灭这个无法计算的Z(x)呢?考虑到提示词x固定的情况下,这一项其实就是一个固定值了: 在人类偏好数据集中,我们面对的通常是两条回答:一个是赢家(y_w),一个是输家(y_l)。 判断哪个更好,我们实际上只需要知道它们的奖励差值,而不是绝对值:

img

然后将前面的公式带入进去:

img

当将两者相减的时候,奇迹就发生了:因为提示词 x 是相同的,那个极其难算的 beta log Z(x) 被直接抵消掉了!

img

这段推导之所以被视为 DPO 的核心,是因为它从数学上证明了:我们根本不需要单独去拟合一个奖励函数 r(x,y)。我们只需要让目标语言模型 pi 在遇到“好回答”时,相对于参考模型提高其概率,在遇到“坏回答”时降低其概率,这个过程本身就是在隐式地、完美地最优化那个带约束的奖励目标。这彻底省去了传统 RLHF 中训练 Reward Model 和跑 PPO 强化学习的繁琐步骤。

5. Bradley-Terry 偏好模型

在偏好学习中,我们通常只有成对的比较数据(y_w 赢了 y_l),而不知道它们具体的绝对得分。Bradley-Terry 模型就是专门用来把“得分差”转换为“胜率(概率)”的经典统计学模型。 它的核心思想很简单:赢家战胜输家的概率,取决于两者的能力值(Reward)之差。差值越大,赢的概率越无限趋近于 100%。在神经网络中,我们通常用 Sigmoid 函数来实现这种映射:

P(y_w > y_l | x)
= sigmoid(r(x,y_w) - r(x,y_l))

img

此处进行偷梁换柱:代入“隐式奖励” 传统的 RLHF 会在这里放一个专门的 Reward Model 神经网络来输出 r。但在 DPO 中,我们在上一步已经证明了,当前语言模型 pi_theta 自己就可以隐式地表示这个 Reward:

r_theta(x,y)
= beta log[pi_theta(y|x) / pi_ref(y|x)] + const(x)

img

(这里的 $const(x)$ 就是上一节那个无法计算的 $\beta \log Z(x)$,因为 $x$ 固定,所以它是个常数)。

现在,我们把这个“隐式奖励”代入到 BT 模型要计算的奖励差值中,const(x)常数再次抵消:

r_theta(x,y_w) - r_theta(x,y_l)
= beta [
    log pi_theta(y_w|x) - log pi_ref(y_w|x)
    - log pi_theta(y_l|x) + log pi_ref(y_l|x)
  ]

img

整理得到:

img

这个差值就是 DPO 的核心 logit。 如何深入理解这个核心差值(Logit)? 为了更直观地理解这个公式到底在干什么,我们可以根据对数运算的性质,把它稍微重新组合一下:

img

这个形式极其优雅,它揭示了 DPO 优化的本质:

img

6. DPO 损失函数

前面两步我们通过复杂的推导,把传统的 RLHF 过程压缩成了一个“核心差值(Logit)”。现在,这段内容展示了如何把这个差值包装成一个标准的机器学习损失函数(Loss Function),从而让模型可以通过反向传播来学习。 DPO loss:

L_DPO(theta)
= - E_{(x,y_w,y_l)}
  log sigmoid(
    beta * [
      log pi_theta(y_w|x) - log pi_ref(y_w|x)
      - log pi_theta(y_l|x) + log pi_ref(y_l|x)
    ]
  )

img

更紧凑地写:

log_ratio_w = log pi_theta(y_w|x) - log pi_ref(y_w|x)
log_ratio_l = log pi_theta(y_l|x) - log pi_ref(y_l|x)

L_DPO = -log sigmoid(beta * (log_ratio_w - log_ratio_l))

img

直觉:

提高 chosen 相对 reference 的概率
降低 rejected 相对 reference 的概率
并通过 reference ratio 隐式控制偏离程度

7. DPO 中的 beta

beta 是 DPO 中最重要的超参数之一。它来自 KL 约束 RLHF 目标中的温度/正则强度。 直觉: - beta 大:偏好差异 logit 放大,训练更激进,可能偏离 reference 更明显。

  • beta 小:偏好信号变弱,训练更保守。

不同实现和论文解读中会从“inverse temperature”或“KL strength”的角度描述 beta。面试中要说明:beta 控制偏好优化强度和 reference 约束之间的权衡,具体效果需要结合 loss 写法和代码实现判断。

8. DPO 的训练流程

典型流程:

1. 准备 preference pairs: (prompt, chosen, rejected)
2. 加载 policy model pi_theta
3. 加载 frozen reference model pi_ref
4. 分别计算 chosen/rejected 的 sequence log probability
5. 计算 log_ratio_w 和 log_ratio_l
6. 计算 DPO loss
7. 反向传播更新 policy
8. reference model 保持冻结
不需要: - reward model 前向打分。

  • PPO rollout。

  • value head。

  • advantage/GAE。

  • 在线环境交互。

9. Sequence Log Probability

DPO 使用回答序列的 log probability:

log pi_theta(y|x)
= sum_t log pi_theta(y_t | x, y_<t)

img

工程上必须只对 response token 求和,不应把 prompt token 加入 loss。 常见做法:

logps = token_logps * response_mask
sequence_logp = logps.sum(dim=-1)
有些实现会使用长度归一化或平均 log probability,但经典 DPO 通常使用序列 log probability。是否归一化会影响长度偏置和优化行为。

10. DPO 与 SFT 的关系

SFT 对 chosen response 做最大似然:

L_SFT = -log pi_theta(y_w|x)
DPO 使用 chosen/rejected 对比:

chosen 相对 reference 应变高
rejected 相对 reference 应变低
SFT 只告诉模型“模仿这个答案”,DPO 还告诉模型“相对于另一个答案,这个更好”。因此 DPO 更适合利用偏好数据中的反例。

11. DPO 与 RLHF-PPO 对比

维度 RLHF-PPO DPO 数据使用 SFT 数据 + 偏好标注 +训练中在线实时采样新回答 仅离线人工偏好对(x,yw,yl),全程无在线生成采样 奖励模型 单独训练 RM,输出标量奖励打分 隐式奖励,由logπrefπθ等价表示,无独立 RM 参考模型πref 在 PPO 目标以外加 KL 正则项约束 内置在 loss 的对数比值里,天然完成 KL 约束效果 Value/Critic 头 标配 Critic 网络 + GAE 优势计算,PPO 必需 单模型训练,不需要 Value 分支 工程 & 调参 模块多:Actor+Critic+RM+KL+GAE,超参敏感、训练不稳定 训练流程≈SFT 微调,超参极少(主要β) 在线探索 每轮迭代从当前πθ采样新样本,具备在线探索、主动发现新输出的能力 纯离线监督式优化,没有在线探索 核心隐患 奖励黑客(Reward Hacking)、PPO 震荡、KL 系数难调 依赖偏好数据集质量,易出现长度偏置、偏好分布覆盖不全 DPO 简化了 RLHF,但也牺牲了在线探索和主动采样能力。

12. DPO 的隐式奖励

DPO 可以从 policy 和 reference 的 log ratio 中读出隐式 reward 差:

r_theta(x,y) = beta log pi_theta(y|x) / pi_ref(y|x) + const(x)

img

由于 const(x) 不可辨识,DPO 更自然地学习 reward difference,而不是绝对 reward。 这也是 DPO 论文标题中“language model is secretly a reward model”的含义:策略相对 reference 的 log ratio 可以被解释为隐式奖励。

13. DPO 的优点

DPO 的主要优点: - 实现简单,接近监督学习训练。

  • 不需要显式 reward model。

  • 不需要 PPO 的 rollout/value/advantage。

  • 训练稳定性通常好于 PPO。

  • 可直接使用离线偏好数据。

  • 很容易和 LoRA/QLoRA 等 PEFT 方法结合。

14. DPO 的局限

DPO 的局限: - 依赖偏好对质量。

  • 没有在线探索,难以发现数据外更优回答。

  • 对噪声偏好敏感。

  • 可能学习偏好数据中的长度、格式和风格偏置。

  • reference model 选择影响很大。

  • beta 和 log probability 长度处理会影响结果。

  • 多轮 Agent 或工具调用任务中,静态偏好对可能不足。

15. ORPO 的动机

在实际的大模型工程实践中,DPO 会暴露出一根软肋:显存开销极大。因为 DPO 要求在训练时,显存里必须同时存活着两个模型——正在更新权重的 Policy Model 和被冻结的 Reference Model。

此外,标准的 DPO 流程是“两步走”:先做一遍 SFT 教模型怎么说话,再做一遍 DPO 教模型符合偏好。 ORPO(Odds Ratio Preference Optimization)的破局思路(Monolithic Preference Optimization):既然 SFT 是最大化好回答的概率,偏好对齐是拉开好坏回答的概率差,为什么不把它们揉进同一个损失函数里,只用一个模型、一个阶段就搞定?这就是 ORPO 被称为“单体/一站式偏好优化”的原因。 DPO 通常需要:

policy model + frozen reference model + preference loss
ORPO 希望:

只训练一个 model
用 chosen 做 SFT
同时用 odds ratio 区分 chosen 和 rejected
它被称为 monolithic preference optimization,因为它把 instruction tuning 和 preference alignment 放进一个统一损失。

16. ORPO 损失结构

ORPO loss 通常由两部分构成:

L_ORPO = L_SFT + lambda * L_OR

img

SFT 部分:

L_SFT = -log pi_theta(y_w|x)

img

Odds-ratio preference 部分鼓励 chosen 的 odds 高于 rejected:

L_OR = -log sigmoid(log_odds_theta(y_w|x) - log_odds_theta(y_l|x))

img

其中Odds(赔率/胜率)的直觉是:

odds(y|x) = P_theta(y|x) / (1 - P_theta(y|x))

img

工程上会用序列 log probability 的稳定变形来计算,避免直接处理极小概率。

17. ORPO 与 DPO 的区别

比较维度DPO (直接偏好优化)ORPO (赔率比偏好优化)显存杀手 (Reference Model)🚨 必须有 (需要额外占用一倍模型显存)✅ 不需要 (单模型打天下)SFT (监督微调) 阶段通常作为前置阶段单独完成隐式融合,Loss 中直接包含了 SFT 项偏好对齐的标尺基于新旧模型的 Log-ratio 差值基于赢家输家自身生成概率的 Odds Ratio 差值训练范式两阶段 (SFT →DPO)单阶段 (直接吃偏好数据端到端训练)工程与理论风险超参数 beta 难调;Reference 模型如果不够强会带偏目标Odds 计算面临数值稳定挑战;需要仔细平衡 lambda (SFT与偏好的权重比)ORPO 的优势是流程简洁;DPO 的优势是理论上更直接来自 KL 约束 RLHF。

18. 实现细节

实现 DPO/ORPO 时需要注意: - chosen/rejected 必须对应同一个 prompt。

  • policy 和 reference 的 tokenizer、模板、padding 必须一致。

  • loss 只计算 response tokens。

  • prompt 部分不能进入 sequence log probability。

  • chosen/rejected 的长度差异可能引入偏置。

  • reference model 必须冻结。

  • DPO 中 chosen/rejected logps 要分别计算 policy 和 reference。

  • 使用 PEFT 时 reference 可能是 base model 或 disabled adapter 模式。

19. 常见误区

误区一:DPO 完全不需要 reference model。 经典 DPO loss 需要 reference model 的 log probability。ORPO 才是 reference-free。 误区二:DPO 等于 SFT。 DPO 是偏好对比损失,利用 chosen 和 rejected 的相对信息。 误区三:DPO 训练时需要 reward model。 DPO 不显式训练或调用 reward model,偏好信息直接进入 loss。 误区四:DPO 一定优于 RLHF-PPO。 DPO 更简单稳定,但在线探索能力弱;复杂交互任务仍可能需要 RL。 误区五:ORPO 只是 DPO 去掉 reference。 ORPO 是 SFT loss 加 odds-ratio preference loss,目标结构不同。

20. 核心总结

第十六天需要掌握的最小闭环:

DPO data:
  (prompt, chosen, rejected)

DPO implicit reward:
  r_theta(x,y) = beta log pi_theta(y|x) / pi_ref(y|x) + const

DPO loss:
  -log sigmoid(beta * [
    log pi_theta(chosen) - log pi_ref(chosen)
    - log pi_theta(rejected) + log pi_ref(rejected)
  ])

DPO removes:
  reward model
  PPO rollout
  value head

ORPO:
  SFT NLL + odds-ratio preference loss
  reference-free
  single-stage preference alignment

21. 参考资料

  • DPO 原论文:https://arxiv.org/abs/2305.18290

  • DPO 原理详解及公式推导:https://zhuanlan.zhihu.com/p/779691018

  • 模型调优(RLHF/DPO/ORPO):https://zhuanlan.zhihu.com/p/692594519

  • ORPO 原论文:https://arxiv.org/abs/2403.07691

  • Hugging Face TRL DPOTrainer 文档:https://huggingface.co/docs/trl/dpo_trainer

            预览时标签不可点
    

    <div class="