偏好优化:从 RLHF 到 DPO
预训练模型会续写文本,指令微调模型会按照要求回答,但这还不等于它是一个好助手。一个回答可能语法正确,却没有真正解决问题;可能信息丰富,却把不确定的事情说得过于肯定;可能完成了用户要求,却忽略了隐私和安全边界。
于是大模型训练里出现了一个越来越重要的问题:我们能不能把“哪个回答更好”这类人类判断,转化成模型能够学习的信号?这就是偏好优化要解决的事情。
我第一次接触 RLHF 时,觉得它像一条很自然的路:让人比较两个答案,训练一个奖励模型,再让语言模型努力拿高分。真正搭完流程后才发现,这条路同时引入了数据偏差、奖励投机、训练不稳定、资源成本和评测困难。DPO 的出现并不是把这些问题全部消除,而是换了一种更直接的优化路径。
理解 RLHF 到 DPO 的演进,最重要的不是记住几个缩写,而是看清每一步为什么存在:SFT 教模型基本行为,奖励模型把偏好变成评分,PPO 根据评分调整策略,DPO 则尝试从偏好对直接调整模型概率。
一、预训练和 SFT 解决了什么
预训练让模型获得语言、知识和一定的推理能力,但训练目标通常是预测下一个 Token。模型并不知道“回答用户问题”与“继续网页文本”有什么不同,也不天然知道应该简洁、诚实还是安全。
SFT,也就是监督微调,使用问题和理想回答示范,让模型学习任务格式和助手行为:
问题 x → 人写的理想回答 y*
↓
最大化生成 y* 的概率
SFT 的优点是稳定、容易实现、训练信号清楚。缺点是每个问题往往只有一条示范,模型很难知道多个可行回答之间的细微差异。示范成本也很高,特别是需要领域专家判断的任务。
更现实的训练数据通常还包含拒答、引用、格式和安全边界。但只靠模仿,模型可能学会答案表面风格,却没有真正理解为什么某种行为更符合目标。
二、偏好数据把绝对打分改成相对比较
让标注者给回答打 1 到 5 分,看起来很直接,实际上不同人对“4 分”的理解可能完全不同。让标注者在同一个问题下选择两个回答中哪个更好,通常更容易保持一致:
Prompt x
├─ 回答 y+:更有帮助、更准确
└─ 回答 y-:相对较差
偏好数据的基本结构是:
type PreferencePair = {
prompt: string
chosen: string
rejected: string
criterion: 'helpfulness' | 'accuracy' | 'safety' | 'style'
annotatorId?: string
confidence?: number
}
但相对比较并不自动等于客观真理。标注者可能偏爱长回答、强烈语气或某种格式;如果偏好标准没有写清楚,数据会把个人习惯偷偷变成模型目标。偏好训练前要明确:准确性和流畅性冲突时谁优先?回答不知道时,诚实拒答是否比猜测更好?高风险任务是否需要更高的证据标准?
三、奖励模型:把偏好变成一个分数
RLHF 的经典流程会训练奖励模型。给定问题和回答,奖励模型输出一个标量分数,并希望 chosen 的分数高于 rejected:
RM(x, y+) > RM(x, y-)
训练完成后,奖励模型可以为语言模型生成的回答打分,强化学习再根据分数更新策略。这让偏好可以被反复利用,不必每生成一条新回答都找人标注。
type RewardModel = {
score(prompt: string, answer: string): Promise<number>
}
async function preferenceLoss(pair: PreferencePair, reward: RewardModel) {
const chosenScore = await reward.score(pair.prompt, pair.chosen)
const rejectedScore = await reward.score(pair.prompt, pair.rejected)
return -Math.log(sigmoid(chosenScore - rejectedScore))
}
奖励模型的风险在于它只是偏好的近似器。它可能被流畅表达、回答长度或表面关键词影响,不能真正理解所有事实。策略模型如果发现某种写法容易骗过奖励模型,就可能优化“拿高分”而不是优化真实质量,这就是奖励投机。
奖励模型还可能分布外失效。训练数据里的问题和线上用户问题不同,奖励模型给出的分数会变得不可靠。必须保留人工抽检、独立评测和安全规则,不能把奖励分数当成最终事实。
四、PPO 为什么被用于 RLHF
PPO 的目标是让策略更倾向高奖励行为,同时限制每次更新不要偏离原策略太远。直觉上,它像一条带护栏的优化路线:可以朝奖励更高的方向走,但不要一步跨得太大。
策略模型生成回答
↓
奖励模型打分
↓
计算优势与策略更新
↓
使用 KL 约束避免漂移
PPO 的优势是灵活,可以利用在线生成的结果继续探索;缺点是训练系统复杂,需要策略模型、参考模型、奖励模型和价值模型协调,显存、采样和调参成本都很高。
训练时常见角色:
policy model 需要更新
reference model 用于约束
reward model 提供奖励
value model 估计价值 / 优势
任何一个角色的质量或同步出了问题,训练结果都可能不稳定。PPO 还需要仔细处理奖励尺度、KL 系数、序列长度和截断,工程上很容易出现“loss 看起来下降,模型行为却变坏”。
五、DPO 的直觉:直接让模型偏爱 chosen
DPO 观察到一个有意思的事实:如果偏好关系可以表示为“在同一个问题下,模型应该更倾向 chosen 而不是 rejected”,那么我们能否跳过显式奖励模型和复杂的在线 PPO,直接优化策略的相对概率?
偏好对 (x, y+, y-)
↓
比较策略对 y+ 和 y- 的相对概率
↓
让 y+ 的相对概率更高
DPO 通常还会保留一个冻结的参考策略,限制新模型不要离它太远。常见目标可以用直觉形式表示:
偏好差距
= [新策略偏好 y+ 的程度]
- [新策略偏好 y- 的程度]
- 参考策略的对应差距
优化这个差距,模型会学习增加 chosen 的概率、降低 rejected 的概率。它不需要单独部署奖励模型,也不需要像 PPO 那样维护完整的在线策略优化循环,因此训练更直接,资源需求通常更低。
但 DPO 不是没有奖励。偏好对本身就是奖励排序的载体,数据中的错误偏好、长度偏差和标准冲突仍然会进入目标。只是奖励不再以一个独立模型的分数形式出现。
六、三种路线放在一起看
| 阶段 | 主要数据 | 优化对象 | 优点 | 代价 |
|---|---|---|---|---|
| SFT | 理想回答 | 模仿示范 | 稳定、简单 | 难表达细微偏好 |
| RLHF | 偏好对 + 奖励模型 | 奖励下的策略 | 灵活、可在线探索 | 系统复杂、成本高 |
| DPO | 偏好对 | 策略相对概率 | 直接、易部署 | 依赖偏好数据和参考模型 |
它们不是严格的替代关系。很多项目会先做 SFT 建立稳定行为,再使用 DPO 或 RLHF 优化风格、帮助性和安全边界。选择方法要看任务是否有稳定偏好、是否需要在线探索、团队是否有训练基础设施,以及能不能独立评估结果。
七、为什么数据质量比算法名字更重要
偏好训练非常容易出现“算法很新,数据很旧”的情况。下面几类数据问题尤其常见:
偏好差异不清楚
两个回答几乎一样,标注选择更像随机噪声。这样的样本会给模型弱而混乱的信号。
chosen 只是更长
如果所有 chosen 都比 rejected 长,模型可能学会扩写,而不是提高准确性。长度、重复率和信息密度应该单独检查。
rejected 过于糟糕
如果 rejected 永远是乱码,模型只能学会区分极端错误,学不到生产环境的细微质量差异。
任务标准不一致
同一个任务一会儿奖励简洁,一会儿奖励长篇;一会儿要求拒答,一会儿又惩罚谨慎。训练前必须把 rubric 写清楚,冲突数据要标记并复核。
type DataAudit = {
averageChosenTokens: number
averageRejectedTokens: number
agreementRate: number
duplicateRate: number
conflictRate: number
criteriaDistribution: Record<string, number>
}
数据审计不是附加工作,它直接决定模型学到什么。算法能优化信号,不能把混乱的目标变成清晰的目标。
八、偏好优化会带来哪些副作用
模型可能变得过度迎合。它学会用户喜欢听什么,却不一定更诚实;学会使用安全套话,却可能在正常问题上频繁拒答;学会一种漂亮格式,却忽略真实证据。
常见副作用包括长度膨胀、模式化表达、事实幻觉、能力遗忘和过度拒答。训练后不能只看偏好准确率,要加入独立事实集、无答案集、越权集、长上下文集和通用能力回归。
偏好指标变好
≠
真实任务整体变好
模型的总体质量需要多目标观察:帮助性、准确性、安全性、引用质量、结构化通过率、延迟和成本。某个目标的提升如果以另一个关键目标严重退化为代价,不能简单称为成功。
九、KL 约束为什么重要
无论使用 PPO 还是 DPO,参考模型通常都扮演“不要走得太远”的角色。新策略如果过度追逐偏好数据,可能忘记原本的语言能力,或者产生训练集中没有的奇怪行为。
优化偏好收益
+
限制与参考策略的距离
↓
在变好和不跑偏之间找平衡
KL 约束太弱,模型容易过拟合偏好和奖励漏洞;太强,模型几乎不改变,训练收益很小。它也不是解决所有问题的安全锁:如果参考模型本身有偏差,靠近它并不能保证正确;如果偏好数据恶意,限制漂移也只能减慢错误。
训练中应该记录 KL、长度、拒答、事实和独立测试变化,不能只调一个系数直到 loss 看起来好看。
十、离线偏好和在线反馈如何结合
离线偏好数据便于控制和复现,适合训练主流程;线上反馈更接近真实分布,但有噪声、选择偏差和隐私问题。用户点了“有帮助”,不一定代表事实正确;用户没反馈,也不代表满意。
离线专家偏好 → 基础训练与回归
线上脱敏反馈 → 发现长尾问题
人工复核 → 形成高质量新偏好对
版本评测 → 再进入训练
线上数据不能直接全部喂回模型。先脱敏、去重、判断反馈含义、检查是否包含恶意输入,再加入训练或评测。尤其要把失败样本保留下来,不能只收集用户点赞的成功回答。
十一、什么时候选 RLHF,什么时候选 DPO
如果任务有稳定的离线偏好对,想快速做风格和帮助性优化,DPO 通常是很好的起点。它训练流程直观,容易和 LoRA 结合,也比较容易做多组实验。
如果任务需要在线探索、奖励来自环境交互、偏好无法简单表示为固定回答对,RLHF 或其他强化学习方法可能更合适。例如某些工具使用、长程决策和可验证任务,奖励可能在多步行动之后才能获得。
如果团队连偏好标准和验证集都没有,暂时不要急着选算法。先定义目标、收集小批量高质量数据、建立人工评测和回归流程。没有可测量的目标,最先进的优化方法也只是把不确定性训练得更快。
十二、我的总结:对齐是持续校准,不是一次训练
从 RLHF 到 DPO,路线变化的核心是:我们不断寻找更直接、更稳定、更省资源的方式,把人类偏好传给模型。SFT 教基本行为,奖励模型把偏好变成评分,PPO 让策略在奖励下探索,DPO 则直接利用偏好对调整相对概率。
但无论采用哪种方法,真正决定结果的始终是目标和数据。偏好不是天然正确的,奖励不是事实,模型分数也不是用户价值的完整代表。训练后要检查准确性、安全性、拒答、长度、通用能力和真实任务完成度,不能因为某一个 loss 下降就宣布对齐成功。
我现在看偏好优化项目,会先问三个问题:我们究竟希望模型改变什么?如何证明它改变得更好?如果它学会钻目标的空子,谁能及时发现?这三个问题没有答案时,继续堆训练步骤只是在增加风险。
好的对齐系统不是把模型驯化成永远顺从,而是让它更清楚地帮助用户、诚实地表达不确定、在危险边界前停下来,并且能被评测和纠正。DPO 让一部分偏好优化变得更容易上手,但它真正的价值只有在高质量数据、独立验证和持续反馈组成闭环之后,才会显现出来。