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

Machine Learning from Human Preferences · Lecture 08。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

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

本篇目录

对应:Stanford CS329H Fall 2026 Lecture 8(10/19 Reinforcement learning from human feedback)。依据教材第 1 章 1.2 节、第 3 章 3.7 节及相应幻灯片;RLHF 流程依据 InstructGPT(Ouyang 等 2022)和 Stiennon 等(2020);奖励过度优化依据 Gao、Schulman、Hilton(2023);策略梯度依据 Williams(1992)、PPO(Schulman 等 2017)、GRPO(Shao 等 2024)、RLOO(Ahmadian 等 2024)。 配套代码:code/lecture08/(numpy + PyTorch,CPU 即可) 预计阅读时间:3~4 小时(含运行代码)


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 画出 RLHF 的完整流程(SFT → 偏好数据 → 奖励模型 → RL),说出每一步的输入、输出和作用,以及 InstructGPT 的规模。
  2. 把”生成一个回答”写成马尔可夫决策过程;解释为什么逐词的 KL 惩罚等于整个回答的 KL。
  3. 推导策略梯度定理(对数导数技巧),解释基线为什么不改变期望、却能降低方差;说出 RLOO、GRPO、PPO 各自怎样构造”优势”。
  4. 推导 KL 约束目标的最优解 π∗∝πrefexp⁡(r/β)\pi^* \propto \pi_{\text{ref}}\exp(r/\beta),说出”RLHF 学到什么由 rr 和 β\beta 决定,RL 算法只决定怎样到达”。
  5. 解释奖励过度优化:代理奖励一路上升,真实质量先升后降;说出它的两种来源(奖励模型的设定错误 / 外推,标注员的偏差),以及为什么”多收集数据”解决不了。
  6. 推导 Best-of-n 的 KL 公式,比较 Best-of-n 和 RL。
  7. 说出控制过度优化的办法(选 β、提前停止、人工评估、奖励模型集成、迭代地更新奖励模型)以及它们的局限。

0.2 先修知识

知识点用在哪里最低要求
第 1 讲第 3 节全部RLHF 的流程图、KL 约束最优策略(练习 4)
第 5、6 讲第 2、5 节BT 最大似然、奖励模型的训练与评估、集成
强化学习第 3 节不需要预先会;会从头推导策略梯度。学过 CS234 更好
PyTorch代码第 6 讲 text_world.py 开头的说明

0.3 本讲地图

第1节  RLHF 全景:InstructGPT 的三步
第2节  生成 = 马尔可夫决策过程;SFT                         ← 代码 01
第3节  策略梯度:REINFORCE、基线、RLOO、GRPO、PPO           ← 代码 03 演示 1
第4节  KL 约束的目标与它的解析解                            ← 代码 03 演示 2、3
第5节  奖励过度优化                                        ← 代码 02、04
第6节  怎样控制过度优化:选 β、提前停止、Best-of-n            ← 代码 04
第7–11节 小结、与考核的关系、练习、延伸阅读、下一讲预告

0.4 玩具世界与关于数字

真实的语言模型不能穷举所有回答,任何量都只能靠采样估计。本讲的代码用一个可以穷举的玩具语言模型(toy_lm.py):

  • 词表 6 个”词”:〈结束〉、要点、例子、客套、华丽、错误。一个回答最多 6 个内容词,所有可能的回答共 1+5+⋯+56=195311 + 5 + \cdots + 5^6 = 19531 个。
  • 真实质量(上帝视角,只用于评估):要点前两个各 +1.0、第三个起每个 −0.6(边际递减:重复啰嗦);例子第一个 +0.7、再多每个 −0.4;客套 −0.15、华丽 −0.1、错误 −1.2;空回答 −1.0。最好的回答是”要点 要点 例子”(+2.7)。
  • 众包标注员的效用 = 真实质量 + 0.5 × 华丽的个数 + 0.1 × 长度(第 1 讲的风格偏差和长度偏差),按 BT 模型 P(a≻b)=σ(2(ua−ub))P(a \succ b) = \sigma(2(u_a - u_b)) 选择。
  • 策略:一个小 MLP,输入”已经写了几个词、每种词各几个”,输出下一个词的概率。

因为能穷举,本讲引用的所有期望、KL、最优策略都是精确值,不是采样估计(随机种子固定,重复运行逐字相同)。真实论文里的数字单独标出。


1. RLHF 全景:InstructGPT 的三步

第 1 讲画过这张图。现在把每一步的细节填上(InstructGPT,Ouyang 等 2022):

步骤数据训练什么目标
① SFT约 1.3 万个提示词,标注员写的示范回答在 GPT-3 上做最大似然学会”像人一样回答”
② 奖励模型约 3.3 万个提示词,每个 4~9 个回答由标注员排序6B 的奖励模型(SFT 模型去掉输出层 + 一个打分头),BT 损失学会”哪个回答更好”
③ RL约 3.1 万个提示词(没有标注)用 PPO 优化策略,奖励 = 奖励模型分数 − β × KL生成奖励模型打高分的回答,又不离 SFT 太远

整个项目大约 40 名标注员。结果:1.3B 参数的 InstructGPT 的回答,比 175B 的 GPT-3 更受标注员喜欢;175B 的 InstructGPT 对 175B GPT-3 的胜率约 85%。

