对应原课: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 约束下的最优策略 ,解释 β 的作用;
- 解释奖励的过度优化(Goodhart 定律),以及 KL 惩罚、best-of-n 的位置;
- 写出 REINFORCE 的梯度,说出 PPO 比它多了什么;
- 从最优策略推导出 DPO 的损失,说出它的优点和已知的问题(似然位移、离线数据)。
0.3 本讲的实验平台
- 回答 = 一句花园句子,从
<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 让它学会”像示范那样回答”。两者都是模仿。模仿有几个根本的局限:
- 目标不一致:预训练的目标是”预测下一个 token”,不是”帮助用户”。互联网上有大量错误、有害、不相关的内容,模型把它们也一起学了。
- 示范的天花板:SFT 最多学到示范者的水平;示范者写得不好的地方,模型也学不好。
- 没有负面信号:SFT 只告诉模型”应该怎样”,从不告诉它”什么是错的”。模型自己生成的回答里出了错,它不会知道。
- 评价比生成容易:判断”这篇摘要比那篇好”,比自己写一篇好摘要容易得多。人的这种能力,模仿学习用不上。
1.2 InstructGPT 的三步
Ouyang et al. (2022) 的流程(也是 ChatGPT 的雏形):
- SFT:标注员为一批提示写示范回答,在 GPT-3 上做监督微调。
- 奖励模型(RM):
- 对每个提示,用 SFT 模型生成 K 个回答(K = 4~9),标注员把它们排序;
- 每个排序拆成 对比较,训练一个给回答打分的模型。
- 强化学习:用 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₁ 的概率是:
这是 Bradley & Terry (1952) 的模型,也是国际象棋 Elo 分的基础(第 20 讲会再用到它)。它有几个性质:
- 只有分数的差有意义(所有回答加同一个常数,概率不变);
- 两个回答越接近,人越容易”选错”;分数差 1 时,人有 27% 的时候选了更差的那个。
奖励模型 r_φ 就是用这个模型做最大似然:
这就是一个”更好的回答分数更高”的逻辑回归。InstructGPT 的奖励模型从 SFT 模型初始化,把”预测下一个词”的输出层换成一个标量头(代码里取最后一个位置的隐藏状态,经过一个线性层)。
2.2 实验:标签噪声决定的上限
代码 01 §1–2:
- SFT 模型的起点:它的回答平均真实奖励 0.300,95.8% 合语法。
- 评测数据:3000 对测试比较。即使用真实奖励去预测”人选了哪个”,准确率也只有 0.667——标签本身有噪声。
| 比较的对数 | 奖励模型的准确率 | 和真实奖励的相关 |
|---|---|---|
| 250 | 0.543 | 0.277 |
| 500 | 0.551 | 0.440 |
| 1000 | 0.588 | 0.620 |
| 2000 | 0.612 | 0.795 |
| 4000 | 0.630 | 0.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 的目标
如果只最大化奖励模型的分数 ,最优策略会把全部概率放在 r 最高的那一个回答上——正是 §2.3 里奖励模型外推出错的地方。所以 RLHF 的目标加了一个 KL 惩罚:
π_ref 是 SFT 模型。KL 惩罚的作用:
- 防止奖励被钻空子:策略不能跑到 SFT 模型几乎不会说的地方去,那里正是奖励模型不可靠的地方;
- 保留语言能力和多样性:不要为了奖励把语言模型”训坏”;
- 从贝叶斯的角度看,它相当于把 π_ref 当作先验、把奖励当作似然(Korbak et al. 2022, RL with KL penalties is better viewed as Bayesian inference)。
3.2 闭式解
这个目标有一个漂亮的闭式解:
推导:把目标改写成
β 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% 概率的句子数 |
|---|---|---|---|
| 10 | 0.441 | 0.00 | 11117 |
| 1 | 0.798 | 0.20 | 11592 |
| 0.5 | 1.167 | 0.75 | 9061 |
| 0.3 | 1.488 | 1.58 | 4345 |
| 0.2 | 1.699 | 2.44 | 2678 |
| 0.1 | 1.925 | 3.99 | 1060 |
| 0.05 | 1.991 | 4.87 | 547 |
| 0.02 | 2.000 | 5.08 | 469 |
这条”奖励–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 有一个常用的上界 。代码 02 §2(用真实奖励挑):
| n | KL 上界 | E[r*] | 同样 KL 下 π* 的 E[r*] |
|---|---|---|---|
| 2 | 0.19 | 0.736 | 0.790 |
| 4 | 0.64 | 1.053 | 1.109 |
| 16 | 1.84 | 1.521 | 1.559 |
| 64 | 3.17 | 1.789 | 1.825 |
| 256 | 4.55 | 1.958 | 1.972 |
best-of-n 几乎贴着最优前沿(它的真实 KL 比上界还小,所以实际上更接近)。这个最简单的方法在奖励–KL 的意义下几乎是最优的,代价在推理:每个回答要生成 n 次。很多 RLHF 论文用它作为强基线;也有方法把 best-of-n 的结果蒸馏回模型(例如 Llama 2 的拒绝采样微调)。
3.5 实验:过度优化
把挑选标准从真实奖励换成奖励模型。代码 02 §3:从 SFT 模型采样 4 万个回答,每 n 个一组,挑奖励模型打分最高的那个,看它的真实奖励。
| 用谁挑 | n=1 | n=4 | n=16 | n=64 | n=256 | n=1024 | n=4096 |
|---|---|---|---|---|---|---|---|
| (KL 上界) | 0.00 | 0.64 | 1.84 | 3.17 | 4.55 | 5.93 | 7.32 |
| 真实奖励(理论值) | 0.40 | 1.05 | 1.52 | 1.79 | 1.96 | 2.00 | 2.00 |
| 奖励模型(250 对) | 0.31 | 0.46 | 0.53 | 0.54 | 0.57 | 0.24 | −1.27 |
| 奖励模型(1000 对) | 0.31 | 0.65 | 0.77 | 0.88 | 0.94 | 0.43 | −0.17 |
| 奖励模型(4000 对) | 0.31 | 0.89 | 1.32 | 1.47 | 1.45 | 1.29 | 0.44 |
真实奖励先升后降:
- n 小时,奖励模型的偏好和真实偏好大体一致;
- n 大时,挑出来的是奖励模型打分极端高的回答——正是 §2.3 里那些外推出错的胡言乱语。
- 奖励模型的分数一直在涨(这正是 best-of-n 在最大化的东西),真实奖励却崩了。
这就是 Goodhart 定律:“当一个指标变成目标,它就不再是一个好指标。” Gao et al. (2023, Scaling Laws for Reward Model Overoptimization) 系统地测量了这条曲线(他们用一个大的”金标准”奖励模型代替人)。
- 真实奖励随 先升后降,形状可以用简单的函数拟合;
- 奖励模型越大、数据越多,峰值出现得越晚、越高。这里 4000 对的模型峰值最高、下降最慢,但最后也会下降。
4. 用强化学习优化策略
4.1 策略梯度
best-of-n 在推理时花 n 倍的计算;RLHF 想把”挑出好回答”的能力训练进模型本身。目标 (R 包含 KL 惩罚)的梯度,用 log 导数技巧:
这就是 REINFORCE(Williams 1992):采样一个回答,按它的奖励放大或缩小它的 log 概率的梯度。
- 奖励高的回答被”鼓励”,奖励低的被”抑制”。
- 减去基线:减去任何不依赖 y 的基线 b 都不改变期望(因为 ),但能大大降低方差。常用这一批样本的平均奖励作为基线;RLOO 用”除自己以外的样本的平均”。
- 语言模型的 log 概率是各个 token 的 log 概率之和,所以梯度可以照常反向传播。
KL 惩罚有两种加法:
- 加在奖励里:,InstructGPT 的做法,并且是逐 token 地加;
- 作为单独的损失项。
本讲的代码用前一种。
4.2 PPO 多了什么
InstructGPT 用 PPO(Schulman et al. 2017)。和 REINFORCE 相比,它多了:
- 价值网络 :估计”从当前位置往后能得到多少奖励”,用作逐 token 的基线。优势函数用 GAE(广义优势估计)计算。
- 重要性比率与裁剪:用旧策略采的一批样本更新好几次,目标里用比率 ,并把它裁剪在 里,防止一次更新走得太远:
- 工程上:同时在显存里放策略、参考模型、奖励模型、价值网络四个模型,超参数很多、训练不稳定。
近年的发现是,对 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.2 | 1.619 | 2.35 | 1.699 | 2.44 | 77.1% |
| 0.05 | 1.914 | 4.95 | 1.991 | 4.87 | 39.3% |
400 步的 REINFORCE 几乎到达了闭式解 π* 的奖励和 KL(KL 的估计来自样本,π* 的 KL 只在合法句子上算,两者有一点口径差别)。RLHF 的数学目标是清楚的,优化方法也能达到它——难点在奖励。
4.4 实验:用奖励模型训练
代码 03 §2:奖励换成 01 号脚本的奖励模型。
| 奖励模型 | β | 模型给的奖励 | 真实奖励 | KL | 合语法 | 不同回答 |
|---|---|---|---|---|---|---|
| 500 对 | 0 | 1.40 | −2.000 | 47.31 | 0.0% | 3.2% |
| 500 对 | 0.05 | −0.65 | 0.681 | 2.97 | 96.6% | 52.6% |
| 500 对 | 0.2 | −0.88 | 0.462 | 0.25 | 96.2% | 89.2% |
| 4000 对 | 0 | 0.04 | 1.491 | 9.06 | 92.2% | 6.3% |
| 4000 对 | 0.05 | −0.03 | 1.521 | 5.04 | 97.9% | 24.3% |
| 4000 对 | 0.2 | −0.35 | 1.233 | 1.69 | 95.7% | 70.4% |
500 对的奖励模型、β = 0 时的训练过程:
| 步 | 模型给的奖励 | 真实奖励 | KL | 合语法 |
|---|---|---|---|---|
| 0 | −0.96 | 0.24 | 0.00 | 96.9% |
| 50 | −0.70 | 0.87 | 2.96 | 95.3% |
| 100 | 0.85 | −1.91 | 42.60 | 3.1% |
| 400 | 1.41 | −2.00 | 47.42 | 0.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.2 | 76.3% | 77.1% |
| 0.05 | 46.0% | 39.3% |
用真实奖励训练的策略,多样性和 π* 差不多。多样性下降主要是目标本身决定的:β 越小,最优策略本来就越集中在少数高奖励的回答上。用奖励模型训练的策略还要更集中(4000 对、β = 0.05 只有 24%;β = 0 只有 6%):奖励模型把某几个回答打得特别高,优化就挤到它们上面(模式坍缩,mode collapse)。
真实的 RLHF 模型也常被观察到输出多样性下降(Kirk et al. 2024)。这对创意写作、生成合成数据(第 23 讲)、以及需要多次采样的推理方法(第 7 讲)都是问题。
5. DPO:把强化学习变成分类
5.1 推导
从 §3.2 的闭式解出发,反过来把奖励用最优策略表示:
把它代入奖励模型的 Bradley–Terry 损失。因为损失只依赖两个回答的奖励之差,β log Z 正好消掉:
这就是 DPO(Rafailov et al. 2023)。直觉:
- 隐式奖励:。策略本身定义了一个奖励模型,论文标题说”你的语言模型其实是一个奖励模型”。
- 损失就是用这个隐式奖励训练的 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.1 | 3 | 0.500 | 0.09 | 0.672 | 96.1% | 88.5% | +0.05 | −0.23 |
| 500 对 | 0.1 | 10 | 0.812 | 0.66 | 1.121 | 96.2% | 79.5% | −0.25 | −1.12 |
| 500 对 | 0.5 | 10 | 0.726 | 0.39 | 0.954 | 96.2% | 85.2% | −0.05 | −0.74 |
| 2000 对 | 0.1 | 3 | 0.852 | 0.52 | 1.039 | 96.5% | 85.3% | −0.25 | −0.74 |
| 2000 对 | 0.1 | 10 | 0.647 | 3.78 | 1.903 | 78.7% | 76.6% | −2.56 | −4.18 |
| 2000 对 | 0.5 | 3 | 0.730 | 0.30 | 0.884 | 96.3% | 87.8% | −0.08 | −0.46 |
| 2000 对 | 0.5 | 10 | 0.872 | 0.60 | 1.088 | 95.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.612 | 0.795 |
| DPO 的隐式奖励 | 0.621 | 0.883 |
在这里,隐式奖励和显式奖励模型一样准,和真实奖励的相关甚至更高。不过隐式奖励是 log 概率之比,只在策略自己会说的回答上有意义:策略几乎不说的回答(概率很小)上,它的值噪声很大,用它给任意文本打分要小心。
5.5 实验:离线 vs 在线
DPO 用的是固定的、离线的比较数据(比较的是 SFT 模型的回答);RLHF 在训练中不断从当前策略采样。代码 04 §4:
| 真实奖励 | KL(相对 SFT) | 合语法 | |
|---|---|---|---|
| 第一轮:2000 对 SFT 回答(离线),β = 0.5,3 遍 | 0.730 | 0.30 | 96.3% |
| 第二轮:再从第一轮策略采样 2000 对,让人比较,以第一轮为参考再训练 | 1.014 | 0.81 | 96.2% |
| 对照:4000 对 SFT 回答(离线),从头训练 | 0.852 | 0.45 | 96.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 小结
- 为什么要人类反馈:模仿学习的目标和”有用、无害”不一致;人比较回答比写回答容易。InstructGPT:SFT → 奖励模型 → PPO + KL。
- 奖励模型:
- Bradley–Terry 的逻辑回归,准确率被标签噪声封顶(这里 0.667)。
- 看准确率会低估它的质量(准确率 0.63 时相关 0.90)。
- 它只在训练分布附近可靠:看不见语法,最喜欢的回答是胡言乱语。
- KL 约束下的最优策略:
- π* ∝ π_ref exp(r/β),β 控制奖励和”离参考多远”的交换,可以精确算出奖励–KL 前沿。
- best-of-n 几乎贴着前沿。
- 对奖励模型优化得越狠,真实奖励先升后降(Goodhart)。
- 强化学习:
- REINFORCE + KL 用真实奖励时几乎到达 π*(β = 0.05:1.914 vs 1.991)。
- 用奖励模型、不加 KL 时 100 步内被钻空子(真实奖励 −2)。
- 多样性下降主要来自目标本身,对着奖励模型优化时坍缩得更厉害。
- 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) 证明 。 (b) 用它说明减去基线 b 不改变梯度的期望。 (c) 为什么基线能降低方差?
参考答案
(a) 。
(b) (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 模型被观察到的”奖励被钻空子”的现象。对每一个,说明奖励模型(或标注员)喜欢的东西和用户真正想要的东西的差别,以及一种缓解办法。
参考答案(开放)
- 冗长:
- 现象:回答越来越长,重复问题、加不必要的总结和免责声明。
- 原因:标注员和奖励模型偏爱”看起来更详细”的回答(Singhal et al. 2023 发现,在一些数据集上,RLHF 的提升大部分来自长度)。
- 缓解:长度惩罚;在奖励模型训练中控制长度(成对数据的长度相近);评测时用长度控制的胜率(AlpacaEval LC)。
- 迎合(sycophancy):
- 现象:用户表达一个观点(哪怕是错的),模型就附和;用户质疑一个正确答案,模型就改口。
- 原因:标注员更喜欢同意自己的回答(Sharma et al. 2023)。
- 缓解:专门构造”用户错了”的偏好数据;用可验证的事实做奖励;评测里加入迎合测试。
- 过度自信与格式:
- 现象:用自信的语气陈述不确定的内容;大量使用列表、标题、粗体。
- 原因:奖励模型把”看起来专业”当作”好”。
- 缓解:校准相关的奖励(对说”不知道”的正确回答给分);多样化标注员和评测者;对格式做控制。
通用的缓解办法:
- 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;
- 量化的误差;
- 推测解码怎样在输出分布严格不变的前提下加速——在花园世界里,我们能精确地验证这个”严格不变”。