LLM 后训练实践
第3课:偏好对齐DPO

3.3 DPO 变体

SimPO、KTO、ORPO、IPO 等 DPO 变体的设计理念、数学公式与适用场景比较

概述

DPO 的提出开创了"直接偏好优化"的范式,但它并非完美。研究者针对 DPO 的不同局限提出了多种改进变体。本节将详细介绍四种最重要的变体:SimPOKTOORPOIPO,并在最后给出系统性的对比。

SimPO:简单偏好优化

动机

标准 DPO 存在两个实际问题:

  1. 需要参考模型:必须在内存中维护一个冻结的参考模型 πref\pi_{\text{ref}},对于大模型来说内存开销显著
  2. 对数概率与生成质量的不一致性:DPO 使用序列总对数概率(sum of log-probs)来衡量模型对回复的偏好度,但这一指标偏向于短回复(短回复的负对数概率累积更小)

SimPO 的核心设计

SimPO(Simple Preference Optimization)(Meng 等,NeurIPS 2024)通过两个关键创新解决了上述问题:

创新一:平均对数概率作为隐式奖励

SimPO 用平均对数概率替代对数概率比作为隐式奖励:

r^SimPO(x,y)=1ylogπθ(yx)=1yt=1ylogπθ(ytx,y<t)\hat{r}_{\text{SimPO}}(x, y) = \frac{1}{|y|} \log \pi_\theta(y|x) = \frac{1}{|y|} \sum_{t=1}^{|y|} \log \pi_\theta(y_t | x, y_{<t})

其中 y|y| 是回复 yy 的 token 数量。

为什么用平均而非总和? 总对数概率 tlogπθ(yt)\sum_t \log \pi_\theta(y_t | \cdots) 天然倾向于短回复,因为每多一个 token 就多一个负项。除以长度 y|y| 后,长短回复的隐式奖励在同一尺度上比较,消除了长度偏差。

创新二:目标奖励边际(Target Reward Margin)

SimPO 引入了一个固定的目标边际 γ>0\gamma > 0,要求 chosen 回复的隐式奖励至少超过 rejected 回复 γ\gamma

LSimPO=E[logσ(βywlogπθ(ywx)βyllogπθ(ylx)γ)]\mathcal{L}_{\text{SimPO}} = -\mathbb{E}\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]

SimPO 的优势

方面DPOSimPO
参考模型需要(内存×2)不需要
长度偏差存在通过平均消除
超参数β\betaβ,γ\beta, \gamma
训练速度基准更快(无需 ref 前向传播)
AlpacaEval 2基准高出最多 6.4 分

与 DPO 的数学联系

SimPO 可以视为 DPO 的一个特例:如果将参考模型设为均匀分布(πref(yx)=const\pi_{\text{ref}}(y|x) = \text{const}),则 DPO 退化为只依赖策略对数概率的形式,与 SimPO 的核心思想一致。但 SimPO 进一步做了长度归一化和边际约束,使其在实践中更加稳健。

KTO:前景理论偏好优化

动机

DPO 和 SimPO 都需要成对偏好数据——每条数据必须同时包含 chosen 和 rejected 回复。但在很多实际场景中:

  • 人类标注者更自然的反馈方式是点赞/点踩(binary feedback),而非成对比较
  • 成对偏好数据的收集成本更高
  • 很多现有数据集只有单条回复的好坏标签

前景理论(Prospect Theory)启发

KTO(Kahneman-Tversky Optimization)(Ethayarajh 等,2024)受到行为经济学中前景理论的启发。前景理论(由 Kahneman 和 Tversky 于1979年提出,获诺贝尔经济学奖)的核心发现是:

  1. 损失厌恶:人们对损失的敏感度大于对等量收益的敏感度
  2. 参考点依赖:人们评估结果时依赖于一个参考点,而非绝对值
  3. 边际递减:收益/损失的边际效用递减

KTO 损失函数

KTO 将每条数据视为独立的"好"或"坏"反馈,使用不同的损失函数处理:

LKTO=Ex,yD[w(y)(1vKTO(β,rθ(x,y)))]\mathcal{L}_{\text{KTO}} = \mathbb{E}_{x, y \sim \mathcal{D}} \left[ w(y) \cdot \left(1 - v_{\text{KTO}}\left(\beta, r_\theta(x, y)\right)\right) \right]

其中隐式奖励与 DPO 相同:

rθ(x,y)=logπθ(yx)πref(yx)r_\theta(x, y) = \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)}

对于好回复yy 被标记为"好"):

vKTO(β,r)=σ(βrβzref)v_{\text{KTO}}(\beta, r) = \sigma\left(\beta \cdot r - \beta \cdot z_{\text{ref}}\right)