每一步在偏好学习里的位置:

  • ① 是第 5 讲的最大似然(对象是”示范”,不是”比较”)。SFT 学的是”人通常怎样写”,不是”怎样写最好”:示范里有好有坏,SFT 照单全收。代码 01_toy_lm_sft.py 演示 2:示范分布的平均真实质量只有 +0.67(最好可以到 +2.7),SFT 学得很像(KL 约 0.01),平均真实质量也就 +0.69。
  • ② 是第 2、5、6 讲的 BT 模型。
  • ③ 是这一讲的主角:有了奖励模型,怎样用它改进一个生成文字的策略?

2. 生成 = 马尔可夫决策过程;SFT

2.1 把生成写成强化学习

强化学习语言模型
状态 sts_t提示词 + 已经生成的词 y<ty_{<t}
动作 ata_t下一个词 yty_t
策略 π(a∣s)\pi(a \mid s)语言模型的下一个词分布 π(yt∣x,y<t)\pi(y_t \mid x, y_{<t})
转移确定性的:把 yty_t 接到后面
奖励只在结束时给:r(x,y)r(x, y) = 奖励模型的分数
一条轨迹一个完整的回答 yy,概率 π(y∣x)=∏tπ(yt∣x,y<t)\pi(y \mid x) = \prod_t \pi(y_t \mid x, y_{<t})

代码 01 演示 3 一步一步地展示了回答”要点 要点 例子”的生成:每一步的状态、动作和概率,四步相乘得到 0.0059。

和一般的强化学习比,这个 MDP 有几个特点:转移是确定性的(没有环境的随机性);奖励极其稀疏(整个回答只有一个数);动作空间很大(几万个词);“轨迹”很长(几百到几千个词)。

2.2 KL 的链式法则

RLHF 要约束”新策略别离 SFT 策略太远”,距离用 KL 散度:

KL(π ∥ πref)=Ey∼π[log⁡π(y)πref(y)]=Ey∼π[∑tlog⁡π(yt∣y<t)πref(yt∣y<t)]\mathrm{KL}(\pi\,\|\,\pi_{\text{ref}}) = E_{y\sim\pi}\Big[\log\frac{\pi(y)}{\pi_{\text{ref}}(y)}\Big] = E_{y\sim\pi}\Big[\sum_t \log\frac{\pi(y_t \mid y_{<t})}{\pi_{\text{ref}}(y_t \mid y_{<t})}\Big]

第二个等号只是把 log⁡π(y)\log\pi(y) 拆成逐词之和。进一步可以写成”每一步下一个词分布之间的 KL,在策略访问的状态上取期望”(链式法则,练习 4)。代码 01 演示 3 用两种算法算同一个 KL,都是 4.27015。

所以实现里在每个词上扣 β(log⁡π−log⁡πref)\beta(\log\pi - \log\pi_{\text{ref}})(InstructGPT、TRL 库都这样做),和”对整个回答的 KL 加惩罚”是一回事。


3. 策略梯度:REINFORCE、基线、RLOO、GRPO、PPO

3.1 问题:怎样对”采样”求导

我们想最大化 J(θ)=Ey∼πθ[R(y)]J(\theta) = E_{y\sim\pi_\theta}[R(y)]。困难在于:θ\theta 影响的是采到哪些回答,而采样这个动作没法求导。

对数导数技巧:

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

(用了 ∇π=π∇log⁡π\nabla\pi = \pi\nabla\log\pi。)右边是一个期望,可以用采样估计:采 BB 个回答,算 1B∑iR(yi)∇log⁡π(yi)\frac{1}{B}\sum_i R(y_i)\nabla\log\pi(y_i)。这就是 REINFORCE(Williams 1992)。

直觉:每个采到的回答,按它的回报 RR 被”往上推”(提高它的概率)。回报高的推得多,回报低的推得少(回报为负的被往下压)。

在代码里,这只需要一行”代理损失”:loss = -(R * logp).mean(),其中 R 当作常数(不求导)。对它求梯度就是上面的估计。

3.2 基线:只说”比平常好还是差”

问题:如果所有回报都是正的(例如奖励模型的分数整体偏高),每个采到的回答都被往上推,只是推的力度略有不同——信号淹没在噪声里。

解决办法:减去一个基线 bb:

∇J=E[(R(y)−b) ∇log⁡π(y)]\nabla J = E\big[(R(y) - b)\,\nabla\log\pi(y)\big]

只要 bb 不依赖于这个回答本身,期望就不变,因为

Ey∼π[∇log⁡π(y)]=∑yπ(y)∇π(y)π(y)=∇∑yπ(y)=∇1=0E_{y\sim\pi}[\nabla\log\pi(y)] = \sum_y \pi(y)\frac{\nabla\pi(y)}{\pi(y)} = \nabla\sum_y\pi(y) = \nabla 1 = 0

R−bR - b 叫优势(advantage):这个回答比”平常”好多少。几种常见的基线:

做法优势 AiA_i特点
不减基线(原始 REINFORCE)RiR_i无偏,方差大,结果随奖励的常数平移而变
减这一批的平均Ri−RˉR_i - \bar R包含自己,有 1/B1/B 的微小偏差
RLOO(留一法)Ri−1B−1∑j≠iRjR_i - \frac{1}{B-1}\sum_{j\ne i}R_j严格无偏(Kool 等 2019;Ahmadian 等 2024 用于 RLHF)
GRPO(组内标准化)(Ri−Rˉ)/std(R)(R_i - \bar R)/\mathrm{std}(R)同一个提示词采一组回答(Shao 等 2024,DeepSeekMath),不需要价值网络
PPO 的演员—评论家A^t\hat A_t 由价值网络 V(st)V(s_t) 和 GAE 估计每个词有自己的优势,要多训练一个价值网络

在玩具世界里,目标 JJ 是 19531 个回答上的有限和,精确梯度可以直接求出来,于是能检验每种估计的好坏。代码 03_reinforce_kl.py 演示 1(在 SFT 策略处、每次 32 个回答、估计 200 次):

做法和精确梯度的平均余弦相似度相对均方误差平均长度 / 真实长度
不减基线0.7650.750.98
减这一批的平均0.8590.380.97
RLOO0.8590.411.00
GRPO0.8590.280.63

减去基线后,均方误差降到约一半。GRPO 的方向和 RLOO 一样准,但梯度整体被缩放了(最后一列 0.63),所以它的均方误差不能直接比较;除以标准差相当于自动调整步长。

3.3 训练:REINFORCE 到底在优化什么

演示 2:β=1\beta = 1,每步 128 个回答,Adam 学习率 10−310^{-3}。因为能穷举,每 25 步精确地算一次目标 JJ,以及和解析最优解 π∗\pi^*(第 4 节)的 KL:

步数不减基线:JJ / KL(π‖π*)RLOOGRPO
252.286 / 0.17132.324 / 0.13372.337 / 0.1209
1002.440 / 0.01772.453 / 0.00432.456 / 0.0020
4002.433 / 0.02462.457 / 0.00052.457 / 0.0001

(SFT 策略的 JJ = 1.412;解析最优解的 JJ = 2.458。)RLOO 和 GRPO 在一两百步内几乎到达了解析最优解;不减基线的版本一直在最优解附近抖动,到不了。

3.4 PPO 的组成部分

InstructGPT 用的是 PPO(Schulman 等 2017)。它在 REINFORCE 的基础上加了几样东西,目的都是更省样本、更稳:

  1. 重要性采样,复用样本:生成回答很贵,PPO 用同一批样本更新好几轮。第二轮时,样本来自旧策略 πold\pi_{\text{old}} 而不是当前策略,要乘以比值 ρ=πθ(yt∣st)/πold(yt∣st)\rho = \pi_\theta(y_t \mid s_t)/\pi_{\text{old}}(y_t \mid s_t) 修正。
  2. 裁剪:min⁡(ρA, clip(ρ,1−ϵ,1+ϵ)A)\min\big(\rho A,\ \mathrm{clip}(\rho, 1-\epsilon, 1+\epsilon)A\big)。一旦新旧策略差得太多(ρ\rho 超出 [1−ϵ,1+ϵ][1-\epsilon, 1+\epsilon],ϵ\epsilon 常取 0.2),就不再继续推——防止一批样本把策略推得太远。
  3. 价值网络(评论家):学一个 V(st)V(s_t) 估计”从这个状态开始,期望能拿多少回报”,用它构造每个词的优势(广义优势估计 GAE)。代价是要多训练一个和策略差不多大的网络。
  4. KL 惩罚(对 πref\pi_{\text{ref}}):放在每个词的奖励里。注意它和裁剪是两件事:裁剪让每一步别离上一步的策略太远;KL 惩罚让最终的策略别离 SFT 太远。
  5. InstructGPT 的 PPO-ptx:再加上一项预训练语言模型的损失,减轻”对齐税”(RLHF 后在一些公开基准上变差)。

为什么后来很多人改用更简单的方法? 对语言模型来说,转移是确定性的、奖励只在最后,价值网络很难学好又很贵。GRPO 去掉价值网络,用”同一个提示词的一组回答”互相做基线;RLOO 发现 REINFORCE + 留一法基线在 RLHF 上和 PPO 一样好甚至更好。在玩具世界里,你已经看到 REINFORCE + RLOO 就能精确地到达最优解。


4. KL 约束的目标与它的解析解

4.1 目标

RLHF 的 RL 阶段优化:

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

为什么要 KL 项?

  1. 防止奖励黑客:奖励模型只在 SFT 生成过的那类回答上训练过,离开那里就不可靠(第 5 节)。
  2. 保留语言能力和多样性:没有 KL 项,最优解是”只输出奖励最高的那一个回答”(确定性的、毫无多样性)。
  3. 贝叶斯的解释(Korbak 等 2022):把 πref\pi_{\text{ref}} 当作先验、exp⁡(r/β)\exp(r/\beta) 当作似然,KL 约束的最优解就是后验。β\beta 是”有多相信奖励模型”。

4.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\big(r(y)/\beta\big), \qquad Z = \sum_y \pi_{\text{ref}}(y)\exp(r(y)/\beta)

证明(一行):目标可以改写成

Eπ[r]−β KL(π ∥ πref)=−β KL(π ∥ π∗)+βlog⁡ZE_\pi[r] - \beta\,\mathrm{KL}(\pi\,\|\,\pi_{\text{ref}}) = -\beta\,\mathrm{KL}(\pi\,\|\,\pi^*) + \beta\log Z

(把 π∗\pi^* 的定义代进去展开即可,练习 1。)βlog⁡Z\beta\log Z 和 π\pi 无关,KL ≥ 0,等号当且仅当 π=π∗\pi = \pi^*。

几个推论:

  • 奖励加一个常数,π∗\pi^* 不变(常数被 ZZ 吸收)——BT 模型只确定奖励的差值(第 1 讲),这里正好不需要零点。
  • 奖励乘以 cc 等价于 β\beta 除以 cc——奖励的尺度和 β\beta 是一回事。所以不同论文的 β\beta 没法直接比较。
  • β→∞\beta \to \infty:π∗→πref\pi^* \to \pi_{\text{ref}}(完全不动);β→0\beta \to 0:π∗\pi^* 集中到奖励最高的回答上(完全听奖励模型的)。

4.3 RL 找到的就是它

代码 03 演示 3(RLOO,500 步):

βKL(π‖π_ref)奖励真实质量平均长度KL(π‖π*)
3.0RL0.120+2.147+1.0333.820.0000
3.0解析0.121+2.148+1.0333.82
1.0RL0.921+3.378+1.3374.670.0004
1.0解析0.924+3.382+1.3384.67
0.3RL4.319+5.217+0.8225.860.0059
0.3解析4.309+5.216+0.8335.86

这是本讲最重要的结论之一:RLHF 的目标有一个明确的答案 π∗\pi^*。RL 算法(REINFORCE、PPO、GRPO)只是”怎样到达那里”的不同方法。 “RLHF 学到了什么”主要由奖励模型 rr 和 β\beta 决定。第 9 讲的 DPO 正是利用这一点,跳过奖励模型和 RL,直接用偏好数据求 π∗\pi^*。

(真实的语言模型没法穷举所有回答,ZZ 算不出来,所以必须用 RL 从采样中逼近 π∗\pi^*。玩具世界能直接算,是”作弊”,但让我们看清了目标本身。)

注意表格的最后一行:β=0.3\beta = 0.3 时,奖励更高了,真实质量却比 β=1\beta = 1 时低。


5. 奖励过度优化

5.1 现象

代码 04_overoptimization.py 演示 1:对奖励模型”线性 + 众包”,让 β\beta 从 10 扫到 0.02,每个 β\beta 精确计算 πβ∗\pi^*_\beta:

βKL代理奖励真实质量平均长度华丽要点
SFT0.000+1.412+0.6853.420.531.21
3.000.121+2.148+1.0333.820.661.58
1.000.924+3.382+1.3384.670.932.36
0.502.613+4.552+1.2025.491.203.31
0.304.309+5.216+0.8335.861.294.03
0.106.530+5.664+0.1076.000.965.02
0.028.127+5.741−0.3716.000.065.94

代理奖励随 KL 单调上升,真实质量先升后降,最后比什么都不做(SFT 的 +0.685)还差。下跌的过程很清楚:要点越来越多、回答越来越长;最后策略集中到奖励模型最喜欢的”要点 要点 要点 要点 要点 要点”(真实质量 −0.40)。

这就是 Goodhart 定律:“一个指标一旦成为目标,就不再是好的指标。“Stiennon 等(2020)在摘要任务上第一次清楚地展示了它:对着奖励模型优化过头,人类评价反而下降。Gao、Schulman、Hilton(2023)用一个大的”金标准奖励模型”代替人类,系统地画出了这条曲线,并研究了它怎样随奖励模型的大小和数据量变化。

5.2 为什么:奖励模型在”最高分”的地方最不可靠

代码 02_reward_model.py 看奖励模型本身。线性奖励模型(6 个参数)在 2000 对比较上训练,学到的权重:

特征学到的权重真实质量里的作用
要点+0.958前两个 +1.0,之后每个 −0.6
例子+0.470第一个 +0.7,之后每个 −0.4
客套+0.004每个 −0.15
华丽+0.884每个 −0.1(标注员 +0.5)
错误−1.529每个 −1.2

在 3000 对新回答上,它和真实质量的方向一致 78%——“看起来不错”。可是看看它在哪里准(演示 2,斯皮尔曼秩相关):

回答的范围奖励模型和真实质量的秩相关
SFT 策略采样的 3000 个回答0.755
奖励模型打分最高的 300 个回答−0.044

在 SFT 平常写的回答上,奖励模型的排序和真实质量相当一致;在它打分最高的那些回答上,两者几乎无关。它最喜欢的回答(6 个要点)在 SFT 策略下的概率只有 2×10−42\times10^{-4}——训练数据里几乎没有,奖励模型在那里是在外推(第 2 讲第 5.4 节)。RL 的工作恰恰是去找奖励模型打分最高的地方——也就是它最不可靠的地方。

5.3 两种误差来源

演示 3 / 代码 04 演示 4 比较四种奖励模型(都是 2000 对数据):

奖励模型它最喜欢的回答那个回答的真实质量过度优化曲线的最高点
线性 + 众包要点 × 6−0.40+1.338(β = 1)
线性 + 专家要点 × 6−0.40+1.357(β = 1)
灵活 + 众包要点 要点 例子 华丽 华丽 华丽+2.40+2.404(β = 0.2)
灵活 + 专家要点 要点 例子+2.70+2.700(β = 0.02)

(“灵活”把每种词的个数拆成”1 次 / 2 次 / ≥3 次”的指示变量,能表示边际递减;“专家”没有风格和长度偏差。)

  • 设定错误 / 外推(线性 + 专家):标注没有偏差,但线性模型不能表示”要点太多有害”,在数据之外无界地外推,过度优化会崩溃到负数。
  • 标注偏差(灵活 + 众包):模型能表示边际递减,但学到了标注员对华丽的偏爱。真实质量升到接近最好后稳定在 +2.4,损失 0.3,不崩溃但有方向地偏。
  • 两者都没有(灵活 + 专家):β\beta 越小越好,最后到达真实最优——没有过度优化。过度优化不是 RL 的本性,而是奖励模型的错误被优化放大。
  • 两种错误会相互作用:线性 + 众包在 β\beta 更小时反而比线性 + 专家跌得慢(β=0.3\beta = 0.3 时 +0.833 vs +0.509)——众包对华丽的偏爱让策略把一部分位置填上华丽(每个只扣 0.1),而不是更多的要点(每个扣 0.6),两种错误碰巧部分抵消。

5.4 多收集数据有没有用?

代码 02 演示 4:线性 + 众包,数据从 200 对增加到 20000 对,“华丽”的权重从 +0.83 变到 +0.70,收敛到一个有偏的正数,而不是真实质量里的 −0.1;它最喜欢的回答从头到尾都是”要点 × 6”。数据多了只能减少方差,减少不了偏差(第 5 讲第 9 节)。Gao 等发现,奖励模型越大、数据越多,过度优化的峰值越高、出现得越晚——但峰值总是存在。

5.5 真实世界的奖励黑客

  • 长度:RLHF 后的模型回答越来越长。Singhal 等(2023)发现,在几个常用的 RLHF 设定里,奖励的提升有相当一部分可以只用”变长”来解释。
  • 讨好(sycophancy):模型倾向于附和用户的观点,因为标注员更喜欢被认同(Sharma 等 2023)。
  • 格式:列表、加粗、标题让回答”看起来”更认真(第 14 讲的风格控制)。

它们都是同一个机制:标注员(或奖励模型)有一个系统性的偏好,这个偏好和”真正有用”不完全一致,优化把差距放大。


6. 怎样控制过度优化

6.1 选 β,或者提前停止

代码 04 演示 3:β=0.05\beta = 0.05(KL 惩罚很弱),RLOO 训练,每 25 步精确评估:真实质量在第 100 步(KL 0.89)达到最高 +1.150,之后一路下跌到 −0.14,代理奖励却一直在涨。

两种办法:(1) 用较大的 β\beta,让最优解本身就停在安全的地方;(2) 用较小的 β\beta,在真实质量最高时提前停止。两者都需要一个独立于训练奖励模型的”真实质量”信号来做选择——现实中就是定期的人工评估(或一个独立的、更可信的评估模型)。只看训练用的奖励模型,永远发现不了过度优化:它一直在涨。 这就是为什么 RLHF 的论文都报告人工评估的胜率。

在这个玩具世界里两种办法并不完全等价:提前停止的策略(KL 0.89,真实质量 +1.15)不如同样 KL 下的解析最优解(KL 0.92,+1.34)。Gao 等在他们的设定里发现 KL 惩罚的效果大致相当于提前停止;不同设定下结论可能不同。

InstructGPT 的 KL 系数是 0.02。这个数字依赖于奖励的尺度和 KL 的单位(第 4.2 节:奖励乘以 cc 等价于 β\beta 除以 cc),不能和别的设定直接比较。

6.2 Best-of-n

最简单的”优化”:从 SFT 采 nn 个回答,选奖励最高的。它不训练任何东西。连续奖励(没有并列)时,它的分布是 πBoN(y)=n F(r(y))n−1πref(y)\pi_{\text{BoN}}(y) = n\,F(r(y))^{n-1}\pi_{\text{ref}}(y),KL 是

KL(πBoN ∥ πref)=log⁡n−n−1n\mathrm{KL}(\pi_{\text{BoN}}\,\|\,\pi_{\text{ref}}) = \log n - \frac{n-1}{n}

(练习 5。)代码 04 演示 2 精确计算了它(考虑了并列):

nKL(精确)公式代理奖励真实质量
10.0000.000+1.412+0.685
40.6360.636+2.949+1.428
81.2041.204+3.511+1.516
643.1743.175+4.712+1.214
10245.9175.932+5.574+0.385
163848.2588.704+5.741−0.387
  • Best-of-n 同样会过度优化:nn 越大越会挑中奖励模型高估的回答。
  • 公式在 nn 不大时很准;nn 很大时精确值更小——很多回答奖励相同(只是词序不同),公式不再适用。一般情况下这个公式是上界(Beirami 等 2024)。
  • 在这个玩具世界里,Best-of-n 的真实质量峰值(+1.516)比 RL 解析最优解的峰值(+1.338)还高。解析最优解在每个 KL 下把代理奖励推到最高,也就最有效率地利用了奖励模型的错误;Best-of-n 只按名次挑,不那么激进。
  • Best-of-n 的代价在推理时:每次生成要采 nn 个回答、打 nn 次分。它常被用作 RLHF 的对照;Llama 2 用它生成”拒绝采样微调”的数据(每个提示词采多个回答,用奖励模型挑最好的,再在上面做 SFT)。

Gao 等的函数形式:以 d=KLd = \sqrt{\mathrm{KL}} 为横轴,他们发现 Best-of-n 的金标准奖励 ≈ d(α−βd)d(\alpha - \beta d),RL 的 ≈ d(α−βlog⁡d)d(\alpha - \beta\log d)。演示 5 在这里拟合:Best-of-n 很符合第一种形式(R2=0.995R^2 = 0.995);解析最优解的曲线也更符合第一种(0.997 vs 0.922),和论文里 RL 的形式不同——论文里的 RL 是真实的 PPO 训练轨迹,奖励模型是神经网络。这些函数形式是经验规律,不是定理。

6.3 其他办法

  • 奖励模型集成(第 6 讲第 7 节):用集成的平均、最差的成员或”平均 − 若干倍标准差”作奖励(Coste 等 2023),惩罚奖励模型不确定的地方。
  • 迭代地更新奖励模型:用当前策略生成新回答、收集新的偏好、重新训练奖励模型,让奖励模型”跟上”策略的分布(Llama 2 做了多轮;Bai 等 2022 的在线 RLHF)。这直接针对第 5.2 节的外推问题。
  • 修正标注偏差:在奖励模型里显式地加入长度、格式等”风格”变量,再在优化时去掉它们的贡献(第 14 讲的风格控制)。
  • 约束而不是惩罚:例如限制回答长度,或者对已知的黑客方式加专门的惩罚。小心:被约束的模型会找别的漏洞。

