SimPO:无需参考模型的简洁偏好优化

笔记日期: 2026-05-26 笔记作者: Zhongzhu Zhou 论文标题: SimPO: Simple Preference Optimization with a Reference-Free Reward 作者: Yu Meng, Mengzhou Xia, Danqi Chen arXiv: 2405.14734

一句话总结

SimPO 发现了 DPO 训练与推理之间的一个根本性错位:DPO 优化的奖励(相对参考模型的对数概率比值)和模型推理时实际使用的生成度量(绝对平均对数概率)并不一致,导致训练后约 50% 的偏好对仍然存在错误的似然排序。SimPO 将奖励换成长度归一化的平均对数概率,移除参考模型,并加入目标奖励边距,在更简洁的实现下取得全面更好的对齐效果。

前置知识

本节为没有 RLHF/偏好优化背景的读者补充必要的基础知识。已经熟悉 DPO 的读者可以直接跳到”DPO 的核心问题”一节。

1. 为什么预训练的语言模型不够用?

一个大语言模型经过预训练后,学会了对自然语言文本建模——它擅长预测下一个词,能续写文章,能完成填空。但”预测下一个词的能力”和”成为有帮助、无害、诚实的对话助手”之间存在巨大的鸿沟:

  • 预训练数据包含海量互联网文本,其中不乏有害内容、错误信息、冗余废话;
  • 预训练目标是最大化训练数据的似然,而不是”让用户满意”;
  • 模型不知道”哪种回答是好的”,只知道”哪种回答在训练数据中更常见”。

RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)就是为了弥补这个鸿沟而提出的方法族。其核心思想是:收集人类对不同回答的偏好标注,然后把这个偏好信号转化为训练信号,引导模型生成更符合人类期望的输出。

2. 标准 RLHF 三阶段流程

flowchart LR
    A["预训练模型\n(原始文本预测)"] -->|"第一阶段:监督微调 SFT"| B["SFT 模型\n(能按指令回答)"]
    B -->|"第二阶段:奖励模型训练"| C["奖励模型 RM\n(评估回答好坏的代理)"]
    B -->|"第三阶段:PPO 强化学习"| D["对齐后的策略 π_θ\n(有帮助的助手)"]
    C -.->|"奖励信号 r(x,y)"| D

第一阶段(SFT): 在高质量的(提示词, 理想回答)对上做有监督微调,教模型基本的指令跟随能力。

第二阶段(奖励模型): 人类标注员比较同一问题的多个回答,标记哪个更好。奖励模型 rϕ(x,y)r_\phi(x, y) 在这些比较标注上训练,学习给更好的回答打更高的分。

第三阶段(PPO 强化学习): 以 SFT 模型为出发点,用 PPO 算法最大化奖励模型的得分,同时加上一个 KL 散度约束防止策略偏离太远:

max⁡πθEx∼D, y∼πθ(y∣x)[rϕ(x,y)]−β⋅KL[πθ(y∣x) ∥ πref(y∣x)]\max_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D},\, y \sim \pi_\theta(y|x)}\left[r_\phi(x, y)\right] - \beta \cdot \mathbb{KL}\left[\pi_\theta(y|x) \,\|\, \pi_{\text{ref}}(y|x)\right]

这里的参考模型 πref\pi_{\text{ref}} 就是 SFT 模型,KL 项保证策略不会跑偏到能欺骗奖励模型但实际质量很差的退化解。

全套 RLHF 流程强大但昂贵:同时维护三个模型(SFT / 奖励模型 / 参考模型),训练时还需要在线采样,工程复杂度高。

3. Bradley-Terry 模型:偏好比较的概率框架

Bradley-Terry(BT)模型是做偏好排序的经典工具。给定两个选项 ii 和 jj,BT 模型预测 ii 胜出的概率:

P(i≻j)=σ(log⁡si−log⁡sj)P(i \succ j) = \sigma(\log s_i - \log s_j)

其中 si,sjs_i, s_j 是两个选项的”强度”(用奖励替代),σ\sigma 是 sigmoid 函数。

在偏好优化中,“强度”就是奖励函数 r(x,y)r(x, y):

P(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))P(y_w \succ y_l \mid x) = \sigma(r(x, y_w) - r(x, y_l))

在偏好数据集 D={(x,yw,yl)}\mathcal{D} = \{(x, y_w, y_l)\} 上的极大似然训练目标:

LBT=−E(x,yw,yl)∼D[log⁡σ(r(x,yw)−r(x,yl))]\mathcal{L}_{\text{BT}} = -\mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}}\left[\log \sigma(r(x, y_w) - r(x, y_l))\right]

DPO 和 SimPO 都用这个框架——区别在于如何定义奖励 r(x,y)r(x, y)。

4. 直接偏好优化(DPO):被 SimPO 改进的基础算法

DPO(Rafailov 等人, 2023)的关键洞察:KL 约束下的 RLHF 最优策略 π∗\pi^* 满足:

π∗(y∣x)=πref(y∣x)⋅exp⁡(r(x,y)/β)Z(x)\pi^*(y|x) = \frac{\pi_{\text{ref}}(y|x) \cdot \exp(r(x,y)/\beta)}{Z(x)}

反推可得奖励的闭式表达:

r(x,y)=βlog⁡πθ(y∣x)πref(y∣x)+βlog⁡Z(x)r(x, y) = \beta \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)} + \beta \log Z(x)

代入 BT 目标,配分函数 Z(x)Z(x) 消掉,得到 DPO 目标函数:

LDPO(πθ;πref)=−E(x,yw,yl)∼D[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))]\mathcal{L}_{\text{DPO}}(\pi_\theta; \pi_{\text{ref}}) = -\mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}}\left[\log \sigma\left(\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)}\right)\right]

DPO 的优势:不需要显式奖励模型,不需要 PPO,直接在偏好数据上做有监督学习,工程简单。它迅速成为最流行的对齐算法。但它有一个细微却重要的缺陷,SimPO 将其暴露出来。

5. 语言模型对序列的打分方式

深入理解 SimPO 前,还需要清楚语言模型如何打分。一个语言模型对序列 y=(y1,y2,…,y∣y∣)y = (y_1, y_2, \ldots, y_{|y|}) 给定上下文 xx 的概率是:

πθ(y∣x)=∏i=1∣y∣πθ(yi∣x,y<i)\pi_\theta(y | x) = \prod_{i=1}^{|y|} \pi_\theta(y_i \mid x, y_{<i})

取对数:

log⁡πθ(y∣x)=∑i=1∣y∣log⁡πθ(yi∣x,y<i)\log \pi_\theta(y | x) = \sum_{i=1}^{|y|} \log \pi_\theta(y_i \mid x, y_{<i})

