RLHF Book · 大模型后训练  /  Nathan Lambert
CHAPTER 01

导论

当我们无法写出奖励函数、却能一眼判断好坏时,该怎么优化一个语言模型。

原章节:01-introduction.md 对应讲座:lec0(预备知识)+ lec1(第 1–3 章总览) 英文原文

0. 本章导读

这一章要回答四个问题,它们是整本书的地基:

  1. RLHF 是什么——它是一套把人类信息注入 AI 系统的技术,最初诞生于「目标难以形式化描述」(hard-to-specify)的问题。开创这个领域的那句问题是:「我们能不能仅凭最基础的偏好信号,就引导优化过程解决困难问题?」
  2. 它在后训练里的位置——现代后训练由三类优化方法组成:指令微调(SFT)、偏好微调(PreFT)、可验证奖励强化学习(RLVR)。RLHF 主宰第二块,同时是第三块的技术祖先。
  3. 为什么 RLHF 有用而 SFT 不够——核心在于「判别比生成容易」这个不对称性,以及由此带来的两个机制差异:响应级而非 token 级的更新,对比式而非模仿式的信号。
  4. 后面 16 章各自在解决什么——本章末尾给出全书路线图,让你知道每个概念会在哪一章被展开。

这一章几乎没有公式推导的负担,但有大量需要建立的直觉。如果你只打算精读一章,读这一章;如果你打算读完全书,这一章是你之后每次迷路时该回来看的地图。

核心结论
  • RLHF 存在的理由是「能评价,但写不出评价标准」。经典 RL 的奖励函数由环境给定(CartPole 每活一步 +1),而「有用」「无害」「写得好」没有闭式表达,只能从人类比较里学出来。
  • RLHF 的三步流水线:SFT → 奖励模型 → 用 RL 优化奖励模型。这个由 InstructGPT(2022)确立的模板,是现代后训练的智力原型。
  • RLHF 的目标函数永远是两项:最大化奖励,但别离参考模型太远。$J(\pi)=\E[r_\phi(x,y)]-\beta\,\KL(\pi\,\|\,\pi_\text{ref})$。全书一半的内容都在讨论这两项怎么平衡。
  • SFT 是逐 token 的模仿,RLHF 是整条响应的对比。前者教「照着说」,后者教「哪种更好、哪种要避免」——这是 RLHF 跨领域泛化更好的根本原因。
  • 奖励模型是代理目标而非真值,所以过优化(over-optimization)是结构性的、不可避免的,只能被正则化约束,不能被消除。
  • 后训练不是「风格迁移」。基座模型决定天花板,后训练的工作是把天花板够到——Lambert 称之为「后训练的激发理论」(Elicitation Theory)。但在 2025 年之后的大规模 RL 时代,这个理论本身也开始被突破。

1. 从「写不出奖励函数」开始

要理解 RLHF 为什么会被发明出来,先要看清楚经典强化学习(Reinforcement Learning, RL)依赖什么前提。

经典 RL:奖励是环境白送的

一个 RL 问题通常写成马尔可夫决策过程(Markov Decision Process, MDP),是一个五元组 $(\mathcal{S},\mathcal{A},P,r,\gamma)$:状态空间 $\mathcal{S}$、动作空间 $\mathcal{A}$、转移动态 $P(s_{t+1}\mid s_t,a_t)$、奖励函数 $r(s_t,a_t)$、折扣因子 $\gamma$。智能体的策略(policy)$\pi(a\mid s)$ 要最大化一条轨迹上的累计回报:

$$ J(\pi)=\E_{\tau\sim\pi}\left[\sum_{t=0}^{T}\gamma^{t}\,r(s_t,a_t)\right] $$

这里 $\tau=(s_0,a_0,r_0,s_1,a_1,r_1,\dots)$ 是轨迹(trajectory),它的概率由初始分布、策略和环境动态三者共同决定:$P(\tau\mid\pi)=p(s_0)\prod_{t}\pi(a_t\mid s_t)\,p(s_{t+1}\mid s_t,a_t)$。注意这个乘积里有两个来源的随机性——策略的随机性(我们能优化)和环境的随机性(我们不能)。

教科书例子 CartPole:状态是 $s_t=(x_t,\dot x_t,\theta_t,\dot\theta_t)$,即小车位置、速度、杆角度、角速度;动作 $a_t\in\{\text{左推},\text{右推}\}$;奖励是「杆没倒就 +1」:

$$ r(s_t,a_t)=\begin{cases}1 & |\theta_t|<12^\circ \ \text{且}\ |x_t|<2.4\\ 0 & \text{否则(回合结束)}\end{cases} $$

更简单的例子是恒温器:状态是室温,动作是开/关加热,奖励是「室温接近目标值时为正」。这两个例子共同的特征是——奖励函数是任务定义的一部分,白纸黑字写得出来。你不需要学它,你只需要最大化它。同时,动作会改变下一个状态(推小车会改变杆的角度),所以这是真正的多步控制问题,需要做长期的信用分配(credit assignment)。

语言任务:奖励写不出来

现在把同样的框架套到语言模型上,第一件塌掉的事就是奖励函数。请你写一个函数,输入是一段回答的 token 序列,输出是一个实数,表示这个回答「有多有帮助」。你写不出来。任何试图用规则拼出来的东西(长度、关键词、可读性指标)都会被优化器立刻钻空子。

但奇怪的是,你能判断。给你两首诗,你能挑出更好的那首,尽管你写不出杰作;给你两个回答,你能挑出更有帮助的那个,尽管你说不清「有帮助」的公式是什么。这个能力上的落差,就是 RLHF 的全部立足点。

RLHF 的一句话定义

RLHF 让我们能优化那些可以评价(evaluate)但难以指定(specify)的行为:先用人类的比较数据把「评价能力」拟合成一个奖励模型,再用 RL 去最大化这个学出来的奖励。

另一件塌掉的事是「最可能」不等于「最有用」。预训练优化的是下一个 token 的极大似然,它给出的是互联网文本中最可能的续写。而对于一个被人当作助手使用的模型,最可能的续写常常是最没用的那个——它会继续补全网页元数据,而不是回答你的问题。这一点在第 2 节会用具体例子展示。

RLHF 的史前史:先有偏好,后有语言模型

RLHF 不是为语言模型发明的。它最早的应用场景恰恰是传统 RL 领域的控制问题:

  • TAMER(Knox & Stone, 2008)——让人给智能体的动作打分,从打分里学出奖励。
  • Christiano 等人 2017——在 Atari 和 MuJoCo 上用轨迹片段的两两偏好训练奖励预测器。最著名的演示是让一个模拟机器人学后空翻:人类标注员根本写不出「后空翻」的奖励函数,但看到两段视频就能说哪段更像后空翻。用大约 900 个人类比较,就学出了漂亮的后空翻;而手工设计的奖励函数训出来的动作则怪异得多。
  • Ziegler 等人 2019——第一次把 RLHF 用在语言模型上。
Christiano 2017 的 RLHF 系统结构图
Christiano 等人 2017 的系统结构:整个回路里,环境和 RL 算法的交互(下半部分)是标准 RL;新增的是上方的「奖励预测器」——它异步地从人类对轨迹片段的偏好中训练,再把预测奖励喂回给 RL 算法。今天 RLHF 里的奖励模型,就是这个奖励预测器在语言模型上的化身;「异步」这个细节在现代分布式 RL 训练里同样重要。