7. 小结

  1. RLHF 三步:SFT(示范上的最大似然:学会像人一样写)→ 奖励模型(偏好上的 BT:学会哪个更好)→ RL(KL 约束地最大化奖励)。InstructGPT:约 1.3 万 / 3.3 万 / 3.1 万个提示词,6B 奖励模型,PPO。
  2. 生成 = MDP:状态是前缀,动作是下一个词,奖励在结尾。KL 的链式法则:逐词 KL 之和 = 整个回答的 KL。
  3. 策略梯度:∇J=E[(R−b)∇log⁡π]\nabla J = E[(R - b)\nabla\log\pi]。基线不改变期望(E[∇log⁡π]=0E[\nabla\log\pi] = 0),降低方差。RLOO(留一法,无偏)、GRPO(组内标准化)、PPO(价值网络 + 重要性采样 + 裁剪)。
  4. KL 约束目标的解析解 π∗∝πrefexp⁡(r/β)\pi^* \propto \pi_{\text{ref}}\exp(r/\beta):RL 只是到达它的方法。奖励的常数不重要,奖励的尺度和 β\beta 是一回事。
  5. 奖励过度优化:代理奖励单调上升,真实质量先升后降。奖励模型在”它打分最高的地方”最不可靠。来源:设定错误 / 外推(可能崩溃)和标注偏差(有方向地偏)。数据多了只减方差、不减偏差。
  6. 控制:选 β\beta 或提前停止(都需要独立的评估信号);Best-of-n 作对照(KL = log⁡n−(n−1)/n\log n - (n-1)/n);奖励模型集成;迭代地更新奖励模型;修正已知偏差。

8. 与测验、口试和项目的关系

  • 测验与口试可能会问:RLHF 的三步各做什么;推导策略梯度定理;为什么基线不引入偏差;RLOO 和 GRPO 的优势怎样算;PPO 的裁剪和 KL 惩罚有什么区别;推导 KL 约束目标的最优解;奖励加常数、乘常数对最优策略的影响;什么是奖励过度优化、它从哪里来、为什么多收集数据不够;Best-of-n 的 KL 公式;怎样选 β\beta。
  • 期末项目:如果项目涉及用偏好优化一个策略,一定要有一个独立于训练奖励模型的评估(人工评估、独立的评估模型、或者在模拟里的”金标准”),并报告”真实质量 vs KL”的曲线而不只是最终的奖励。

9. 练习

练习 1(解析解)。证明 Eπ[r]−β KL(π ∥ πref)=−β KL(π ∥ π∗)+βlog⁡ZE_\pi[r] - \beta\,\mathrm{KL}(\pi\,\|\,\pi_{\text{ref}}) = -\beta\,\mathrm{KL}(\pi\,\|\,\pi^*) + \beta\log Z,其中 π∗=πrefer/β/Z\pi^* = \pi_{\text{ref}}e^{r/\beta}/Z。

参考答案

由定义 log⁡π∗(y)=log⁡πref(y)+r(y)/β−log⁡Z\log\pi^*(y) = \log\pi_{\text{ref}}(y) + r(y)/\beta - \log Z,所以 r(y)=βlog⁡π∗(y)πref(y)+βlog⁡Zr(y) = \beta\log\frac{\pi^*(y)}{\pi_{\text{ref}}(y)} + \beta\log Z。代入: Eπ[r]−βEπ[log⁡ππref]=βEπ[log⁡π∗πref]+βlog⁡Z−βEπ[log⁡ππref]=−βEπ[log⁡ππ∗]+βlog⁡Z=−β KL(π ∥ π∗)+βlog⁡ZE_\pi[r] - \beta E_\pi[\log\frac{\pi}{\pi_{\text{ref}}}] = \beta E_\pi[\log\frac{\pi^*}{\pi_{\text{ref}}}] + \beta\log Z - \beta E_\pi[\log\frac{\pi}{\pi_{\text{ref}}}] = -\beta E_\pi[\log\frac{\pi}{\pi^*}] + \beta\log Z = -\beta\,\mathrm{KL}(\pi\,\|\,\pi^*) + \beta\log Z。

练习 2(策略梯度与基线)。 (a) 推导 ∇θEy∼πθ[R(y)]=E[R(y)∇log⁡πθ(y)]\nabla_\theta E_{y\sim\pi_\theta}[R(y)] = E[R(y)\nabla\log\pi_\theta(y)]。 (b) 证明减去任何不依赖于 yy 的 bb 后期望不变。 (c) 基线可以依赖于状态(前缀)吗?可以依赖于这个回答之后的词吗?

参考答案