总对数概率的问题: 更长的序列几乎总是有更低(更负)的总对数概率,仅仅因为乘了更多项。如果用总对数概率来比较两个不同长度的回答,长度本身就是一个混淆因素。

平均对数概率(每个 token 的平均对数概率)解决了这个问题:

p~θ(y∣x)=1∣y∣log⁡πθ(y∣x)=1∣y∣∑i=1∣y∣log⁡πθ(yi∣x,y<i)\tilde{p}_\theta(y|x) = \frac{1}{|y|} \log \pi_\theta(y|x) = \frac{1}{|y|} \sum_{i=1}^{|y|} \log \pi_\theta(y_i \mid x, y_{<i})

注意:p~θ\tilde{p}_\theta 越大,代表模型对这个序列越”有信心”(每个 token 的平均困惑度越低)。这也正是模型在解码时隐式使用的度量——beam search 和采样都基于每个 token 的局部分数,等价于沿途累积平均对数概率。

DPO 的核心问题

6. 训练奖励与推理度量的错位

DPO 在训练时优化的奖励是:

rDPO(x,y)=βlog⁡πθ(y∣x)πref(y∣x)r_{\text{DPO}}(x, y) = \beta \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)}

训练目标要求对每个偏好对 (x,yw,yl)(x, y_w, y_l):

rDPO(x,yw)>rDPO(x,yl)r_{\text{DPO}}(x, y_w) > r_{\text{DPO}}(x, y_l)

⇔log⁡πθ(yw∣x)−log⁡πref(yw∣x)>log⁡πθ(yl∣x)−log⁡πref(yl∣x)\Leftrightarrow \quad \log \pi_\theta(y_w|x) - \log \pi_{\text{ref}}(y_w|x) > \log \pi_\theta(y_l|x) - \log \pi_{\text{ref}}(y_l|x)

但推理时没有参考模型。模型直接用 πθ(y∣x)\pi_\theta(y|x) 生成或排序回答。推理时的”隐含排序”是:

p~θ(yw∣x)>p~θ(yl∣x)\tilde{p}_\theta(y_w|x) > \tilde{p}_\theta(y_l|x)

这两个条件不等价。 DPO 奖励排序成立时,似然排序不一定成立——参考模型作为混淆变量,可能抵消模型的绝对概率调整。

SimPO 作者实测:DPO 训练后,训练集里只有约 50% 的偏好三元组满足 p~θ(yw∣x)>p~θ(yl∣x)\tilde{p}_\theta(y_w|x) > \tilde{p}_\theta(y_l|x)。训练前(SFT 基线)也是约 50%。也就是说,DPO 训练几乎没有改变模型对preferred/rejected回答的绝对似然排序。

flowchart TD
    A["DPO 训练目标\n优化:r_DPO(x,yw) > r_DPO(x,yl)\nr_DPO(x,y) = β·log[π_θ(y|x) / π_ref(y|x)]"] --> B{{"奖励排序\n是否蕴含似然排序?"}};
    B -->|"❌ 不保证\n(实测约 50% 满足)"| C["推理时用\nπ_θ(y|x) 生成\n无参考模型参与"];
    B -->|"✅ 设计上保证"| D["SimPO 训练目标\n优化:p̃_θ(yw|x) > p̃_θ(yl|x)\np̃_θ(y|x) = (1/|y|)·log π_θ(y|x)"];
    C --> E["⚠️ 训练优化的量\n和推理使用的量不一致"];
    D --> F["✅ 训练与推理\n使用同一度量"]

7. 参考模型是不必要的负担

DPO 需要参考模型出于两个原因:(1) 提供 KL 正则化的基点;(2) 计算隐式奖励的比值。如果我们能定义一个不需要这个比值的奖励,就可以得到:

  • 显存节省:训练时不需要在 GPU 上保存第二份模型的激活值;
  • 计算节省:每个 batch 不需要额外过一遍冻结的参考模型;
  • 概念简化:损失函数只依赖当前策略,不依赖历史检查点。

SimPO 通过直接用平均对数概率作为奖励来实现无参考训练。虽然没有显式 KL 约束,但小学习率、多样化偏好数据和大模型的固有稳定性共同提供了隐式正则化,实验测量的 KL 散度与 DPO 相当。

SimPO 算法详解

8. 第一步:定义无参考奖励

SimPO 的奖励函数就是回答的长度归一化平均对数概率:

rSimPO(x,y)=β∣y∣log⁡πθ(y∣x)=β∣y∣∑i=1∣y∣log⁡πθ(yi∣x,y<i)\boxed{r_{\text{SimPO}}(x, y) = \frac{\beta}{|y|} \log \pi_\theta(y|x) = \frac{\beta}{|y|} \sum_{i=1}^{|y|} \log \pi_\theta(y_i \mid x, y_{<i})}

为什么要做长度归一化? 不做长度归一化时,奖励会偏向更短的回答(因为总对数概率是负的,更短的序列总对数概率绝对值更小,即数值更大)。长度归一化让不同长度的回答在相同每 token 质量下获得相同奖励,完全消除了长度带来的系统性偏差。

形式上,设 y=(y1,…,y∣y∣)y = (y_1, \ldots, y_{|y|}),奖励等价于:

rSimPO(x,y)=β⋅p~θ(y∣x)r_{\text{SimPO}}(x, y) = \beta \cdot \tilde{p}_\theta(y|x)

其中 p~θ(y∣x)=1∣y∣∑i=1∣y∣log⁡πθ(yi∣x,y<i)\tilde{p}_\theta(y|x) = \frac{1}{|y|}\sum_{i=1}^{|y|}\log \pi_\theta(y_i|x,y_{<i}) 是平均 token 对数概率。p~θ\tilde{p}_\theta 越大,模型对该序列越”自然”——每个 token 的平均困惑度越低。

这恰恰就是推理时模型评分序列所用的度量。训练和推理用同一把尺子——这是 SimPO 的核心修正。

9. 第二步:引入目标奖励边距

有了无参考奖励,直接应用 BT 目标得到:

L=−E[log⁡σ(rSimPO(x,yw)−rSimPO(x,yl))]\mathcal{L} = -\mathbb{E}\left[\log \sigma(r_{\text{SimPO}}(x, y_w) - r_{\text{SimPO}}(x, y_l))\right]

这个损失在 rSimPO(x,yw)>rSimPO(x,yl)r_{\text{SimPO}}(x, y_w) > r_{\text{SimPO}}(x, y_l) 时最小化,但”高多少才够”并不明确。

SimPO 引入目标奖励边距 γ>0\gamma > 0,要求赢家的奖励至少比输家高 γ\gamma:

p(yw≻yl∣x)=σ(rSimPO(x,yw)−rSimPO(x,yl)−γ)p(y_w \succ y_l \mid x) = \sigma(r_{\text{SimPO}}(x, y_w) - r_{\text{SimPO}}(x, y_l) - \gamma)

