logo

偏好优化:从 RLHF 到 DPO

Published on

偏好优化:从 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 让一部分偏好优化变得更容易上手,但它真正的价值只有在高质量数据、独立验证和持续反馈组成闭环之后,才会显现出来。

🤪 您也可以编辑此页: