深蓝黑背景封面。左侧自上而下列出 RLHF 的三步流程卡片:第一步「SFT 监督微调」正常显示;第二步「训练奖励模型 RM」标注「需要成对偏好标注」;第三步「PPO 强化学习」以灰色弱化并打叉,标注「采样加价值网络,训练不稳、开销大」。下方一条青色直通箭头连接高亮卡片「DPO:偏好对直接闭式优化」,注「省掉奖励模型与 PPO 两个阶段」。右侧大标题「DPO 为什么能成为 RLHF 的替代方案」,副标题「绕过奖励模型与 PPO,直接优化偏好数据」。左上标注「面试经典 · 偏好对齐」,右上圆角胶囊标注「Day 07 · 11-24」。 图 1:DPO 把三步流程折成一条直通路线。

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料整理,与任何公司的当前招聘无关。DPO 是大模型对齐方向的高频考点,面试官真正想听的往往不是「DPO 不用强化学习」这句结论,而是它凭什么可以不要、又付出了什么代价。

先看清 RLHF 原本要走的三步。

2022 年的 InstructGPT 论文确立了经典的三段式流程:先在基座模型上做监督微调(SFT);再收集标注员对多个回答的排序数据,训练一个奖励模型(RM)来模仿人类偏好打分;最后用 PPO 强化学习,让策略模型在「奖励最大化」和「不偏离参考模型太远」之间做更新。

这条链路的工程痛点很具体。PPO 阶段内存里要同时挂着策略模型、参考模型、奖励模型、价值网络四个大块头;每一步都要让策略模型在线采样生成回答,再交给奖励模型打分,采样本身又贵又不稳;价值网络的收敛、KL 系数的调校,每一项都是调参坑。奖励模型本身还是偏好数据的近似,策略模型会钻它误差的空子——分数越刷越高,回答质量却在劣化,这就是常说的奖励黑客。

DPO 的关键观察:奖励模型可以被「绕过去」。

2023 年的 DPO 论文从 RLHF 的优化目标出发做了两步代数变形。第一,给定奖励函数时,这个目标的最优策略可以用参考策略和奖励闭式地写出来;第二,把这个关系反过来用,奖励就可以用「策略与参考模型的对数概率比」来表达。把这个表达代入偏好对的概率模型,奖励模型整个消掉了,剩下的损失里只有策略模型自己和冻结的参考模型。

最终得到的损失函数简洁得不像强化学习:

L = -log σ( β · [ (log π(chosen) - log πref(chosen)) - (log π(rejected) - log πref(rejected)) ] )

其中 σ 是 sigmoid,π 是待训练的策略,πref 是 SFT 后冻结的参考模型,β 控制偏离参考模型的强度。它的形状就是一个二分类损失:让策略相对参考模型在 chosen 回答上的对数概率提升得比 rejected 多。差距拉得越开,sigmoid 越接近 1,损失越低。

用一组数字直观感受一下。

下面这段代码用 Node.js 22.15.0 直接运行(node dpo.js),模拟训练中策略对数概率变化对损失的影响:

function dpoLoss(beta, ref, cur) {
  // chosen 是被偏好的回答,rejected 是被拒绝的回答
  const margin = (cur.chosen - ref.chosen) - (cur.rejected - ref.rejected);
  return -Math.log(1 / (1 + Math.exp(-beta * margin))); // -log sigmoid
}
const beta = 0.1;
const ref = { chosen: -3.0, rejected: -3.5 };      // 冻结的参考模型
const cases = [
  ["起点(策略=参考)", { chosen: -3.0, rejected: -3.5 }],
  ["训练一段后",        { chosen: -2.8, rejected: -3.7 }],
  ["训练更久",          { chosen: -2.2, rejected: -4.5 }],
  ["方向走反",          { chosen: -3.8, rejected: -2.6 }],
];
for (const [name, cur] of cases)
  console.log(`${name}: loss = ${dpoLoss(beta, ref, cur).toFixed(4)}`);

实测输出:

起点(策略=参考): loss = 0.6931
训练一段后: loss = 0.6733
训练更久: loss = 0.6072
方向走反: loss = 0.7818

起点时 margin 为 0,损失恰好是 ln 2 ≈ 0.693;chosen 与 rejected 的差距拉开后损失稳步下降;一旦策略反而偏爱 rejected,损失立刻被推高。整个训练就是普通的梯度下降,没有采样、没有价值网络、没有奖励模型。

深蓝黑背景概念图。上方横排 RLHF 管线:卡片「偏好对数据」经箭头到「训练奖励模型 RM」,再到「PPO 在线采样更新策略」,后两张卡片以灰色弱化并分别标注「RM 有误差,会被策略钻空子」和「采样加价值网络,显存与调参成本高」。中间一条标注带写「DPO 的关键观察:最优策略可以用偏好数据闭式表达,不必显式学奖励」。下方横排 DPO 管线:「偏好对 chosen / rejected」经青色箭头到高亮卡片「闭式对比损失」,再到「直接更新策略」,卡片注「让 chosen 的相对概率上升、rejected 下降」。底部总结条:省下奖励模型训练与 PPO 采样循环,训练更稳、成本更低;代价是没有在线探索,效果上限取决于偏好数据质量与覆盖度。 图 2:两条管线用同一批偏好数据,DPO 省掉了中间的奖励模型。

省掉了什么,又付出了什么。

省掉的东西很实在:不用再训练一个独立的奖励模型,不用 PPO 的在线采样循环,训练过程从「四个模型互相配合」退化成「一份偏好数据 + 一次监督式微调」,稳定性和可复现性都上一个台阶,论文实验也显示在摘要和单轮对话上质量不输甚至优于 PPO 路线。

代价同样要说清。第一,DPO 完全没有在线探索——它只能从已有的偏好对里学,效果上限被偏好数据的质量和覆盖度锁死,数据没覆盖到的行为它无从纠正。第二,没有显式的奖励模型,就少了一个独立工具:想对多个候选回答做打分重排、想在推理时做 best-of-n 筛选,DPO 路线给不了现成的评分器。第三,偏好对里 chosen 和 rejected 往往来自旧策略的分布,当策略更新走远后,数据代表性会打折。

回到面试现场,建议的答题结构:先复述 RLHF 三步流程与各自的角色,再点出 DPO 的闭式观察——最优策略可以用偏好数据直接表达,奖励模型因此可以被消去,给出损失函数的直观含义「拉大 chosen 相对 rejected 的对数概率差」,最后主动补上代价:无在线探索、上限取决于数据、没有独立奖励模型可用。答出「不用强化学习」只是及格线,讲清这条等式为什么成立、什么场景该退回 RLHF,才是区分度所在。你所在的团队做偏好对齐时选的是哪条路线?有没有踩过偏好数据覆盖度不够的坑?欢迎聊聊。