γ\gamma 的作用类似于支持向量机(SVM)中的间隔:强制模型在偏好对之间建立足够大的分隔,而不只是让赢家”稍微领先”。通常更大的间隔带来更好的泛化能力——直到间隔大到无法满足为止。

为什么 DPO 不需要显式边距? DPO 有参考模型提供隐式的 KL 正则化,这相当于限制了策略偏离参考模型的程度,间接给出了偏好间隔的下界。SimPO 去掉了参考模型,需要用显式的 γ\gamma 来填补这个角色。

10. 第三步:推导 SimPO 完整目标函数

将无参考奖励和带边距的 BT 模型合并,得到 SimPO 最终目标:

LSimPO(πθ)=−E(x,yw,yl)∼D[log⁡σ(β∣yw∣log⁡πθ(yw∣x)−β∣yl∣log⁡πθ(yl∣x)−γ)]\boxed{\mathcal{L}_{\text{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]}

逐项解读:

  • β∣yw∣log⁡πθ(yw∣x)\frac{\beta}{|y_w|}\log \pi_\theta(y_w|x):赢者回答的平均对数概率,乘以温度系数 β\beta
  • β∣yl∣log⁡πθ(yl∣x)\frac{\beta}{|y_l|}\log \pi_\theta(y_l|x):输者回答的平均对数概率,乘以 β\beta
  • γ\gamma:两者奖励差需要超过的目标边距
  • log⁡σ(⋅)\log \sigma(\cdot):应用 BT 模型,最大化偏好一致的概率

11. SimPO 训练算法(伪代码)

SimPO 训练算法

输入:
  - 策略模型 π_θ(从 SFT 检查点初始化)
  - 偏好数据集 D = {(x, y_w, y_l)}
  - 超参数:β(温度),γ(目标边距),α(学习率)

对每个训练批次 {(x, y_w, y_l)}_B:
  步骤 1:π_θ 前向传播
    对每个 (x, y_w, y_l):
      r_w ← (β / |y_w|) · Σ_i log π_θ(y_w_i | x, y_w_{<i})   // 赢者平均对数概率
      r_l ← (β / |y_l|) · Σ_i log π_θ(y_l_i | x, y_l_{<i})   // 输者平均对数概率

  步骤 2:计算损失
    L ← -mean( log σ(r_w - r_l - γ) )   // BT 带边距损失

  步骤 3:反向传播并更新参数
    ∇_θ L → 优化器.step()

返回:π_θ(对齐后的策略)

与 DPO 相比,SimPO 省去了参考模型的整个前向传播步骤。

12. DPO 与 SimPO 计算架构对比

flowchart LR
    subgraph DPO训练["DPO 训练(双路前向传播)"]
        direction TB
        D1["偏好批次\n(x, y_w, y_l)"] --> D2["π_ref(冻结)\n参考模型前向传播"]
        D1 --> D3["π_θ(可训练)\n策略模型前向传播"]
        D2 --> D4["log π_ref(y_w|x)\nlog π_ref(y_l|x)"]
        D3 --> D5["log π_θ(y_w|x)\nlog π_θ(y_l|x)"]
        D4 & D5 --> D6["r_w = β·log[π_θ(y_w)/π_ref(y_w)]\nr_l = β·log[π_θ(y_l)/π_ref(y_l)]"]
        D6 --> D7["损失:-log σ(r_w - r_l)"]
    end
    subgraph SimPO训练["SimPO 训练(单路前向传播)"]
        direction TB
        S1["偏好批次\n(x, y_w, y_l)"] --> S3["π_θ(可训练)\n仅策略模型前向传播"]
        S3 --> S5["log π_θ(y_w|x), |y_w|\nlog π_θ(y_l|x), |y_l|"]
        S5 --> S6["r_w = (β/|y_w|)·log π_θ(y_w|x)\nr_l = (β/|y_l|)·log π_θ(y_l|x)"]
        S6 --> S7["损失:-log σ(r_w - r_l - γ)"]
    end
    DPO训练 --- SimPO训练

SimPO 彻底去掉了冻结参考模型,节省约 50% 的激活显存和计算量。

13. 梯度分析:SimPO 到底在优化什么

对单个三元组的损失 ℓ=−log⁡σ(Δ)\ell = -\log\sigma(\Delta),其中 Δ=rw−rl−γ\Delta = r_w - r_l - \gamma,对策略参数的梯度为:

∂ℓ∂θ=(1−σ(Δ))⋅∂Δ∂θ\frac{\partial \ell}{\partial \theta} = (1 - \sigma(\Delta)) \cdot \frac{\partial \Delta}{\partial \theta}

展开 ∂Δ∂θ\frac{\partial \Delta}{\partial \theta}:

∂ℓ∂θ=(1−σ(Δ))⋅β[1∣yw∣∇θlog⁡πθ(yw∣x)−1∣yl∣∇θlog⁡πθ(yl∣x)]\frac{\partial \ell}{\partial \theta} = (1 - \sigma(\Delta)) \cdot \beta \left[\frac{1}{|y_w|} \nabla_\theta \log\pi_\theta(y_w|x) - \frac{1}{|y_l|} \nabla_\theta \log\pi_\theta(y_l|x)\right]

三个部分的含义:

① (1−σ(Δ))(1 - \sigma(\Delta)):这是”样本权重”。当模型已经明确偏向 ywy_w(Δ\Delta 很大)时,σ(Δ)≈1\sigma(\Delta) \approx 1,梯度趋近于零——模型不需要再”用力推”。当排序错误或不确定(Δ≤0\Delta \leq 0)时,梯度最大——困难样本获得最多训练信号。这正是理想的课程学习行为。

② 1∣yw∣∇θlog⁡πθ(yw∣x)\frac{1}{|y_w|}\nabla_\theta\log\pi_\theta(y_w|x):提升赢者的平均对数概率,每个 token 贡献相等,与序列长度无关。

③ −1∣yl∣∇θlog⁡πθ(yl∣x)-\frac{1}{|y_l|}\nabla_\theta\log\pi_\theta(y_l|x):降低输者的平均对数概率,同样长度归一化。

长度归一化的梯度意味着:对赢者/输者序列中每个 token 施加的”推力”是均等的,不会因为序列更长而在数值上”推得更多”。这消除了训练中对长度的系统性偏差。

实验设置

14. 模型与训练配置

作者在两个模型族、两种训练设置下评估 SimPO:

模型族:

  • Mistral-7B-v0.1(base)/ Mistral-7B-Instruct-v0.2(instruct)
  • Llama-3-8B(base)/ Llama-3-8B-Instruct(instruct)
  • Gemma-2-9B-it(instruct,最强模型)

两种训练设置:

flowchart TD
    subgraph Base["Base 设置(全透明流程)"]
        B1["Base 模型"] -->|"在 UltraChat-200k 上做 SFT"| B2["SFT 模型"]
        B2 -->|"在 UltraFeedback 上做偏好优化"| B3["对齐模型"]
    end
    subgraph Instruct["Instruct 设置(近似在线数据)"]
        I1["Instruct 模型\n(已经过 RLHF)"] -->|"每个提示词采样 5 个回答"| I2["候选回答池"]
        I2 -->|"PairRM/ArmoRM 打分\n选最好和最差"| I3["在线偏好对"]
        I3 -->|"偏好优化"| I4["对齐模型"]
    end

Base 设置使用公开数据集,透明度高,可复现性强。

Instruct 设置在策略自身生成的数据上训练,更接近在线 RLHF,通常效果更好,因为偏好数据分布与当前策略匹配。

SimPO 关键超参数:

  • β=2.5\beta = 2.5(奖励缩放系数)
  • γ=0.5\gamma = 0.5(目标边距,单位为对数概率)
  • 学习率:5×10−75 \times 10^{-7}(极小,保证稳定)
  • 批大小:32

15. 评估基准

基准测什么关键指标
AlpacaEval 2开放式指令跟随 vs. GPT-4 TurboLC 胜率(长度控制)
MT-Bench多轮推理/代码/写作/数学GPT-4 评分(1-10)
Arena-Hard困难编程和推理任务 vs. GPT-4o胜率

AlpacaEval 2 的长度控制(LC)胜率是主要指标,因为它直接对抗 SimPO 所解决的长度利用问题。

结果

16. 主要结果:SimPO 全面超越 DPO

SimPO 在所有实验设置下持续超越 DPO 及其变体:

AlpacaEval 2 LC 胜率对比(近似值):

xychart-beta
    title "AlpacaEval 2 LC 胜率 (Instruct 设置,Llama-3-8B)"
    x-axis ["SFT", "DPO", "IPO", "CPO", "ORPO", "R-DPO", "SimPO"]
    y-axis "LC 胜率 (%)" 0 --> 60
    bar [5.6, 28.3, 27.5, 28.1, 31.4, 32.5, 44.7]

(数值为论文Table 3近似结果,实际值以原文为准。)

跨所有设置的 SimPO vs. DPO 优势:

  • AlpacaEval 2 LC:SimPO 超越 +4 到 +6.4 个百分点
  • Arena-Hard:SimPO 超越 +5 到 +7.5 个百分点
  • MT-Bench:持平或略好

最强模型(Gemma-2-9B-it + ArmoRM 标注):

  • AlpacaEval 2 LC:72.4%
  • Arena-Hard:59.1%
  • Chatbot Arena 真实用户投票:10B 以下模型排名第一(截至 2024 年 9 月)

17. 核心假设验证:似然排序准确率

作者提供了直接验证核心假设的诊断指标——似然排序准确率:训练结束后,训练集里有多少比例的三元组满足 p~θ(yw∣x)>p~θ(yl∣x)\tilde{p}_\theta(y_w|x) > \tilde{p}_\theta(y_l|x)?

xychart-beta
    title "似然排序准确率(训练集三元组)"
    x-axis ["SFT 基线(训练前)", "DPO(训练后)", "SimPO(训练后)"]
    y-axis "准确率 (%)" 0 --> 100
    bar [50, 51, 90]

结论一目了然:

  • SFT 基线:约 50%(随机水平,模型还没见过偏好数据)
  • DPO 训练后:约 51%(几乎没变!)
  • SimPO 训练后:约 90%(明显提升)

DPO 训练成功优化了比值奖励 rDPOr_{\text{DPO}},但几乎没有改变模型对优/劣回答的绝对似然排序。这是训练-推理错位的直接证据。

18. 回答长度分析

方法平均回答长度(Instruct 设置)
SFT 基线~400 tokens
DPO~560 tokens(增加 40%)
R-DPO~470 tokens(增加 18%)
SimPO~420 tokens(增加 5%)

SimPO 几乎没有引发回答长度膨胀,而 DPO 增加了 40%。这证实了长度归一化奖励的有效性。

这也解释了为什么 SimPO 在 AlpacaEval 2 LC(长度控制指标)上的优势比 MT-Bench(不控制长度)上更明显。

19. 目标边距 γ\gamma 消融实验

作者对 γ\gamma 从 0 到 2.0 做了消融:

  • γ=0\gamma = 0(无边距):仍然超越 DPO,但略低于最优 SimPO
  • γ∈[0.3,0.8]\gamma \in [0.3, 0.8]:最优范围,性能稳定提升
  • γ>1.5\gamma > 1.5:性能下降——约束太紧,很多三元组无法满足,训练不稳定

这与最大间隔分类器的经典行为一致:适当的间隔改善泛化,过大的间隔则限制了可行解空间。

深度分析

20. SimPO 的成功:量化分解两项贡献

  • 长度归一化单独贡献(去掉 γ\gamma,只加长度归一化):约占全部提升的 60-70%
  • 目标边距单独贡献:约占 30-40%

长度归一化是主导贡献——这符合直觉,因为它修复了一个根本性的算法错误(训练-推理错位),而边距是一个经验性的正则化提升。

21. 与无参考模型训练的关系:KL 散度实验

SimPO 没有显式的 KL 约束,可能让人担心灾难性遗忘。作者的实验驱散了这个顾虑:

  1. SimPO 的 KL 散度与 DPO 相当——在相同训练步数下,两种方法与参考模型的 KL 距离相似
  2. MT-Bench 得分保持稳定——通用能力没有退化
  3. KL 散度增长缓慢——小学习率自然地将策略限制在参考附近

这说明:对于偏好优化这个特定任务,KL 正则化的显式约束并非必要——实践因素已经提供了足够的隐式约束。

22. 与 DPO 变体家族的全面对比

flowchart LR
    DPO["DPO\n基础算法"] -->|"加目标边距"| IPO["IPO\n比值奖励 + 边距"]
    DPO -->|"去掉参考\n但用求和对数概率"| CPO["CPO\n无参考但有长度偏差"]
    DPO -->|"加长度惩罚"| RDPO["R-DPO\n在奖励上加长度惩罚"]
    DPO -->|"用 odds ratio"| ORPO["ORPO\n无参考,用 odds ratio"]
    SimPO_["SimPO\n= CPO + 长度归一化 + 目标边距"] -->|"超越所有变体"| SimPO_
  • IPO:有边距但保留了比值奖励,效果不如 SimPO——说明边距不是关键,奖励公式才是
  • CPO:去掉了参考模型但用求和对数概率,有长度偏差,效果不如 SimPO
  • R-DPO:在奖励层面加了长度惩罚,仍需参考模型,效果不如 SimPO
  • ORPO:无参考模型、用 odds ratio,竞争力强但仍被 SimPO 超越

23. 长度归一化防止长度利用:形式推导

假设模型对两个回答每个 token 分配相同的对数概率 cc,但 ∣yw∣=2∣yl∣|y_w| = 2|y_l|:

用求和对数概率(有长度偏差): rsum(x,yw)=c⋅2∣yl∣,rsum(x,yl)=c⋅∣yl∣r_{\text{sum}}(x, y_w) = c \cdot 2|y_l|, \quad r_{\text{sum}}(x, y_l) = c \cdot |y_l| rsum(x,yw)−rsum(x,yl)=c⋅∣yl∣r_{\text{sum}}(x, y_w) - r_{\text{sum}}(x, y_l) = c \cdot |y_l|

奖励差完全由长度比决定,与质量无关。模型学到”更长=更好”。

用平均对数概率(SimPO): ravg(x,yw)=c,ravg(x,yl)=cr_{\text{avg}}(x, y_w) = c, \quad r_{\text{avg}}(x, y_l) = c ravg(x,yw)−ravg(x,yl)=0r_{\text{avg}}(x, y_w) - r_{\text{avg}}(x, y_l) = 0

质量相同的回答获得相同奖励,无论长短。唯一能提高奖励的途径是提高每个 token 的质量(降低每 token 困惑度)。

局限性

24. 已知局限

1. 长度归一化可能过度惩罚合理的长回答。 某些任务(详细的代码实现、多步推理证明、全面的解释)本身需要更长的回答。SimPO 的长度归一化使奖励与长度无关,但这在”需要更长才能质量更高”的场景下可能适得其反。实践中影响似乎较小(长度仅略高于 SFT),但对特别需要长输出的场景值得关注。

2. 离线偏好数据的分布漂移。 SimPO 与 DPO 一样是离线算法:偏好数据在训练前收集好,策略在固定数据集上训练。随着策略改变,早期收集的偏好对可能不再适合当前模型。迭代式 SimPO(每轮重新收集偏好数据)可以缓解这个问题,但增加了计算成本。

3. 没有显式奖励模型。 SimPO 和 DPO 都不训练显式奖励模型,因此无法评估任意回答的奖励。对于需要奖励模型泛化的应用场景(如 RLAIF、奖励引导的推理搜索),显式奖励模型仍然必要。

4. 需要额外调整 γ\gamma。 相比 DPO 只有 β\beta 一个超参数,SimPO 多了 γ\gamma。虽然默认值 0.5 在多数设置下效果好,但在新任务或新模型上可能需要重新调整 γ\gamma 与 β\beta 的组合。

5. 理论最优解不清晰。 DPO 在理论上与 KL 约束 RLHF 的最优策略有精确的对应关系。SimPO 去掉了 KL 约束,最优解的理论刻画较弱。实践效果很好,但理论理解有待完善。

可复现性

25. 代码、模型与数据

官方代码: https://github.com/princeton-nlp/SimPO

实现基于 TRL(Transformer Reinforcement Learning)库,SimPO 损失函数约 10-15 行代码,可直接替换 TRL 中的 DPO 损失。

已发布模型检查点:

  • SimPO-Mistral-7B-Base
  • SimPO-Llama-3-8B-Base
  • SimPO-Llama-3-8B-Instruct
  • SimPO-Gemma-2-9B-it(最强,使用 ArmoRM 标注)

数据集:

  • SFT:HuggingFaceH4/ultrachat_200k
  • 偏好数据(Base 设置):HuggingFaceH4/ultrafeedback_binarized
  • 在线数据(Instruct 设置):从 SFT 模型自行生成 + PairRM/ArmoRM 打分

SimPO 损失函数实现(简化 Python):

import torch
import torch.nn.functional as F

def simpo_loss(
    policy_chosen_logps: torch.Tensor,     # (B,) 赢者总对数概率
    policy_rejected_logps: torch.Tensor,   # (B,) 输者总对数概率
    chosen_lengths: torch.Tensor,          # (B,) 赢者长度 |y_w|
    rejected_lengths: torch.Tensor,        # (B,) 输者长度 |y_l|
    beta: float = 2.5,
    gamma: float = 0.5,
) -> torch.Tensor:
    """SimPO 损失:无参考模型、长度归一化、目标边距"""
    # 计算长度归一化的平均对数概率
    chosen_reward = beta * (policy_chosen_logps / chosen_lengths)
    rejected_reward = beta * (policy_rejected_logps / rejected_lengths)

    # 带边距的 BT 损失
    reward_diff = chosen_reward - rejected_reward - gamma
    loss = -F.logsigmoid(reward_diff).mean()
    return loss

计算资源要求:

  • Llama-3-8B:4-8 张 A100 80GB,约 6-12 小时
  • Gemma-2-9B-it:8 张 A100 80GB,约 12-24 小时
  • 无需参考模型,显存约为 DPO 的一半

总结与个人思考

SimPO 是一篇”找到了真正问题并干净地修复它”的论文。DPO 的训练-推理错位不是一个模糊的”可能有问题”的担忧,而是可以精确度量的缺陷:训练后似然排序准确率约 50%,几乎等于随机。SimPO 的修复也是精准的:把奖励换成和推理对齐的度量。

让我印象深刻的是诊断方法的设计。论文不只是在基准上展示提升,而是构造了一个直接验证核心假设的指标(似然排序准确率)。这种”先定义要证明什么,再测量它”的风格,比只看最终 benchmark 的方法要严谨得多,也更有说服力。

去参考模型的决定带来了意外的好结果:更少的显存、更快的训练、更简单的代码。有时候最好的改进方式不是”加什么”,而是”去掉什么不必要的东西”。

从落地角度来看,SimPO 现在应该是偏好优化的首选 baseline:更简单、更快、效果更好。除非有特殊原因需要 KL 约束(如安全关键应用需要与参考模型保持严格接近),SimPO 是严格意义上对 DPO 的改进。

对未来工作而言,最自然的延伸是迭代式 SimPO——在每轮训练后,用当前策略生成新的偏好对,然后继续优化。SimPO 在计算上的节省使这种迭代更加可行。结合强大的奖励模型(如 ArmoRM),迭代 SimPO 很可能是下一个在小模型上挑战大模型对齐能力的方向。

附录:核心公式速查

DPO 隐式奖励: rDPO(x,y)=βlog⁡πθ(y∣x)πref(y∣x)+βlog⁡Z(x)r_{\text{DPO}}(x, y) = \beta \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)} + \beta \log Z(x)

DPO 训练目标: LDPO=−ED[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))]\mathcal{L}_{\text{DPO}} = -\mathbb{E}_{\mathcal{D}}\left[\log \sigma\left(\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)}\right)\right]

SimPO 奖励(长度归一化平均对数概率): rSimPO(x,y)=β∣y∣∑i=1∣y∣log⁡πθ(yi∣x,y<i)r_{\text{SimPO}}(x, y) = \frac{\beta}{|y|} \sum_{i=1}^{|y|} \log \pi_\theta(y_i \mid x, y_{<i})

带边距的 BT 偏好概率: p(yw≻yl∣x)=σ(r(x,yw)−r(x,yl)−γ)p(y_w \succ y_l \mid x) = \sigma(r(x, y_w) - r(x, y_l) - \gamma)

SimPO 训练目标: LSimPO=−ED[log⁡σ(β∣yw∣log⁡πθ(yw∣x)−β∣yl∣log⁡πθ(yl∣x)−γ)]\mathcal{L}_{\text{SimPO}} = -\mathbb{E}_{\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]

SimPO 梯度(单个三元组): ∂L∂θ=(1−σ(Δ))⋅β[∇θlog⁡πθ(yw∣x)∣yw∣−∇θlog⁡πθ(yl∣x)∣yl∣]\frac{\partial \mathcal{L}}{\partial \theta} = (1 - \sigma(\Delta)) \cdot \beta \left[\frac{\nabla_\theta \log\pi_\theta(y_w|x)}{|y_w|} - \frac{\nabla_\theta \log\pi_\theta(y_l|x)}{|y_l|}\right]

