← 返回论文列表
📄 论文解读 · LLM Alignment × Self-Play

SPIN:让弱语言模型通过自我博弈变强

Self-Play Fine-Tuning Converts Weak Language Models to Strong Language Models

作者
Chen*, Deng*, Yuan* et al. · UCLA
发表
ICML 2024 · arXiv 2401.01335
场景
LLM 微调 / 自对齐 / 无额外标注
核心命题
SFT 后的弱模型 → 自我博弈 → 变强,无需额外偏好数据
💡一句话总结
SPIN 是一种基于自我博弈的 LLM 微调方法:模型在每个迭代中用上一版自己生成的回答作为"假数据",学习区分这些假回答与人类真实回答的差异,从而逐步逼近真实数据分布。整个过程不需要任何额外的偏好标注数据,仅靠已有的 SFT 数据集即可显著提升模型性能,甚至超越需要额外 GPT-4 偏好数据的 DPO。
🔍背景与动机

SFT 后的瓶颈

Supervised Fine-Tuning(SFT)是目前最主流的 LLM 对齐方法:用人类标注的 $(x, y)$ 对(prompt + 高质量回答)来微调预训练模型,让模型学会生成类似人类风格的回答。SFT 的目标函数是最大化对人类数据的似然:

$$L_{\text{SFT}}(\theta) = -\mathbb{E}_{x \sim q(\cdot),\, y \sim p_{\text{data}}(\cdot|x)}\bigl[\log p_\theta(y|x)\bigr]$$
符号说明
  • $q(\cdot)$:prompt 的边际分布
  • $p_{\text{data}}(\cdot|x)$:给定 prompt 下人类真实回答的分布
  • $p_\theta(y|x)$:LLM 在参数 $\theta$ 下对回答的条件概率
  • 目标:让 $p_\theta$ 尽可能逼近 $p_{\text{data}}$

但问题在于:SFT 在自己的训练集上继续训练,性能会停滞甚至下降。模型已经"吃透"了这些数据,重复训练无法带来额外收益。这时如果要进一步提升,传统路径是转向 RL 微调(如 RLHF/DPO),但这需要大量额外的偏好标注数据——要么靠人工标注(昂贵),要么靠 GPT-4 生成(依赖更强的模型)。

RL 微调的代价

RL 微调的核心挑战在于奖励函数的获取

  • RLHF:需要大量人类偏好标注(成对的 chosen vs rejected 比较),成本极高
  • RLAIF:用更强模型(如 GPT-4)提供偏好反馈,但依赖外部"裁判"
  • DPO:虽然不需要显式训练奖励模型,但仍需要偏好数据集 $(x, y_w, y_l)$

所有这些方法都无法仅凭已有 SFT 数据集来完成进一步提升。这就引出了一个关键问题:

能否在不获取任何额外标注数据的前提下,仅凭已有的 SFT 数据集,让一个已做过 SFT 的弱模型变得更强?

自博弈的灵感

作者从博弈论和强化学习中的self-play 机制获得灵感:

  • AlphaGo Zero:通过自己与自己对弈,从零开始达到超人水平
  • TD-Gammon:西洋双陆棋的自我博弈,超越人类最强选手
  • GAN:生成器与判别器的对抗博弈,让生成器学会逼近真实分布

核心洞察:如果模型能学会区分自己生成的回答与人类的回答,那么它就在朝真实分布的方向前进。而当模型完全无法区分两者时,说明它的分布已经与真实分布一致——训练自然收敛。