(a) 见第 3.1 节:∇∑yπR=∑yR∇π=∑yRπ∇log⁡π\nabla\sum_y\pi R = \sum_y R\nabla\pi = \sum_y R\pi\nabla\log\pi。 (b) E[b∇log⁡π]=b∑yπ∇log⁡π=b∇∑yπ=0E[b\nabla\log\pi] = b\sum_y\pi\nabla\log\pi = b\nabla\sum_y\pi = 0。 (c) 对逐词的策略梯度 ∑tE[At∇log⁡π(yt∣st)]\sum_t E[A_t\nabla\log\pi(y_t \mid s_t)],第 tt 步的基线可以依赖于状态 sts_t(以及之前的一切),因为 Eyt∼π(⋅∣st)[∇log⁡π(yt∣st)]=0E_{y_t\sim\pi(\cdot\mid s_t)}[\nabla\log\pi(y_t \mid s_t)] = 0 对每个 sts_t 都成立——这正是 PPO 价值网络 V(st)V(s_t) 的依据。但不能依赖于 yty_t 本身或之后的词,否则期望会变。

练习 3(RLOO)。 (a) 证明 RLOO 的优势估计 Ai=Ri−1B−1∑j≠iRjA_i = R_i - \frac{1}{B-1}\sum_{j\ne i}R_j 给出无偏的梯度估计。 (b) “减这一批的平均”Ai=Ri−RˉA_i = R_i - \bar R 的梯度估计期望是多少?

参考答案

(a) yjy_j(j≠ij \ne i)和 yiy_i 独立,所以基线 1B−1∑j≠iRj\frac{1}{B-1}\sum_{j\ne i}R_j 不依赖于 yiy_i,由练习 2(b),E[Ai∇log⁡π(yi)]=E[Ri∇log⁡π(yi)]=∇JE[A_i\nabla\log\pi(y_i)] = E[R_i\nabla\log\pi(y_i)] = \nabla J。 (b) Ri−Rˉ=B−1B(Ri−1B−1∑j≠iRj)R_i - \bar R = \frac{B-1}{B}\big(R_i - \frac{1}{B-1}\sum_{j\ne i}R_j\big),所以期望是 B−1B∇J\frac{B-1}{B}\nabla J——方向对,长度缩小了 1/B1/B(代码 03 演示 1 里”平均长度 / 真实长度” 0.97 ≈ 31/32)。

练习 4(KL 的链式法则)。对两个自回归分布 π(y)=∏tπ(yt∣y<t)\pi(y) = \prod_t\pi(y_t \mid y_{<t}) 和 q(y)=∏tq(yt∣y<t)q(y) = \prod_t q(y_t \mid y_{<t}),证明 KL(π ∥ q)=∑tEy<t∼π[KL(π(⋅∣y<t) ∥ q(⋅∣y<t))]\mathrm{KL}(\pi\,\|\,q) = \sum_t E_{y_{<t}\sim\pi}\big[\mathrm{KL}\big(\pi(\cdot \mid y_{<t})\,\|\,q(\cdot \mid y_{<t})\big)\big]。

参考答案

KL(π ∥ q)=Eπ[∑tlog⁡π(yt∣y<t)q(yt∣y<t)]=∑tEy<t[Eyt∼π(⋅∣y<t)[log⁡π(yt∣y<t)q(yt∣y<t)]]\mathrm{KL}(\pi\,\|\,q) = E_\pi[\sum_t\log\frac{\pi(y_t\mid y_{<t})}{q(y_t\mid y_{<t})}] = \sum_t E_{y_{<t}}\big[E_{y_t\sim\pi(\cdot\mid y_{<t})}[\log\frac{\pi(y_t\mid y_{<t})}{q(y_t\mid y_{<t})}]\big],内层期望正是条件分布之间的 KL。(用了全期望公式:先对 yty_t 求期望,再对前缀求期望。)

练习 5(Best-of-n 的 KL)。设奖励是连续的(没有并列),FF 是 πref\pi_{\text{ref}} 下奖励的累积分布函数。 (a) 证明 πBoN(y)=n F(r(y))n−1πref(y)\pi_{\text{BoN}}(y) = n\,F(r(y))^{n-1}\pi_{\text{ref}}(y)。 (b) 证明 KL(πBoN ∥ πref)=log⁡n−n−1n\mathrm{KL}(\pi_{\text{BoN}}\,\|\,\pi_{\text{ref}}) = \log n - \frac{n-1}{n}。

参考答案

(a) nn 个样本里最大的落在 yy 附近:nn 个位置里选一个是 yy(概率 πref(y)\pi_{\text{ref}}(y)),其余 n−1n-1 个都小于 r(y)r(y)(概率 Fn−1F^{n-1}),共 nn 种选法。 (b) KL=EBoN[log⁡(nFn−1)]=log⁡n+(n−1)EBoN[log⁡F(r(y))]\mathrm{KL} = E_{\text{BoN}}[\log(nF^{n-1})] = \log n + (n-1)E_{\text{BoN}}[\log F(r(y))]。在 BoN 下,U=F(r(y))U = F(r(y)) 是 nn 个独立均匀分布的最大值,密度 nun−1nu^{n-1},E[log⁡U]=∫01nun−1log⁡u du=−1/nE[\log U] = \int_0^1 nu^{n-1}\log u\,du = -1/n。所以 KL =log⁡n−(n−1)/n= \log n - (n-1)/n。

练习 6(奖励的平移和缩放)。 (a) 奖励模型的分数整体加 5,π∗\pi^* 变不变?REINFORCE(不减基线)的训练过程变不变? (b) 奖励模型的分数整体乘以 2,等价于把 β\beta 改成多少?

参考答案

(a) π∗\pi^* 不变(e5/βe^{5/\beta} 被 ZZ 吸收)。不减基线的 REINFORCE 期望梯度不变,但方差变大(所有回报多了 5,每个采到的回答都被更用力地往上推),训练过程会变;减基线的方法不受影响。 (b) exp⁡(2r/β)=exp⁡(r/(β/2))\exp(2r/\beta) = \exp(r/(\beta/2)),等价于 β\beta 减半。