其中 Δ=β∣yw∣log⁡πθ(yw∣x)−β∣yl∣log⁡πθ(yl∣x)−γ\Delta = \frac{\beta}{|y_w|}\log\pi_\theta(y_w|x) - \frac{\beta}{|y_l|}\log\pi_\theta(y_l|x) - \gamma。

默认超参数(Instruct 设置): β=2.5\beta = 2.5,γ=0.5\gamma = 0.5,学习率 5×10−75 \times 10^{-7},批大小 32。

延伸讨论:SimPO 在更广泛对齐研究中的位置

26. 偏好优化算法谱系

从 2023 年至今,偏好优化方法经历了快速演化。理解这个谱系有助于把 SimPO 放在正确的坐标系中。

flowchart TD
    RLHF["RLHF (Christiano 2017)\n显式奖励模型 + PPO + KL 约束\n强大但工程复杂"] -->|"去掉显式 RM\n重参数化奖励"| DPO["DPO (Rafailov 2023)\n用对数比值作为隐式奖励\n简单但训练-推理错位"]
    DPO -->|"加目标边距"| IPO["IPO (Azar 2024)\n比值奖励 + 边距\n仍然有错位问题"]
    DPO -->|"去掉参考模型"| CPO["CPO\n无参考但用求和对数概率\n有长度偏差"]
    DPO -->|"加长度惩罚"| RDPO["R-DPO\n在奖励层面惩罚长度\n但仍需参考模型"]
    DPO -->|"odds ratio"| ORPO["ORPO\n无参考、odds ratio\n性能有竞争力"]
    CPO -->|"+ 长度归一化 + 目标边距"| SimPO_["SimPO (Meng 2024)\n平均对数概率奖励\n无参考、目标边距\n训练-推理完全对齐"]
    SimPO_ -->|"+ 在线数据收集"| Future["迭代式 SimPO\n(2024-2025 研究方向)"]