Figure 1: Ground truth vs model generation comparison`" />
Figure 1(论文原图):人类真实回答 vs SPIN 不同迭代的模型生成对比。Iter 0 的回答虽然流畅,但包含"幻觉"百分比;Iter 1 的回答更接近人类回答的风格,不再编造具体数据。
⚙️方法详解

整体框架

SPIN 的核心是一个两人零和博弈,但两个"玩家"都是同一个 LLM——只是来自不同的迭代轮次:

  • Main Player(主玩家):当前迭代要训练的新模型 $p_{\theta_{t+1}}$,目标是区分人类回答 $y$ 和旧模型生成的回答 $y'$
  • Opponent Player(对手玩家):上一迭代的旧模型 $p_{\theta_t}$,任务是生成尽可能像人类的回答 $y'$

整个流程可以概括为:旧模型生成假回答 → 新模型学习区分真假 → 新模型取代旧模型成为下一个对手 → 重复迭代 → 当模型无法区分真假时收敛。

Opponent $p_{\theta_t}$
上一轮模型
→ 生成
合成数据 $y'$
假回答 + 人类真回答 $y$
→ 训练
Main Player $p_{\theta_{t+1}}$
学习区分真假
→ 复制
新 Opponent $p_{\theta_{t+1}}$
进入下一轮迭代
→ ...
收敛 $p_{\theta^*} = p_{\text{data}}$
模型 ≈ 人类分布
💡 举例:SPIN 迭代流程

假设我们有一组 SFT 数据包含 prompt "What is the capital of France?" 和人类回答 "Paris is the capital of France, known for the Eiffel Tower."

Iteration 0:Opponent 就是初始 SFT 模型 $p_{\theta_0}$(zephyr-7b-sft-full),它对同一 prompt 生成的回答可能是 "France's capital is Paris, a beautiful city with many landmarks like the Louvre."——这看起来很像人类写的,但与真实回答仍有微妙差异。

Main Player 学习的目标就是:给这两段回答打分,让人类回答的分数高于模型回答的分数。训练后得到 $p_{\theta_1}$。

Iteration 1:$p_{\theta_1}$ 成为新的 Opponent,生成更逼真的回答。Main Player 需要区分这个更逼真的回答与人类回答——这是一个更难的任务,迫使模型进一步提升。最终当模型完全无法区分自己生成的回答与人类回答时,说明 $p_\theta$ 已逼近 $p_{\text{data}}$。

Main Player:区分真假回答

Main Player 的训练目标来自积分概率度量(Integral Probability Metric, IPM)的思路:找到一个函数 $f_{t+1}$,使得它在人类数据分布上的期望值高于在旧模型分布上的期望值:

$$f_{t+1} = \arg\max_{f \in \mathcal{F}_t} \mathbb{E}\bigl[f(x,y) - f(x,y')\bigr]$$
符号说明
  • $f_{t+1}$:Main Player 的判别函数
  • $\mathcal{F}_t$:依赖于 $p_{\theta_t}$ 的函数类
  • $x$:prompt,来自 $q(\cdot)$
  • $y$:人类回答,来自 $p_{\text{data}}(\cdot|x)$
  • $y'$:旧模型回答,来自 $p_{\theta_t}(\cdot|x)$
  • 直觉:$f(x,y)$ 应在 $y$ 来自人类时取高值,$y$ 来自模型时取低值

由于直接最大化 IPM 会导致无界增长(线性损失 $\ell(t)=-t$ 会使 $f(x,y')$ 趋向负无穷),作者选择了logistic loss $\ell(t) = \log(1+\exp(-t))$——它具有非负性、光滑性和指数衰减尾部,能防止 $|f|$ 过大增长。

因此实际的优化目标为:

$$f_{t+1} = \arg\min_{f \in \mathcal{F}_t} \mathbb{E}\bigl[\ell\bigl(f(x,y) - f(x,y')\bigr)\bigr]$$
符号说明
  • $\ell(t) = \log(1+\exp(-t))$:logistic loss,单调递减凸函数
  • 期望是在 $x \sim q, y \sim p_{\text{data}}, y' \sim p_{\theta_t}$ 上计算
  • 其他可选 loss:相关损失 $\ell(t)=1-t$、hinge loss $\ell(t)=\max(0,1-t)$、指数损失 $\ell(t)=\exp(-t)$

Opponent Player:生成逼真回答

训练好 Main Player $f_{t+1}$ 后,下一个问题是:如何更新 Opponent?直觉上,Opponent 应生成让 Main Player 难以区分的回答,即最大化 $f_{t+1}$ 在其分布上的期望值。同时加入 KL 正则防止偏离过远:

$$\arg\max_p \mathbb{E}_{x \sim q, y \sim p(\cdot|x)}\bigl[f_{t+1}(x,y)\bigr] - \lambda \mathbb{E}_{x \sim q}\bigl[\text{KL}(p(\cdot|x) \| p_{\theta_t}(\cdot|x))\bigr]$$
符号说明
  • $p$:Opponent 要寻找的新分布
  • $f_{t+1}$:当前 Main Player 的判别函数
  • $\lambda > 0$:KL 正则化参数,控制新分布偏离旧分布的程度
  • $\text{KL}(p \| p_{\theta_t})$:KL 散度,衡量新分布与旧分布的差异

这个优化问题有闭式解

$$\hat{p}(y|x) \propto p_{\theta_t}(y|x) \exp\bigl(\lambda^{-1} f_{t+1}(x,y)\bigr)$$
符号说明
  • $\hat{p}(y|x)$:闭式解给出的理想分布
  • $p_{\theta_t}(y|x)$:上一轮模型的分布(基础概率)
  • $\exp(\lambda^{-1} f_{t+1}(x,y))$:由 Main Player 判别值给出的加权因子
  • $\lambda$越小 → 更大幅更新;$\lambda$越大 → 更保守更新

但 $\hat{p}$ 不一定在 LLM 参数空间 $\{p_\theta(\cdot|x) | \theta \in \Theta\}$ 中。为了让闭式解可被 LLM 实现,需要将 $f_{t+1}$ 限制为对数比率形式:

$$\mathcal{F}_t = \left\{\lambda \cdot \log \frac{p_\theta(y|x)}{p_{\theta_t}(y|x)} \,\big|\, \theta \in \Theta\right\}$$
符号说明
  • $\mathcal{F}_t$:函数类,每个函数是新旧模型的对数概率比
  • $\lambda$:与 KL 正则化中的 $\lambda$ 相同
  • $\theta$:LLM 的参数,遍历参数空间 $\Theta$
  • 这意味着 Main Player $f_{t+1}$ 本质上就是新旧模型的对数比率
💡 举例:函数类 $\mathcal{F}_t$ 的直觉

假设旧模型 $p_{\theta_t}$ 对 prompt "法国首都" 给回答 "Paris" 的概率是 0.6,新模型 $p_\theta$ 给同样回答的概率是 0.9。

那么 $f(x,y) = \lambda \cdot \log(0.9/0.6) = \lambda \cdot 0.405$。这个正值说明新模型更"偏好"这个回答,即新模型认为这个回答更像人类数据。

反过来,如果旧模型给某个幻觉回答的概率是 0.3,新模型给的概率是 0.05,那么 $f(x,y') = \lambda \cdot \log(0.05/0.3) = \lambda \cdot (-1.79)$——负值说明新模型认为这个回答不像人类写的。

所以 Main Player 的训练目标就是:让 $\lambda \cdot \log \frac{p_\theta(y|x)}{p_{\theta_t}(y|x)}$ 在人类回答 $y$ 上取高值,在模型回答 $y'$ 上取低值。

端到端训练目标

将 Main Player 的函数类 $\mathcal{F}_t$ 代入 logistic loss 优化目标,就得到了 SPIN 的端到端训练目标

$$L_{\text{SPIN}}(\theta, \theta_t) = \mathbb{E}\left[\ell\left(\lambda \log \frac{p_\theta(y|x)}{p_{\theta_t}(y|x)} - \lambda \log \frac{p_\theta(y'|x)}{p_{\theta_t}(y'|x)}\right)\right]$$
符号说明
  • $L_{\text{SPIN}}$:SPIN 的训练损失
  • $\theta$:当前要优化的新模型参数
  • $\theta_t$:上一轮的旧模型参数(固定)
  • $\lambda$:KL 正则化参数
  • $y$:人类回答(chosen),来自 $p_{\text{data}}$
  • $y'$:旧模型回答(rejected),来自 $p_{\theta_t}$
  • $\ell(t) = \log(1+\exp(-t))$:logistic loss
  • 期望在 $x \sim q, y \sim p_{\text{data}}, y' \sim p_{\theta_t}$ 上计算

代入 logistic loss 后,展开得:

$$L_{\text{SPIN}}(\theta, \theta_t) = \mathbb{E}\left[\log\left(1 + \exp\left(\lambda \log \frac{p_\theta(y'|x)}{p_{\theta_t}(y'|x)} - \lambda \log \frac{p_\theta(y|x)}{p_{\theta_t}(y|x)}\right)\right)\right]$$
关键洞察:SPIN 的 loss 形式看起来很像 DPO——都是对数概率比的 logistic loss。但 SPIN 的 "rejected" 数据不是来自外部偏好标注,而是模型自己上一轮生成的回答。这就是自博弈的精髓:用自己过去的弱点作为今天的训练信号。
💡 举例:SPIN Loss 的具体计算

假设 prompt $x$ = "什么是光合作用?",人类回答 $y$ = "光合作用是植物利用阳光将二氧化碳和水转化为葡萄糖和氧气的过程。"

旧模型 $p_{\theta_t}$ 生成的回答 $y'$ = "光合作用是植物通过阳光获取能量的方式,它产生了糖和氧气作为副产品。"

假设新模型 $p_\theta$ 给人类回答的概率 $p_\theta(y|x) = 0.12$,给模型回答的概率 $p_\theta(y'|x) = 0.08$。

旧模型给人类回答的概率 $p_{\theta_t}(y|x) = 0.10$,给模型回答的概率 $p_{\theta_t}(y'|x) = 0.15$。

取 $\lambda = 1$:

人类回答的对数比率 = $\log(0.12/0.10) = 0.182$

模型回答的对数比率 = $\log(0.08/0.15) = -0.634$

$L_{\text{SPIN}} = \log(1 + \exp((-0.634) - 0.182)) = \log(1 + \exp(-0.816)) \approx 0.383$

训练目标是降低这个 loss,即让人类回答的对数比率更高、模型回答的对数比率更低。

与 DPO 的核心区别

🔄 SPIN(自博弈)

  • 只需要 SFT 数据 $(x, y)$
  • "rejected" 数据由模型自己生成
  • 天然迭代训练:每轮 opponent 变强 → main player 也变强
  • loss 函数可选:logistic / hinge / correlation / exponential
  • 收敛条件:$p_\theta = p_{\text{data}}$ 时自然停止

📊 DPO(偏好优化)

  • 需要偏好数据 $(x, y_w, y_l)$
  • "chosen" 和 "rejected" 需外部标注
  • 单轮训练:基于 Bradley-Terry 模型匹配偏好概率
  • loss 固定为 logistic loss(BT 模型推导)
  • 无显式收敛机制,需要新的偏好数据才能迭代

虽然 SPIN 选 logistic loss 时 loss 形式与 DPO 相似,但本质不同:

  1. 数据来源:DPO 的 $(y_w, y_l)$ 是固定的外部偏好标注;SPIN 的 $(y, y')$ 中 $y'$ 每轮迭代重新生成,越来越逼真
  2. 迭代性:DPO 不天然迭代;SPIN 的自博弈机制自动产生迭代训练流程
  3. 理论保证:SPIN 有收敛定理——当 $p_\theta = p_{\text{data}}$ 时全局最优;DPO 基于 BT 模型假设

理论分析

作者提供了两个关键定理:

Theorem 5.2:收敛性

充分性:如果 $p_{\theta_t}(\cdot|x) = p_{\text{data}}(\cdot|x)$,则 $\theta_t$ 是 $L_{\text{SPIN}}$ 的全局最小值(对任意 $\lambda \geq 0$)。
必要性:如果 $p_{\theta_t}(\cdot|x) \neq p_{\text{data}}(\cdot|x)$,则存在合适的 $\lambda$ 使得 $\theta_t$ 不是全局最小值。

这意味着:优化过程只在 $p_\theta = p_{\text{data}}$ 时停止——此时模型分布与真实分布完全一致,Main Player 无法再区分真假回答。如果模型分布还没对齐真实分布,就总能找到更好的参数。

Theorem 5.4:Opponent 更新机制

$$p_{\theta_{t+1}}(y|x) \propto p_{\theta_t}(y|x) \left(\frac{p_{\text{data}}(y|x)}{p_{\theta_t}(y|x)}\right)^{1/\lambda}$$
符号说明
  • $p_{\theta_{t+1}}$:下一轮 Opponent 的分布
  • $p_{\theta_t}$:当前 Opponent 的分布
  • $p_{\text{data}}$:真实数据分布
  • $1/\lambda$:控制更新幅度。$\lambda$ 小 → 大幅调整;$\lambda$ 大 → 小幅调整
  • 当 $p_{\theta_t}(y|x) < p_{\text{data}}(y|x)$ 时,比率 $>1$,增加该回答的概率
  • 当 $p_{\theta_t}(y|x) > p_{\text{data}}(y|x)$ 时,比率 $<1$,降低该回答的概率
💡 举例:Opponent 更新的直觉

假设旧模型对某个 prompt 下回答 A 的概率是 $p_{\theta_t}(A|x) = 0.2$,但人类真实分布给 A 的概率是 $p_{\text{data}}(A|x) = 0.5$。

比率 $= 0.5/0.2 = 2.5$,取 $\lambda = 1$ 时 $1/\lambda = 1$,新模型给 A 的概率会被调高(乘以 $2.5^1 = 2.5$ 的权重)。

反过来,如果旧模型给幻觉回答 B 的概率是 0.4,但人类分布只有 0.1,比率 $= 0.1/0.4 = 0.25$,新模型会调低 B 的概率。

这就像一个自我纠错机制:模型对比自己的分布与真实分布的差异,然后朝真实分布方向调整。

📊实验结果

实验设置

项目设置
基础模型zephyr-7b-sft-full(Mistral-7B + Ultrachat200k SFT)
SFT 数据Ultrachat200k 的 50k 子集
合成数据量Iter 0: 50k → Iter 1-3: 100k(累计旧合成数据 + 新合成数据)
每轮训练2 epochs
评估基准HuggingFace Open LLM Leaderboard(6 任务)、MT-Bench
对比方法SFT 继续训练、DPO(+62k GPT-4 偏好数据)

SPIN 迭代提升效果

Figure 2: SPIN iterations average score
Figure 2(论文原图):SPIN 在不同迭代轮次下的平均得分。从 SFT baseline 58.14% → Iter 0: 60.80% → Iter 1: 62.12% → Iter 2: 62.97% → Iter 3: 63.16%,每轮都有提升但增幅递减。
迭代平均得分vs SFT关键提升
SFT (baseline)58.14%
SPIN Iter 060.80%+2.66%GSM8k +10%+、TruthfulQA +5%+
SPIN Iter 162.12%+3.98%Arc Challenge +2%+、TruthfulQA 继续提升
SPIN Iter 262.97%+4.83%各任务稳步小幅提升
SPIN Iter 363.16%+5.02%接近收敛,增幅最小
核心发现:SFT 在自己的训练集上继续训练只能获得不到 1% 的提升甚至下降,而 SPIN 在相同数据集上通过自博弈获得了 5%+ 的总提升。这证明了自博弈机制有效打破了 SFT 的性能天花板。

与 DPO 的对比

Figure 3: SPIN vs DPO performance comparison
Figure 3(论文原图):SPIN 与 DPO 的性能对比。DPO 使用 62k GPT-4 偏好数据;SPIN Iter 0(仅 50k SFT 数据)已接近 DPO,Iter 1 在多数 benchmark 上超越 DPO。

🔑 SPIN Iter 0 vs DPO

SPIN 仅用 50k SFT 数据(无额外偏好数据),平均得分已与 DPO(62k GPT-4 偏好数据)相当。

在某些任务上 SPIN 甚至更好(TruthfulQA、GSM8k),说明自博弈信号比外部偏好信号更有效

🚀 SPIN Iter 1 超越 DPO

经过第二轮自博弈,SPIN 在 Leaderboard 上全面超越 DPO。

关键原因:DPO 的偏好数据是固定的(一次性信号),而 SPIN 的 rejected 数据每轮迭代都会更新,提供了持续进化的训练信号

消融实验

训练数据规模的影响

Figure 5: Training size scaling effect
Figure 5(论文原图):训练数据规模对 SPIN vs SFT 的影响。SPIN 随数据量增长有显著提升;SFT 继续训练几乎无额外收益。

迭代训练 vs 更多 Epoch

Figure 4: Iterative training vs more epochs
Figure 4(论文原图):迭代训练 vs 更多 epoch。单迭代内多 epoch 训练会停滞,但停滞水平低于 Iter 1。这说明迭代训练是必要的——需要新 opponent 生成新 rejected 数据。
消融结论
  1. 数据量:SPIN 随训练数据增加有显著提升,50k 比 14k 好 ~1.8%
  2. 迭代必要性:在同一迭代内训练更多 epoch 无法达到下一迭代的性能水平——因为 rejected 数据是固定的,反复训练同一对数据不如换一个更强的 opponent 生成新的 rejected 数据
  3. SFT 对比:SFT 继续训练自己的数据集几乎无收益(<1%),而 SPIN 用同样数据获得 5%+ 提升
🧠个人理解与延伸

亮点

  1. 无需额外标注:这是最大的卖点。SFT 数据集通常已经有了,SPIN 可以直接用,不需要花钱请人标注偏好或调用 GPT-4
  2. 理论优雅:收敛定理清晰——$p_\theta = p_{\text{data}}$ 时全局最优且自然停止,这给了方法一个很好的理论保证
  3. 超越 DPO:仅用 50k SFT 数据就能达到甚至超越 DPO + 62k GPT-4 偏好数据的效果,性价比极高
  4. 与 GAN 的类比:Main Player ≈ Discriminator,Opponent ≈ Generator,但两者是同一个 LLM 的不同迭代版本,比 GAN 更稳定(不会 mode collapse)

不足

  1. 天花板是 SFT 数据:SPIN 的收敛目标是 $p_{\text{data}}$——即 SFT 数据的分布。这意味着 SPIN 的上限受限于 SFT 数据质量,无法超越人类标注的水平。作者也承认这是一个局限
  2. 迭代 3 后几乎停滞:实验中 Iter 2→3 仅提升 0.19%,说明收敛很快但天花板也很快到达
  3. 仅测试 7B 模型:实验只在 Mistral-7B 系列上验证,更大的模型(13B, 70B)是否同样有效尚不确定
  4. 合成数据累积:Iter 1-3 使用 100k 合成数据(含旧数据),累积效应是否真的有益?理论上新 opponent 生成的数据应该更逼真,但如果旧数据不够好,会不会拖累训练?

启发

  • 推荐系统场景:SPIN 的思路可以迁移到推荐排序模型——用模型上一版对同一 query 的预测作为 "rejected",用真实点击作为 "chosen",做自博弈训练。这比 DPO 不需要额外标注偏好数据
  • 弱到强的范式:SPIN 验证了"弱模型可以通过自我博弈变强"这一核心命题,与 boosting 算法的哲学一致——这也是机器学习领域从 Kearns & Valiant (1994) 就在研究的方向
  • 迭代训练的必要性:消融实验清楚地表明——单迭代内多 epoch 不如跨迭代训练。这对我们的 DPO 训练也有启发:与其在同一批偏好数据上反复训练,不如每轮用新模型生成新 rejected 数据
  • KL 正则的调控:Theorem 5.4 揭示 $\lambda$ 的双重角色——既是 KL 正则参数,也控制 opponent 更新幅度。实践中 $\lambda$ 可以动态调整:前期小(大胆更新),后期大(保守稳定)

论文链接arxiv.org/abs/2401.01335

代码仓库github.com/uclaml/SPIN

资源目录:~/Desktop/paper-reader-assets/spin-2401.01335/