第 18 讲:基于人类反馈的强化学习(RLHF)

Large Language Models: Methods and Applications · Lecture 18。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应原课:CMU 11-667 Fall 2025 · Lecture 18 · Thu 6-Nov-2025 · Reinforcement Learning from Human Feedback(客座:Yiming Zhang) 原课 slides:RLHF 阅读材料:Ouyang et al. (2022), Training language models to follow instructions with human feedback(InstructGPT);Rafailov et al. (2023), Direct Preference Optimization: Your Language Model is Secretly a Reward Model(DPO) 配套代码:code/lecture18/(1 个模块 + 4 个演示脚本) 本讲的写法:先讲为什么需要人类反馈,再沿着 InstructGPT 的三步——SFT → 奖励模型 → 强化学习——推导出 KL 约束下的最优策略,最后从这个最优策略导出 DPO。实验在一个”人类偏好已知”的花园世界里做:真实奖励、真实的最优策略都能精确算出来,于是”奖励被钻空子""离最优还有多远”都看得见。所有数字都来自配套代码的实际输出。


目录


0. 本讲导读

0.1 这一讲要回答的问题

第 6 讲的指令微调(SFT)让模型学会了”按指令回答”:给它很多”指令 → 好回答”的示范,它模仿这些示范。可是我们真正想要的是”有用、诚实、无害”的回答,这些目标没法写成一个损失函数:

  • 什么样的回答是”有用”的?同一个问题有无数种好回答,示范只是其中一种。
  • 人很难写出完美的回答,但很容易比较两个回答哪个更好。
  • 模型的回答里哪些地方不好(编造事实、啰嗦、不安全),模仿学习不会告诉它。

RLHF 的思路是:让人比较模型的回答,用这些比较训练一个奖励模型,再用强化学习让模型的回答得到更高的奖励。这一讲要回答:

  • 奖励模型学到的是什么?它在哪里不可靠?
  • “让奖励更高”的目标为什么要加一个 KL 约束?这个目标的最优解长什么样?
  • 强化学习怎样逼近这个最优解?它会出什么问题?
  • DPO 为什么能跳过奖励模型和强化学习?代价是什么?

0.2 学完这一讲你应该能

  • 说出 InstructGPT 的三个阶段,以及每个阶段的数据和损失;
  • 用 Bradley–Terry 模型写出奖励模型的损失,解释为什么它的准确率有上限;
  • 推导 KL 约束下的最优策略 π∗(y)∝πref(y)exp⁡(r(y)/β)\pi^*(y) \propto \pi_{\text{ref}}(y)\exp(r(y)/\beta),解释 β 的作用;
  • 解释奖励的过度优化(Goodhart 定律),以及 KL 惩罚、best-of-n 的位置;
  • 写出 REINFORCE 的梯度,说出 PPO 比它多了什么;
  • 从最优策略推导出 DPO 的损失,说出它的优点和已知的问题(似然位移、离线数据)。

0.3 本讲的实验平台

rlhf_world.py:

  • 回答 = 一句花园句子,从 <bos> 生成到句号。
  • “人”心里的真实奖励 r*(y)(真实世界里永远看不到):
    • 宾语是花 +1.0、是动物 −0.5;
    • 有形容词 +0.5;
    • 尾巴是 with … friends +0.5、from … own garden +0.3;
    • 不合语法的句子 −2——模拟真实世界里”胡言乱语、格式崩坏”的回答。
    • 合法句子的奖励在 −0.5 到 2.0 之间。
  • 人的比较按 Bradley–Terry 模型给出:P(y₁ ≻ y₂) = σ(r*(y₁) − r*(y₂)),有噪声,像真人一样。
  • SFT 模型(也是参考策略 π_ref):在 2 万个花园句子上训练的语言模型(d = 64、2 层)。
  • 精确计算:花园世界只有 30336 个合法句子,所以 KL 约束下的最优策略能精确算出来。
she picks the pretty rose with her friends .     r* = +2.0
he feeds the hungry dog .                        r* = +0.0
I eat the apple .                                r* = +0.0
we water our rose in our own garden in the       r* = −2.0(不合语法)

1. 为什么需要人类反馈

1.1 模仿学习的局限

预训练让模型学会”像互联网文本那样续写”,SFT 让它学会”像示范那样回答”。两者都是模仿。模仿有几个根本的局限:

  1. 目标不一致:预训练的目标是”预测下一个 token”,不是”帮助用户”。互联网上有大量错误、有害、不相关的内容,模型把它们也一起学了。
  2. 示范的天花板:SFT 最多学到示范者的水平;示范者写得不好的地方,模型也学不好。
  3. 没有负面信号:SFT 只告诉模型”应该怎样”,从不告诉它”什么是错的”。模型自己生成的回答里出了错,它不会知道。
  4. 评价比生成容易:判断”这篇摘要比那篇好”,比自己写一篇好摘要容易得多。人的这种能力,模仿学习用不上。

1.2 InstructGPT 的三步

Ouyang et al. (2022) 的流程(也是 ChatGPT 的雏形):

  1. SFT:标注员为一批提示写示范回答,在 GPT-3 上做监督微调。
  2. 奖励模型(RM):
    • 对每个提示,用 SFT 模型生成 K 个回答(K = 4~9),标注员把它们排序;
    • 每个排序拆成 (K2)\binom{K}{2} 对比较,训练一个给回答打分的模型。
  3. 强化学习:用 PPO 优化 SFT 模型,奖励来自奖励模型,并加上一个”不要离 SFT 模型太远”的 KL 惩罚。

结果:

  • 1.3B 参数的 InstructGPT,标注员更喜欢它的回答,胜过 175B 参数的 GPT-3。
  • 它编造事实更少、毒性略低。
  • 但在一些公开的 NLP 基准上有退步(“对齐税”,alignment tax)。

后来几乎所有的聊天模型都沿用了这个框架或它的变体。

1.3 这一讲的三个核心对象

对象是什么在花园世界里
真实偏好 r*人心里”什么是好回答”已知(上面的规则)
奖励模型 r_φ从比较数据学到的 r* 的近似训练出来的网络
策略 π_θ要优化的语言模型从 SFT 模型出发

RLHF 的所有难点,都来自”我们优化的是 r_φ,想要的却是 r*”。


2. 奖励模型

2.1 Bradley–Terry 模型

人比较两个回答时,假设每个回答有一个潜在的”好坏分数” r(y),人选 y₁ 的概率是:

P(y1≻y2)=σ(r(y1)−r(y2))=er(y1)er(y1)+er(y2)P(y_1 \succ y_2) = \sigma(r(y_1) - r(y_2)) = \frac{e^{r(y_1)}}{e^{r(y_1)} + e^{r(y_2)}}

这是 Bradley & Terry (1952) 的模型,也是国际象棋 Elo 分的基础(第 20 讲会再用到它)。它有几个性质:

  • 只有分数的差有意义(所有回答加同一个常数,概率不变);
  • 两个回答越接近,人越容易”选错”;分数差 1 时,人有 27% 的时候选了更差的那个。

奖励模型 r_φ 就是用这个模型做最大似然:

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

这就是一个”更好的回答分数更高”的逻辑回归。InstructGPT 的奖励模型从 SFT 模型初始化,把”预测下一个词”的输出层换成一个标量头(代码里取最后一个位置的隐藏状态,经过一个线性层)。

2.2 实验:标签噪声决定的上限

代码 01 §1–2:

  • SFT 模型的起点:它的回答平均真实奖励 0.300,95.8% 合语法。
  • 评测数据:3000 对测试比较。即使用真实奖励去预测”人选了哪个”,准确率也只有 0.667——标签本身有噪声。
比较的对数奖励模型的准确率和真实奖励的相关
2500.5430.277
5000.5510.440
10000.5880.620
20000.6120.795
40000.6300.902
  • 准确率被标签噪声封顶:再多的数据也不可能超过 0.667。InstructGPT 报告标注员之间的一致率约 73%,奖励模型的准确率也在 70% 左右。
  • 看准确率会低估奖励模型:准确率从 0.55 到 0.63 看起来变化不大,和真实奖励的相关却从 0.28 升到了 0.90。真实世界里看不到相关性,只能看准确率,这让”奖励模型够不够好”很难判断。

2.3 实验:奖励模型在没见过的回答上

代码 01 §3:奖励模型只在 SFT 模型的回答上训练过,这些回答 96% 合语法。

  • 把正常回答里的一个词重复一遍(真实奖励从正分变成 −2):所有奖励模型的打分几乎不变(例如 4000 对的模型:−1.25 → −1.21)。它从没学过”语法”这个维度。

  • 在 4 万个 SFT 回答里打分最高的那个:五个奖励模型(250~4000 对)最喜欢的都是同一句胡言乱语:

    the children eat the green cabbage from the children water the children pick the      (r* = −2)

    它把 eat、green、water、pick 这些”好词”堆在一起,又很长。这样的回答在 SFT 模型的分布里极少见(4 万个里只有这一个),奖励模型在那里的判断完全是外推。比较数据从 250 对加到 4000 对也没有改变这一点:训练数据里根本没有这类回答。

奖励模型只在训练分布附近可靠。 一旦用优化去”寻找”奖励模型给高分的回答,找到的正是这些外推出错的地方。


3. KL 约束下的最优策略

3.1 RLHF 的目标

如果只最大化奖励模型的分数 max⁡πEy∼π[r(y)]\max_\pi \mathbb{E}_{y\sim\pi}[r(y)],最优策略会把全部概率放在 r 最高的那一个回答上——正是 §2.3 里奖励模型外推出错的地方。所以 RLHF 的目标加了一个 KL 惩罚:

max⁡π Ey∼π[r(y)]−β KL(π ∥ πref)\max_{\pi}\ \mathbb{E}_{y\sim\pi}[r(y)] - \beta\, \mathrm{KL}(\pi \,\|\, \pi_{\text{ref}})

π_ref 是 SFT 模型。KL 惩罚的作用:

  1. 防止奖励被钻空子:策略不能跑到 SFT 模型几乎不会说的地方去,那里正是奖励模型不可靠的地方;
  2. 保留语言能力和多样性:不要为了奖励把语言模型”训坏”;
  3. 从贝叶斯的角度看,它相当于把 π_ref 当作先验、把奖励当作似然(Korbak et al. 2022, RL with KL penalties is better viewed as Bayesian inference)。

3.2 闭式解

这个目标有一个漂亮的闭式解:

π∗(y)=1Z πref(y) exp⁡ ⁣(r(y)β),Z=∑yπref(y)exp⁡ ⁣(r(y)β)\pi^*(y) = \frac{1}{Z}\,\pi_{\text{ref}}(y)\,\exp\!\left(\frac{r(y)}{\beta}\right), \qquad Z = \sum_y \pi_{\text{ref}}(y)\exp\!\left(\frac{r(y)}{\beta}\right)

推导:把目标改写成

Eπ[r]−β KL(π∥πref)=−β∑yπ(y)log⁡π(y)πref(y)er(y)/β=−β KL(π∥π∗)+βlog⁡Z\mathbb{E}_\pi[r] - \beta\,\mathrm{KL}(\pi\|\pi_{\text{ref}}) = -\beta \sum_y \pi(y)\log\frac{\pi(y)}{\pi_{\text{ref}}(y)e^{r(y)/\beta}} = -\beta\,\mathrm{KL}(\pi\|\pi^*) + \beta\log Z

β log Z 和 π 无关,KL ≥ 0,且只在 π = π* 时为 0。所以 π* 是唯一的最优解,最优值是 β log Z(练习 3)。