SimPO 是这个家族树中多条改进路线的自然交汇点:它同时解决了 CPO 的长度问题、R-DPO 仍然需要参考模型的问题,并且比 IPO 更准确地找到了错位的根源。

27. 从弱到强:小模型对齐的天花板在哪里?

SimPO 基于 Gemma-2-9B-it 的结果尤其值得关注——一个 9B 参数的模型在真实用户投票中排名 10B 以下第一。这引出一个重要问题:对齐能在多大程度上放大模型的能力?

理解这个问题需要区分两种提升:

  • 能力提升:模型学会了之前不会的新技能(如解一类新的数学题)
  • 校准提升:模型学会了更一致地展示它已经具备的能力

SimPO 的提升主要属于后者。大型语言模型经过预训练后,“已经懂了”很多东西,但在采样生成时不一定总是展示出来。偏好优化将模型的概率分布重新校准——让好的回答获得更高的生成概率。

这种校准效应可以是相当大的。从 AlpacaEval 2 的 57% 提升到 72%,幅度有 15 个百分点。对于一个参数量没有变化的同一个模型,这种提升完全来自于概率质量的重新分配。

这告诉我们:对齐不只是”安全”的问题,也是性能的问题。一个参数量相同的模型,对齐好坏可以导致实际使用体验上的巨大差异。SimPO 提供了一个相对便宜(相比预训练)但有效的方式来挖掘这种潜力。

28. 无参考模型训练:理论上能走多远?

去掉参考模型后,是否存在理论上的性能天花板?

DPO 有明确的理论对应: 它的最优解精确对应于 KL 约束 RLHF 的最优策略 π∗(y∣x)∝πref(y∣x)exp⁡(r(x,y)/β)\pi^*(y|x) \propto \pi_{\text{ref}}(y|x)\exp(r(x,y)/\beta)。这个最优策略是有界的——距参考模型越远,奖励越高,但 KL 代价也越高,形成了自然的平衡点。

SimPO 的最优解更难刻画: 没有 KL 约束,理论上模型可以将任意多的概率质量放在偏好数据中”正确”的回答上,同时将不相关的分布保留。实践中小学习率阻止了这种极端情形,但我们不知道理论最优解是什么样子。

这是 SimPO 相比 DPO 的一个理论弱点:更难进行形式分析和安全性论证。对于希望提供形式化对齐保证的研究者来说,这是一个值得关注的开放问题。

29. 在线 vs. 离线偏好优化:为什么重要

SimPO 的 Instruct 设置(从当前策略生成偏好数据)已经比纯离线设置好得多,但仍然是单轮的。真正的在线/迭代偏好优化会每轮重新生成:

轮次 tt 的迭代 SimPO:

  1. 用当前策略 πt\pi_t 对每个提示词 xx 生成若干候选回答
  2. 用奖励模型(或人类)对候选评分,选出 ywy_w 和 yly_l
  3. 用 SimPO 在新数据上训练得到 πt+1\pi_{t+1}
  4. 重复

这个循环的好处是:每一轮的偏好数据都来自最新版本的模型,避免了分布漂移。坏处是:每轮都需要大量推理开销来生成候选回答。

SimPO 在这个流程中有实际优势:因为不需要参考模型,每轮训练的计算成本约是 DPO 的 60-70%,使更多迭代轮次在相同的计算预算下成为可能。

30. 从工程角度看 SimPO

对于工程师来说,SimPO 的吸引力不只是性能数字。让我梳理一下工程层面的考量:

显存占用分析(以 7B 模型为例,BF16 精度):