对于坏回复yy 被标记为"坏"):

vKTO(β,r)=σ(βzrefβr)v_{\text{KTO}}(\beta, r) = \sigma\left(\beta \cdot z_{\text{ref}} - \beta \cdot r\right)

其中 zref=E(x,y)D[KL(πθ(yx)πref(yx))]z_{\text{ref}} = \mathbb{E}_{(x', y') \sim \mathcal{D}} \left[ \text{KL}\left(\pi_\theta(y'|x') \| \pi_{\text{ref}}(y'|x')\right) \right] 是一个参考点(reference point),体现了前景理论中的参考点依赖。

损失厌恶通过对好/坏回复赋予不同权重 w(y)w(y) 来体现:

w(y)={λDif y is desirable (好)λUif y is undesirable (坏)w(y) = \begin{cases} \lambda_D & \text{if } y \text{ is desirable (好)} \\ \lambda_U & \text{if } y \text{ is undesirable (坏)} \end{cases}

通常设置 λU>λD\lambda_U > \lambda_D,使模型对"坏"回复更敏感——即损失厌恶。

KTO 的关键优势

KTO 的最大价值:它可以使用非配对的二值反馈进行训练。这意味着你可以用 (x1,y1,good)(x_1, y_1, \text{good})(x2,y2,bad)(x_2, y_2, \text{bad}) 来训练,其中 x1x2x_1 \neq x_2——不需要同一个提示下的成对比较数据。这极大地扩展了可用数据的范围。

ORPO:统一 SFT 和对齐

动机

标准的后训练流程是两阶段的:先 SFT → 再 DPO。这带来了额外的训练成本和超参数调优负担。

ORPO 损失设计

ORPO(Odds Ratio Preference Optimization)(Hong 等,2024)将 SFT 目标和偏好优化合并为一个统一的损失函数:

LORPO=LSFT(yw)SFT 项+λLOR(yw,yl)偏好项\mathcal{L}_{\text{ORPO}} = \underbrace{\mathcal{L}_{\text{SFT}}(y_w)}_{\text{SFT 项}} + \lambda \cdot \underbrace{\mathcal{L}_{\text{OR}}(y_w, y_l)}_{\text{偏好项}}

其中 SFT 项是标准的交叉熵损失(只在 chosen 回复上计算):

LSFT(yw)=1ywt=1ywlogπθ(yw,tx,yw,<t)\mathcal{L}_{\text{SFT}}(y_w) = -\frac{1}{|y_w|}\sum_{t=1}^{|y_w|} \log \pi_\theta(y_{w,t} | x, y_{w,<t})

偏好项使用**几率比(Odds Ratio)**来量化 chosen 和 rejected 的差异:

LOR=logσ(logoddsθ(ywx)oddsθ(ylx))\mathcal{L}_{\text{OR}} = -\log\sigma\left(\log\frac{\text{odds}_\theta(y_w|x)}{\text{odds}_\theta(y_l|x)}\right)

其中 odds 定义为:

oddsθ(yx)=Pθ(yx)1Pθ(yx)\text{odds}_\theta(y|x) = \frac{P_\theta(y|x)}{1 - P_\theta(y|x)}

在实践中,Pθ(yx)P_\theta(y|x) 用平均 token 概率近似:

Pθ(yx)exp(1ytlogπθ(ytx,y<t))P_\theta(y|x) \approx \exp\left(\frac{1}{|y|}\sum_t \log \pi_\theta(y_t | x, y_{<t})\right)

ORPO 的优势与局限

优势

  • 单阶段训练,简化流程
  • 无需参考模型
  • SFT 和对齐联合优化,可能找到更好的解

局限

  • 两个损失项之间的平衡(λ\lambda)需要仔细调优
  • 在某些基准上效果略逊于两阶段训练
  • 研究社区的实验验证相对较少

IPO:正则化偏好优化

动机

DPO 在理论上存在一个问题:当偏好数据中的偏好非常明确(chosen 明显优于 rejected)时,DPO 会推动隐式奖励边际趋向无穷大,导致过拟合

IPO 损失函数

IPO(Identity Preference Optimization)(Azar 等,Google DeepMind,2023)通过添加正则化来解决这个问题:

LIPO=E[(logπθ(ywx)πref(ywx)logπθ(ylx)πref(ylx)12β)2]\mathcal{L}_{\text{IPO}} = \mathbb{E}\left[\left(\log\frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \log\frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} - \frac{1}{2\beta}\right)^2\right]

与 DPO 的 logσ()\log\sigma(\cdot) 损失不同,IPO 使用平方损失,将对数概率比的差异约束在 12β\frac{1}{2\beta} 附近。

关键差异