把这张图翻译到语言模型上,需要做几处替换:环境消失了(提示词从数据集采样,而不是从环境交互中产生),状态转移变成确定性的「把 token 追加到序列末尾」,奖励从「每步都有」变成「整条回答结束时给一个标量」。这些替换看起来是简化,实际上引入了全新的困难——它们是第 3 章和第 6 章的主题。

2. RLHF 到底改变了模型的什么

「RLHF 给模型带来了什么?」是围绕 RLHF 最大的问题,也是至今最难精确回答的问题。最有说服力的回答方式不是列基准分数,而是直接看输出。

基座模型是一台续写机

把同一句话喂给一个很强的基座模型——Llama 3.1 405B Base,输入「The president of the united states in 2006 was」:

George W. Bush, the governor of Florida in 2006 was Jeb Bush, and John McCain was an Arizona senator in 2006 - who later lost to obama.
September 1 -- U.S. President Bush signs an executive order to provide more options for faith-based organizations...
January 1 -- The current deadline set by United States Congress in the Unlawful Internet Gambling Enforcement Act, aka UIGEA.
search: Amendments to the 1961 International Convention for the Protection of New Varieties of Plants...

模型没有答错——它压根不是在「答」。它在补全一段维基百科式的文本,顺手把互联网上常见的元数据(日期条目、「search:」这种页面残留)也一起补出来了。这就是纯自回归预训练的产物:一台功能极强的自动补全机。

同一句话给经过完整后训练的 Tülu 3 405B:

George W. Bush was the president of the United States in 2006. He served two terms in office, from January 20, 2001, to January 20, 2009.

简洁、直接、答完就停。这个转变是本书所讲的全部方法共同的产物,其中格式(format)这一层主要来自指令微调,而风格(style)那一层主要来自 RLHF。

风格与格式:两个必须分开的概念

风格指的是语气、口吻、态度。同一个问题「我明天要做汇报,慌得不行」,可以这么答:

低共情版:你没事的。多练几遍幻灯片,睡一觉,别想太多。把你会的讲出来就行了。

高共情版:这确实挺让人紧张的,有这种反应很正常。如果可以,现在快速过一遍;挑出一两个你最希望别人记住的点;然后允许自己去休息——明天讲得清楚、状态平稳,比今晚临时抱佛脚重要得多。

格式指的是答案的结构组织。「怎么改善睡眠质量」的早期模型答案是一句大白话:「尽量每天同一时间睡,下午别喝咖啡,卧室保持安静黑暗。」而现代模型会给出带标题、分「今晚就能做的」和「日常基础」两组、用箭头标注因果、末尾附一句「如果长期严重请就医」的 markdown 结构化回答。

Lambert 的判断

「风格只是表面功夫」是 2023 年整个领域集体犯过的错。风格决定信息被接收的效率——同样的知识,包装方式不同,用户实际获得的价值差好几倍。这也是为什么本书专门有一个附录 B(Beyond "Just Style")讨论这件事。判断一个团队懂不懂后训练,看他们是把风格当成「调性问题」还是当成「产品性能问题」。

更硬的证据:安全性与跨域泛化

RLHF 早期最有说服力的应用是安全:Anthropic 的 HH(helpful & harmless)系列工作和 Safe RLHF 展示了 RLHF 能让模型在多个数据集上同时做到有帮助且无害——这是个天然的多目标权衡问题,用规则或者 SFT 都很难同时压住两端。

更重要的是泛化能力。多项研究比较过 SFT 和 RLHF 的泛化行为,结论一致指向:RLHF 跨领域泛化明显好于指令微调(Kirk 等人 2024;Chu 等人 2025 的标题直接叫「SFT 记忆,RL 泛化」)。代价是 RLHF 会降低输出多样性——这是同一枚硬币的两面,第 14、15 章会展开。

代价:贵、脆、容易长歪

灵活性是有账单的。RLHF 的实现成本远高于简单的指令微调:你要训一个奖励模型(而最佳实践至今没有定论,且强依赖应用领域),要跑在线采样,要调 KL 系数,还要防各种意料之外的偏差。最著名的是长度偏置(length bias):奖励模型系统性地偏好更长的回答,于是优化出来的模型越训越啰嗦,而质量并没有同步提升。

注意

RLHF 不能凭空造出能力,它需要一个足够强的起点。ChatGPT 之后有大量论文声称「用受限的指令微调就能近似 RLHF 的效果」,但随着文献成熟,这个说法被反复证伪:对于真正在意绝对性能的模型训练,RLHF 及其后继方法是无法绕过的阶段。所以正确的心态是:RLHF 不是万能药,它是一整套后训练流程中不可省略的一环。

3. RLHF 在后训练版图中的位置

在现代语言模型训练里,RLHF 只是后训练(post-training)的一个组件。后训练指的是大规模自回归预训练之后的一切训练技术与工程实践,目的是让模型在下游任务上真正好用。

三种优化方法,三种作用

后训练可以概括为一个多阶段流程,用到三类优化方法:

阶段学的是什么损失形态更新粒度典型数据量级
指令微调 / 监督微调
(IFT/SFT)
语言中的特征:格式、对话轮次结构、指令跟随的基本能力交叉熵(模仿)per-token10K → 1M 条
偏好微调
(Preference Fine-tuning, PreFT)
语言的风格和难以量化的细微人类偏好;顺带一小截能力提升对比式(contrastive)per-response100K → 1M 对
可验证奖励强化学习
(RLVR)
在可验证领域(数学、代码)的性能RL(真奖励,非代理)per-response10K → 100K+ 提示

RLHF 位于并且主宰第二块——偏好微调。它比指令微调复杂得多,因为它通常要经过一个「真实目标的代理」(proxy reward model),而且数据本身噪声更大。同时它又比 RLVR 成熟得多、稳定得多:RLVR 是 2024 年底才被命名的新东西,而 RLHF 从 2019 年做到今天已经有一套可复现的方法论。本书因此把重心放在偏好学习上,但会把另外两个阶段也讲清楚——因为不理解 SFT 和 RLVR,就无法真正把握 RLHF 的位置。

直觉:三个阶段各自「改动」了模型的什么
  • 预训练:建立世界知识、语言流畅度、广泛能力。决定天花板。
  • SFT:教模型用问答格式回答,并且往往是在教它复现特定的 token 序列。改的是形状。
  • RLHF / 偏好微调:用对比式损失整条整条地改写回答,让模型更丰富、更灵活。改的是质地。
  • RLVR:提升在可验证问题上的能力,并且能外溢成更复杂的、面向智能体的行为。改的是能力。

Lambert 的补充判断:基于 RL 的后训练给的是响应级、对比式的更丰富反馈,所以模型更灵活、更有吸引力;但 SFT 依然是必需的地基,想要最高性能就绕不开它。「跳过 SFT 直接上 RL」在特定场景(如 R1-Zero)有效,但不是通用配方。

从「RLHF 配方」到「后训练系统」

2022 年那个干净的三步流程,到 2024 年已经长成了一个复杂系统。

现代多轮后训练流程示意图
现代后训练不再是一条直线,而是一个可以迭代 N 轮的回路:每一轮从「已对齐模型 N」出发,用人类+合成指令继续 SFT,用偏好数据(约百万量级)训练奖励模型或直接用 LLM-as-a-judge,再用 DPO / PPO / 拒绝采样等多种优化器中的一个或几个得到「已对齐模型 N+1」,其产出的新合成回答又回流成下一轮的训练数据。注意两个关键变化:数据量从 10K/100K 涨到 1M+,以及优化器从「PPO 一种」变成「按需选择的一组工具」。

