DPO 为什么能绕开奖励模型?和 RLHF/PPO 比有什么取舍?

Q4-02偏好对齐常见DPORLHFPPO奖励模型偏好对齐KL

谁在问:有算法背景的面试官(二面居多);做过对齐或训练的技术负责人;从 Q4-01 自然追问下来

口语化问法

  • DPO 为什么不用训奖励模型?它凭什么能直接优化?
  • RLHF 和 DPO 你会怎么选?各自的适用场景是什么?
  • 既然 DPO 这么简单,为什么还有人用 PPO?

考察意图

  1. 是不是只知道结论。"DPO 不用奖励模型"这句话人人会说,面试官要的是它凭什么可以不用——能不能说清那个数学观察。
  2. 能不能说出代价。这是本项目"进阶技术三段式"的典型考点:解决什么、代价是什么、什么时候不该用。只说好处的回答一律判为读过没做过。
  3. 有没有真跑过 DPO。真跑过的人会主动提两件事:β 怎么调、以及训练中似然一起下降的现象。

参考答案

图 2 · 60 分与 90 分差在哪:代价、演进、怎么验证

60

60 分答案(及格线)

RLHF 的流程是:先用人类偏好对训一个奖励模型 RM,再用 PPO 让策略去最大化 RM 的打分,同时加 KL 惩罚防止模型跑离参考模型太远。

DPO 的洞察是:这个"最大化奖励 + KL 惩罚"的优化目标,它的最优策略和奖励函数之间有一个闭式的对应关系。既然奖励函数可以用策略本身表达出来,就能把它代入偏好损失里消掉,于是不再需要单独训一个奖励模型,直接在偏好对上算一个损失函数就行。

取舍是:DPO 工程上简单很多——不训 RM、不做在线采样、显存里只要策略和参考两个模型,训练形态和 SFT 一样。但它是离线的,数据固定不随策略更新重采样,理论上不如 PPO 灵活。

说清了原理和主要取舍,及格。但"理论上不如 PPO 灵活"是一句正确的废话,没有落到可观察的现象上,往下追会散。

90

90 分答案(有生产经验的回答)

为什么能绕开: RLHF 的目标函数是"最大化 RM 打分,减去 β 倍的 KL 惩罚"。这个带 KL 约束的最优化问题有解析解——最优策略正比于 π_ref × exp(reward / β)。把它反解,奖励可以写成策略与参考策略的对数比再乘 β。既然奖励能被策略表达,就把它代进 Bradley-Terry 偏好损失,奖励项自己消掉了,剩下一个只含策略和参考策略的普通损失:

def dpo_loss(x, y_win, y_lose, beta):
    delta_w = logprob(pi_theta, x, y_win)  - logprob(pi_ref, x, y_win)
    delta_l = logprob(pi_theta, x, y_lose) - logprob(pi_ref, x, y_lose)
    return -log_sigmoid(beta * (delta_w - delta_l))

人话:让"当前模型相对参考模型更偏爱 win 而非 lose"这件事的对数几率变大。 β 就是原来那个 KL 系数,控制允许离参考模型跑多远——它没消失,只是从约束项变成了损失里的温度。

省下了什么: 训练时显存从四个模型(策略 / 参考 / 奖励 / critic)降到两个(策略 / 参考);不需要在线采样;不需要维护一条 RM 的训练与评估流水线;也就不再有 RM 被 reward hacking 的那类失败模式。工程复杂度差了一个数量级。

赔上了什么,三条:

  1. 离线。 偏好数据是训练前采好的,不随策略更新重新采样。训到后期,模型已经不产出那些样本了,你还在用它们学,出现分布偏移。表现是训练后期指标继续"改善"但线上没有对应提升。
  2. 对数据的系统性偏置极度敏感。 RLHF 至少还隔着一个奖励模型做泛化,DPO 是把偏好对直接怼进损失。标注里任何系统性倾向都会被原样学走。我们踩过:标注员在判准不明时系统性偏好短答案,chosen 比 rejected 平均短 40%,训完模型学到的是"更短"而不是"更好",复杂问题开始敷衍。现在偏好数据的长度与格式分布体检是我们开训前的固定检查项。
  3. 常见的似然一起下降现象。 DPO 在拉开 win/lose 差距的同时,往往把两者的对数似然一起压低——它只保证相对差距,不保证 chosen 的绝对概率不掉。表现为模型整体变得保守、更容易拒答、回答变短。这是训练曲线上能直接看到的:logp(chosen) 在降。看不看这条曲线,是跑没跑过 DPO 的分界。

什么时候不该用 DPO: 偏好数据是众包来的且没做过一致性检查时;需要在线纠偏、想让模型在自己新产出的分布上持续被修正时(这是 PPO 还活着的主要场景);以及你真正想要的是能力提升而不是风格取舍时——DPO 不会让模型做出一道它原本做不出来的题。