阶段DPO 显存占用SimPO 显存占用
模型权重14 GB (训练) + 14 GB (参考) = 28 GB14 GB (只有训练模型)
梯度~14 GB~14 GB
优化器状态~28 GB (AdamW)~28 GB
激活值2× forward pass1× forward pass
总计(4卡)~80 GB~56 GB

显存节省约 30%(主要来自参考模型权重和激活值),这足以在相同硬件上使用更大的批大小,或者训练更大的模型。

训练速度: 去掉参考模型前向传播后,每步的计算量约减少 25-35%(取决于批大小和序列长度),训练速度相应提升。

代码维护: DPO 实现需要维护参考模型的加载、冻结、推理,以及对应的日志记录和检查点。SimPO 去掉了这整套逻辑,代码更易读、更少的潜在 bug 源。

31. 评估方法的设计考量

SimPO 论文的评估策略本身就很有启发性,值得单独分析。

AlpacaEval 2 LC vs. 原版 AlpacaEval: 原版 AlpacaEval 直接用胜率(不控制长度),这让偏向产生更长回答的模型占据优势。LC(Length-Controlled)胜率通过统计手段控制回答长度的影响,给出更公平的质量对比。

SimPO 在 AlpacaEval 2 LC 上优势最大(而不是原版胜率),这其实是个好迹象:它说明 SimPO 的优势来自真实质量提升,而不是长度利用。

Chatbot Arena 真实人类投票的重要性: 所有基于 LLM 评测的基准(GPT-4 作为评委)都存在”评测者偏好”问题——评委模型有自己的偏好模式,可能和真实用户不一样。Chatbot Arena 用真实用户盲测,从根本上绕过了这个问题。

SimPO 的 Gemma-2-9B-it 模型在 Chatbot Arena 排名前进了 11 名(从第 36 名到第 25 名),并成为 10B 以下第一。这是对对齐改进最直接的验证。

32. 超参数敏感性与实践指导

对于准备在自己的任务上应用 SimPO 的工程师和研究者,以下是详细的调参建议:

β\beta(奖励缩放系数)的作用:

  • β\beta 过小(< 1.0):奖励信号太弱,模型改变太慢,可能需要很多轮才能看到效果
  • β\beta 在 2.0-3.0 之间:通常效果最好(论文默认 2.5)
  • β\beta 过大(> 5.0):奖励差异被放大,训练可能不稳定(损失剧烈震荡)

γ\gamma(目标边距)的作用:

  • γ=0\gamma = 0:标准 BT 目标,仍然比 DPO 好,但略低于带边距的版本
  • γ\gamma 在 0.3-0.8 之间:最优范围,平衡了分离强度和可行性
  • γ\gamma 在 1.0-1.5 之间:某些任务上仍然有效,但开始出现边际效益递减
  • γ>2.0\gamma > 2.0:通常导致训练不稳定,因为太多样本无法满足约束

学习率选择: 偏好优化要求极小的学习率(5×10−75 \times 10^{-7} 到 2×10−62 \times 10^{-6})。使用普通微调的学习率(10−510^{-5} 到 10−410^{-4})会导致灾难性遗忘——模型失去一般能力,只对偏好数据过拟合。

实践检查清单:

  1. 训练前:确认偏好数据集里赢者和输者质量差距明显(太相近的对子对训练没有意义)
  2. 训练中:监控 AlpacaEval 2 LC 分数,而不只是训练损失
  3. 训练后:检查回答长度是否相比 SFT 基线有明显变化(SimPO 应该接近基线)
  4. 深度检查:计算似然排序准确率——如果只有 60% 左右,说明训练还有空间

最终小结

SimPO 是一个展示”精准诊断”价值的典型案例。它的起点不是”我们能想到一个新的损失函数”,而是”DPO 的排序准确率为什么只有 50%“——这个问题导向了一个有明确答案的根因,以及一个有效的修复方案。

两项设计改变——长度归一化奖励和目标奖励边距——都可以用一两句话解释清楚,实现加起来不超过 20 行代码,却带来了全面的性能提升。这是算法设计的理想形态:简单、有理论动机、效果明确。

从更大的图景看,SimPO 证明了一件事:在对齐算法上,找到正确的目标函数比增加算法复杂度更重要。今天的 DPO 是明天的”基线”,而 SimPO 则是这条演化路线上一个干净的台阶。

深度补充:对算法细节的进一步展开

33. Bradley-Terry 模型的导出与直觉

Bradley-Terry 模型的核心假设是:每个备选项有一个固定的”潜在强度”si>0s_i > 0,两两比较的结果完全由强度比决定。

P(i≻j)=sisi+sjP(i \succ j) = \frac{s_i}{s_i + s_j}

用对数强度 θi=log⁡si\theta_i = \log s_i 替代,得到:

P(i≻j)=eθieθi+eθj=σ(θi−θj)P(i \succ j) = \frac{e^{\theta_i}}{e^{\theta_i} + e^{\theta_j}} = \sigma(\theta_i - \theta_j)

这就是 sigmoid 函数作用在强度差上——非常熟悉的形式。

在偏好优化中,“潜在强度”就是奖励函数 r(x,y)r(x, y)。给定一批偏好对 {(x,yw,yl)}\{(x, y_w, y_l)\},最大似然的 BT 估计就是找到使以下概率最大的奖励函数:

∏(x,yw,yl)∈DP(yw≻yl∣x)=∏(x,yw,yl)∈Dσ(r(x,yw)−r(x,yl))\prod_{(x,y_w,y_l)\in\mathcal{D}} P(y_w \succ y_l | x) = \prod_{(x,y_w,y_l)\in\mathcal{D}} \sigma(r(x,y_w) - r(x,y_l))

取负对数即得 BT 损失:

LBT=−∑(x,yw,yl)∈Dlog⁡σ(r(x,yw)−r(x,yl))\mathcal{L}_{\text{BT}} = -\sum_{(x,y_w,y_l)\in\mathcal{D}} \log \sigma(r(x,y_w) - r(x,y_l))

为什么用 sigmoid 而不是其他函数? sigmoid 对应 logistic 回归的概率模型,是最小假设下的最大熵选择:它假设偏好差的”噪声”服从 logistic 分布(最接近正态分布的二参数分布,但计算更方便)。

加上边距 γ\gamma 后: BT 损失变为:

LBT+margin=−∑(x,yw,yl)∈Dlog⁡σ(r(x,yw)−r(x,yl)−γ)\mathcal{L}_{\text{BT+margin}} = -\sum_{(x,y_w,y_l)\in\mathcal{D}} \log \sigma(r(x,y_w) - r(x,y_l) - \gamma)

当奖励差 r(x,yw)−r(x,yl)=0r(x,y_w) - r(x,y_l) = 0 时,原始 BT 给出 50% 的偏好概率(完全不确定),而带边距的版本给出 σ(−γ)<50%\sigma(-\gamma) < 50\%——模型被要求”不确定性更低的程度更严格”。这迫使优化过程为偏好对建立更大的奖励间距。