这就是为什么这本书叫《RLHF Book》却要讲十七章:真实的后训练是把若干目标函数按特定顺序、针对特定能力交织起来使用。哪些顺序有效、什么时候该用哪个优化器,目前仍是经验知识,正在缓慢地沉淀为最佳实践。

常见误区

把「RLHF」和「后训练」当同义词。2023 年初这两个词几乎可以互换,因为 ChatGPT 的成功被 OpenAI 明确归功于 RLHF,全部注意力都在这上面。但今天 RLHF 只是后训练的一块:它是偏好微调这一支的主干,是 RLVR 的基础设施来源,但它既不包含中训练(mid-training)和数据配比,也不包含 RLVR、模型融合、提示词工程这些环节。混淆这两个词会让你在读论文时严重误判各家配方的差异来源。

4. 为什么 RLHF 比 SFT 更有效:判别比生成容易

这是全书最重要的一个论点,值得讲透。它有两层:一层是信息层面的(为什么用偏好信号能拿到 SFT 拿不到的东西),一层是梯度层面的(为什么这些信号的更新方式不同)。

4.1 生成—判别落差

先看一个量纲上的对比。设词表大小 $|\mathcal{V}|=128{,}000$,一条回答长 $T=500$ 个 token。那么「所有可能回答」的空间大小是 $|\mathcal{V}|^{T}=128000^{500}$——一个天文数字。生成一条好回答,等价于在这个空间里精确定位一个点;而判别两条给定回答谁更好,只是一个二分类,输出一个 bit。

把它写成两个学习问题:

$$ \underbrace{\pi_\theta:\ x\ \mapsto\ \Delta(\mathcal{V}^{T})}_{\text{生成:学一个高维分布}} \qquad\text{vs.}\qquad \underbrace{r_\phi:\ (x,y)\ \mapsto\ \R}_{\text{判别:学一个标量打分}} $$

$\Delta(\cdot)$ 表示单纯形(概率分布空间)。左边要在指数级大的空间上建立一个分布,右边只要学一个从文本到实数的映射,并且训练它时只需要满足序关系(好的分数高于差的),连绝对刻度都不用对。这个不对称性就是「判别比生成容易」,也是人类标注得以规模化的原因:让标注员写一条 5 星回答很贵很慢,让标注员在两条回答里挑一条又快又便宜。

直觉

「写一首伟大的诗很难,但判断两首诗哪首更好很容易。」这句话是整个 RLHF 领域的口号。同样地:写出「什么叫有帮助」的公式很难,但看到一个有帮助的回答一眼就认得出来。RLHF 做的事就是把这个更容易的能力(判别)拟合下来,然后用它去驱动更难的能力(生成)。

这个落差还有一个可观测的推论:如果模型的 best-of-$N$ 采样(生成 $N$ 条、用打分器挑最好的一条)明显优于它的平均采样,说明模型已经能生成好回答,只是没有稳定地生成。这部分差距就是判别信号能兑现的红利。第 9 章的拒绝采样正是最直白地兑现这笔红利的方法。

4.2 梯度层面:三个机制差异

SFT 的损失就是带 completion mask 的交叉熵——只有回答部分的 token 计入损失,提示词只做条件:

$$ \mathcal{L}_{\text{SFT}}(\theta)=-\sum_{(x,y^\star)}\sum_{t=1}^{|y^\star|}\log\pi_\theta\!\left(y^\star_t\mid x,\,y^\star_{其中 $y^\star$ 是人类(或更强模型)写好的参考回答,$y^\star_{ $$ J(\theta)=\E_{x\sim\mathcal{D},\ y\sim\pi_\theta(\cdot\mid x)}\big[r_\phi(x,y)\big]-\beta\,\KL\!\left(\pi_\theta\,\|\,\pi_{\text{ref}}\right) $$

请特别注意 $y\sim\pi_\theta(\cdot\mid x)$ 这一行:期望是对当前策略自己产生的样本取的。这一个下标带来了三处根本差异。

推导:SFT 是「奖励恒为 1 的离策略策略梯度」

忽略 KL 项,策略梯度定理给出:

$$ \nabla_\theta J(\theta)=\E_{y\sim\pi_\theta}\big[r_\phi(x,y)\,\nabla_\theta\log\pi_\theta(y\mid x)\big] $$

由于 $\sum_y \pi_\theta(y\mid x)=1$ 恒成立,对其求导得 $\E_{y\sim\pi_\theta}[\nabla_\theta\log\pi_\theta(y\mid x)]=0$。因此对任意与 $y$ 无关的基线 $b(x)$:

$$ \nabla_\theta J(\theta)=\E_{y\sim\pi_\theta}\big[(r_\phi(x,y)-b(x))\,\nabla_\theta\log\pi_\theta(y\mid x)\big] $$

取 $b(x)=\E_{y\sim\pi_\theta}[r_\phi(x,y)]$(即该提示词下的平均奖励),则:高于平均分的回答被推高,低于平均分的回答被推低。这就是 RLHF 里「负反馈」的数学来源,也是 GRPO 这类算法用组内均值做基线的出发点(第 6 章)。

反观 SFT:$\nabla_\theta(-\mathcal{L}_{\text{SFT}})=\nabla_\theta\log\pi_\theta(y^\star\mid x)$,等价于把 $r\equiv 1$、样本固定为 $y^\star$(且来自别的分布,不是 $\pi_\theta$)代入上式。SFT 只有正梯度,没有任何东西被推低——所有概率质量的下降都是 softmax 归一化的副作用,而不是有方向的惩罚。

把三处差异列清楚:

维度SFTRLHF后果
更新粒度per-token:每个位置独立地被要求预测那个特定的 tokenper-response:整条回答拿一个分数,再分摊到 token 上SFT 会强迫模型复现「这一个具体说法」;RLHF 允许模型用自己的方式说好,只要整体更优
信号方向只有正例:「照着这个说」对比式:「这个比那个好」,且劣例被显式压低RLHF 能教模型不要做什么,这是 SFT 结构上做不到的
采样分布off-policy:数据来自人或别的模型on-policy:数据是模型自己当下生成的RLHF 在模型实际会犯的错上做修正;SFT 只在别人的正确答案上做模仿,存在暴露偏差(exposure bias)

「对比式损失」(contrastive loss)——损失由两个或更多样本之间的比较算出,而不是每个样本独立算出——这个词会在全书反复出现:奖励模型的 Bradley–Terry 损失是它,DPO 是它,GRPO 的组内归一化优势也是它。

4.3 为什么这带来更好的泛化

把 4.1 和 4.2 合起来就能理解泛化差异。SFT 是在特定文本特征上做记忆式拟合,模型学到的是「见到这类前缀,就输出这类 token」;一旦分布偏移,学到的东西就不迁移。RLHF 优化的是一个关于质量的标量函数,这个函数由跨大量提示词、大量回答、大量标注员收集来的偏好数据训练而成,它捕捉的是「什么样的文本特征更好」这种跨领域共享的规律。所以 Kirk 等人(2024)与 Chu 等人(2025)都观察到:RLHF/RL 的分布外泛化显著优于 SFT,代价是输出多样性下降。

常见误区

「既然 RLHF 更好,那就跳过 SFT。」错。RLHF 需要一个能采样出足够好的候选的起点——如果模型在某个提示词下 $N$ 条回答全是垃圾,奖励模型给出的相对排序就只是在垃圾里矮子里拔将军,梯度指向的方向没有意义。SFT 的作用正是把策略的采样分布挪到「有好东西可挑」的区域。用第 1 节的话说:RLHF 放大已有的东西,它不凭空创造。

5. 一个 RLHF 配方的完整走查

抛开术语,「做 RLHF」具体是什么样子?下面走一遍标准的三阶段配方,也就是 OpenAI 在 2022 年用 InstructGPT 确立的那个模板。

早期三阶段 RLHF 流程图
早期 RLHF 的完整数据流。注意三个容易被忽略的细节:(1) 奖励模型是从 SFT 模型初始化的,不是从基座模型;(2) 人类指令数据(约 10K)和人类偏好数据(约 100K)是两批不同的数据,量级差一个数量级;(3) 最后 PPO 优化阶段复用偏好数据里的提示词——RL 阶段只需要提示词,回答由模型自己现场生成。

第 1 步:指令微调,把续写机变成问答机

目标是把一个「补全文本的基座模型」转成「能在问答格式下工作的指令跟随模型」。做法是同一个下一 token 预测损失,只是数据换成精心构造的问答格式样本,并且只在回答部分算损失:

$$ \mathcal{L}_{\text{SFT}}(\theta)=-\sum_{(x,y^\star)}\sum_{t=1}^{|y^\star|}\log\pi_\theta\!\left(y^\star_t\mid x,\,y^\star_{训练完之后,模型见到特定的对话模板 token 序列,就知道自己该以「助手人格」回答任意问询。这一步在工程上和预训练几乎一样,只是 batch size、学习率、训练步数不同——这也是为什么 SFT 是把基座模型快速适配到新领域最便宜的手段。

第 2 步:奖励建模,把「人类的判断」压成一个标量

RL 需要一个表示质量的奖励函数。奖励模型(Reward Model, RM)的任务就是造出这个可优化的标量信号。实现上是拿一个语言模型(通常就是上一步的 SFT 模型)换一个输出维度为 1 的线性头,在偏好对数据上微调。

概率模型(Bradley–Terry)说:分数高的那条应该赢:

$$ P(y_w\succ y_l\mid x)=\sigma\big(r_\phi(x,y_w)-r_\phi(x,y_l)\big) $$

训练就是最小化这个二元事件的负对数似然:

$$ \mathcal{L}_{\text{RM}}(\phi)=-\log\sigma\big(r_\phi(x,y_w)-r_\phi(x,y_l)\big) $$

符号:$x$ 是 prompt,$y_w$ 是胜出(chosen)回答,$y_l$ 是落败(rejected)回答,$\sigma$ 是 sigmoid,$r_\phi(x,y)\in\R$ 是标量打分。注意只有分数差进入损失——给所有分数加一个常数不改变任何东西,所以奖励模型的绝对刻度没有意义,跨模型比较 RM 分数是没有意义的操作。

核心结论:奖励模型在预测什么

RLHF 里用的奖励,本质是模型在预测「这段文本在一对/一批候选中成为胜出回答的概率」。不是绝对质量分,是相对胜率。想清楚这一点,后面很多现象(分数漂移、跨批次不可比、长度偏置)就都顺理成章了。

最小实现(改写自 _src/code/reward_models/train_preference_rm.py):

import torch
import torch.nn.functional as F

class PreferenceRewardModel(torch.nn.Module):
    def __init__(self, backbone, hidden_size):
        super().__init__()
        self.backbone = backbone                    # 通常用 SFT 后的模型初始化
        self.head = torch.nn.Linear(hidden_size, 1) # 标量奖励头

    def get_reward(self, input_ids, attention_mask):
        # hidden: (B, L, H)
        hidden = self.backbone(input_ids, attention_mask=attention_mask).last_hidden_state
        # 取每条序列最后一个非 padding 位置的隐状态
        seq_lengths = attention_mask.sum(dim=1) - 1          # (B,)
        idx = torch.arange(hidden.size(0), device=hidden.device)
        last_hidden = hidden[idx, seq_lengths]               # (B, H)
        return self.head(last_hidden).squeeze(-1)            # (B,)

    def forward(self, chosen_ids, chosen_mask, rejected_ids, rejected_mask):
        r_chosen   = self.get_reward(chosen_ids, chosen_mask)      # (B,)
        r_rejected = self.get_reward(rejected_ids, rejected_mask)  # (B,)
        # Bradley-Terry: -log sigmoid(r_w - r_l)
        loss = -F.logsigmoid(r_chosen - r_rejected).mean()
        return loss, r_chosen, r_rejected

整个奖励模型的核心就是最后那一行。logsigmoid 而不是 log(sigmoid(...)) 是数值稳定性考虑。第 5 章会展开处理长度归一化、margin、多头 RM 等变体。

第 3 步:用 RL 优化这个奖励

有了问答模型和奖励模型,就可以真正做 RLHF 了。循环是:从数据集采一批提示词 $x_i$ → 用当前策略生成回答 $y_i\sim\pi_\theta(\cdot\mid x_i)$ → 用 RM 打分 $r_\phi(x_i,y_i)$ → 加上 KL 惩罚 → 用策略梯度算法(InstructGPT 和 ChatGPT 用的是 PPO)更新参数。

$$ J(\pi)=\E_{x\sim\mathcal{D},\ y\sim\pi(\cdot\mid x)}\underbrace{\big[r_\phi(x,y)\big]}_{\text{最大化奖励}}-\underbrace{\beta\,\KL\!\left(\pi(\cdot\mid x)\,\|\,\pi_{\text{ref}}(\cdot\mid x)\right)}_{\text{但别改动太大}} $$

$\pi_{\text{ref}}$ 是参考模型,通常就是冻结的 SFT 模型;$\beta$ 控制「改进行为」与「守住已有能力」之间的权衡。对离散输出,$\KL(\pi\|\pi_{\text{ref}})=\E_{y\sim\pi}[\log\pi(y\mid x)-\log\pi_{\text{ref}}(y\mid x)]$——注意它就是你在 rollout 里已经算出来的两组 log 概率之差,实现上几乎是免费的。

RLHF 训练回路的完整示意图
一次 RLHF 迭代里数据怎么流动:提示词 $x$ 进入被训练的策略模型,采样出回答 $y$;$y$ 同时走两条路——右边送进奖励模型拿到 $r_\theta(y\mid x)$,左边送进参数冻结的初始模型算 log 概率,与策略自己的 log 概率相减得到 KL 惩罚项。两者相加构成最终的每条 rollout 的奖励,再由 PPO 之类的算法转成参数更新。图中左侧「Parameters Frozen」的星号很关键:参考模型不训练,但它必须常驻显存,这是 RLHF 显存开销高于 SFT 的主要原因之一。

RL 的基本原语是:给定「哪些动作是好的」的信号(这里动作就是模型生成的 token),推导出把不同动作归因到不同参数上的更新规则。最后这一步把好 token 的概率抬高,并且是迭代地做,以保持初始模型的通用能力。当性能饱和,这个模型通常就是最终交付给用户的模型。

配方的量级在怎么变

InstructGPT (2022)Tülu 3 (2024)DeepSeek R1 (2025)
指令数据约 10K约 1M100K+
偏好数据约 100K约 1Mon-policy 生成
RL 阶段约 100K 提示词约 10K(RLVR)以 RLVR 为主

总体趋势是各阶段算力都在涨,但重心正在向 RLVR 迁移。注意 Tülu 3 的 RLVR 只用了约 10K 提示词却效果显著——RL 阶段的提示词质量远比数量重要,这一点和 SFT 的数据规模逻辑完全不同。

6. 同一个目标的三条路

第 5 节讲的是「用 PPO 优化奖励模型」这一条路。但 RLHF 的目标函数并不规定你必须用在线 RL 去解它。实践中有三条主流路线,它们优化的是同一个底层目标,区别在于怎么把策略推向高奖励区域。

路线一:拒绝采样(rejection sampling)

最简单的偏好优化方法,也是最容易被低估的。四步:

  1. 生成:对每个提示词从当前模型采 $N$ 条回答;
  2. 打分:每条过一遍奖励模型 $r_\phi(x,y)$;
  3. 筛选:留下分数最高的一条(或若干条);
  4. 微调:在这个筛过的集合上跑标准 SFT 损失。
$$ \mathcal{L}_{\text{RS}}=\mathcal{L}_{\text{SFT}}\!\left(\theta;\ \{(x_i,y_i^\star)\}\right),\qquad y_i^\star=y_{i,\ \argmax_j r_\phi(x_i,y_{i,j})} $$

它简单、稳定、几乎不会训崩,而且用的还是你已经调好的 SFT 代码路径。Llama 2 和 DeepSeek R1 的配方里都包含拒绝采样阶段。第 9 章会详细讲。

路线二:在线 RL(PPO / GRPO 等)

就是第 5 节那条路:每一步都从当前策略采样、打分、更新。数据完全 on-policy,能持续针对模型当下的弱点做修正,因此上限最高——但工程复杂度也最高:要同时在显存里放策略模型、参考模型、奖励模型(PPO 还要加价值模型),要处理生成与训练的调度,要调一堆超参。

路线三:直接对齐算法(DPO 及其后继)

DPO(Direct Preference Optimization)的思路是:既然我们知道 KL 正则化奖励最大化问题的最优解 $\pi^\star$ 有闭式形式,那就把奖励模型解出来代回偏好似然,从而在偏好数据上直接做梯度下降,跳过显式的奖励模型和采样循环:

$$ \mathcal{L}_{\text{DPO}}(\theta)=-\log\sigma\!\left(\beta\log\frac{\pi_\theta(y_w\mid x)}{\pi_{\text{ref}}(y_w\mid x)}-\beta\log\frac{\pi_\theta(y_l\mid x)}{\pi_{\text{ref}}(y_l\mid x)}\right) $$

把它和第 5 节的 $\mathcal{L}_{\text{RM}}$ 并排看,形状完全一样:都是 $-\log\sigma(\Delta)$,只不过 $\Delta$ 里的打分函数从「独立的 RM」换成了「策略与参考模型的对数概率比」。换句话说,DPO 训练的是一个隐式奖励模型,而这个奖励模型就是策略本身。第 8 章会完整推导。

Lambert 的判断:DPO 到底值不值
  • 「DPO 实现简单得多、跑起来便宜得多,能拿到最终性能的 80% 甚至更多。我用它训了 Zephyr-Beta、Tülu 2/3、Olmo 2/3 等一系列模型。」
  • DPO 论文 2023 年 5 月就挂出来了,但直到当年秋天都没有任何有影响力的模型是用它训出来的。转折点是一批突破性模型的出现——而它们全都依赖同一个发现:学习率要调得更低。Zephyr-Beta 和 Tülu 2 之后,DPO 时代才算真正开始。Chris Manning 曾当面感谢 Lambert「拯救了 DPO」。
  • 这个故事的教训不是「DPO 很棒」,而是:一个算法能不能用,常常取决于一个没写在论文里的超参。开源社区花了将近半年才找到它。读论文时要对「复现失败」保持怀疑——失败的可能是你的学习率,不是这个方法。

三条路的对照

拒绝采样在线 RL(PPO/GRPO)DPO
机制先筛,再 SFT生成 → 打分 → 更新策略在偏好对上直接求梯度
奖励模型需要需要隐式(无独立 RM)
on-policy 数据是(从当前模型生成)是(每步都生成)否(固定偏好数据集)
实现复杂度低高低
显存驻留模型数2(策略 + RM,可分离)3–42(策略 + 参考)
注意:哪条路最好,没有定论

关于哪种方法最终性能最高,学界争论很多。一般而言在线 RL 胜出,但证据是混杂的(mixed)。这不是模糊其辞——不同论文的结论确实相互矛盾,因为 RLHF 结果对数据、基座模型、评测集都极其敏感。这正是本书反复强调的方法论:在每个主题上读多篇论文,不要把任何单一结果当定论。

7. 代理目标的宿命:过优化

RLHF 的灵活性带来一个绕不开的实现难题:如何控制优化。而所有控制问题的根源只有一句话:奖励模型是代理(proxy),不是真值。

即使一个训得很好的 RM,它与真实用户满意度之间也只是相关关系。而 RL 优化器的工作就是把这个相关性榨到极致——它会毫不留情地找到「RM 分数高但真实质量低」的那部分区域。这就是古德哈特定律(Goodhart's Law):「当一个度量变成目标,它就不再是好的度量。」

过优化在实践中长什么样

现象表现为什么会发生
奖励攻击(reward hacking)RM 分数持续上升,人工评测的实际质量在下降策略找到了 RM 的分布外区域,那里 RM 的外推不可靠
冗长偏置(verbosity bias)回答越训越长,信息密度反而下降标注数据中长回答略微更常胜出,RM 把「长」学成了「好」的特征
谄媚(sycophancy)模型顺着用户说,牺牲准确性标注员倾向于给「同意自己」的回答打高分
过度拒答(over-refusal)拒绝完全正当的问题,比如「怎么 kill 一个 linux 进程」安全偏好数据把表层词汇特征当成了危险信号

长度偏置尤其顽固,专门有一批工作研究它(Singhal 等人 2023 关于 RLHF 中的长度相关性;Park 等人 2024 关于在 DPO 里把长度从质量中解耦)。如果你在自己的实验里看到「训完之后平均回答长度翻倍、评分也涨了」,第一反应应该是怀疑评测器,而不是庆祝。

推导:KL 惩罚为什么是主要防线

回到目标函数 $J(\pi)=\E_{y\sim\pi}[r_\phi(x,y)]-\beta\KL(\pi\|\pi_{\text{ref}})$。对固定 $x$,在无约束的分布空间上解这个变分问题,最优解有闭式:

$$ \pi^\star(y\mid x)=\frac{1}{Z(x)}\,\pi_{\text{ref}}(y\mid x)\,\exp\!\left(\tfrac{1}{\beta}r_\phi(x,y)\right) $$

其中 $Z(x)=\sum_y \pi_{\text{ref}}(y\mid x)\exp(r_\phi(x,y)/\beta)$ 是归一化常数(配分函数)。这个式子说明两件事:

  • 最优策略是参考模型的指数倾斜(exponential tilting)——$\pi_{\text{ref}}$ 给概率为零的回答,$\pi^\star$ 也给零。RLHF 只能重新分配已有的概率质量,无法凭空创造新行为。这是第 4.3 节那个「不能跳过 SFT」结论的严格版本。
  • $\beta\to 0$ 时,$\exp(r/\beta)$ 退化成在 $\argmax_y r_\phi$ 上的点质量——策略坍缩到「RM 最爱的那一条回答」,也就是彻底的奖励攻击。$\beta\to\infty$ 时 $\pi^\star\to\pi_{\text{ref}}$,什么也没学到。$\beta$ 就是你在「学到东西」和「学歪」之间画的那条线。

顺带说明:这个闭式解正是 DPO 推导的起点——把上式对 $r_\phi$ 反解,代入 Bradley–Terry 似然,$Z(x)$ 在成对相减时消掉,就得到第 6 节的 $\mathcal{L}_{\text{DPO}}$。

实践含义

KL 惩罚是主要防线,但它只是「限制策略能漂多远」,并不能修复奖励模型本身的缺陷。过优化是所有基于偏好的训练中一个根本性的张力,不是一个可以调好参数就消失的 bug。工程上你需要:

  • 把 KL 散度当作一等公民监控指标,和奖励曲线画在一起看。奖励涨但 KL 也在飞涨,通常意味着在攻击 RM。
  • 准备一套 RM 之外的评测(人工评测、LLM-as-a-judge、能力基准),因为你不能用被优化的那个指标来验收优化结果。
  • 接受「训到某个点就该停」这个事实。RLHF 没有「训得越久越好」这回事。

第 14 章专门讲过优化的定性观察和为什么它不可避免,第 15 章讲各种正则化工具。这两章是把 RLHF 从「论文能跑」做到「产品能上」的关键。

8. 后训练的直觉:激发理论 vs 肤浅对齐假说

前面讲了 RLHF 做什么,这一节回答更本质的问题:为什么在一个已经训好的基座模型上,还能刷出这么多性能?

F1 底盘类比

Lambert 把这个直觉称为后训练的激发解释(elicitation interpretation):我们做的全部事情,就是把基座模型里已经存在的有价值行为放大出来。

类比一级方程式赛车。每支车队每年拿到新底盘和新引擎,然后整整一年都在改空气动力学和各种子系统——赛季中的性能提升幅度,往往大于换一代底盘带来的提升。最好的车队在一个赛季内能榨出惊人的性能差距。

后训练也是这样:面对一个静止不动的基座模型,随着你越了解它的脾气和倾向,你能从它身上榨出的性能就越多。这里的「后训练」包含预训练末尾及之后的一切——中训练(mid-training,即退火阶段和高质量收尾数据)、指令微调、偏好微调、RLVR 等等。

核心结论

基座模型决定天花板,后训练的工作是把天花板够到。基座模型里潜藏的智能远超早期后训练配方所能暴露的部分;难点在于既要把模型从「下一 token 预测」重塑成「对话式问答」,又要在这个过程中把预训练学到的知识和智能完整地提取出来。

一个干净的实证:Ai2 的全开源小型 MoE 模型 OLMoE Instruct,第二版只改了后训练、预训练部分基本没动,热门基准的平均分就从 38.44(OLMoE-1B-7B-0924-Instruct,2024 年 9 月)涨到 45.62(OLMoE-1B-7B-0125-Instruct,2025 年 1 月)。书中正文把这组数字概括为「从 35 涨到 48」,量级是一致的:同一个基座,只换后训练配方,绝对分数涨 7–13 个点。

反过来看也成立。OpenAI 2025 年 2 月发布的 GPT-4.5 作为消费级产品基本算失败——基座太大,没法服务上百万用户。但从激发理论的视角,它是一个远比之前更有活力、更值得在其上做后训练的底盘。

肤浅对齐假说,以及它错在哪

与激发理论相关但结论不同的,是 LIMA 论文(Less is More for Alignment, 2023)提出的肤浅对齐假说:

模型的知识与能力几乎全部在预训练中学到,而对齐只是教它在与用户交互时该用哪个子分布的格式。如果这个假说成立,且对齐主要是学风格,那么一个推论就是:用相当少的样本就足以调好一个预训练模型。

Lambert 的评价是:这篇论文抓对了一些重要直觉,但在大图景上是因为错误的理由而正确的。拆开说:

  • 对的部分:几千条指令微调样本确实能大幅改变一个模型,并在一批窄评测上(AlpacaEval、MT-Bench、Chatbot Arena 之类)显著提分。这对新模型的短期适配非常重要。
  • 错的部分:深度学习的全部成功史都在告诉你「数据规模对性能至关重要」。作者讨论的是对齐与风格——那是当时学术界后训练关注的全部范围——这些窄评测的提升并不总能迁移到更困难的能力上。这也是为什么 Meta 不会只用这样一个数据集去训 Llama Chat。
  • 被证伪的部分:换了数据,影响可以远远不止「肤浅」。今天的基座模型(完全没有后训练)可以直接用 RL 在数学题上训练,学会输出完整的思维链,然后在 BigBenchHard、Zebra Logic、AIME 等一整套推理评测上提分。这不是格式的重新选择。
Lambert 的判断

「肤浅对齐假说站不住脚,和那些认为『RLHF 和后训练只是调调氛围(vibes)』的人错得一样。这是整个领域在 2023 年必须翻过去的一课,尽管到今天仍有不少 AI 观察者停留在这个认知上。」

补充一句同样重要的观察:模型的风格是运行在行为之上的——比如现在流行的长思维链,它既是行为也是风格。当后训练进入智能体和推理模型的时代,肤浅对齐假说会进一步瓦解。有意思的是,三年后(2026)一篇《用任务复杂度操作化肤浅对齐假说》的论文,反而给出了与激发理论相符的更细致刻画。

可验证奖励与算力规模:激发理论的边界

RLVR 系统结构图
RLVR 把 RLHF 回路里的「学出来的奖励模型」换成了一个确定性验证器:数学题对答案,代码跑测试,对就给 $\gamma$,错就给 0。整个回路的其余部分——采样、打分、策略梯度更新——和 RLHF 完全一样。关键差别在于奖励不再是代理目标,因此不存在第 7 节意义上的过优化,可以放心地往上堆算力。

这正是激发理论开始遇到边界的地方。自 Tülu 3(2024 年秋)提出 RLVR 这个名字以来,后训练消耗的算力急剧增长:

  • DeepSeek R1:RL 训练用了约 147K H800 GPU 小时,而其底座 DeepSeek V3 的预训练是 2.8M GPU 小时——后训练只占总算力的约 5%,却带来了推理能力的质变。
  • 单次消融实验:2026 年研究 RL 规模化的工作显示,一次消融跑就要 10K–100K GPU 小时。这个量级相当于 Olmo 3.1 Think 32B(2025 年 11 月发布)整个 RL 阶段的算力——200 余张 GPU 连续跑 4 周(讲座给出的具体数字是 28 天、224 卡)。而且性能在整个训练过程中提升得非常稳定,被迫停止时曲线还在往上走。

OpenAI 的 o1 揭示了一个双向的规模化图景:推理时算力(生成的 token 数)与性能呈对数线性关系,训练时 RL 算力与性能同样呈对数线性关系。核心问题因此变成:扩大 RL 训练规模,究竟只是从基座里激发出更多东西,还是真的在教会模型新能力?

注意

激发理论很可能只在轻量后训练配方下成立——那种用来把模型特化到某个领域的配方。对于算力密集的前沿模型,RL 阶段的规模已经大到让「只是激发」这个说法站不住。2026 年的大规模后训练科学还处在非常早期的阶段,正在把预训练积累的规模化方法论搬到这个新领域里,所以上面这些 GPU 小时数还会继续变;但「后训练算力占比持续上升」这个趋势不会变。

9. 我们是怎么走到这里的

为什么这本书是在此刻写出来的?ChatGPT 之后,后训练这门手艺经历了好几个季节,每个季节的共识都不一样,而且经常是错的。了解这段历史能帮你判断手上论文的结论有多少还成立。

RLHF 发展时间线
RLHF 的三个时代。偏好上的 RL(2008–2018):TAMER、Christiano 等人,做的是控制问题。语言模型上的早期 RLHF(2019–2022):Ziegler、Learning to Summarize、InstructGPT,方法逐渐成型但只在少数实验室内部。ChatGPT 时代(2023–):ChatGPT、Constitutional AI、Llama 2、DPO 密集出现在 2023 年一年内,随后是 o1(2024)与 DeepSeek R1(2025)。注意 2008 到 2017 之间那段折线——中间将近十年几乎没有进展,这个领域是被深度 RL 和大模型两波浪潮先后唤醒的。

阶段一(2023):Alpaca 时代与「氛围评测」

Alpaca、Vicuna、Koala、Dolly 的时代:用少量人类数据加上 Self-Instruct 风格的合成数据,微调原版 LLaMA,就能做出和 ChatGPT 神似的行为。当时的评测标准完全是「氛围」加人工评测——大家被小模型也能有这种跨领域表现震住了,这份兴奋是合理的。

这个阶段开源后训练比闭源跑得更快、发得更多、声音更大。各家公司在手忙脚乱地追赶(DeepMind 与 Google Brain 的合并就发生在这个窗口),需要时间才跟上。开源配方领先与落后是周期性交替的,这个模式在后面几年不断重演。

阶段二(2023 中–2024):怀疑期与 DPO 的崛起

Alpaca 之后开源配方第一次掉队,那个阶段的主旋律是对 RLHF 的怀疑——尽管 OpenAI 明确说 RLHF 是第一版 ChatGPT 成功的关键。很多公司认为自己不需要做 RLHF。一句话在当时极其流行:「指令微调足以完成对齐」(instruction tuning is enough for alignment)。这句话直到今天仍有影响力,尽管反证已经非常明显。

Lambert 的判断

这份怀疑之所以持久,主要是钱的问题:偏好数据的预算在 10 万到 100 万美元量级,开源团队根本负担不起,于是把「做不起」合理化成了「不需要做」。早期就投入 RLHF 的公司最后赢了——Anthropic 在 2022 年就发表了大量 RLHF 研究(A General Language Assistant、HH、Constitutional AI),今天它的后训练可以说是业界最好的。开源团队苦于无法复现、甚至不知道闭源的基本技巧,这个鸿沟是贯穿全书的一条暗线。

开源对齐方法上的第一次转向来自 DPO:它证明了你可以用更少的活动部件解同一个优化问题——直接在成对偏好数据上做梯度步。如第 6 节所述,真正让 DPO 落地的是「更低的学习率」这个发现,Zephyr-Beta 和 Tülu 2 之后,偏好微调从 2023 年底开始成为「发一个好模型的入场券」。

DPO 时代贯穿 2024 年,表现形式是层出不穷的算法变体,但开源配方其实陷入了又一次停滞:知识和资源都被榨干了。Zephyr 和 Tülu 2 发布一年之后,同一个突破性数据集 UltraFeedback 在开源偏好微调里仍然可以说是最优选择——这本身就说明数据侧几乎没有前进。

与此同时,Llama 3.1 和 Nemotron 4 340B 的技术报告给出了实质性的暗示:大规模后训练要复杂和有效得多。闭源实验室做的是完整后训练——指令微调、RLHF、提示词设计等构成的大型多阶段流程——而学术论文只是在挠表皮。Tülu 3 就是为了给未来的学术后训练研究打地基而做的一次全面开放努力。

阶段三(2025):RLVR 与复杂配方

Tülu 3、Olmo 3、Nemotron 3、DeepSeek R1 的一年。创新主战场转移到可验证奖励强化学习、推理训练及相关方向。这些新方法大量建立在 RLHF 的基础设施和思想之上,但演化速度快得多。

阶段四(2026):智能体训练与多轮 RL

后训练与 RLHF 的变化速度可能是史上最快的。语言模型正在变成「原生会用工具」的东西——今天讨论一个模型,讨论的是工具、脚手架(harness,即你怎么告诉模型使用这些工具)以及远不止权重的一整套系统。RLHF 与人类偏好并没有消失,但它们的演化慢下来了,也离开了行业注意力的中心。

这本书为什么在此刻写

正因为 RLHF 已经度过了最初剧烈变动的时期,它的文献第一次稳定下来了——技术、问题、权衡都被反复验证过。这本书要捕捉的就是这批稳定下来的知识。而 RLVR、推理训练这些还在高速变化的部分,本书讲它们的结构,不追它们的数字。

10. 全书路线图

这本书希望覆盖标准 RLHF 实现的每一个核心步骤。它不试图讲全每个组件的历史,也不追最新研究方法,只讲那些被反复验证过的技术、问题和权衡。

四个板块,十七章

板块章这一章要解决的问题
引入
全书通用的参考与背景
1. 导论RLHF 是什么、在后训练里的位置、为什么有效(本章)
2. RLHF 简史历史上的关键模型与论文,技术脉络怎么来的
3. 训练总览RLHF 的训练目标是怎么设计出来的,以及理解它需要的基本工具
核心训练流程
把模型对齐到人类偏好的整套技术
4. 指令微调怎么把语言模型适配到问答格式
5. 奖励建模从偏好数据训练奖励模型,作为 RL 的优化目标(或用于数据筛选)
6. 强化学习优化奖励模型(及其他信号)用到的核心 RL 技术。全书最长的一章
7. 推理与推理时扩展新的 RL 训练方法在推理时扩展上扮演什么角色
8. 直接对齐算法DPO 及其后继:跳过奖励模型,直接从成对偏好数据优化 RLHF 目标
9. 拒绝采样用奖励模型 + 指令微调做对齐的最基础技术
数据与偏好
驱动 RLHF 的数据与它真正要解决的大问题
10. 偏好的本质为什么需要人类偏好数据,以及该怎么理解它
11. 偏好数据偏好数据具体是怎么采集的
12. 合成数据从人类数据转向合成数据、AI 反馈怎么工作、蒸馏怎么用
13. 工具调用与函数调用训练模型在输出中调用函数或工具的基础
实践问题
实现与评估 RLHF 时的根本困难
14. 过优化RLHF 为什么会出错,以及软优化目标下过优化为何不可避免
15. 正则化把这些优化工具约束在参数空间有效区域内的手段
16. 评估评测(以及提示词)在语言模型中不断演变的角色
17. 塑造模型性格与产品各大实验室如何用 RLHF 把模型微妙地匹配到自家产品上

附录部分:A. 定义——RL、语言建模及本书用到的其他 ML 技术的数学定义(第 1 节讲的 MDP、KL、Bradley–Terry 都能在这里查到);B. 超越「只是风格」——风格在信息传递中扮演的关键角色,以及 RLHF 因此被严重低估的原因;C. 实践问题——延伸讨论与工程细节。

怎么读这本书

训练语言模型是一个极其复杂的过程,往往牵涉几十到上百人的技术团队、数据和算力成本达数百万美元。这本书有三个目的:把藏在大公司内部的前沿研究蒸馏成清晰的主题和权衡;让你能跑起最基础的代码示例、亲手微调模型;以及——超出技术本身——传递为什么 RLHF 对现代 AI 模型至关重要的直觉。

注意作者的自我限定

「一本能给出针对某个具体需求的精确 RLHF 配方的书是不可能存在的」——这正是为什么市场上有一整个价值数百万美元的行业在提供 RLHF 及相关训练服务。这本书提供的是做一次玩具实现或扎进文献所需的最小知识,它不是一本详尽的教科书。

由此推出的阅读方法论:每个主题都要读多篇论文,不要把任何单一结果当定论。RLHF 是一个不寻常的学术领域——已发表的结果往往噪声大,跨设置难以复现。书里给了大量学术风格的引用,就是为了让你顺着去读原文。

RLHF 的未来

随着语言建模投入的加大,传统 RLHF 方法衍生出了大量变体,「RLHF」这个词在口语里已经变成若干重叠方法的统称。准确的层级关系是:RLHF 是偏好微调(PreFT)的一个子集,PreFT 还包含直接对齐算法(第 8 章)这类不学中间奖励模型、直接在偏好数据上求梯度的方法;而 PreFT 又是后训练的一部分。

随着更多「用 RL 微调语言模型」的成功案例出现(比如 OpenAI 的 o1 系列),RLHF 会被视为一座桥梁——它让业界相信值得在大规模基座模型上继续投入 RL 方法。但作者最后强调的是另一件事:RLHF 的内核,是研究现代 AI 根本问题的一面透镜。怎么把人类价值观与目标的复杂性,映射进我们日常使用的系统里?这本书希望成为未来几十年围绕这个问题的研究与经验的起点。

本章小结

一句话速查

概念一句话展开于
RLHF 的存在理由目标可评价但难指定:能判断哪个更好,写不出「更好」的公式第 1 节
三步流水线SFT → 奖励模型 → 用 RL 优化奖励模型第 5 节 / 第 4、5、6 章
RLHF 目标函数$J(\pi)=\E[r_\phi(x,y)]-\beta\KL(\pi\|\pi_{\text{ref}})$,最大化奖励但别漂太远第 5、7 节 / 第 3 章
最优策略闭式解$\pi^\star\propto\pi_{\text{ref}}\exp(r_\phi/\beta)$,是参考模型的指数倾斜第 7 节 / 第 8 章
判别 > 生成学一个标量打分远比学一个 $|\mathcal{V}|^T$ 上的分布容易,这是 RLHF 的杠杆第 4.1 节
SFT vs RLHFper-token 模仿 / 只有正例 / off-policy 对比 per-response 对比 / 有负反馈 / on-policy第 4.2 节
后训练三件套SFT 学特征、PreFT 学风格与细微偏好、RLVR 提可验证能力第 3 节
三条优化路线拒绝采样(简单)、在线 RL(上限高)、DPO(便宜,约 80% 效果)第 6 节 / 第 6、8、9 章
过优化奖励模型是代理目标,古德哈特定律必然生效,只能约束不能消除第 7 节 / 第 14、15 章
激发理论基座模型定天花板,后训练负责够到它;但大规模 RL 正在突破这个框架第 8 节

要点清单

  • 看到「RLHF」时先确认说话人指的是狭义的三步配方、偏好微调这一整类,还是整个后训练。三者在 2023 年可以混用,今天不行。
  • 奖励模型只有相对分数有意义。跨模型、跨批次比较 RM 绝对分数是无效操作。
  • RLHF 无法凭空创造行为——$\pi_{\text{ref}}$ 概率为零的地方 $\pi^\star$ 也是零。所以强 SFT 起点是必需的。
  • 训练时把 KL 曲线和奖励曲线画在一起看;奖励涨、KL 飞涨 = 正在攻击奖励模型。
  • 看到「回答变长且分数变高」时先怀疑长度偏置,不要庆祝。
  • 复现某个算法失败时,先排查学习率——DPO 被开源社区雪藏半年就是因为这个。
  • RL 阶段的提示词质量远比数量重要:Tülu 3 的 RLVR 只用了约 10K 提示词。
  • 每个主题读多篇论文。RLHF 领域的单篇结果噪声很大、跨设置难复现。

动手实验

本章没有配套作业代码,但有两个 30 分钟内能跑完、能直接印证正文论点的小实验。

实验一:亲眼看见「续写机 → 助手」的转变

取同一系列的 base 与 instruct 两个检查点(例如 Qwen3-1.7B-Base 与 Qwen3-1.7B,或任意 Llama 系列的 Base/Instruct 对),喂同一个非疑问句形式的前缀:

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

PROMPT = "The president of the United States in 2006 was"

for model_id in ["Qwen/Qwen3-1.7B-Base", "Qwen/Qwen3-1.7B"]:
    tok = AutoTokenizer.from_pretrained(model_id)
    model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16).cuda()
    # base 模型直接喂裸文本;instruct 模型要套对话模板
    if model_id.endswith("Base"):
        text = PROMPT
    else:
        text = tok.apply_chat_template([{"role": "user", "content": PROMPT}],
                                       tokenize=False, add_generation_prompt=True)
    ids = tok(text, return_tensors="pt").to("cuda")
    out = model.generate(**ids, max_new_tokens=160, do_sample=False)
    print("=" * 20, model_id)
    print(tok.decode(out[0][ids["input_ids"].shape[1]:], skip_special_tokens=True))

能观察到什么:base 模型会继续补全成一段百科式文本,甚至带出日期条目、导航残留这类网页元数据,而且停不下来;instruct 模型会给一个完整句子的回答然后终止。再把 base 模型也套上对话模板试一次——它多半仍然收不住,说明「知道该停」这件事是后训练教的,不是模板本身的功劳。

进阶:对同一个提示词,用 base 模型采 $N=16$ 条(do_sample=True, temperature=1.0),人工挑出最好的一条。你会发现 16 条里往往真的有一条不错——这就是第 4.1 节说的「best-of-$N$ 红利」,也正是拒绝采样和 RLHF 要兑现的东西。

实验二:50 行看懂 Bradley–Terry 到底在学什么

不需要语言模型。用一个 2 维「回答特征」(比如 [有用性, 长度])和一个线性打分器,在合成偏好对上跑 BT 损失:

import torch, torch.nn.functional as F

torch.manual_seed(0)
# 真实偏好只由第 0 维(有用性)决定,第 1 维(长度)是干扰项
true_w = torch.tensor([1.0, 0.0])

def sample_pairs(n, length_confound=0.0):
    y_a, y_b = torch.rand(n, 2) * 2 - 1, torch.rand(n, 2) * 2 - 1
    # length_confound > 0 时,标注员给长回答一点额外偏爱(模拟长度偏置)
    score = lambda y: y @ true_w + length_confound * y[:, 1]
    win = (score(y_a) > score(y_b))
    chosen = torch.where(win.unsqueeze(1), y_a, y_b)
    rejected = torch.where(win.unsqueeze(1), y_b, y_a)
    return chosen, rejected

w = torch.zeros(2, requires_grad=True)          # 我们的「奖励模型」
opt = torch.optim.Adam([w], lr=0.05)
chosen, rejected = sample_pairs(4096, length_confound=0.6)

for step in range(400):
    loss = -F.logsigmoid(chosen @ w - rejected @ w).mean()   # Bradley-Terry
    opt.zero_grad(); loss.backward(); opt.step()

print("学到的权重:", w.detach())                 # 例如 tensor([2.9, 1.8])
print("准确率:", ((chosen @ w) > (rejected @ w)).float().mean().item())

能观察到什么:(1) length_confound=0 时第二维权重收敛到 ~0,模型正确地忽略了长度;(2) 把 length_confound 调到 0.6,第二维权重立刻变正——标注者的系统性偏置会被奖励模型忠实地学进去,这就是第 7 节冗长偏置的最小可复现版本;(3) 把 w 整体乘以 10 再算准确率,准确率不变——印证了「只有分数差有意义,绝对刻度无意义」。

延伸阅读

RLHF 的源头(先读这三篇)

早期 RLHF 在语言模型上的其他重要工作

方法演进

RLHF 的边界与批评

基础补课

  • Sutton & Barto, Reinforcement Learning: An Introduction — MDP、策略、价值函数的标准教材。本书附录 A 是它的极简版。
  • Sebastian Raschka, Build a Large Language Model (From Scratch) — 如果 log-softmax、completion mask、张量形状这些还不熟练,先补这本。
  • UC Berkeley CS285 / David Silver 的 UCL 课程 — 深度 RL 的两门经典公开课,第 6 章之前值得过一遍策略梯度部分。