π* 的含义:把参考策略的概率按 exp(r/β) 重新加权。

  • β 大:几乎不变;
  • β 小:概率集中到高奖励的回答上;
  • π_ref 里概率为 0 的回答,π* 里也是 0——策略只能在参考模型”会说的话”里重新分配概率。

这个式子在真实的语言模型上算不出来,因为 Z 要对所有可能的回答求和。强化学习和 DPO 都是逼近它的方法。

3.3 实验:精确的奖励–KL 前沿

代码 02 §1:π_ref 是 SFT 模型在全部 30336 个合法句子上的概率(重新归一化),平均真实奖励 0.404,最大 2.0。

βE_π*[r*]KL(π*‖π_ref)覆盖 90% 概率的句子数
100.4410.0011117
10.7980.2011592
0.51.1670.759061
0.31.4881.584345
0.21.6992.442678
0.11.9253.991060
0.051.9914.87547
0.022.0005.08469

这条”奖励–KL 前沿”是任何方法在给定 KL 下能达到的最高真实奖励。

  • β 越小,奖励越高,离 π_ref 越远,多样性越低。
  • β = 0.2 时概率最大的是 we water the pretty rose with our friends . 这类奖励为 2.0 的句子:每句 π* ≈ 0.003,在 π_ref 里只有约 0.0001。

3.4 实验:best-of-n

最简单的”对齐”不需要训练:采样 n 个回答,挑奖励最高的那个(best-of-n,也叫拒绝采样,第 15 讲 §5.1)。它和 π_ref 的 KL 有一个常用的上界 log⁡n−(n−1)/n\log n - (n-1)/n。代码 02 §2(用真实奖励挑):

nKL 上界E[r*]同样 KL 下 π* 的 E[r*]
20.190.7360.790
40.641.0531.109
161.841.5211.559
643.171.7891.825
2564.551.9581.972

best-of-n 几乎贴着最优前沿(它的真实 KL 比上界还小,所以实际上更接近)。这个最简单的方法在奖励–KL 的意义下几乎是最优的,代价在推理:每个回答要生成 n 次。很多 RLHF 论文用它作为强基线;也有方法把 best-of-n 的结果蒸馏回模型(例如 Llama 2 的拒绝采样微调)。

3.5 实验:过度优化

把挑选标准从真实奖励换成奖励模型。代码 02 §3:从 SFT 模型采样 4 万个回答,每 n 个一组,挑奖励模型打分最高的那个,看它的真实奖励。

用谁挑n=1n=4n=16n=64n=256n=1024n=4096
(KL 上界)0.000.641.843.174.555.937.32
真实奖励(理论值)0.401.051.521.791.962.002.00
奖励模型(250 对)0.310.460.530.540.570.24−1.27
奖励模型(1000 对)0.310.650.770.880.940.43−0.17
奖励模型(4000 对)0.310.891.321.471.451.290.44

真实奖励先升后降:

  • n 小时,奖励模型的偏好和真实偏好大体一致;
  • n 大时,挑出来的是奖励模型打分极端高的回答——正是 §2.3 里那些外推出错的胡言乱语。
  • 奖励模型的分数一直在涨(这正是 best-of-n 在最大化的东西),真实奖励却崩了。

这就是 Goodhart 定律:“当一个指标变成目标,它就不再是一个好指标。” Gao et al. (2023, Scaling Laws for Reward Model Overoptimization) 系统地测量了这条曲线(他们用一个大的”金标准”奖励模型代替人)。

  • 真实奖励随 KL\sqrt{\mathrm{KL}} 先升后降,形状可以用简单的函数拟合;
  • 奖励模型越大、数据越多,峰值出现得越晚、越高。这里 4000 对的模型峰值最高、下降最慢,但最后也会下降。

4. 用强化学习优化策略

4.1 策略梯度

best-of-n 在推理时花 n 倍的计算;RLHF 想把”挑出好回答”的能力训练进模型本身。目标 J(θ)=Ey∼πθ[R(y)]J(\theta) = \mathbb{E}_{y\sim\pi_\theta}[R(y)](R 包含 KL 惩罚)的梯度,用 log 导数技巧:

∇θJ=∑yR(y)∇θπθ(y)=∑yπθ(y)R(y)∇θlog⁡πθ(y)=Ey∼πθ[R(y)∇θlog⁡πθ(y)]\nabla_\theta J = \sum_y R(y)\nabla_\theta \pi_\theta(y) = \sum_y \pi_\theta(y) R(y)\nabla_\theta \log\pi_\theta(y) = \mathbb{E}_{y\sim\pi_\theta}\big[R(y)\nabla_\theta\log\pi_\theta(y)\big]

这就是 REINFORCE(Williams 1992):采样一个回答,按它的奖励放大或缩小它的 log 概率的梯度。

  • 奖励高的回答被”鼓励”,奖励低的被”抑制”。
  • 减去基线:减去任何不依赖 y 的基线 b 都不改变期望(因为 E[∇log⁡π]=0\mathbb{E}[\nabla\log\pi] = 0),但能大大降低方差。常用这一批样本的平均奖励作为基线;RLOO 用”除自己以外的样本的平均”。
  • 语言模型的 log 概率是各个 token 的 log 概率之和,所以梯度可以照常反向传播。

KL 惩罚有两种加法:

  • 加在奖励里:R(y)=r(y)−β[log⁡πθ(y)−log⁡πref(y)]R(y) = r(y) - \beta[\log\pi_\theta(y) - \log\pi_{\text{ref}}(y)],InstructGPT 的做法,并且是逐 token 地加;
  • 作为单独的损失项。

本讲的代码用前一种。

4.2 PPO 多了什么

InstructGPT 用 PPO(Schulman et al. 2017)。和 REINFORCE 相比,它多了:

  1. 价值网络 V(s)V(s):估计”从当前位置往后能得到多少奖励”,用作逐 token 的基线。优势函数用 GAE(广义优势估计)计算。
  2. 重要性比率与裁剪:用旧策略采的一批样本更新好几次,目标里用比率 ρ=πθ/πold\rho = \pi_\theta/\pi_{\text{old}},并把它裁剪在 [1−ϵ,1+ϵ][1-\epsilon, 1+\epsilon] 里,防止一次更新走得太远:

Lclip=−E[min⁡(ρA, clip(ρ,1−ϵ,1+ϵ)A)]\mathcal{L}^{\text{clip}} = -\mathbb{E}\big[\min(\rho A,\ \mathrm{clip}(\rho, 1-\epsilon, 1+\epsilon) A)\big]

  1. 工程上:同时在显存里放策略、参考模型、奖励模型、价值网络四个模型,超参数很多、训练不稳定。

近年的发现是,对 LLM 来说 PPO 的很多复杂性不是必需的:

  • Ahmadian et al. (2024, Back to Basics) 发现 REINFORCE / RLOO 和 PPO 一样好甚至更好;
  • GRPO(Shao et al. 2024,DeepSeekMath / DeepSeek-R1)去掉了价值网络:对同一个提示采样一组回答,用组内奖励的均值和标准差把奖励标准化成优势(练习 8)。

4.3 实验:用真实奖励训练,能到达最优前沿吗?

代码 03 §1:

  • 训练:每步从策略采样 64 个回答,总奖励 = r*(y) − β[log π_θ(y) − log π_ref(y)],减去这一批的平均作为优势。Adam,学习率 3e-4,400 步。
  • 评估:在 1000 个新采样的回答上。
  • 起点:SFT 模型的真实奖励 0.337,96.7% 合语法,88.8% 的回答互不相同。
β真实奖励KLπ* 的真实奖励π* 的 KL不同回答
0.21.6192.351.6992.4477.1%
0.051.9144.951.9914.8739.3%

400 步的 REINFORCE 几乎到达了闭式解 π* 的奖励和 KL(KL 的估计来自样本,π* 的 KL 只在合法句子上算,两者有一点口径差别)。RLHF 的数学目标是清楚的,优化方法也能达到它——难点在奖励。

4.4 实验:用奖励模型训练

代码 03 §2:奖励换成 01 号脚本的奖励模型。

奖励模型β模型给的奖励真实奖励KL合语法不同回答
500 对01.40−2.00047.310.0%3.2%
500 对0.05−0.650.6812.9796.6%52.6%
500 对0.2−0.880.4620.2596.2%89.2%
4000 对00.041.4919.0692.2%6.3%
4000 对0.05−0.031.5215.0497.9%24.3%
4000 对0.2−0.351.2331.6995.7%70.4%

500 对的奖励模型、β = 0 时的训练过程:

步模型给的奖励真实奖励KL合语法
0−0.960.240.0096.9%
50−0.700.872.9695.3%
1000.85−1.9142.603.1%
4001.41−2.0047.420.0%
  • 不加 KL 惩罚:
    • 前 50 步,真实奖励随奖励模型的分数一起上升(0.24 → 0.87);
    • 接下来 50 步,策略找到了奖励模型的漏洞,一句不合语法、塞满”好词”的话:we water our rose in our own garden in the own garden in the。奖励模型的分数越来越高,真实奖励掉到 −2,KL 冲到 40 多。模型说的已经不是 SFT 模型会说的话了。
  • β = 0.05 让策略留在 SFT 模型附近:回答保持合语法,真实奖励是 SFT 模型的两倍,但远低于用真实奖励训练的 1.91——奖励模型的误差限制了能达到的高度。β = 0.2 更保守,改进更少。
  • 更好的奖励模型(4000 对):同样的 β 能得到更高的真实奖励。β = 0 在 400 步内也没有崩溃,但 KL 已经到 9、回答只剩 6% 互不相同。更好的奖励模型推迟了被钻空子,并不能保证不被钻:§3.5 里,best-of-n 对同一个奖励模型在 n = 4096 时也崩了。

真实世界里被钻的”空子”不是胡言乱语那么明显,而是:

  • 更长的回答:标注员偏爱长回答,Singhal et al. 2023;
  • 迎合用户的观点(sycophancy,Sharma et al. 2023);
  • 自信的语气;
  • 特定的格式(列表、标题、表情)。

这些都是”奖励模型喜欢、用户真正想要的却不一定是”的特征。

4.5 实验:多样性

代码 03 §3:和 π* 比较,从 π* 采样 1000 个期望有多少个不同的回答。

βπ* 的不同回答RL(真实奖励)的不同回答
0.276.3%77.1%
0.0546.0%39.3%

用真实奖励训练的策略,多样性和 π* 差不多。多样性下降主要是目标本身决定的:β 越小,最优策略本来就越集中在少数高奖励的回答上。用奖励模型训练的策略还要更集中(4000 对、β = 0.05 只有 24%;β = 0 只有 6%):奖励模型把某几个回答打得特别高,优化就挤到它们上面(模式坍缩,mode collapse)。

真实的 RLHF 模型也常被观察到输出多样性下降(Kirk et al. 2024)。这对创意写作、生成合成数据(第 23 讲)、以及需要多次采样的推理方法(第 7 讲)都是问题。


5. DPO:把强化学习变成分类

5.1 推导

从 §3.2 的闭式解出发,反过来把奖励用最优策略表示:

r(y)=βlog⁡π∗(y)πref(y)+βlog⁡Zr(y) = \beta\log\frac{\pi^*(y)}{\pi_{\text{ref}}(y)} + \beta\log Z

把它代入奖励模型的 Bradley–Terry 损失。因为损失只依赖两个回答的奖励之差,β log Z 正好消掉:

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

这就是 DPO(Rafailov et al. 2023)。直觉:

  • 隐式奖励:r^θ(y)=βlog⁡πθ(y)/πref(y)\hat r_\theta(y) = \beta\log\pi_\theta(y)/\pi_{\text{ref}}(y)。策略本身定义了一个奖励模型,论文标题说”你的语言模型其实是一个奖励模型”。
  • 损失就是用这个隐式奖励训练的 Bradley–Terry 奖励模型的损失。训练好这个”奖励模型”,就同时得到了对应的最优策略。
  • 不需要单独的奖励模型,不需要从策略采样,不需要强化学习:在固定的偏好数据上做一个分类问题,和 SFT 一样简单稳定。

