直接对齐算法研究:从 DPO 到 SimPO 的演进
1. 从 RLHF 到直接对齐:为什么我们需要新的范式?
在大语言模型对齐人类偏好的主流流程中,RLHF(基于人类反馈的强化学习) 是经典方案。它通常分三步走:
- 监督微调(SFT):在高质量指令数据上微调预训练模型,使其学会遵循指令。
- 奖励建模(RM):收集人类对模型多个回复的偏好排序,训练一个奖励模型来模拟人类打分。
- 强化学习(RL):使用 PPO 等算法,以奖励模型的输出作为奖励信号,继续优化 SFT 模型。
这个范式的核心痛点是 复杂且不稳定。PPO 阶段需要同时维护四个模型:策略模型、参考模型、奖励模型和值函数模型,带来了巨大的显存开销和调参难度。而且奖励模型只能捕获人类偏好的代理指标,容易发生奖励黑客(Reward Hacking)现象——策略模型学会钻奖励模型的空子来获得高分,但实际输出质量却下降。
直接对齐算法的出现,正是为了绕过显式奖励模型,直接从成对的偏好数据中优化策略。它们用巧妙的数学形式,将偏好比较直接转化为策略的更新方向,既保留了人类偏好的引导,又移除了独立的奖励建模和复杂的强化学习阶段。这个家族从 DPO 开始,并迅速演化出 SimPO 等更简洁高效的变体。
2. DPO:直接偏好优化的奠基之作
DPO(Direct Preference Optimization)是直接对齐算法的里程碑。它用一个巧妙的推导证明:在给定偏好数据的情况下,最优策略可以与奖励模型建立一一映射,从而将奖励函数用策略本身表示出来,代入偏好损失后,即可直接优化策略,而不需要显式训练奖励模型。
2.1 核心思想与损失函数
DPO 从 RLHF 的 Bradley-Terry 偏好模型出发。对于人类偏好的回复对 $(y_w, y_l)$ (赢家/输家),奖励模型 $r_\phi$ 给出的偏好概率为:
$$ p^*(y_w \succ y_l) = \frac{\exp(r_\phi(y_w))}{\exp(r_\phi(y_w)) + \exp(r_\phi(y_l))} $$
在 RL 阶段,优化带有 KL 约束的最大奖励目标:
$$ \max_\pi \mathbb{E}{x \sim \mathcal{D}, y \sim \pi(\cdot|x)}\left[r\phi(x,y)\right] - \beta \cdot \mathrm{KL}\big(\pi(\cdot|x) | \pi_{\mathrm{ref}}(\cdot|x)\big) $$
其中 $\pi_{\mathrm{ref}}$ 是参考策略(通常为 SFT 模型),$\beta$ 控制 KL 惩罚强度。该目标存在解析解:
$$ \pi^*(y|x) = \frac{1}{Z(x)} \pi_{\mathrm{ref}}(y|x) \exp\left(\frac{1}{\beta} r_\phi(x,y)\right) $$
反过来解出奖励函数:
$$ r_\phi(x,y) = \beta \log \frac{\pi^*(y|x)}{\pi_{\mathrm{ref}}(y|x)} + \beta \log Z(x) $$
将这一表达式代入 Bradley-Terry 模型,配分函数 $Z(x)$ 会相互抵消,最终得到仅依赖策略 $\pi_\theta$ 的损失函数:
$$ \mathcal{L}{\mathrm{DPO}}(\pi\theta; \pi_{\mathrm{ref}}) = -\mathbb{E}{(x,y_w,y_l) \sim \mathcal{D}} \left[ \log \sigma \left( \beta \log \frac{\pi\theta(y_w|x)}{\pi_{\mathrm{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\mathrm{ref}}(y_l|x)} \right) \right] $$
这里 $\sigma$ 是 sigmoid 函数,$\beta$ 控制偏离参考策略的程度。直观上,损失函数增大赢家相对于参考策略的对数概率比,同时减小输家的对数概率比。模型更新只需要计算当前策略和参考策略在赢/输回复上的对数概率,没有奖励模型,没有 PPO,实现简洁且训练稳定。
2.2 DPO 的优势与局限
优势:
- 极简性:隐式地同时完成奖励建模和策略优化,训练代码可以仅基于 SFT 脚本稍加修改。
- 稳定性:无在线采样、无值函数估计,训练曲线更平滑。
- 数据效率:在同等偏好数据下,常常能取得持平或超越 RLHF-PPO 的效果。
局限:
- 长度偏差:DPO 容易偏好更长的回复,因为对数概率累积会随着 token 数量增长而偏大,导致算法倾向于产生冗长输出。
- 参考模型依赖:需要一个固定的 $\pi_{\mathrm{ref}}$,通常就是 SFT 模型,占用了额外内存,并且在某些场景下参考模型与当前策略分布差异过大可能导致训练信号异常。
- 负梯度不对称:DPO 对赢家和输家的梯度对称性有时会造成同时压低赢家概率的情况,影响收敛。
这些局限催生了一系列变体和后续的 SimPO。
3. DPO 变体概览:从 IPO 到 KTO
社区很快意识到 DPO 并非终点,多个改进版本从不同角度修补其缺陷。
-
IPO (Identity Preference Optimization)
针对 DPO 可能导致的过拟合和赢/输对概率差距无限拉大的问题,IPO 采用了一种基于平方损失的回归型目标,迫使 $\log \frac{\pi_\theta(y_w)}{\pi_\mathrm{ref}(y_w)} - \log \frac{\pi_\theta(y_l)}{\pi_\mathrm{ref}(y_l)}$ 直接逼近一个提前设定的常数(如 $\frac{1}{\beta}$),避免了概率比值无限增长。它去掉了 sigmoid 映射,使训练更稳定,但依然依赖参考模型。 -
DPOP (DPO with Positive-only regularizer)
观察到 DPO 有时会同时降低赢家和输家的概率,DPOP 在损失中增加了一项正则项,专门鼓励赢家相对于参考模型的对数概率不小于 0,强化正信号。 -
KTO (Kahneman-Tversky Optimization)
KTO 进一步突破数据格式限制,不再需要成对的偏好数据,只需对单个回复标注“好/坏”。它借鉴前景理论,从“可接受”还是“不可接受”的二元判断出发优化策略。这使得数据收集更加灵活,但仍需要参考模型。
这些方法虽然改进了 DPO,但都无法摆脱对参考模型的依赖,且没有从根本上解决长度偏差问题。SimPO 应运而生,它的提出将直接对齐算法推向了更简洁高效的新阶段。
4. SimPO:简单偏好优化
SimPO(Simple Preference Optimization) 的核心动机是 用更简单的形式达到甚至超越 DPO 的效果,同时解决长度偏差和参考模型依赖。其关键思路是:将策略自身的平均对数概率作为隐式奖励,并直接与目标奖励边际进行比较,无需参考模型。
4.1 隐式奖励与长度归一化
在 DPO 中,隐式奖励表达式为 $r(x,y) = \beta \log \frac{\pi_\theta(y|x)}{\pi_{\mathrm{ref}}(y|x)}$。SimPO 发现,可以直接使用策略模型输出的序列级对数概率,并做长度归一化,得到更公平的奖励度量:
$$ r_{\mathrm{SimPO}}(x,y) = \frac{\beta}{|y|} \log \pi_\theta(y|x) = \frac{\beta}{|y|} \sum_{t=1}^{|y|} \log \pi_\theta(y_t|x, y_{<t}) $$
为什么要归一化?语言模型生成时,长句子的对数概率总和天然偏大,这在 DPO 的隐式奖励中同样存在(因为 $\log \frac{\pi_\theta(y)}{\pi_{\mathrm{ref}}(y)}$ 也随长度累积)。通过除以序列长度,SimPO 将奖励转化为每个 token 的平均对数概率,由此 从根本上抑制长度偏差,不再需要额外的长度惩罚或奖励伸缩技巧。
4.2 目标奖励边际
SimPO 直接在偏好对之间引入一个 目标奖励边际(target reward margin) $\gamma$,确保赢家奖励不仅高于输家,而且要高出至少 $\gamma$。损失函数如下:
$$ \mathcal{L}{\mathrm{SimPO}}(\pi\theta) = -\mathbb{E}{(x,y_w,y_l) \sim \mathcal{D}} \left[ \log \sigma \left( \frac{\beta}{|y_w|} \log \pi\theta(y_w|x) - \frac{\beta}{|y_l|} \log \pi_\theta(y_l|x) - \gamma \right) \right] $$
解释:模型期望赢者序列的平均对数概率比输者大,并且差值超过一个正值门限 $\gamma$。$\gamma$ 是一个超参数,可以控制偏好强度,实验表明设置一个适中的 $\gamma$(如 0.5~1.0)能有效提升表现。
与 DPO 的对比非常清晰:
- SimPO 彻底去除了参考模型 $\pi_{\mathrm{ref}}$,节省一半显存和计算量。
- 通过长度归一化直接解决冗长偏向问题。
- 目标边际 $\gamma$ 提供了直观的优化目标,避免了 DPO 中隐式边际不明确的问题。
4.3 SimPO 的效果与实践
实验表明,SimPO 在多个基准(如 AlpacaEval 2、Arena-Hard)上显著优于 DPO,并且在训练过程中更不容易产生越来越长的回复。消融实验揭示了两个组件的重要性:长度归一化是关键,不使用归一化时性能大幅下降;目标边际 $\gamma$ 也带来稳定提升,而 DPO 即使加入长度惩罚也无法完全匹配 SimPO 的性能。
此外,SimPO 的算法实现极其简单。训练循环中,每个批次只需:
- 计算策略模型在赢者和输者序列上的逐 token 对数概率。
- 对每个序列求长度平均值。
- 计算两个平均值的差值,减去 $\gamma$ 后输入 sigmoid 交叉熵。
没有任何额外的参考模型前向传播,代码量几乎和 SFT 一样少。
5. SimPO vs DPO:关键差异一览
| 维度 | DPO | SimPO |
|---|---|---|
| 奖励形式 | $\beta \log \frac{\pi_\theta}{\pi_{\mathrm{ref}}}$ | $\frac{\beta}{ |
| 参考模型 | 需要 $\pi_{\mathrm{ref}}$ | 不需要 |
| 长度控制 | 依赖外部长度惩罚或正则项 | 内置长度归一化,天然免疫长度偏差 |
| 优化目标 | 隐式边际,由 $\beta$ 和 KL 决定 | 显式目标边际 $\gamma$ |
| 内存开销 | 同时维护策略和参考模型 | 仅需策略模型 |
| 典型性能 | 较好,但易产生冗长输出 | 更优,简洁且生成长度更合理 |
6. 如何选择与未来展望
对于初学者和从业者,可以遵循以下建议:
- 如果你的硬件资源紧张,或希望快速实验直接对齐,SimPO 是首选,去参考模型+内置长度控制让它极其实用。
- 如果偏好数据的质量极高,且对输出长度有额外业务约束(例如必须生成特定长度的摘要),可以尝试 DPO 并搭配自定义长度惩罚,但需要仔细调参。
- 面对不完整偏好数据(仅有单条回复的好坏判断),可转向 KTO;若遇训练不稳定,IPO 的正则化思路也值得参考。
直接对齐算法仍在快速演化。未来极有可能的方向包括:
- 在线迭代对齐:将直接对齐应用于自我生成数据,实现在线偏好优化(如 online SimPO)。
- 多步推理偏好:直接对齐能否延伸到链式思维(CoT)和过程奖励,让模型在推理步骤上对齐人类偏好。
- 多模态与多目标对齐:将 SimPO 等简洁方法推广到视觉语言模型,以及同时对齐帮助性、无害性等多种维度。
从 DPO 到 SimPO,研究者不断在做减法,去除不必要的组件,让算法回归到偏好学习最本质的信号上。这种“简单的力量”正在推动大模型对齐技术走向更广泛的落地应用。