直觉:监督学习教不会的东西

预训练让模型学会"语言长什么样",指令微调(SFT)让它学会"听懂指令"。但还有一类目标,监督学习很难直接表达:什么样的回答更有帮助、更安全、更符合人类偏好?

问题在于"好"没有唯一标准答案。对同一个问题,可能有无数个都不错的回复,写出一个"标准答案"去做交叉熵监督既不现实也不充分。但人类擅长另一件事:给两个回答,说出哪个更好。 偏好对齐(preference alignment)就建立在这种相对比较的信号上。本文拆解两条主流路线:经典的 RLHF 和后来的 DPO。

机制一:RLHF 的三段式流水线

RLHF(Reinforcement Learning from Human Feedback)分三步走。

第一步:SFT。 用人工示范数据做监督微调,得到一个能听指令的基座模型,记作 πref\pi_{\text{ref}}(参考策略)。

第二步:训练奖励模型(Reward Model, RM)。 收集人类偏好数据:对同一 prompt xx 采样两个回答 ywy_w(更优,winner)和 yly_l(更差,loser),人类标注谁好。奖励模型 rϕ(x,y)r_\phi(x, y) 输出一个标量打分,训练目标是让优答得分高于劣答。这里用的是 Bradley-Terry 偏好模型,损失为:

LRM=E(x,yw,yl)[logσ(rϕ(x,yw)rϕ(x,yl))]\mathcal{L}_{\text{RM}} = -\mathbb{E}_{(x, y_w, y_l)}\left[\log \sigma\big(r_\phi(x, y_w) - r_\phi(x, y_l)\big)\right]

σ\sigma 是 sigmoid。直觉上:把优答和劣答的分差送进 sigmoid 当作"优答胜出的概率",最大化它。

第三步:用 RL(通常是 PPO)优化策略。 让模型生成回答,用 RM 打分作为奖励,强化高分行为。但有个陷阱——如果只追求 RM 高分,模型会钻奖励模型的空子(reward hacking),输出一些 RM 误判为高分、人类看着却很怪的内容。为防止跑偏,目标里加一个 KL 惩罚,约束新策略别离参考策略太远:

maxπθ Ex,yπθ[rϕ(x,y)βlogπθ(yx)πref(yx)]\max_{\pi_\theta}\ \mathbb{E}_{x,\, y \sim \pi_\theta}\Big[ r_\phi(x, y) - \beta\, \log\frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)} \Big]

β\beta 控制约束强度。β\beta 太小,模型放飞自我去 hack 奖励;太大,模型不敢改变,对齐效果有限。

RLHF 链路完整但工程复杂:要同时在显存里维护四个模型——策略模型、参考模型、奖励模型、以及 PPO 的 critic(价值网络)。PPO 本身对超参敏感,训练不稳定,调起来很痛苦。

机制二:DPO 把 RL 消掉了

DPO(Direct Preference Optimization)的洞见是:上面那个带 KL 约束的 RL 目标,其实有闭式最优解。在理想情况下,最优策略与参考策略、奖励之间满足:

π(yx)=1Z(x)πref(yx)exp(1βr(x,y))\pi^*(y|x) = \frac{1}{Z(x)}\, \pi_{\text{ref}}(y|x)\, \exp\!\Big(\tfrac{1}{\beta} r(x, y)\Big)

把这个式子反解,就能用策略本身表示奖励:

r(x,y)=βlogπ(yx)πref(yx)+βlogZ(x)r(x, y) = \beta \log\frac{\pi^*(y|x)}{\pi_{\text{ref}}(y|x)} + \beta \log Z(x)

妙处在于:把这个表达式代回 Bradley-Terry 偏好损失时,那个难算的配分函数 Z(x)Z(x) 在优答与劣答的差值里被消掉了(同一个 xxZ(x)Z(x) 相同)。于是得到一个可以直接对策略做梯度下降的损失:

LDPO=E(x,yw,yl)[logσ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))]\mathcal{L}_{\text{DPO}} = -\mathbb{E}_{(x, y_w, y_l)}\left[\log \sigma\Big(\beta \log\frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log\frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)}\Big)\right]

这个式子的形状和奖励模型的损失一模一样,但它直接训练策略——奖励模型被"吸收"进了策略本身。不需要单独训 RM,不需要 PPO,不需要采样 rollout。本质上 DPO 把一个 RL 问题变回了一个监督学习问题。

1
2
3
4
5
6
7
8
9
10
def dpo_loss(policy, ref, x, y_w, y_l, beta=0.1):
# 各自的对数概率(实现上是序列 token logp 求和)
logp_w = policy.logprob(x, y_w)
logp_l = policy.logprob(x, y_l)
ref_w = ref.logprob(x, y_w) # 参考模型冻结,no_grad
ref_l = ref.logprob(x, y_l)

# 隐式奖励 = beta * (策略 logp - 参考 logp)
margin = beta * ((logp_w - ref_w) - (logp_l - ref_l))
return -F.logsigmoid(margin).mean()

对比与权衡

维度 RLHF (PPO) DPO
显存中的模型 4 个 2 个(策略 + 参考)
是否需要奖励模型 是,单独训练 否,隐式
是否需要在线采样 是(rollout) 否,离线数据即可
训练稳定性 较差,对超参敏感 较好
实现复杂度
灵活性 高(RM 可复用、可在线探索) 受限于离线偏好数据

DPO 的吸引力在于简单:流程短、稳、省资源。但它不是免费午餐。

踩坑与边界

1. DPO 高度依赖离线数据分布。 它没有在线探索,只能在你给的偏好对里学。如果偏好数据覆盖不到模型实际会产生的回答分布,对齐就有盲区。RLHF 的在线 rollout 在这点上更有优势——模型边训边采样自己当前的输出。

2. 参考模型不能省。 无论 RLHF 还是 DPO,那个 KL/参考项是防止模型崩坏的关键。去掉参考约束,模型很容易为了拉大优劣答分差而整体退化(比如概率分布坍缩、复读、变啰嗦)。

3. β\beta 是核心旋钮。 它平衡"听从偏好"和"别偏离原模型太远"。DPO 里 β\beta 偏小会让模型对偏好数据过拟合、输出风格漂移。

4. 偏好数据质量决定天花板。 无论哪条路线,标注噪声会直接被学进去。两个回答其实差不多却被强行标了高下,模型学到的就是噪声。数据清洗和标注一致性比算法选择更影响最终效果。

5. DPO 容易让"优答概率上升"变成"劣答概率暴跌"。 实践中常观察到优答的绝对对数概率也在下降——模型主要靠压低劣答来拉开 margin。这通常无害,但若过头会影响生成质量,需要监控。

小结

偏好对齐的本质是把"人类的相对比较"变成可优化的信号。RLHF 走的是经典 RL 路线:训奖励模型,再用 PPO 在 KL 约束下优化策略,链路完整但工程沉重。DPO 通过一个漂亮的数学变换,证明那个 RL 目标有闭式解,从而把奖励模型和 PPO 一起消掉,退化成一个监督式损失。资源紧、数据是离线偏好对、要稳,选 DPO;要在线探索、奖励模型需复用、追求上限,RLHF 仍有不可替代之处。