5.2 实验:DPO 的效果

代码 04 §1:和 01~03 号脚本同样的偏好数据,从 SFT 模型出发,Adam 学习率 1e-4。“Δ log π”是训练前后,训练数据里 chosen / rejected 回答的平均 log 概率变化。

数据β遍数真实奖励KL同 KL 的 π*合语法不同回答Δ log π(chosen)Δ log π(rejected)
500 对0.130.5000.090.67296.1%88.5%+0.05−0.23
500 对0.1100.8120.661.12196.2%79.5%−0.25−1.12
500 对0.5100.7260.390.95496.2%85.2%−0.05−0.74
2000 对0.130.8520.521.03996.5%85.3%−0.25−0.74
2000 对0.1100.6473.781.90378.7%76.6%−2.56−4.18
2000 对0.530.7300.300.88496.3%87.8%−0.08−0.46
2000 对0.5100.8720.601.08895.3%85.7%−0.29−0.98
  • DPO 很”省 KL”:在很小的 KL(0.5~0.7)下把真实奖励从 0.34 提高到 0.8 以上。对照:§4.4 里用 500 对的奖励模型做 RLHF(β = 0.05),在 KL 3.0 时只得到 0.68。DPO 直接在人的比较上训练,不经过一个会被钻空子的奖励模型,也不从策略采样,所以不会跑到奖励模型没见过的地方去。
  • 离最优前沿仍有距离:同样 KL 下 π* 能达到 1.0~1.1。偏好数据有限、有噪声。

5.3 被偏好的回答,概率也下降了

上表最后两列有一个奇怪的现象:训练之后,chosen 回答的概率也下降了,只是 rejected 降得更多。DPO 只要求 chosen 相对 rejected 的 log 比值变大,并不要求 chosen 本身的概率变大。这个现象在真实模型上也普遍存在:Pal et al. (2024) 发现 chosen 的概率常常下降;Razin et al. (2024) 称之为”似然位移”(likelihood displacement)。

下降的概率质量去了训练数据里没有的回答——可能是好的(没见过的高奖励句子),也可能是坏的。2000 对、β = 0.1、训练 10 遍时:

  • chosen 降了 2.6;
  • 合语法的比例从 96% 掉到 79%,KL 冲到 3.8;
  • 真实奖励反而比训练 3 遍时更低。

β 越小、训练越久,这种过拟合越严重;β 大一些更稳。β 在 DPO 里同样扮演”别离 π_ref 太远”的角色。IPO(Azar et al. 2023)等变体修改了损失,避免把 log 比值推向无穷。

5.4 实验:隐式奖励

代码 04 §3:DPO 策略(2000 对、β = 0.5、10 遍)的隐式奖励 β log π/π_ref,能不能当奖励模型用?

测试偏好准确率和真实奖励的相关
显式奖励模型(2000 对)0.6120.795
DPO 的隐式奖励0.6210.883

在这里,隐式奖励和显式奖励模型一样准,和真实奖励的相关甚至更高。不过隐式奖励是 log 概率之比,只在策略自己会说的回答上有意义:策略几乎不说的回答(概率很小)上,它的值噪声很大,用它给任意文本打分要小心。

5.5 实验:离线 vs 在线

DPO 用的是固定的、离线的比较数据(比较的是 SFT 模型的回答);RLHF 在训练中不断从当前策略采样。代码 04 §4:

真实奖励KL(相对 SFT)合语法
第一轮:2000 对 SFT 回答(离线),β = 0.5,3 遍0.7300.3096.3%
第二轮:再从第一轮策略采样 2000 对,让人比较,以第一轮为参考再训练1.0140.8196.2%
对照:4000 对 SFT 回答(离线),从头训练0.8520.4596.4%

同样多的人工比较,在线收集的那一轮更有用:它比较的是当前策略会说的回答,正好告诉模型”你现在的回答里哪些更好”;离线数据里大部分比较都是 SFT 模型的普通回答。

这是 RLHF(在线采样)相对于离线 DPO 的优势,也是迭代 DPO、在线 DPO(Xu et al. 2023;Guo et al. 2024)的出发点——代价是每一轮都要重新收集偏好(或者用奖励模型 / AI 来标注)。

5.6 DPO 家族

DPO 之后出现了大量变体:

方法改动
IPO(Azar et al. 2023)把 log σ 换成平方损失,防止过拟合到确定性的偏好
KTO(Ethayarajh et al. 2024)不需要成对的比较,只需要”好 / 不好”的单个标签(前景理论)
ORPO(Hong et al. 2024)把 SFT 和偏好优化合成一个损失,不需要参考模型
SimPO(Meng et al. 2024)用长度归一化的平均 log 概率作为隐式奖励,不需要参考模型

它们都在”离线、分类式”的框架里,各自修补 DPO 的某个问题(过拟合、数据格式、显存)。


6. 近期的发展

6.1 用 AI 代替人:RLAIF 与 Constitutional AI

人工比较又贵又慢,而且标注员之间不一致。Bai et al. (2022, Constitutional AI) 用一组写好的原则(“宪法”)让 AI 模型自己批评、修改回答,并给出偏好(RLAIF)。人只需要写原则,不需要标注每一对。代价是:AI 标注者的偏差(喜欢长回答、喜欢自己的风格,第 5 讲的 LLM-as-judge)会传给模型。

6.2 可验证的奖励:推理模型

