DPO 是一种直接用人类偏好数据训练大模型的方法,全称 Direct Preference Optimization,中文译作直接偏好优化。它的数据长这样:同一个问题配两个回答,一个是标注者更喜欢的,一个是被淘汰的;训练要做的事,就是让模型以后多生成前一类回答、少生成后一类。它和 RLHF 想达到的目的相同,都是把模型往人更认可的方向推,区别在于它把中间最麻烦的两步省掉了:不再单独训练一个奖励模型,也不再跑强化学习,而是把偏好直接写成一条损失函数,像普通微调一样训练。
它省掉的,正是 RLHF 最难伺候的部分
回顾 RLHF 的流程:先收集人类对多个回答的排序,训出一个能给回答打分的奖励模型;再让大模型反复生成、按分数用强化学习调整自己。这条链的问题不在效果,而在工程:奖励模型本身要训练和校准,强化学习阶段又出了名的不稳定,参数没调好,模型会钻分数的空子,或者把原有能力练丢。2023 年斯坦福大学 Rafael Rafailov 等人发表 DPO 论文时,给出的关键推导是:在常用的偏好模型假设下,最优策略和奖励函数之间存在一个可以直接换算的关系,也就是说,模型自身其实就隐含着奖励函数,不必先把奖励模型单独训出来。既然奖励能从模型概率里反推,偏好训练就可以改写成一个普通的分类式损失,训练过程随之变成和监督微调差不多的形态:稳定、好复现、一台机器上就能跑通。
一对回答进来,模型到底在学什么
DPO 的每条训练样本包含三样东西:问题、被选中的回答、被拒绝的回答。训练时同时看两份模型:一份是正在训练的模型,另一份是训练开始前的模型副本,冻结不动,称作参考模型。损失函数比较的不是回答的绝对概率,而是两个回答相对于参考模型的概率变化:如果被选中的回答相对参考模型变得更可能、被拒绝的变得更不可能,损失就小;反过来就大,模型被往回推。
这个设计里藏着一个容易被忽略的细节:DPO 真正放大的是两个回答之间的差距,而不是保证被选中回答的绝对概率一定上升。训练数据偏激进时,两个回答的概率可能一起下降,只是被拒绝的那个降得更多。理解这一点,就能明白为什么 DPO 练完有时会出现回答变短、变保守或某些表达退化的问题——它优化的是相对偏好,不是逐字模仿标准答案,这和监督微调的逻辑有本质区别。
β 参数:学偏好和别跑偏之间的一根拉绳
DPO 里最重要的参数是 β,它控制模型可以偏离参考模型的程度。β 越大,拉绳越紧:模型学偏好学得慢、幅度小,但原有能力保存得好,不容易练出怪毛病;β 越小,拉绳越松:偏好信号吸收得快,但模型可能为了迎合偏好数据走得太远,出现能力退化甚至输出质量崩坏。实践中 β 常在 0.1 附近起步调试,具体取值要看数据规模和任务。它没有通用最优值,这也是 DPO 简单归简单、依然需要做评测对比的原因:同一批数据换一个 β,训出来的模型性格可能明显不同。
适合的活和露怯的地方
DPO 最适合的场景,是模型已经完成监督微调、基本会回答问题,只差最后一道口味校准:让回答更有帮助、语气更合适、在该拒绝的请求上守住边界。开源社区早期出名的 Zephyr 模型就是靠 DPO 在公开偏好数据上再训一轮,聊天评测明显超过了它的监督微调版本,这也是 DPO 在开源生态里迅速普及的原因之一——配方公开、算力门槛低、效果立竿见影。
它的短板同样清楚。第一,DPO 是离线学习:它只见过数据集里现成的回答对,模型更新后会生成的新回答长什么样、好不好,它没有机会再获得反馈,而在线强化学习可以在训练中不断采样新回答、即时纠偏。第二,它的天花板被偏好数据的质量锁死:标注者意见不一致、偏好标准模糊,模型学到的就是一团噪声。第三,它有已知的长度偏好问题:标注者常常更喜欢写得长的回答,模型可能学会用啰嗦换取偏好,而不是真的答得更好。后续出现的 IPO、KTO 等变体,以及把 DPO 多轮迭代、接近在线做法的方案,针对的正是这些短板。
三个流传很广的误解
第一个误解是 DPO 不需要人类数据。它省的是奖励模型和强化学习,省不掉偏好标注:回答对从哪来,依然要靠人类挑选,或靠更强的模型生成再筛选,只是组织形式从打分排序变成了成对比较。第二个误解是 DPO 全面强于 RLHF。它赢在简单和稳定,复杂任务上的上限、以及对训练中新生错误的纠正能力,在线强化学习路线仍有优势,前沿实验室的后训练也远没有被 DPO 一家包办。第三个误解是把 DPO 当成换了名字的监督微调。监督微调学的是照着这一个答案说,DPO 学的是这两个答案里哪个更好;前者教知识和格式,后者教取舍和口味,两者在训练流水线里通常是前后衔接的两步,而不是互相替代。