特性DPOIPO
损失类型logσ()-\log\sigma(\cdot)(交叉熵)(target)2(\cdot - \text{target})^2(平方)
优化方向持续增大边际约束边际在目标值附近
过拟合风险存在通过正则化缓解
训练至收敛可能不稳定更稳定
理论保证需要 Bradley-Terry 假设更一般的偏好模型

IPO 的名称由来:"Identity" 指的是 IPO 不需要 Bradley-Terry 模型假设——它直接在偏好的"恒等映射"上优化,因此具有更强的理论一般性。

系统性对比

综合比较表

方法核心思想参考模型数据要求主要优势主要局限最佳使用场景
DPO将 RLHF 目标重参数化为监督损失需要成对偏好理论优雅、实现简单长度偏差、需要参考模型通用对齐,有高质量偏好数据时
SimPO平均对数概率 + 目标边际不需要成对偏好更快、更省内存、效果更好需要调 γ\gamma资源受限或追求最佳效果
KTO前景理论,非配对二值反馈需要非配对好/坏标签数据要求最低理论相对复杂只有点赞/点踩数据时
ORPOSFT + 对齐联合优化不需要成对偏好单阶段训练验证较少、平衡调优难追求训练效率
IPO平方正则化防止过拟合需要成对偏好训练稳定、可收敛效果可能略低于 DPO数据量大、需要训练至收敛

损失函数对比

用统一的符号 u=r^(x,yw)r^(x,yl)u = \hat{r}(x, y_w) - \hat{r}(x, y_l) 表示隐式奖励边际:

方法损失函数形式关于 uu 的行为
DPOlogσ(βu)-\log\sigma(\beta \cdot u)u+u \to +\infty 时梯度趋于 0
SimPOlogσ(βunormγ)-\log\sigma(\beta \cdot u_{\text{norm}} - \gamma)类似 DPO 但有偏移
IPO(u12β)2(u - \frac{1}{2\beta})^2推向固定目标值
KTO分别处理好/坏样本非对称损失
ORPOLSFT+λLOR\mathcal{L}_{\text{SFT}} + \lambda \cdot \mathcal{L}_{\text{OR}}包含 SFT 正则化

实验结果对比(来自各原始论文)

以下是在常用基准上的代表性结果(数值来自原始论文,模型规模和基线可能不同,仅供参考趋势):

基准DPOSimPOKTOORPO
AlpacaEval 2 (LC Win Rate)~30%~36% (+6.4)~28%~27%
MT-Bench~7.5~7.8~7.3~7.2
Arena-Hard~25%~30%~23%~22%

注意:以上数值来自不同论文的不同实验设置(模型大小、基线模型、训练数据等),不能直接横向比较。它们的主要价值在于展示相对趋势:SimPO 在多个基准上优于标准 DPO。

如何选择合适的方法

评估数据情况

  • 有高质量成对偏好数据 → DPO / SimPO / IPO
  • 只有点赞/点踩标签 → KTO
  • 数据量很大但质量参差不齐 → IPO(正则化防过拟合)

评估计算资源

  • GPU 内存充足 → DPO(加载参考模型)
  • GPU 内存紧张 → SimPO / ORPO(无需参考模型)

评估训练流程偏好

  • 已有 SFT 模型,想在其基础上对齐 → DPO / SimPO
  • 想一步到位 → ORPO
  • 需要训练至完全收敛 → IPO

选择最终方法

对于大多数场景,SimPO 是当前的推荐首选:无需参考模型、效果最好、实现简单。如果数据不是成对偏好格式,则使用 KTO。

代码示例:切换 DPO 变体

在 TRL 中,切换 DPO 变体非常简单,只需修改 loss_type 参数:

from trl import DPOConfig, DPOTrainer

# 标准 DPO
dpo_config = DPOConfig(
    loss_type="sigmoid",  # 标准 DPO
    beta=0.1,
)

# SimPO(无参考模型)
simpo_config = DPOConfig(
    loss_type="simpo",
    beta=2.0,
    simpo_gamma=0.5,    # 目标奖励边际
)

# IPO
ipo_config = DPOConfig(
    loss_type="ipo",
    beta=0.1,
)

# KTO(使用 KTOTrainer)
from trl import KTOConfig, KTOTrainer

kto_config = KTOConfig(
    beta=0.1,
    desirable_weight=1.0,
    undesirable_weight=1.0,
)

# ORPO(使用 ORPOTrainer)
from trl import ORPOConfig, ORPOTrainer

orpo_config = ORPOConfig(
    beta=0.1,  # ORPO 中 beta 控制偏好项权重
)

在本课实验中,我们将实际对比 DPO 和 SimPO 两种方法,你将亲手体验两者在训练速度、内存占用和最终效果上的差异。