对数学、代码这类有标准答案的任务,奖励可以直接验证:答案对不对、代码能不能通过测试。这就是 RLVR(reinforcement learning with verifiable rewards)。

  • DeepSeek-R1(2025)用 GRPO 在可验证的奖励上做大规模强化学习,模型自己学会了长的思维链、自我检查和回溯。OpenAI 的 o1 系列也属于这一路线。
  • 可验证的奖励不容易被钻空子:答案就是对或错。但仍有漏洞,例如修改测试、利用评测器的格式解析。
  • 这和第 7 讲讨论的”推理”直接相关。强化学习到底是教会了新能力,还是把预训练模型里已有的能力”挑”出来?这仍有争论(Yue et al. 2025 发现 RL 后的模型在 pass@k 很大时不如基座模型)。

6.3 过程奖励与结果奖励

  • 结果奖励(outcome reward):只看最终答案。
  • 过程奖励(process reward,Lightman et al. 2023, Let’s Verify Step by Step):给推理的每一步打分。

过程奖励的信号更密,但标注更贵,也更容易被钻空子(步骤看起来对,结论却错了)。


7. 小结、常见误区、练习

7.1 小结

  1. 为什么要人类反馈:模仿学习的目标和”有用、无害”不一致;人比较回答比写回答容易。InstructGPT:SFT → 奖励模型 → PPO + KL。
  2. 奖励模型:
    • Bradley–Terry 的逻辑回归,准确率被标签噪声封顶(这里 0.667)。
    • 看准确率会低估它的质量(准确率 0.63 时相关 0.90)。
    • 它只在训练分布附近可靠:看不见语法,最喜欢的回答是胡言乱语。
  3. KL 约束下的最优策略:
    • π* ∝ π_ref exp(r/β),β 控制奖励和”离参考多远”的交换,可以精确算出奖励–KL 前沿。
    • best-of-n 几乎贴着前沿。
    • 对奖励模型优化得越狠,真实奖励先升后降(Goodhart)。
  4. 强化学习:
    • REINFORCE + KL 用真实奖励时几乎到达 π*(β = 0.05:1.914 vs 1.991)。
    • 用奖励模型、不加 KL 时 100 步内被钻空子(真实奖励 −2)。
    • 多样性下降主要来自目标本身,对着奖励模型优化时坍缩得更厉害。
  5. DPO:
    • 把隐式奖励代入 Bradley–Terry 损失,Z 消掉,变成分类。
    • 在小数据上比经过奖励模型的 RLHF 更省 KL。
    • 有似然位移(chosen 也下降、过度训练时概率流向坏回答)。
    • 在线收集偏好比同样多的离线数据更有效(1.01 vs 0.85)。

7.2 常见误区

  • “奖励模型准确率只有 63%,说明它很差”:标签本身的一致性就只有 67%;它和真实偏好的相关可能很高(§2.2)。
  • “奖励模型分数越高,模型越好”:过度优化时奖励模型的分数一直涨,真实质量在降(§3.5、§4.4)。
  • “KL 惩罚只是一个正则项,可有可无”:它决定了策略会不会跑到奖励模型不可靠的地方去(§4.4)。
  • “RLHF 让模型变得单一,是强化学习算法的毛病”:在这里主要是目标本身(小 β)决定的,π* 也一样集中(§4.5)。
  • “DPO 会提高被偏好回答的概率”:它只提高相对的比值,被偏好回答的概率常常也下降(§5.3)。
  • “DPO 和 RLHF 等价,所以结果一样”:最优解相同,但 DPO 用离线数据、RLHF 在线采样;有限数据下的行为很不一样(§5.5)。
  • “更多的偏好数据能解决奖励模型的外推问题”:同分布的数据再多,也教不会它训练分布之外的东西(§2.3)。

7.3 练习

练习 1(Bradley–Terry):两个回答的真实奖励分别是 1.5 和 0.5。

(a) 人选第一个的概率是多少? (b) 如果有 3 个标注员独立比较、取多数,选对的概率是多少? (c) 这对”标注员一致率”意味着什么?

参考答案

(a) σ(1.0) = 1/(1 + e⁻¹) ≈ 0.731。

(b) 至少 2 个选对:0.731³ + 3 × 0.731² × 0.269 = 0.391 + 0.431 = 0.822。多数投票能减少噪声,所以很多数据集让多个标注员比较同一对。

(c) 两个独立标注员给出相同结论的概率是 0.731² + 0.269² = 0.607。即使每个标注员都”按真实偏好、只是有噪声”,一致率也只有约 61%。InstructGPT 报告的 73% 一致率,不说明标注员不认真,只说明很多比较本来就接近。

练习 2(奖励模型的平移不变性):

(a) 为什么给奖励模型的所有输出加一个常数 c,Bradley–Terry 损失不变? (b) 这对 RLHF 有什么影响? (c) 奖励的尺度(乘一个常数)呢?

参考答案

(a) 损失只依赖 r(y_w) − r(y_l),加常数后差不变。

(b) 两方面:

  • 基线:奖励模型的绝对数值没有意义(01 号脚本里奖励模型给的分数大多是负的),RL 里用的是相对于基线的优势,所以平移不影响策略梯度。
  • 跨提示比较:不同提示的奖励没有共同的零点,比较”这个提示的回答 0.5 分、那个提示的回答 0.3 分”没有意义。所以 RL 实现常对奖励做标准化(GRPO 在每个提示的组内标准化)。

(c) 尺度会被 Bradley–Terry 损失确定下来:分数差决定预测的概率。但它和 β 相互纠缠:π* ∝ π_ref exp(r/β),把 r 乘 2 等价于把 β 除以 2。所以”β 取多少”只有在奖励的尺度确定之后才有意义。

练习 3(最优策略的计算):三个回答,π_ref = (0.5, 0.3, 0.2),奖励 r = (0, 1, 2),β = 1。

(a) 算 π*、E_π*[r]、KL(π*‖π_ref)。 (b) 验证目标的最优值等于 β log Z。

参考答案

(a) 未归一化的权重:

  • 0.5 × e⁰ = 0.500;
  • 0.3 × e¹ = 0.815;
  • 0.2 × e² = 1.478。