我的选型口径: 有稳定标注流水线 + 专职训练团队 + 需要在线纠偏 → PPO;只有一批离线偏好对、想快速拿到风格与安全上的收益 → DPO;任务能写出自动判分器 → 别在这层纠结,直接上 GRPO 那一档。

追问链

图 1 · 五层追问树:面试官会往哪儿挖
五问全绕着同一件事:DPO 省掉的那一块,代价记在哪

  1. 写一下 DPO 的损失,β 在控制什么?调大调小会怎样?

    期望-log_sigmoid(β·(Δ_w − Δ_l))Δ = logp_θ − logp_refβ 就是 KL 系数的化身,管允许离参考模型多远。β 太小约束松,为拉开偏好差距会大幅偏离参考模型、崩坏基础能力;β 太大训了等于没训。先用 0.1 量级默认值跑通,再上验证集扫
    信号写不出损失但能讲清「β 是原来的 KL 系数」→ 理解到位;既写不出也说不出 β 作用 → 只读过摘要
  2. 「离线」具体会带来什么可观察的问题?

    期望分布偏移:训练数据来自采样当时的策略,策略一更新就与当前产出分布脱节。可观察现象是训练损失继续降、离线偏好准确率继续升,线上人工评测不再改善。缓解是迭代式 DPO —— 用当前策略重新采样、重新标注,做几轮
    信号说出「迭代式 DPO / 多轮重采样」这个缓解方向 → 跟过实践;只会重复「离线不如在线灵活」→ 背的
  3. 训练中 logp(chosen) 也在下降,正常吗?要不要停?

    期望是 DPO 的已知现象不是 bug —— 损失只约束相对差距,不保证 chosen 概率不掉。但要盯:拒答率上升、长度骤降、通用评测掉点 → 就是过头了。缓解:调大 β → 混入 SFT 损失项(chosen 的交叉熵)→ 减训练步数 → 查数据里有没有退化的 rejected
    信号本题最锋利的一刀:没跑过的几乎必然答「训练有问题该停」→ 没跑过 DPO;跑过的先问「拒答率涨没涨」
  4. 什么情况下你会放弃 DPO 回到 PPO?

    期望需要在线纠偏(产出漂移快、离线数据快速失效);有稠密奖励信号可用;有人力维护 RM 的训练与监控;对效果上限的要求高于对工程成本的敏感度。反过来只想拿风格与安全上的收益,回 PPO 就是过度投资
    信号说出「拿工程复杂度换在线纠偏能力」→ 有取舍意识;答「PPO 效果更好所以都该用 PPO」→ 没有成本概念
  5. DPO 上线后拒答率涨了 8 个点,业务方要 24 小时内给方案,你怎么排查、止血、定根因?

    期望止血优先于根因:先回滚 checkpoint 或切流量 → 切开两侧:手工构造「应该回答」的样本直接打模型、绕开上层护栏 → 模型侧查 logp(chosen) 是否在降、rejected 里是否混了大量拒答、β 太小步数太多 → 修复取最小改动:回滚中间 checkpoint 早停 → 调大 β 重训 → 加 SFT 项。别第一反应重标数据,那是周级动作
    信号第一句是「我先分析根因」→ 没扛过线上;把回滚放第一位、并复用「构造样本绕开上层链路」→ 真处理过事故
logp(chosen) 在降算不算 bug,一句话就把「读过 DPO」和「跑过 DPO」切开 —— 第 3 层是分水岭;第 5 层换的是考法,看你把止血排在根因前面还是后面。

评分要点

  1. 能说清"最优策略与奖励函数有闭式对应"这个核心观察,而不只是"DPO 不需要 RM"
  2. 知道 β 就是原来的 KL 系数,能说出调大调小的后果
  3. 能说出至少两条 DPO 的代价(离线/分布偏移、数据偏置敏感、似然一起下降)
  4. 知道 DPO 训练只需策略 + 参考两个模型,RLHF 需要四个
  5. 能给出"什么时候不该用 DPO"的反向判断
  6. (加分)知道似然一起下降是已知现象而非 bug
  7. (加分)知道迭代式 DPO 是缓解离线问题的方向
  8. (加分)压力分支里把回滚放在根因分析之前

常见错误

"DPO 就是简化版 RLHF"只说了结论没说机制。追问"凭什么能简化"即见底。
"DPO 不需要奖励模型,所以更好"单边论证,没有代价。违反本项目"进阶技术三段式"的基本要求。
"β 是学习率相关的参数"概念混淆。β 是 KL 系数,与学习率无关。
"DPO 是离线的,所以效果不如 PPO"把"离线"当结论用,说不出离线导致的可观察现象(训练指标涨、线上不涨)。含糊回答的典型形态:用术语代替现象。
"训练中似然下降说明数据有问题"误判已知现象为 bug,暴露没跑过。
"我们用 DPO 提升了模型的推理能力"方向性错误。偏好对齐不长能力。
全程不提数据从哪来、几条、谁标的工程岗的重要减分项。DPO 的成败八成在数据。

关联学习