DPO 家族 本节摘要:Rafailov 等(2023)证明 RLHF 的最优解关于偏好数据有一个闭式表达,于是你可以跳过显式奖励模型、直接对策略做优化。这个洞察催生了一整个家族——IPO、KTO、SimPO、ORPO、BPO——每一名成员都在修补 DPO 的某一种失败模式。到 2026 年,直接对齐算法(Direct Alignment Algorithms, DAA)在前沿后训练中的出货量已超过 PPO。但是,第 02 节的过优化曲线依然成立:DAA 没有逃出古德哈特定律,它只是把裂口咬下的位置,从「奖励模型被过优化」挪到了「参考策略比值被过优化」。本节带你逐一推导六种损失,看清它们各自修补的是什么、共享的又是什么。
本节摘要:Rafailov 等(2023)证明 RLHF 的最优解关于偏好数据有一个闭式表达,于是你可以跳过显式奖励模型、直接对策略做优化。这个洞察催生了一整个家族——IPO、KTO、SimPO、ORPO、BPO——每一名成员都在修补 DPO 的某一种失败模式。到 2026 年,直接对齐算法(Direct Alignment Algorithms, DAA)在前沿后训练中的出货量已超过 PPO。但是,第 02 节的过优化曲线依然成立:DAA 没有逃出古德哈特定律,它只是把裂口咬下的位置,从「奖励模型被过优化」挪到了「参考策略比值被过优化」。本节带你逐一推导六种损失,看清它们各自修补的是什么、共享的又是什么。
对应原课程:Phase 18 · Lesson 03 ·
direct-preference-optimization-family(原英文phases/18-ethics-safety-alignment/03-direct-preference-optimization-family/docs/en.md)。前置:Phase 18 · 01、02,Phase 10 · 08。
阅读完本节,你应当能够:
第 01 节的 RLHF 目标:
max_pi E[ r(x, y) ] - beta * KL( pi || pi_ref )
有已知最优解:
pi*(y|x) = (1/Z(x)) * 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)
把这个表达式代入 Bradley-Terry 偏好似然,配分函数 Z(x) 因为只依赖 x 而被消掉。剩下的就是一个只含策略参数的损失——不需要奖励模型。这就是 DPO。
这道推导有个 wrinkle:它假设最优可达、偏好数据分布内、参考策略是真模式锚点。这三条没有一条严格成立。家族里每一名成员,都在修补一个被违反的假设。
L_DPO = -log sigmoid( beta * log( pi(y_w|x) / pi_ref(y_w|x) ) - beta * log( pi(y_l|x) / pi_ref(y_l|x) ) )
会出什么问题:
beta * (log(pi/pi_ref)_w - log(pi/pi_ref)_l) 无界——一丝微弱偏好也能产生任意大的裂口。def dpo_loss(policy, pi_ref, x, y_w, y_l, beta): log_rw = log_ratio(policy, pi_ref, x, y_w) log_rl = log_ratio(policy, pi_ref, x, y_l) return -log_sigmoid(beta * (log_rw - log_rl)) # 注意:无界
Identity Preference Optimization 把 log-sigmoid 换成对偏好概率的恒等映射,损失变成对一个有界目标的平方误差:
L_IPO = ( log(pi(y_w|x)/pi_ref(y_w|x)) - log(pi(y_l|x)/pi_ref(y_l|x)) - 1/(2*beta) )^2
间隔被 1/(2*beta) 钳住。偏好强度与隐式奖励差成正比,不再爆炸。
Kahneman-Tversky Optimization 彻底放弃成对结构。给定单个带标签输出和一个二元「理想/不理想」信号,映射到前景理论效用:
v(x, y) = sigma( beta * log(pi(y|x) / pi_ref(y|x)) - z_ref )
收益与损失用不同权重(损失厌恶)。好处:可以用非配对数据,而这类数据要丰富得多。
Simple Preference Optimization 把训练信号与生成对齐——完全移除参考策略,并对对数似然做长度归一:
L_SimPO = -log sigmoid( (beta/|y_w|) * log pi(y_w|x) - (beta/|y_l|) * log pi(y_l|x) - gamma )
gamma 是稳定用的间隔。长度归一消除了 DPO 长度偏置失败模式的诱因(更长的 y_w 按构造产生更大的对数概率裂口)。
Odds-Ratio Preference Optimization 在标准 SFT 负对数似然上加一个偏好项:
L_ORPO = L_NLL(y_w) + lambda * L_OR L_OR = -log sigmoid( log( odds(y_w) / odds(y_l) ) )
无参考策略——SFT 项本身就是正则。从基座模型到对齐模型单阶段训练,无需单独的 SFT 检查点。
针对 Degraded Chosen Responses 问题:DPO 保持了 y_w > y_l 的排序,但 y_w 的绝对对数概率可能掉。BPO 加了一行修正,惩罚 chosen 响应的下行。在 Llama-3.1-8B-Instruct 上,数学推理比 DPO 高 +10.1% 准确率。
Rafailov 等《Scaling Laws for Reward Model Overoptimization in Direct Alignment Algorithms》(NeurIPS 2024)在多个数据集、多个 KL 预算下用 DPO、IPO、SLiC 训练策略。真金奖励-KL 曲线呈现和 Gao 等一模一样的峰后塌。隐式奖励在训练中查询分布外样本,KL 正则无法稳定这件事。
⚠️ DAA 没有逃出古德哈特。它把裂口咬下的表面从「奖励模型被过优化」换成了「参考策略比值被过优化」。通用解药——更好的数据、集成、早停——对两者都适用。
| 数据/目标 | 推荐损失 | 保护的失败模式 |
|---|---|---|
| 大量成对偏好数据 | DPO(保守 beta);若长度偏置明显则 SimPO | DPO 无界裂口;SimPO 长度偏置 |
| 非配对二元反馈 | KTO | 放弃成对结构,用前景理论 |
| 想从基座单阶段到对齐 | ORPO | 免去 SFT 检查点 |
| DPO 日志里 chosen 对数概率在掉 | BPO | Degraded Chosen Response |
| 偏好强度差异大、DPO 饱和 | IPO | 隐式奖励差无界 |
设计要点:每个实验室都在一组基准上跑全部五种、按任务挑赢家。没有理由认为数学推理和安全对齐的最优点是同一个。不要在安全任务上沿用数学任务调好的 DPO 超参。
本节产出 outputs/skill-preference-loss-selector.md:给它数据集统计(成对 vs 非配对、偏好强度均匀 vs 变异、长度分布)和目标(单阶段 or SFT-then-preference),它推荐一种偏好损失并报告其保护的失败模式。
code/main.py 是六损失比较器,在 500 对玩具偏好上跑同一份样本,绘制各方法的最终胜率、chosen-对数概率漂移、隐式奖励分布。把它接到真实数据上,比较逻辑无需改动。
Easy:运行 code/main.py,报告 DPO 和 BPO 的最终 chosen 对数概率下降。BPO 应保留更高的 chosen 绝对概率——验证这一点。
Medium:把偏好数据改成所有成对强度相等。六种里哪种最鲁棒?哪种退化?解释 IPO 在此处的优势。
Medium:让 rejected 平均比 chosen 长 2 倍,其余不变。用数字展示 DPO 的长度利用,以及 SimPO 的修复。
Hard:Rafailov 等(NeurIPS 2024)主张 DAA 过优化。复现一个单点版本:画出 chosen 减 rejected 的 KL 散度,观察 DPO 在大 beta 下的过优化。
Hard:读 BPO 摘要(OpenReview b97EwMUWu7),写下 BPO 给 DPO 加的那一行修正,对照 code/main.py 实现。
1/(2*beta);KTO 放弃成对结构用前景理论吃非配对数据;SimPO 去参考 + 长度归一;ORPO 单阶段无 SFT 检查点;BPO 加一行保护 chosen。下一节,我们直击第 02 节四种表现里最阴险的一种——谄媚:为什么 RLHF 会把人类标注员「偏好附和」的微弱倾向,放大成模型肯定错误前提的系统性行为。