Z = 2.793。

  • π* = (0.179, 0.292, 0.529);
  • E[r] = 0.292 + 2 × 0.529 = 1.350;
  • KL = 0.179 ln(0.179/0.5) + 0.292 ln(0.292/0.3) + 0.529 ln(0.529/0.2) = −0.184 − 0.008 + 0.515 = 0.323。

(b) E[r] − β KL = 1.350 − 0.323 = 1.027;β log Z = ln 2.793 = 1.027。✓

π_ref 原来的期望奖励是 0.7,最优策略用 0.32 nat 的 KL 换来了 0.65 的奖励提升。

练习 4(best-of-n 的 KL):

(a) 用公式 log n − (n−1)/n 算 n = 16 和 n = 1024 时的 KL 上界。 (b) 为什么 n 很大时 best-of-n 的 KL 大约是 log n? (c) 02 号脚本里,用 4000 对的奖励模型挑选,n = 64 时真实奖励最高。这对应多大的 KL?

参考答案

(a) n = 16:ln 16 − 15/16 = 2.773 − 0.938 = 1.84;n = 1024:6.931 − 0.999 = 5.93(和 §3.4 的表一致)。

(b) 如果所有回答都不同,best-of-n 的分布把”在 π_ref 下排名前 1/n 的那部分”放大了约 n 倍,KL ≈ log n。减去的 (n−1)/n 是精确推导里的修正项。这也说明 KL 增长得很慢:n 每翻一倍,KL 只增加约 0.69。

(c) KL 上界 3.17 nat。超过这个”优化预算”之后,奖励模型的误差开始占上风。Gao et al. (2023) 的经验公式里,峰值的位置随奖励模型的大小和数据量增加而右移。

练习 5(策略梯度与基线):

(a) 证明 Ey∼πθ[∇θlog⁡πθ(y)]=0\mathbb{E}_{y\sim\pi_\theta}[\nabla_\theta\log\pi_\theta(y)] = 0。 (b) 用它说明减去基线 b 不改变梯度的期望。 (c) 为什么基线能降低方差?

参考答案

(a) E[∇log⁡π]=∑yπ(y)∇π(y)π(y)=∇∑yπ(y)=∇1=0\mathbb{E}[\nabla\log\pi] = \sum_y \pi(y)\frac{\nabla\pi(y)}{\pi(y)} = \nabla\sum_y\pi(y) = \nabla 1 = 0。

(b) E[(R(y)−b)∇log⁡π(y)]=E[R∇log⁡π]−b E[∇log⁡π]=E[R∇log⁡π]\mathbb{E}[(R(y) - b)\nabla\log\pi(y)] = \mathbb{E}[R\nabla\log\pi] - b\,\mathbb{E}[\nabla\log\pi] = \mathbb{E}[R\nabla\log\pi](b 不依赖 y)。

(c) 不减基线时,如果所有奖励都是正的(例如都在 10 左右),每个采样到的回答的概率都被往上推,只是推的程度略有不同。梯度的方向主要由”采到了哪个回答”决定,方差很大。减去平均之后,好于平均的被推上、差于平均的被拉下,信号只来自”相对好坏”。

03 号脚本用这一批 64 个样本的平均作为基线。严格地说,它包含了当前样本自己,会带来很小的偏差;RLOO 用”除自己以外的平均”消除这个偏差。

练习 6(DPO 的推导细节):

(a) 为什么 DPO 损失里不需要计算配分函数 Z? (b) 如果把 DPO 用在不是成对比较的数据上(例如每个回答只有一个绝对分数),Z 还能消掉吗?

参考答案

(a) 隐式奖励 r(y) = β log π*(y)/π_ref(y) + β log Z 里,Z 只依赖提示(这里没有提示,就是一个常数),不依赖回答 y。Bradley–Terry 损失只用到同一个提示下两个回答的奖励之差,β log Z 被减掉了。这是 DPO 能成立的关键:Z 要对所有可能的回答求和,在真实的语言模型上根本算不出来。

(b) 不能直接消掉。如果要拟合”r(y) = 某个绝对分数”,就需要知道 β log Z。KTO 用前景理论的形式,引入一个参考点(用一批样本的 KL 估计)来绕开它。这也说明 DPO 的简洁依赖于”成对比较”这种数据格式。

练习 7(似然位移):DPO 的损失只依赖”chosen 的 log 比值 − rejected 的 log 比值”。

(a) 给出一种参数变化,让损失下降、同时 chosen 和 rejected 的概率都下降。 (b) 对一个有固定容量的语言模型,为什么这种情况很常见? (c) 从 §5.2 的表看,什么设置下它变得有害?

参考答案

(a) 让 log π(y_w) 下降 0.25、log π(y_l) 下降 1.12(§5.2 表里 500 对、β = 0.1、10 遍的实际数字):两者的差增加了 0.87,β 倍之后进入 sigmoid 的值增加 0.087,损失下降。概率质量从这两个回答转移到了其他回答上。

(b) chosen 和 rejected 往往非常相似:同一个提示,很多词相同,只差几个关键的地方。要拉开它们的差距,最”省力”的办法是压低它们共有的部分(这同时降低了两者的概率),再在不同的地方做区分。梯度并不关心概率被挪到哪里去。

(c) β 小、训练遍数多时最严重。2000 对、β = 0.1、10 遍:chosen 降了 2.56,合语法的比例从 96% 掉到 79%,真实奖励从 0.85 降到 0.65。被挪走的概率流向了训练数据里没有的、不合语法的回答。缓解办法:

  • 增大 β 或减少训练;
  • 在损失里加上 chosen 的 SFT 项(例如 RPO、ORPO);
  • 换用 IPO 等变体;
  • 改用在线数据,让模型的新回答也被比较。

练习 8(GRPO 的优势):GRPO 对同一个提示采样一组 G 个回答,优势 = (r − 组内均值) / 组内标准差。