34. 当对数概率作为奖励时的隐含假设

SimPO 用平均对数概率作为奖励,这意味着:一个”好的”回答,是模型在当前参数下”觉得自然”的回答。

这个设计有一个微妙之处:奖励不是由外部的人类标注决定的(像 PPO 中的显式奖励模型),而是由模型自身对序列的”信心”决定。那么,当我们说”好的回答赢得偏好训练”,实际上我们在说:训练让模型对那些在人类偏好数据中被选为赢者的回答变得更自信。

这是一个循环的过程:训练改变了模型的对数概率,而对数概率又决定了哪些回答在训练信号下被”鼓励”。关键的非循环部分是偏好数据来自外部——是人类或强大奖励模型的标注,而不是当前策略自身生成的。

这个分析也揭示了 SimPO 对偏好数据质量非常敏感的原因:如果偏好数据噪声大(赢者不一定比输者好),SimPO 会让模型对本质上是噪声的”赢者”变得更自信,导致退化。

35. SimPO 梯度流的直观可视化

理解反向传播如何通过 SimPO 损失流动,对调试和改进算法很有价值。

设当前批次有一个三元组 (x,yw,yl)(x, y_w, y_l),损失为:

ℓ=−log⁡σ(β∣yw∣∑ilog⁡πθ(yw,i∣x,yw,<i)⏟rw−β∣yl∣∑jlog⁡πθ(yl,j∣x,yl,<j)⏟rl−γ)\ell = -\log\sigma\left(\underbrace{\frac{\beta}{|y_w|}\sum_i\log\pi_\theta(y_{w,i}|x,y_{w,<i})}_{r_w} - \underbrace{\frac{\beta}{|y_l|}\sum_j\log\pi_\theta(y_{l,j}|x,y_{l,<j})}_{r_l} - \gamma\right)

梯度通过以下路径流动:

ℓ→−∂log⁡σ(1−σ(Δ))→×(rw−rl−γ)→∂∂rw∂θ−∂rl∂θ\ell \xrightarrow{-\partial\log\sigma} (1-\sigma(\Delta)) \xrightarrow{\times} (r_w - r_l - \gamma) \xrightarrow{\partial} \frac{\partial r_w}{\partial\theta} - \frac{\partial r_l}{\partial\theta}

其中 ∂rw∂θ=β∣yw∣∇θlog⁡πθ(yw∣x)\frac{\partial r_w}{\partial\theta} = \frac{\beta}{|y_w|}\nabla_\theta\log\pi_\theta(y_w|x) 就是标准的语言模型梯度(与 SFT 的梯度形式相同),只是除以了序列长度。

这意味着 SimPO 训练可以分解为两个加权的 SFT 目标:

  • 正向 SFT:在 ywy_w 上做监督微调,权重为 (1−σ(Δ))⋅β∣yw∣(1-\sigma(\Delta)) \cdot \frac{\beta}{|y_w|}
  • 负向 SFT:用负梯度降低 yly_l 的对数概率,权重为 (1−σ(Δ))⋅β∣yl∣(1-\sigma(\Delta)) \cdot \frac{\beta}{|y_l|}

当模型排序正确且边距足够大时(σ(Δ)≈1\sigma(\Delta) \approx 1),两个方向的梯度都趋近于零。当模型排序错误或边距不足时,梯度恢复到最大值。这是一种自适应课程:困难样本自动获得更多训练。

36. 与其他对比学习目标的联系

SimPO 的结构与对比学习(Contrastive Learning)有深刻的联系,虽然论文中没有显式提到。

对比学习的一般形式:

Lcontrastive=−log⁡exp⁡(sim(q,k+)/τ)exp⁡(sim(q,k+)/τ)+∑iexp⁡(sim(q,ki−)/τ)\mathcal{L}_{\text{contrastive}} = -\log\frac{\exp(\text{sim}(q, k^+) / \tau)}{\exp(\text{sim}(q, k^+) / \tau) + \sum_i\exp(\text{sim}(q, k^-_i) / \tau)}

SimPO 是一个二元对比损失(每次一个正样本 ywy_w 和一个负样本 yly_l),“相似度”是平均对数概率。如果我们设 τ=1/β\tau = 1/\beta 并令 k+=ywk^+ = y_w,k−=ylk^- = y_l,则 SimPO(无边距版本)在形式上等价于一个 InfoNCE 损失的双样本特例。

这个联系暗示:SimPO 可能从对比学习的技巧中受益,比如:

  • 使用更多负样本(每个提示词不只一个 yly_l,而是 kk 个)
  • 动态难例挖掘(优先训练最难的负样本对)
  • 温度调度(随训练进行调整 β\beta)

这些扩展都是开放的研究方向,已有一些初步探索。

37. 连接到强化学习的视角

从强化学习的视角,SimPO 实际上是在做什么?

在标准 RL 框架中:

  • 状态:对话历史 xx
  • 动作:生成的回答 yy
  • 奖励:rSimPO(x,y)=β∣y∣log⁡πθ(y∣x)r_{\text{SimPO}}(x, y) = \frac{\beta}{|y|}\log\pi_\theta(y|x)

注意这个奖励取决于策略自身的参数,这使 SimPO 成为一种奖励依赖策略的 RL 问题。每次策略更新都会改变奖励函数,这与传统 RL(奖励固定)不同。

这种”自参考”的奖励结构在理论上比较复杂,但在实践中相当稳定,因为:每步更新量很小(小学习率),奖励函数的变化也很小,整个训练过程近似于一系列静态 RL 问题的逐步求解。

从这个角度看,SimPO 和 DPO 都不是”真正的” RL——它们更像是对齐了目标函数的有监督学习,只是借用了 RL 的概念框架。

关键数字速查

指标数值
DPO 训练后似然排序准确率~51%(约随机水平)
SimPO 训练后似然排序准确率~90%
AlpacaEval 2 LC 优势(vs DPO)+4 到 +6.4 pp
Arena-Hard 优势(vs DPO)+5 到 +7.5 pp
SimPO 回答长度增幅(vs SFT)+5%(DPO 是 +40%)
Gemma-2-9B-it SimPO AlpacaEval 2 LC72.4%
Gemma-2-9B-it SimPO Arena-Hard59.1%
Chatbot Arena 排名(<10B)第一(截至 2024 年 9 月)
最优 γ\gamma 范围0.3–0.8
推荐 β\beta2.5
推荐学习率5×10−75 \times 10^{-7}
相对 DPO 的显存节省~30–50%
训练时前向传播次数1(SimPO)vs 2(DPO)

本笔记基于 arXiv:2405.14734 撰写,引用的实验数值均来自论文原文,近似值以原文为准。代码实现参见官方仓库 https://github.com/princeton-nlp/SimPO 。