07. DPO 和 RLHF 相比有什么区别?各有什么优缺点?
整理 DPO 与 RLHF 的核心区别、优缺点与实际选择逻辑。
简单回答
DPO(Direct Preference Optimization)跳过了 RLHF 中训练 Reward Model 和 PPO 的步骤,直接用偏好对数据以有监督方式优化 policy。它把 RLHF 的 RL 目标做了数学等价变换,推导出一个可以直接优化的 loss function。DPO 训练简单、稳定、资源开销小,但表达能力上限可能略低于 PPO,且对偏好数据的分布比较敏感。
详细解释
RLHF 的复杂性
前面讲过,RLHF 的 PPO 阶段需要四个模型同时在线,训练不稳定,超参敏感,还有 reward hacking 风险。整个流程工程量大、调参痛苦,很多团队实际上跑不好 PPO。
DPO 的核心思路
DPO 的论文做了一个关键的数学推导:在 RLHF 的优化目标(最大化 reward 同时约束 KL 散度)下,最优策略和 reward function 之间存在一个解析关系:
把这个关系代入 Bradley-Terry 偏好模型,就能把 reward 消掉,得到一个直接用 policy 概率表达的 loss:
这个 loss 的直觉含义很清楚:让 policy 增大 chosen response 的概率、降低 rejected response 的概率,同时用 reference model 做锚定,防止过度偏移。
训练流程对比
RLHF 的流程:SFT → 训练 RM → PPO 优化(四个模型同时在线)。DPO 的流程:SFT → 直接用偏好数据做有监督训练(只需要 policy + reference model)。DPO 不需要训 RM,不需要做 RL,训练过程和 SFT 几乎一样简单——就是一个 loss function 不同的有监督训练。
DPO 的优点
训练简单稳定,不需要处理 PPO 的各种超参和不稳定性。资源开销小,只需要维护两个模型(policy 和 reference model),显存需求约为 PPO 的一半。没有 reward hacking 问题,因为根本没有显式的 RM。复现性好,不同团队用同样的数据和超参能得到接近的结果。
DPO 的缺点和局限
第一是 on-policy vs off-policy 的问题。标准 DPO 是 off-policy 的——训练数据的 response 是 SFT 模型生成的,而不是当前正在优化的 policy 生成的。随着训练进行,policy 和生成数据的分布差距越来越大,可能导致优化方向不准。PPO 是 on-policy 的,每一步都用当前 policy 采样,理论上更准确。后来的 Online DPO / Iterative DPO 通过在训练过程中用当前 policy 重新采样来缓解这个问题。
第二是表达能力。DPO 隐式学到的 reward 和显式训练的 RM 在复杂场景下可能有差距。一些研究表明,在特别复杂的对齐任务上(比如多维度的质量标准),PPO + 好的 RM 的上限更高。
第三是对偏好数据质量和分布的敏感性。DPO 的效果很依赖 chosen 和 rejected 之间的质量差距——如果两者差距太小或者偏好标注噪声大,DPO 训练效果会明显下降。
实际选择
目前大多数开源社区和中小团队做对齐都优先选 DPO,因为够用且简单。大厂在追求极致对齐效果时可能还是用 RLHF(PPO 或其变体),因为有资源把 PPO 跑好。也有很多工作在探索 DPO 的改进变体(如 IPO、KTO、ORPO),试图在保持简单性的同时提升效果上限。
面试时可以这样答
DPO 和 RLHF 的核心区别在于 DPO 跳过了训练 Reward Model 和 PPO 的过程。它做了一个数学等价变换,把 RLHF 的 RL 优化目标推导成了一个可以直接用偏好对数据训练的 loss。训练时只需要维护 policy 和 reference model 两个模型,和 SFT 的训练方式几乎一样。
DPO 的优势很明显:训练简单稳定、显存开销小、没有 reward hacking、复现性好。所以现在开源社区做对齐基本默认用 DPO。
但 DPO 也有局限。第一是 off-policy 问题,训练数据是 SFT 模型生成的,不是当前 policy 生成的,训练过程中分布会偏移。可以用 Iterative DPO 来缓解,每隔几步用当前 policy 重新采样。第二是在特别复杂的对齐任务上,PPO 配合高质量 RM 的效果上限可能更高。第三是 DPO 对偏好数据的质量和 chosen/rejected 的区分度比较敏感。
实际选择上,资源有限、追求稳定就用 DPO,追求极致效果且有能力调好 PPO 就用 RLHF。目前趋势是 DPO 系列方法越来越主流。
常见追问
- DPO 的 β 参数怎么设?它的物理含义是什么?
- Online DPO / Iterative DPO 是怎么做的?效果提升大吗?
- DPO 训练过程中 chosen 和 rejected 的 loss 分别是什么趋势?怎么判断训练是否正常?