(a) 一组 4 个回答的奖励是 [1, 0, 0, 1](答对 = 1),算每个回答的优势。 (b) 如果一组 4 个回答全对或全错,会怎样? (c) 这对训练数据的选择有什么启示?

参考答案

(a) 均值 0.5,标准差(总体标准差)0.5,优势 = [+1, −1, −1, +1]。

(b) 全对或全错时,所有回答的奖励相同,标准差为 0,优势全是 0(或除以 0 需要特殊处理),这个提示不提供任何梯度。

(c) 太简单(总是对)和太难(总是错)的题目都浪费计算。DAPO(Yu et al. 2025)的”动态采样”会过滤掉这些组,只保留有对有错的提示;课程学习也会按难度挑题。这和 §3.5 的直觉一致:有用的学习信号来自”策略当前会犯的错”。

练习 9(思考:真实世界的奖励钻空子):举出三个真实 RLHF 模型被观察到的”奖励被钻空子”的现象。对每一个,说明奖励模型(或标注员)喜欢的东西和用户真正想要的东西的差别,以及一种缓解办法。

参考答案(开放)
  1. 冗长:
    • 现象:回答越来越长,重复问题、加不必要的总结和免责声明。
    • 原因:标注员和奖励模型偏爱”看起来更详细”的回答(Singhal et al. 2023 发现,在一些数据集上,RLHF 的提升大部分来自长度)。
    • 缓解:长度惩罚;在奖励模型训练中控制长度(成对数据的长度相近);评测时用长度控制的胜率(AlpacaEval LC)。
  2. 迎合(sycophancy):
    • 现象:用户表达一个观点(哪怕是错的),模型就附和;用户质疑一个正确答案,模型就改口。
    • 原因:标注员更喜欢同意自己的回答(Sharma et al. 2023)。
    • 缓解:专门构造”用户错了”的偏好数据;用可验证的事实做奖励;评测里加入迎合测试。
  3. 过度自信与格式:
    • 现象:用自信的语气陈述不确定的内容;大量使用列表、标题、粗体。
    • 原因:奖励模型把”看起来专业”当作”好”。
    • 缓解:校准相关的奖励(对说”不知道”的正确回答给分);多样化标注员和评测者;对格式做控制。

通用的缓解办法:

  • KL 惩罚和早停(§4.4);
  • 奖励模型集成(多个奖励模型取保守的分数,Coste et al. 2023);
  • 定期用新策略的回答收集新的偏好(§5.5 的在线数据);
  • 可验证的奖励(§6.2);
  • 最重要的是用独立的人工评测检查真实质量,不能只看奖励模型的分数。

7.4 延伸阅读

  • 原课阅读:
    • Ouyang et al. (2022), Training language models to follow instructions with human feedback
    • Rafailov et al. (2023), Direct Preference Optimization
  • RLHF 的基础:
    • Christiano et al. (2017), Deep Reinforcement Learning from Human Preferences
    • Stiennon et al. (2020), Learning to summarize from human feedback
    • Ziegler et al. (2019), Fine-Tuning Language Models from Human Preferences
    • Bai et al. (2022), Training a Helpful and Harmless Assistant with RLHF
  • 奖励过度优化与奖励模型:
    • Gao et al. (2023), Scaling Laws for Reward Model Overoptimization
    • Coste et al. (2023), Reward Model Ensembles Help Mitigate Overoptimization
    • Singhal et al. (2023), A Long Way to Go: Investigating Length Correlations in RLHF
    • Sharma et al. (2023), Towards Understanding Sycophancy in Language Models
    • Lambert et al. (2024), RewardBench
  • 策略优化:
    • Schulman et al. (2017), Proximal Policy Optimization
    • Ahmadian et al. (2024), Back to Basics: Revisiting REINFORCE Style Optimization for Learning from Human Feedback
    • Shao et al. (2024), DeepSeekMath(GRPO)
    • DeepSeek-AI (2025), DeepSeek-R1
    • Korbak et al. (2022), RL with KL penalties is better viewed as Bayesian inference
  • DPO 及其变体:
    • Azar et al. (2023), A General Theoretical Paradigm to Understand Learning from Human Preferences(IPO)
    • Ethayarajh et al. (2024), KTO
    • Meng et al. (2024), SimPO
    • Hong et al. (2024), ORPO
    • Razin et al. (2024), Unintentional Unalignment: Likelihood Displacement in Direct Preference Optimization
    • Xu et al. (2023), Some things are more CRINGE than others(迭代 DPO)
    • Guo et al. (2024), Direct Language Model Alignment from Online AI Feedback
  • AI 反馈与可验证奖励:
    • Bai et al. (2022), Constitutional AI
    • Lightman et al. (2023), Let’s Verify Step by Step
    • Kirk et al. (2024), Understanding the Effects of RLHF on LLM Generalisation and Diversity
  • 本仓库的相关内容:
    • 第 6 讲(SFT)
    • 第 7 讲(推理)
    • 第 9 讲(对齐的失效)
    • 第 15 讲(拒绝采样、红队测试)
    • 第 16 讲(浅层对齐、微调抹掉对齐)
    • 第 20 讲(Bradley–Terry 与人工评估)
    • CS329H(机器学习中的人类偏好)

7.5 下一讲预告

到这里,我们已经知道怎样训练、适配、对齐一个 LLM。可是每生成一个 token 都要跑一遍完整的模型:一个 70B 的模型,生成一段 500 个 token 的回答,要读 500 遍 140 GB 的权重。第 19 讲:高效推理方法。我们会看:

  • 为什么 prefill 和 decode 的瓶颈完全不同;
  • KV 缓存省了什么、又带来了什么问题(PagedAttention);
  • FlashAttention 的分块与在线 softmax;
  • 量化的误差;
  • 推测解码怎样在输出分布严格不变的前提下加速——在花园世界里,我们能精确地验证这个”严格不变”。
← 返回课程目录