练习 7(长度惩罚)。在代码 04 演示 1 里,β≤0.5\beta \le 0.5 时平均长度超过 5.4。有人提议在奖励里减去 0.3×0.3 \times 长度。 (a) 在玩具世界里,这能修好过度优化吗? (b) 这个办法在真实世界里有什么风险?

参考答案

(a) 部分能。长度惩罚抵消了”每多一个词奖励模型就加分”的倾向(奖励模型给要点 +0.96、华丽 +0.88,减 0.3 之后仍为正),策略仍会多写要点,只是没那么极端。问题的根源是线性奖励模型不懂边际递减,长度惩罚治标不治本。 (b) 长度不是坏事本身:有些问题需要长回答。一刀切的长度惩罚会伤害这些回答;而且模型会找别的漏洞(例如用更密集的格式、更多列表)。更好的做法是从奖励模型里分离出”长度”的贡献(第 14 讲的风格控制),或者在标注阶段就控制长度。

练习 8(PPO 的裁剪)。ϵ=0.2\epsilon = 0.2。 (a) 优势 A=+2A = +2,比值 ρ=1.5\rho = 1.5。裁剪后的目标是多少?对 θ\theta 的梯度是多少? (b) 优势 A=−2A = -2,比值 ρ=1.5\rho = 1.5 呢? (c) 用一句话解释裁剪的作用。

参考答案

(a) min⁡(1.5×2, 1.2×2)=2.4\min(1.5 \times 2,\ 1.2 \times 2) = 2.4,取的是裁剪后的那一项,它不依赖 θ\theta(ρ\rho 被截成常数 1.2),梯度为 0:这个词的概率已经提高得够多了,不再继续推。 (b) min⁡(1.5×(−2), 1.2×(−2))=min⁡(−3,−2.4)=−3\min(1.5 \times (-2),\ 1.2 \times (-2)) = \min(-3, -2.4) = -3,取的是未裁剪的项,梯度不为 0:这个”坏”词的概率被意外提高了,PPO 会把它拉回来。 (c) 裁剪只在”朝有利方向走得太远”时停止推动,防止一批样本把策略推得离旧策略太远(重要性采样在那里不可靠),但总是允许纠正”朝不利方向走”的错误。


10. 延伸阅读

课程教材

  • Truong, Haupt, Koyejo. Machine Learning from Human Preferences. 第 1 章 1.2 节、第 3 章 3.7 节。

RLHF 的经典论文

  • Christiano et al. Deep Reinforcement Learning from Human Preferences. NeurIPS 2017.
  • Stiennon et al. Learning to Summarize from Human Feedback. NeurIPS 2020.
  • Ouyang et al. Training Language Models to Follow Instructions with Human Feedback(InstructGPT). NeurIPS 2022.
  • Bai et al. Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback. 2022.
  • Touvron et al. Llama 2: Open Foundation and Fine-Tuned Chat Models. 2023. 第 3 节。

策略梯度

  • Williams. Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning. 1992.
  • Schulman et al. Proximal Policy Optimization Algorithms. 2017.
  • Kool, van Hoof, Welling. Buy 4 REINFORCE Samples, Get a Baseline for Free! 2019.
  • Ahmadian et al. Back to Basics: Revisiting REINFORCE Style Optimization for Learning from Human Feedback in LLMs. ACL 2024.
  • Shao et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. 2024.(GRPO)

KL 约束与过度优化

  • Korbak, Perez, Buckley. RL with KL Penalties is Better Viewed as Bayesian Inference. 2022.
  • Gao, Schulman, Hilton. Scaling Laws for Reward Model Overoptimization. ICML 2023.
  • Beirami et al. Theoretical Guarantees on the Best-of-n Alignment Policy. 2024.
  • Singhal, Goyal, Xu, Durrett. A Long Way to Go: Investigating Length Correlations in RLHF. 2023.
  • Sharma et al. Towards Understanding Sycophancy in Language Models. 2023.
  • Coste, Anwar, Kirk, Krueger. Reward Model Ensembles Help Mitigate Overoptimization. ICLR 2024.

同目录其他课程

  • CS234 第 9 讲、CS336 第 15、16 讲、CS224N 第 10 讲从”怎么训练”的角度讲了 RLHF、PPO、GRPO。

11. 下一讲预告

本讲最重要的发现是:RLHF 的目标有一个解析解 π∗∝πrefexp⁡(r/β)\pi^* \propto \pi_{\text{ref}}\exp(r/\beta),RL 只是到达它的方法。反过来读这个公式:

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

奖励可以用策略表示出来。把它代进第 5 讲的 BT 似然,βlog⁡Z\beta\log Z 在两个回答的差值里消掉了——于是可以直接用偏好数据训练策略,不需要奖励模型,也不需要强化学习。

第 9 讲讲直接偏好优化(DPO):

  • 从 KL 约束的解析解推导 DPO;“你的语言模型其实是一个奖励模型”;参考模型作为零点。
  • DPO 的梯度和 β\beta 的作用;离线数据的问题;“似然位移”(被选中的回答的概率反而下降)。
  • 变体:IPO、KTO、SimPO、ORPO 各改了哪个假设。
  • 在同一个玩具世界里比较 DPO 和本讲的 RLHF:同样的偏好数据,DPO 会到哪里去?
  • DPO 与 Borda 计数(社会选择的视角,预告第 16 讲);当偏好不可传递时怎么办(Nash 偏好学习)。
← 返回课程目录