Lecture 7 · 指令微调与对齐:从 FLAN、T0 到 RLHF 与 Constitutional AI · Instruction Tuning & Alignment

Advances in Foundation Models · Lecture 07。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

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

本篇目录

对应 Maps to:Stanford CS324 Winter 2023 Advances in Foundation Models。Syllabus 主题 “Adapting FMs to New Tasks and Data Domains” 里的三篇:Sanh et al. Multitask Prompted Training Enables Zero-Shot Task Generalization(T0,2021)、Wei et al. Finetuned Language Models Are Zero-Shot Learners(FLAN,2021)、Ouyang et al. Training Language Models to Follow Instructions with Human Feedback(InstructGPT,2022);主题 “Text and (Masked) Language Modeling FMs” 里的 OpenAI 博客 Aligning Language Models to Follow Instructions(2022)和 InstructGPT 论文。3/8 客座报告 Jared Kaplan(Anthropic;日历上没有公布题目)。 依据说明:课程网站没有提供 slides 或录像。§1–§4 依据上面的论文(OpenAI 博客页面我没能访问到,相关内容以 InstructGPT 论文为准),并补充了 Stiennon et al. 2020(Learning to Summarize from Human Feedback)和 Chung et al. 2022(Flan 2022)。Kaplan 的报告内容不可考,§7–§9 是依据他作为作者之一的四篇 Anthropic 公开论文重建的:Askell et al. 2021(A General Language Assistant as a Laboratory for Alignment)、Bai et al. 2022a(Training a Helpful and Harmless Assistant with RLHF)、Bai et al. 2022b(Constitutional AI)、Kadavath et al. 2022(Language Models (Mostly) Know What They Know);这四篇恰好是 2023 年初 Anthropic 对齐研究的主线,但我不能确定报告讲了其中哪些。§6 依据 Gao et al. 2022(Scaling Laws for Reward Model Overoptimization)。文献里的数字都是我在论文里读到的;§10”2023 年之后”是我补充的。 配套代码 Code:code/lecture07/(PyTorch + numpy;5 个脚本 + 1 个模块。第一次运行要微调并缓存小模型:代码 01 约 70 秒、02 约 95 秒、03 约 60 秒、04 约 40 秒、05 约 10 秒;之后读缓存,3–60 秒;请按 01 → 05 的顺序运行) 预计阅读时间:3.5 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 解释为什么预训练好的基础模型”不听话”:它在续写文档,不是在完成任务;并区分”知识在不在模型里”和”模型会不会按要求说出来”。
  2. 说清 T0 和 FLAN 的做法(把大量 NLP 数据集改写成指令模板、多任务微调、在整个没见过的任务类型上测 zero-shot),以及它们最重要的结论:指令微调对大模型有帮助、对小模型可能有害;模板越多样越稳健。
  3. 写出 RLHF 的三步:示范数据上的 SFT → 用 Bradley–Terry 从成对比较训练奖励模型 → 带 KL 惩罚的强化学习(PPO),并解释为什么需要 KL、什么是 PPO-ptx 和对齐税(alignment tax)。
  4. 推导 KL 约束下的最优策略 π∗∝πrefexp⁡(r/β)\pi^* \propto \pi_{\text{ref}} \exp(r/\beta),并从它出发理解 best-of-n 和 DPO。
  5. 复述 InstructGPT 的主要结果(13 亿参数的 InstructGPT 胜过 1750 亿的 GPT-3;真实性、有害性的变化)以及它没有解决的问题,包括”对齐到谁”。
  6. 解释奖励过度优化(reward overoptimization):为什么代理奖励一直上升、真实质量却先升后降;Gao et al. 的函数形式;奖励模型大小和数据量的作用;四类 Goodhart 效应。
  7. 概述 Anthropic 2021–2022 年的路线:HHH(有用、诚实、无害)、有用与无害的张力、偏好模型的规模定律、在线迭代 RLHF,以及 Constitutional AI(批评—修改的监督阶段 + AI 反馈的强化学习阶段)。
  8. 解释校准与 P(True)、P(IK):“模型知不知道自己知道”,以及对齐训练怎样影响它。
  9. 了解 2023 年之后的发展:DPO 家族、LIMA 的”表面对齐假说”、Llama 2 式配方、可验证奖励的强化学习与推理模型、讨好(sycophancy)、可扩展监督等开放问题。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面几讲再展开 Previewed only
第 1 讲:语言模型、提示与 few-shot、base model 与迷你世界;§3.4 的适配概览强化学习的完整理论(策略梯度、PPO 的推导)——这里只讲直觉
第 5 讲:提示敏感性、思维链、§1.2 的涌现表(指令微调的规模门槛)越狱、对抗提示与安全评测(第 17 讲);偏见与有害内容的度量(第 18 讲)
第 6 讲:微调与参数高效方法(本讲的 SFT 用的是全量微调)机制可解释性怎样帮助对齐(第 12 讲)
交叉熵、逻辑回归、KL 散度的定义

如果你学过本目录下的 CS329H(从人类偏好中学习),它的第 8、9 讲把 RLHF 和 DPO 推导得更细;CS336 第 15、16 讲从实现的角度讲 SFT、RLHF 和可验证奖励的强化学习。本讲自成一体,侧重”为什么”和 2021–2023 年的原始论文。

0.3 本讲地图 Map

§1  基础模型为什么"不听话":续写 vs 完成任务;"对齐"指什么;本讲路线        ← 代码 01
§2  多任务指令微调:T0、FLAN 的做法与结论;迷你实验;Flan 2022;对齐税       ← 代码 01
§3  RLHF:为什么要比较;SFT → 奖励模型(Bradley–Terry)→ 带 KL 的 RL;
    KL 约束的闭式解;PPO 的直觉;PPO-ptx
§4  InstructGPT:改进了什么、没改进什么、对齐到谁
§5  奖励模型学到了什么:标注噪声、数据量、预训练初始化、学来的偏差          ← 代码 02
§6  奖励过度优化:Goodhart;精确的"先升后降";best-of-n;自信地答错          ← 代码 03
§7  Anthropic 的路线(Kaplan 报告的背景):HHH、有用与无害、偏好模型与在线迭代
§8  Constitutional AI:批评—修改、AI 反馈;宪法执行了什么、漏掉了什么         ← 代码 04
§9  模型知道自己知道什么吗:校准、P(True)、P(IK)                             ← 代码 05
§10 2023 年之后:DPO 家族(含代码 03 演示 4)、LIMA、Llama 2、RLVR 与推理模型、讨好、开放问题
§11–15  小结、常见误区、练习、延伸阅读、下一讲预告

0.4 记号 Notation(只列本讲新增的,其余见第 1 讲 §0.4)

符号含义例子
xx,yy提示(prompt)与模型的回答(response)xx = 一条评论 + “rate it.”;yy = ” ok. i see.”
πθ(y∣x)\pi_\theta(y \mid x)策略(policy):把语言模型看成”给定提示、输出回答”的分布
πref\pi_{\text{ref}},πSFT\pi^{\text{SFT}}参考策略,通常是 SFT 之后的模型;KL 惩罚以它为基准
rϕ(x,y)r_\phi(x, y)奖励模型(reward model, RM)给出的标量分数偏好模型(preference model, PM)是 Anthropic 的叫法
yw≻yly_w \succ y_l一对比较:ywy_w(winner)被认为比 yly_l(loser)好
σ(z)=1/(1+e−z)\sigma(z) = 1/(1 + e^{-z})logistic / sigmoid 函数Bradley–Terry:P(yw≻yl)=σ(rw−rl)P(y_w \succ y_l) = \sigma(r_w - r_l)
β\betaKL 惩罚的系数InstructGPT 用 0.02
KL(π ∥ πref)\mathrm{KL}(\pi \,\|\, \pi_{\text{ref}})KL 散度 Ey∼π[log⁡π(y)/πref(y)]\mathbb{E}_{y \sim \pi}[\log \pi(y)/\pi_{\text{ref}}(y)],单位 nats
d=KLd = \sqrt{\mathrm{KL}}Gao et al. 画过度优化曲线用的横轴
gg,hh代码里的”真实质量”(gold)和”模拟标注员心里的分数”只在玩具世界里能写出来
best-of-n(BoN)从 πref\pi_{\text{ref}} 抽 nn 个回答,留下奖励最高的
ECE期望校准误差(expected calibration error)0 = 完美校准
P(True),P(IK)模型判断”我的答案是对的”的概率;“我知道这题的答案”的概率Kadavath et al. 2022

0.5 关于数字 · About the numbers

讲义里所有实验数字都来自 code/lecture07/ 的实际输出(固定种子、PyTorch 单线程,同一台机器上重复运行逐字相同;删掉缓存重新训练也逐字相同)。这一讲用到两个小世界:代码 01、05 直接在第 1 讲的 base model(约 11 万参数)上做指令微调;代码 02–04 用一个”能把所有回答列举出来”的评论打分助手世界,这样 RLHF 的最优解、best-of-n 的分布都能精确算出来,不需要采样。和前几讲一样,小模型演示的是机制,不是量级:每一处我都会说明哪些结论能推广到真实的大模型,并给出论文里的数字。好几处结果和我写代码前的预想不一样——最重要的是”指令微调没有解锁知识”(§2.5)、“纯 AI 标注的奖励模型学不会检查评分”(§8.3)和”DPO 把概率推到了数据之外”(§10.1)——讲义按实际结果来写,完整清单在代码 README 的”关于实验结果”里。


1. 基础模型为什么”不听话” · Why a base model doesn’t follow instructions

1.1 续写文档,而不是完成任务

先看 代码 01 演示 1 的一个例子。把”问城市”写成一条指令交给第 1 讲的 base model:

where does panar live? answer:      →   the stew was soggy and the ho…

它没有回答,而是开始写一条评论。原因很简单:base model 是在”迷你互联网”上用”预测下一个字符”训练的,它学到的是这种文本后面通常接什么。迷你互联网里从来没有 “answer:” 这种格式;离它最近的东西是评论(“review: … rating: …”),于是它就照着评论往下写。这不是 bug,而是语言模型的本性:它在续写文档,不是在完成任务。

GPT-3 也是一样,只是”文档”的范围大得多。比如”用几句话给 6 岁小孩解释登月”这样一句话,在网上常常出现在一串作业题或提示词列表里;一个只会续写的模型,很可能接着写出几道类似的题,而不是回答它。第 1 讲 §4.2 和第 5 讲 §6.1 讲的提示工程,本质上都是在把任务伪装成模型熟悉的文档:few-shot 示例、“Q: … A:” 格式、AMA 的”改写成开放式问题”。

代码 01 用两种评测协议给 base model 打分(5 个任务簇,每个簇 4 个指令模板):

任务簇候选数机会多数类rank classification贪心生成 exact match合法答案的比例用原生格式问(exact match)
问城市80.120.230.250.000.000.93(“X lives in”)
问职业80.120.230.150.000.000.63(“q: what does X do? a:”)
评论打分30.330.500.660.030.031.00(“review: … rating:”)
食物好吗20.500.530.470.000.00—(语料里没有这种问法)
店员好吗20.500.500.500.000.00—

三个发现:

  1. 它几乎从不回答:生成的东西里合法答案的比例是 0.00–0.03。
  2. **rank classification(把候选答案摆出来让它挑)**只在”评论打分”上明显高于多数类(0.66 vs 0.50);问城市 0.25 和多数类 0.23 差不多,其余在机会水平附近:用指令的写法问,连”挑答案”都挑不对。这是 T0 论文的评测方式(对每个选项算对数似然,选最大的);它只测”正确答案排第几”,不测模型会不会自己说出来。
  3. 知识其实在:用 base 最熟悉的原生格式问,城市 0.93、评分 1.00。同一个模型、同一批知识,换一种问法就从”答不出”变成”大多答对”。

这就是指令微调要解决的问题:让模型对各种写法的指令都按要求回答,而不需要用户去猜”什么格式能把知识套出来”。表格里同时放两种协议也是一个提醒(第 3 讲 §5 的教训):只看 rank classification 会以为 base 已经”会”了,只看 exact match 会以为它什么都不知道;后面所有模型都用同一个评测函数打这两种分。

1.2 “对齐”指的是什么

InstructGPT 论文把目标说得很直接:语言模型的训练目标(预测网页上的下一个 token)和”有帮助地、安全地遵循用户的指令”不是一回事,所以说这个目标是没对齐的(misaligned)。论文沿用 Askell et al. 2021 的说法,希望模型:

  • 有用(helpful):帮用户完成任务——既包括明说的意图(按指令做),也包括隐含的意图(不要编造、不要输出有害内容、指令不清楚时问清楚);
  • 诚实(honest):不编造信息、不误导用户;
  • 无害(harmless):不对人或社会造成伤害。

这三个词(HHH)是 Anthropic 提出的框架(§7.1)。值得注意的是”对齐”在这里的含义很工程化:它指的是”让模型的行为符合某些人的意图和偏好”。InstructGPT 论文专门有一节讨论”我们在对齐到谁”——标注员、写标注指南的研究者、提供提示的 API 用户,他们的偏好并不一定代表所有人(§4.3)。

1.3 本讲的路线:示范 → 比较 → 原则

2021–2022 年的对齐研究大致沿着”需要多少人类监督、以什么形式提供”这条线发展:

预训练的 base model(续写文档)
   │
   ├─ 多任务指令微调(T0、FLAN, 2021):把现成的 NLP 数据集改写成指令,做有监督微调          §2
   │      监督形式:大量现成的 (指令, 答案) 对
   │
   ├─ RLHF(Stiennon 2020 → InstructGPT 2022;Anthropic 2022)                                  §3–§7
   │      1. SFT:在标注员写的示范上微调               监督形式:示范(贵)
   │      2. 奖励模型:从"两个回答哪个更好"里学一个分数   监督形式:比较(便宜、更一致)
   │      3. 强化学习:最大化奖励,同时用 KL 拉住,别离 SFT 模型太远
   │
   └─ Constitutional AI / RLAIF(Anthropic, 2022):人写原则,AI 按原则给反馈               §8
          监督形式:一份自然语言的"宪法"

每往下一步,人类提供的监督就更”间接”一层:从写答案,到比较答案,到写下判断答案的原则。这条线在 2023 年之后继续延伸:DPO 去掉了显式的奖励模型,可验证奖励的强化学习在数学和代码上用规则直接打分(§10)。


2. 多任务指令微调:T0 与 FLAN · Multitask instruction tuning

2.1 想法:把数据集改写成指令

GPT-3 的 zero-shot 表现远不如 few-shot(第 1 讲 §4.1),一个直觉的解释是:zero-shot 提示的格式和预训练数据差得太远,模型不知道”现在要做什么”。2021 年秋天几乎同时出现的两篇论文给出了同一个办法:拿大量现成的、有标注的 NLP 数据集,把每个样本改写成”自然语言指令 + 答案”的形式,在上面做多任务微调。微调之后,模型对”指令”这种文体就熟悉了,再遇到一个新任务的指令,就可能直接照做。

  • FLAN(Wei et al. 2021,Finetuned Language Models Are Zero-Shot Learners):在一个 1370 亿参数的 decoder-only 模型(LaMDA-PT)上,用 62 个数据集做指令微调。数据集按任务类型分成 12 个簇(cluster,例如自然语言推理、阅读理解、情感分析、翻译……)。每个数据集手写 10 个模板,其中最多 3 个把任务”反过来”(例如情感分类数据集,反过来让模型”写一条正面的影评”)。
  • T0(Sanh et al. 2021,Multitask Prompted Training Enables Zero-Shot Task Generalization):在 110 亿参数的 encoder-decoder 模型(经过 LM 适配的 T5,T5+LM)上做同样的事。提示来自一个众包的提示库 P3(PromptSource):177 个数据集上共 2073 个提示,平均每个数据集 11.7 个;主模型 T0 用 39 个数据集训练,平均每个数据集 8.03 个提示。
原始样本(NLI):   premise = "A dog runs on the grass."  hypothesis = "An animal is outside."  label = entailment

模板 1:  Premise: A dog runs on the grass. Hypothesis: An animal is outside.
          Does the premise entail the hypothesis? Options: yes, it is not possible to tell, no      →  yes
模板 2:  A dog runs on the grass. Based on the paragraph above, can we conclude that
          "An animal is outside."?                                                                →  yes

(上面是示意,不是两篇论文的原文模板。)

2.2 “没见过的任务”怎么定义

指令微调要回答的问题是”能不能泛化到没见过的任务”。这里有一个容易被忽视的细节:如果训练里有情感分析数据集 A,测试用情感分析数据集 B,那 B 算不算”没见过”?两篇论文都选择了更严格的定义:

  • FLAN:留出整个任务簇。测试某个 NLI 数据集时,训练集里不能有任何 NLI 数据集;每个被留出的簇单独训练一个模型。
  • T0:留出 4 种任务类型——自然语言推理、指代消解、句子补全、词义消歧——共 11 个数据集,另外还测了 14 个 BIG-bench 任务。

这和第 2 讲的数据污染是同一种警惕:一个”没见过”的任务,如果和训练任务只是换了个数据集,模型可能只是在做”见过的事”。

2.3 结果

  • FLAN:zero-shot 的 FLAN 在 25 个数据集中的 20 个上超过了 zero-shot 的 GPT-3 1750 亿;在 ANLI、RTE、BoolQ、AI2-ARC、OpenbookQA、StoryCloze 上大幅超过 few-shot 的 GPT-3。消融实验:(1) 训练用的任务簇越多,留出簇上的平均表现越好,而且没有饱和的迹象;(2) 把指令去掉(只给输入和输出)或者只写数据集名字,效果都明显变差——训练时用自然语言指令本身很关键;(3) 对本来就像”语言建模”的任务(常识推理、写成句子补全的指代消解),指令几乎是多余的,FLAN 在 7 个这类任务里只有 3 个超过了没微调的模型。
  • T0:在 11 个留出数据集中的 9 个上追平或超过 GPT-3,而模型只有它的约 1/16。每个数据集用的提示越多,留出任务上的中位数越高(11 个数据集中的 8 个,加上”反过来”的提示后 9 个)、不同提示之间的波动越小(7 个,后来 8 个);训练数据集从 39 个增加到 49 个(T0+)、55 个(T0++),中位数继续上升,但波动不一定变小。

2.4 规模:小模型被伤害,大模型受益

FLAN 论文最常被引用的一张图是规模消融(第 5 讲 §1.2 的涌现表里也有这一行):在 4.22 亿、20 亿、80 亿、680 亿、1370 亿参数的模型上分别做指令微调,两个约 1000 亿参数的模型在留出任务上明显变好,80 亿及以下的模型反而变差。作者的解释是:对小模型,学习约 40 个训练任务就用光了它的容量,没有余力去泛化到新任务;大模型在学会这些任务之后还有容量去学”怎样遵循指令”。

T0 论文对这一点提出了不同意见:在他们的设置里,多任务提示训练对 30 亿参数的模型也有帮助。他们给出的可能原因是架构和预训练目标不同(encoder-decoder、先用 masked LM 预训练,第 3 讲 §4.4),以及他们的提示更多样(长度、写法差别更大),但把完整的验证留给了后续工作。这个分歧本身说明:指令微调的”规模门槛”不是一个常数,它取决于架构、预训练和指令数据的多样性——和第 5 讲 §1.2 对涌现门槛的结论一样。

2.5 迷你实验:在 base model 上做指令微调

代码 01 在第 1 讲的 base model 上做了一个缩小版的 FLAN / T0。5 个任务簇(问城市、问职业、评论打分、食物好吗、店员好吗),每个簇 4 个训练模板、2 个留出的说法;60 个人分成两半,指令微调数据只用其中 30 个”train 人物”的事实,另外 30 个”test 人物”只用来评测(他们的事实在预训练语料里,但 SFT 从没问过)。SFT 只在答案的位置算损失,学习率 3e-4、300 步、每步 32 题,约 6 秒。

任务簇base emSFT(种子 0) rc / em / 合法SFT(种子 1)SFT + ptx(种子 0)
问城市(test 人物)0.000.47 / 0.46 / 0.940.49 / 0.47 / 0.920.54 / 0.53 / 0.93
问职业(test 人物)0.000.38 / 0.36 / 0.930.38 / 0.34 / 0.930.41 / 0.39 / 0.89
评论打分0.031.00 / 1.00 / 1.001.00 / 1.00 / 1.001.00 / 1.00 / 1.00
食物好吗0.000.78 / 0.78 / 1.000.76 / 0.76 / 1.000.76 / 0.76 / 1.00
店员好吗0.000.81 / 0.81 / 1.000.78 / 0.78 / 1.000.85 / 0.85 / 1.00

格式一学就会。 300 步之后合法率从 ≈ 0 升到 0.89–1.00,模型会”按要求只说一个答案”了。食物好吗、店员好吗这两个标签 base model 从没见过,SFT 把它们学到了 0.76–0.85。

知识没有被”解锁”。 这是最出乎我意料的结果。同一个 SFT 模型,问 train 人物和 test 人物:

城市·train城市·test职业·train职业·test
SFT(种子 0)1.000.461.000.36
SFT(种子 1)1.000.470.990.34
SFT + ptx0.970.530.970.39

对 SFT 数据里出现过的人几乎全对,对没出现过的人只有 0.46——而 base model 用原生格式能答对 0.93。两个种子的差别(0.46 vs 0.47)远小于 train / test 的差距,所以这不是噪声。SFT 在很大程度上是在记住”这条指令 → 这个城市”,而不是学会”用预训练里的知识回答任何人的问题”。

这和 LIMA(§10.2)的表面对齐假说——知识和能力几乎全部来自预训练,对齐只是教模型用哪种格式和用户说话——在这个小模型上只对了一半:格式确实是一学就会的”表面”东西,但知识没有自动跟上。原因第 5 讲 §6.2 已经讲过:这个 11 万参数的模型,知识和”问法”绑在一起(“X lives in” 能问出来,问答格式就只能问出一部分)。在一个知识存储得更”格式无关”的大模型里,同样的 SFT 能把知识带到新的问法上——这正是 LIMA 用 1000 条示范就能做出好助手的前提。

2.6 留出一个任务簇、换一种说法

FLAN 式评测:在 4 个簇上微调,zero-shot 测第 5 个(每个被留出的簇单独训练一个模型):

留出的簇base rc / em / 合法没见过该簇 rc / em / 合法见过该簇 em没见过该簇时最常见的答案
问城市0.25 / 0.00 / 0.000.24 / 0.00 / 0.020.46singer ×25、farmer ×11、no ×11
问职业0.15 / 0.00 / 0.000.20 / 0.00 / 0.020.36yes ×37、quila ×19、telmi ×18
评论打分0.66 / 0.03 / 0.030.53 / 0.00 / 0.001.00yes ×70、no ×50
食物好吗0.47 / 0.00 / 0.000.50 / 0.50 / 1.000.78yes ×60、no ×60
店员好吗0.50 / 0.00 / 0.000.50 / 0.50 / 1.000.81yes ×64、no ×56

留出”问城市”时,模型回答职业名;留出”问职业”时,回答 yes 和城市名;留出”评论打分”时,全部回答 yes / no。它学会的是表面线索 → 答案类型:“人名 + 问号 → 训练里见过的那类人名问题的答案”,“评论 + 问号 → yes / no”。最有意思的是两个 yes / no 簇:留出”食物好吗”的模型,答案格式完全正确(合法率 1.00),准确率却正好是 0.50;代码检查了它的答案和”店员好不好”的真实标签——一致率 1.00。问食物,它回答的是店员;反过来也一样。格式迁移了,“读懂指令问的是哪个名词”一点也没有迁移。

这正是 FLAN 在 80 亿参数及以下看到的现象:指令微调伤害了没见过的任务(rc 从 base 的 0.66 降到 0.53)。在这个模型上还要加一条原因:它的预训练语料里从来没有”指令”这种文体,没有可以迁移的”理解指令”的能力。FLAN 的 1370 亿模型在网上见过无数的问题、说明和对话,指令微调只是把这种能力”调出来”。

T0 式评测:用 1 个模板 vs 4 个模板微调,测 2 个没见过的说法(例如 “{n} lives in which city?”、“{r} rating?”):

任务簇1 个模板:见过的说法 em没见过的说法 em / 合法4 个模板:见过的 em没见过的 em / 合法
问城市0.530.10 / 0.220.460.22 / 0.50
问职业0.400.15 / 0.750.360.08 / 0.52
评论打分1.000.50 / 0.531.000.25 / 0.25
食物好吗0.930.37 / 0.500.780.70 / 0.98
店员好吗0.970.38 / 0.500.810.77 / 0.97

换一种说法,准确率大幅下降,而且常常是”答错了类型”:4 个模板的模型看到 “{r} rating?” 这个问号结尾,就按”评论 + 问句 → yes / no”回答(0.25)。4 个模板平均 0.40、1 个模板 0.30,但不是每个簇都变好——食物、店员、城市变好,评论打分和职业变差,最差的簇也没有改善(0.08 vs 0.10)。T0 的结论在它自己的实验里也只在 11 个数据集中的 8 个(中位数)上成立;在这个小模型上只剩”平均变好”这个微弱的影子。另外,同样 300 步,4 个模板的模型在见过的说法上略差(城市 0.46 vs 0.53):每个模板分到的样本少了,多样性和”把一种说法学透”之间有取舍。

2.7 把指令微调做大:Flan 2022

一年后,Chung et al. 2022(Scaling Instruction-Finetuned Language Models,“Flan 2022”)把 FLAN 的路线推到极致:1836 个任务(来自 473 个数据集、146 个任务类别),由 Muffin(80 个任务)、T0-SF(193 个)、Natural Instructions v2(1554 个)和一个 9 个数据集的思维链(CoT)集合组成,在 T5(8000 万到 110 亿参数)和 PaLM(80 亿、620 亿、5400 亿)上微调。几个结论:

  • 有效,而且便宜:Flan-PaLM 5400 亿在一组评测上的归一化平均分比 PaLM 高 9.4 个百分点(58.5 vs 49.1);指令微调只用了预训练算力的约 0.2%。小模型也受益:Flan-T5-XL(30 亿参数)在 MMLU 上 52.4%,超过了 GPT-3 1750 亿的 43.9%。
  • 任务数的回报递减:大部分收益来自前 282 个任务,之后增加任务只带来较小的提升。
  • 思维链数据必不可少:只在非 CoT 数据上微调会损害模型的思维链推理(第 5 讲 §5);混进 9 个 CoT 数据集就能保住,还让模型能做 zero-shot CoT(“let’s think step-by-step”)。这是”对齐税”的一个具体例子:微调教会了一种格式,同时可能挤掉另一种能力,除非把那种能力也放进数据里。

2.8 SFT 的代价:对齐税与遗忘

代码 01 的最后一张表回答了一个实际问题:微调之后,base model 原来会的事还会吗?

“X lives in”(60 人)“review: … rating:”验证集 bit/字符
base model0.931.000.409
SFT(种子 0)0.420.231.067
SFT(种子 1)0.580.311.112
SFT + ptx(种子 0)0.871.000.414

纯 SFT 之后,base 最拿手的叙述句补全从 0.93 掉到 0.42–0.58,原生的评论打分从 1.00 掉到 0.23–0.31,验证集上的 bit/字符从 0.409 变成 1.07–1.11——为了新格式改写参数,模型忘掉了旧的用法。这叫灾难性遗忘(catastrophic forgetting);在对齐的语境里,“为了对齐而损失的能力”被 InstructGPT 称为对齐税(alignment tax)。

补救办法同样来自 InstructGPT(§3.7):每一步混入一点预训练数据,一边学新格式一边复习旧数据(ptx = pretraining mix)。代码里每步加一项系数为 1 的预训练损失,三项指标几乎全部回来(0.87、1.00、0.414),而且指令任务不降反升(城市 0.53、店员 0.85)——复习旧数据也保住了”人名 → 城市”这条通路。第 6 讲讨论的参数高效方法(LoRA 等)是另一条减少遗忘的路:只改动很少的参数。


3. RLHF:从人类比较中学习 · Learning from human feedback

3.1 为什么不止步于 SFT

既然 SFT 能教会格式,为什么还要强化学习?有三个理由。

  1. 示范贵,而且难写好。 让标注员为每个提示写出一个高质量的回答,成本高、速度慢;对开放式任务(写故事、解释概念),“最好的回答”本身就很难写。比较两个回答哪个更好则容易得多,也更一致。
  2. SFT 只能模仿示范员。 示范里的错误、习惯、风格都会被学过去(代码 02 的 π_ref 就是这样:示范员 80% 写对评分,SFT 策略在新评论上评分正确率 0.777)。比较提供的是”什么更好”的方向,模型有可能超过示范员。Stiennon et al. 2020 在摘要任务上的结果很说明问题:用人类反馈训练的 13 亿参数模型,被标注员认为比参考摘要(人写的)更好的比例是 61%;而 10 倍大的监督微调模型只有 43%。
  3. SFT 的损失只看”示范里出现的回答”,不管模型自己会生成什么。 模型生成的回答出错时(编造、啰嗦、有害),SFT 没有一个直接惩罚它的机制;奖励模型可以给模型自己的回答打分。

3.2 第一步:示范数据上的 SFT

InstructGPT 的数据来自 OpenAI API 的真实用户提示(加上标注员自己写的一部分),约 40 名经过筛选的合同标注员(通过 Upwork 和 Scale AI 雇用)。SFT 数据约 1.3 万个提示,每个由标注员写一个示范回答;在 GPT-3 上微调 16 个 epoch。值得注意的一个细节:他们按奖励模型的分数选 SFT 的检查点,而不是按验证集损失——验证集损失在第一个 epoch 之后就开始上升(过拟合),但多训练几个 epoch 对奖励模型分数和人工偏好仍有帮助。

3.3 第二步:奖励模型与 Bradley–Terry

数据:对每个提示,让模型生成 KK 个回答(K=4K = 4 到 9),标注员把它们排序。一个 KK 个回答的排序包含 (K2)\binom{K}{2} 对比较;InstructGPT 把同一个提示的所有比较放在一个 batch 元素里训练(而不是打散),他们发现打散会很快过拟合。奖励模型数据约 3.3 万个提示。

模型:奖励模型 rϕ(x,y)r_\phi(x, y) 是一个去掉”预测下一个 token”输出层、换成标量输出的语言模型。InstructGPT 用的是 60 亿参数的模型——1750 亿的奖励模型训练不稳定,也不适合当 RL 阶段的价值函数。

损失:用 Bradley–Terry 模型把”偏好”和”分数”联系起来。Bradley–Terry(1952)原本是给体育比赛排名用的:每个选手有一个实力分数,两人比赛时强者获胜的概率是 σ(实力差)\sigma(\text{实力差})。把回答当选手、奖励当实力:

P(yw≻yl∣x)=σ(rϕ(x,yw)−rϕ(x,yl)),L(ϕ)=−E(x,yw,yl)[log⁡σ(rϕ(x,yw)−rϕ(x,yl))].P(y_w \succ y_l \mid x) = \sigma\big(r_\phi(x, y_w) - r_\phi(x, y_l)\big), \qquad \mathcal{L}(\phi) = -\mathbb{E}_{(x, y_w, y_l)}\Big[\log \sigma\big(r_\phi(x, y_w) - r_\phi(x, y_l)\big)\Big].

这就是对”哪个回答赢”做逻辑回归,只是”特征”是一个神经网络算出的分数之差。几个要点:

  • 只有差值有意义:所有回答的奖励同时加一个常数,损失不变。InstructGPT 在训练后给奖励加了一个偏置,让标注员示范的平均分为 0。
  • 为什么要比较而不是直接打分:不同标注员的”7 分”含义不同,而”A 比 B 好”更一致;同一个标注员前后打分也会漂移,比较则相对稳定。
  • 天花板:标注员彼此之间并不总是一致。InstructGPT 报告训练标注员之间的一致率约 72.6%(±1.5%),留出的标注员约 77.3%;他们的奖励模型预测训练标注员偏好的准确率是 72.4%,预测留出标注员组的是 69.6%。看上去不高,其实已经接近天花板(§5.2)。

3.4 第三步:带 KL 惩罚的强化学习

有了奖励模型,就可以把语言模型当成一个策略:输入提示 xx、输出回答 yy、得到奖励 rϕ(x,y)r_\phi(x, y)。InstructGPT 的目标(不含 ptx 项时)是:

max⁡πθ Ex∼D, y∼πθ(⋅∣x)[rϕ(x,y)−βlog⁡πθ(y∣x)πSFT(y∣x)].\max_{\pi_\theta}\ \mathbb{E}_{x \sim \mathcal{D},\ y \sim \pi_\theta(\cdot \mid x)}\Big[ r_\phi(x, y) - \beta \log \frac{\pi_\theta(y \mid x)}{\pi^{\text{SFT}}(y \mid x)} \Big].

第二项对 yy 取期望之后就是 β⋅KL(πθ ∥ πSFT)\beta \cdot \mathrm{KL}(\pi_\theta \,\|\, \pi^{\text{SFT}}):策略离 SFT 模型越远,惩罚越大。InstructGPT 用 β=0.02\beta = 0.02,PPO 训练 25.6 万个 episode(约 3.1 万个不同的提示)。为什么一定要这个 KL 项?

  1. 奖励模型只在它见过的地方可靠。 奖励模型的训练数据是 SFT 模型(附近)生成的回答;策略一旦走到很远的地方(比如一直重复某个讨好的短语),奖励模型的分数就是在外推,可能错得离谱。Stiennon et al. 明确给出了这个理由。KL 惩罚把优化限制在奖励模型”还可信”的区域里——但它不能完全阻止过度优化(§6)。
  2. 防止坍缩。 只最大化奖励,最优策略是”永远输出奖励最高的那一个回答”,多样性全部丢失。KL 项起到熵奖励的作用(Stiennon et al. 的第二个理由)。
  3. 保住语言能力。 SFT 模型(以及背后的预训练模型)编码了大量关于”正常的语言”的知识;KL 让策略在提高奖励的同时继续说人话。

3.5 KL 约束问题的闭式解

上面的目标对每个提示 xx 可以单独看。把 πSFT\pi^{\text{SFT}} 记作 πref\pi_{\text{ref}},定义

π∗(y∣x)=1Z(x) πref(y∣x) exp⁡ ⁣(r(x,y)/β),Z(x)=∑yπref(y∣x) exp⁡ ⁣(r(x,y)/β).\pi^*(y \mid x) = \frac{1}{Z(x)}\, \pi_{\text{ref}}(y \mid x)\, \exp\!\big(r(x, y)/\beta\big), \qquad Z(x) = \sum_{y} \pi_{\text{ref}}(y \mid x)\, \exp\!\big(r(x, y)/\beta\big).

把目标改写一下:

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

βlog⁡Z\beta \log Z 和 π\pi 无关,KL 散度非负、当且仅当 π=π∗\pi = \pi^* 时为 0——所以最优策略就是 π∗\pi^*:把参考策略按 exp⁡(r/β)\exp(r/\beta) 重新加权。三个直觉:

  • β→∞\beta \to \infty:π∗=πref\pi^* = \pi_{\text{ref}},一点不动;β→0\beta \to 0:全部概率集中到奖励最高的回答上。β\beta 就是”愿意离参考策略多远”的旋钮。
  • 它像一个贝叶斯后验:先验是 πref\pi_{\text{ref}},“似然”是 exp⁡(r/β)\exp(r/\beta)(Korbak et al. 2022 用这个视角论证 KL 正则的 RL 更应该被理解成贝叶斯推断)。
  • 对真实的语言模型,Z(x)Z(x) 要对所有可能的回答求和,根本算不出来,也没法直接从 π∗\pi^* 采样——所以需要 PPO 这样的 RL 算法去近似它。但在一个回答能被列举的小世界里,π∗\pi^* 可以逐条精确计算:代码 03 就是这样做的,它让我们在没有任何 RL 噪声的情况下看清”优化代理奖励”本身会发生什么(§6)。这个闭式解也是 DPO 的出发点(§10.1)。

3.6 PPO 在做什么(直觉)

PPO(Proximal Policy Optimization,Schulman et al. 2017)是一种策略梯度算法。用一句话说:采样一批回答,让奖励高于预期的回答概率变大、低于预期的变小,并且每一步不要改太多。

  • 策略梯度:∇θEy∼πθ[R(y)]=Ey∼πθ[R(y) ∇θlog⁡πθ(y)]\nabla_\theta \mathbb{E}_{y \sim \pi_\theta}[R(y)] = \mathbb{E}_{y \sim \pi_\theta}[R(y)\, \nabla_\theta \log \pi_\theta(y)]。直觉:如果一个回答的奖励高,就沿着”增大它的对数概率”的方向走。
  • 优势(advantage):用”奖励减去一个基线”(价值函数估计的期望奖励)代替奖励本身,减小方差。InstructGPT 的价值函数从奖励模型初始化。
  • 逐 token 的 KL:实际实现里,KL 惩罚通常拆成每个 token 上的 −βlog⁡πθ(yt∣⋅)πref(yt∣⋅)-\beta \log \frac{\pi_\theta(y_t \mid \cdot)}{\pi_{\text{ref}}(y_t \mid \cdot)},奖励模型的分数只在最后一个 token 给出。
  • “近端”(proximal):用新旧策略的概率比 ρ=πnew/πold\rho = \pi_{\text{new}}/\pi_{\text{old}} 加权,并把 ρ\rho 裁剪在 [1−ϵ,1+ϵ][1 - \epsilon, 1 + \epsilon] 里,防止一次更新走得太远。

PPO 需要同时维护四个模型(策略、参考策略、奖励模型、价值函数),超参数多、训练不稳定,这是 2023 年之后 DPO 等方法流行的一个主要原因(§10.1)。

3.7 PPO-ptx 与对齐税

InstructGPT 发现,纯 PPO 训练之后,模型在若干公开 NLP 数据集上变差了:SQuAD、DROP、HellaSwag、WMT 2015 法英翻译。他们把这种”为了对齐付出的能力代价”叫做对齐税。增大 KL 系数不能解决问题:把 β\beta 调到 2.0(默认值的 100 倍),DROP 和 SQuAD 上的退步依然存在。有效的办法是在目标里加一项预训练数据上的对数似然:

objective(θ)=E(x,y)∼πθ[rϕ(x,y)−βlog⁡πθ(y∣x)πSFT(y∣x)]+γ Ex∼Dpretrain[log⁡πθ(x)],\text{objective}(\theta) = \mathbb{E}_{(x, y) \sim \pi_\theta}\Big[ r_\phi(x, y) - \beta \log \frac{\pi_\theta(y \mid x)}{\pi^{\text{SFT}}(y \mid x)} \Big] + \gamma\, \mathbb{E}_{x \sim \mathcal{D}_{\text{pretrain}}}\big[\log \pi_\theta(x)\big],

γ=27.8\gamma = 27.8。这就是 PPO-ptx;论文里”InstructGPT”指的就是 PPO-ptx 模型。它在不损害标注员偏好的前提下,把大部分退步拉了回来(DROP、SQuADv2 和翻译上仍落后于 GPT-3)。代码 01 的”SFT + ptx”是同一个想法在 SFT 阶段的版本(§2.8)。

为什么 KL 不够、ptx 有用?KL 约束的是策略在RL 提示上的输出分布,而 SQuAD、DROP 这类任务的输入根本不在 RL 提示的分布里——在那些输入上模型怎样变化,KL 项看不到;预训练数据则覆盖了几乎所有类型的文本。


4. InstructGPT:改进了什么,没改进什么 · What InstructGPT did and did not fix

4.1 主要结果

(数字都引自 Ouyang et al. 2022。)

  • 小模型胜过大模型:13 亿参数的 InstructGPT 比 1750 亿参数的 GPT-3 更受标注员偏爱,尽管参数少了 100 多倍。1750 亿的 InstructGPT 和 GPT-3 相比,被偏好的比例是 85 ± 3%;和精心写了 few-shot 提示的 GPT-3 相比是 71 ± 4%。没有参与训练数据标注的”留出标注员”,偏好比例和训练标注员差不多——模型没有只是迎合那 40 个人。
  • 更真实:在 TruthfulQA 上,给出”真实且有信息量”的回答的频率约是 GPT-3 的两倍;在需要忠于输入的”封闭域”任务(摘要、基于给定文本的问答)上,编造输入里没有的信息的比例从 41% 降到 21%。
  • 毒性略降:在被要求”礼貌回答”时,有害输出比 GPT-3 少约 25%;不加这句要求时,优势消失。
  • 偏见没有改善:在 Winogender、CrowS-Pairs 上和 GPT-3 没有显著差别。
  • 胜过 FLAN 和 T0:在 API 提示分布上,InstructGPT 被偏好于 FLAN、T0 的比例分别是 78 ± 4%、79 ± 4%。原因是数据分布:FLAN、T0 的训练数据是学术 NLP 任务(分类、问答),而 API 用户的请求大量是开放式生成和头脑风暴。
  • 泛化到训练分布之外:微调数据里几乎没有非英语和代码,InstructGPT 却能遵循其他语言的指令、回答关于代码的问题(虽然常常用英语回答)。
  • 便宜:训练 1750 亿的 SFT 模型用了 4.9 PF-days(petaflop/s-days),PPO-ptx 用了 60 PF-days;GPT-3 的预训练是 3640 PF-days。论文的结论是:对齐的成本相对预训练很小,而带来的”有用性”提升超过把模型放大 100 倍。

4.2 没有解决的问题

论文自己列得很清楚:模型”既没有完全对齐,也不是完全安全的”——仍然会编造、仍然会生成有害或有偏见的内容;会接受问题里的错误前提;对简单问题过度含糊其辞(hedging);指令里有多个明确约束(比如”用恰好 3 句话”)时表现变差。作者认为最大的局限是:模型会照着用户的指令做,即使这样做会造成现实中的伤害——因为他们在训练数据里优先考虑了对用户有用。“有用”和”无害”之间的张力,正是 Anthropic 那条线的核心问题(§7.2)。

4.3 对齐到谁

InstructGPT 论文用整整一节讨论这个问题。模型的行为被几方共同塑造:

  • 标注员:主要是住在美国或东南亚、说英语的合同工,彼此之间约 73% 的时候意见一致;
  • 研究者:写标注指南、在聊天室里回答标注员的疑问;
  • API 用户:训练提示来自他们,所以模型在隐含地对齐到”客户认为有价值的东西”——而客户和他们的最终用户也可能意见不一;早期的 API 用户还来自一个以 OpenAI 员工为种子的等候名单。

作者明确说,这不等于”对齐到人类的价值”。这个问题没有技术上的答案;Constitutional AI 的一个动机,就是把”对齐到什么”写成可以公开讨论的原则(§8.2)。


5. 奖励模型学到了什么 · What the reward model learns

5.1 一个能列举所有回答的小世界

为了看清奖励模型和 RL 优化的机制,代码 02 造了一个”评论打分助手”:提示是一条评论 + “rate it.”,回答由三部分组成——开头(无 / ” wow.” / ” yay.”)+ 评分(good / ok / bad)+ 0–3 句废话(” i see.” ” sure.” ” fun.”),一共 36 种。因为回答空间小,任何策略在这 36 种回答上的概率都能精确算出。我们还知道两样真实世界里不可能知道的东西:

  • 真实质量 gg:评分对 +2、错 −2;0 / 1 / 2 / 3 句废话分别 +0 / +0.5 / +0.25 / −0.5(一句补充有点用,越多越烦);热情开头 −0.5。最好的回答是”评分正确 + 1 句废话 + 无开头”,g=2.5g = 2.5。
  • 模拟标注员心里的分数 h=g+0.8×废话句数+0.8×[有热情开头]h = g + 0.8 \times \text{废话句数} + 0.8 \times [\text{有热情开头}]:标注员偏爱更长、更热情的回答。这个偏差是我故意设定的,对应真实世界里有据可查的两类偏差:Stiennon et al. 发现标注员的偏好里有一部分来自长度(控制长度之后,13 亿参数模型的优势缩小约 5 个百分点);Sharma et al. 2023 发现人类偏好数据偏爱附和用户的回答(§10.5)。

比较数据按 Bradley–Terry 产生:标注员以 σ(ha−hb)\sigma(h_a - h_b) 的概率选 aa。

回答真实质量 gg标注员分数 hhπref\pi_{\text{ref}} 概率(一条评论)
” ok.”+2.00+2.000.257
” ok. i see.”+2.50+3.300.175
” ok. i see. sure. fun.”+1.50+3.900.067
” wow. ok. i see.”+2.00+3.600.041
” wow. ok. i see. sure. fun.”+1.00+4.200.015
” wow. bad. i see. sure. fun.”(评分错)−3.00+0.200.002

参考策略 πref\pi_{\text{ref}} 是在 base model 上用”有噪声的示范”(80% 评分正确;废话 0/1/2/3 句的比例 0.4/0.3/0.2/0.1;开头 无/wow/yay = 0.8/0.15/0.05)做 300 步 SFT 得到的。在 200 条新评论上,它分给这 36 种回答的概率质量是 0.979,评分正确率 0.777,平均废话 1.02 句,wow 0.155、yay 0.043,期望真实质量 E[g]=1.154\mathbb{E}[g] = 1.154——它忠实地继承了示范员的一切,包括他们的错误。

5.2 标注噪声:准确率的天花板

两个偏好完全相同、只是各自随机的模拟标注员,在同样 2000 对回答上的一致率只有 0.748;任何奖励模型预测单个标注员的准确率上限(每对都猜 hh 更高的那个)是 0.823。InstructGPT 的标注员间一致率约 73%,和这里接近只是巧合,但意义相同:“72% 的准确率”可能已经接近完美,判断一个奖励模型好不好,要先知道标注本身有多少噪声。

5.3 数据量、初始化与预训练的作用

奖励模型是 TinyGPT 的主体 + 一个读最后一个字符的线性输出头,用 Bradley–Terry 损失训练 300 步(每步 32 对,学习率 1e-3)。测试用 200 条训练时没见过的新评论上的 2000 对回答:

初始化比较数 N训练种子预测标注符合真实质量评分对错
base model(预训练)10000.5970.6290.598
base model(预训练)30000.6020.5990.626
base model(预训练)100000.7650.7000.876
base model(预训练)300000.7200.5940.727
base model(预训练)300010.7700.6890.858
base model(预训练)300020.7720.6580.846
随机初始化300000.6720.5420.578

(“评分对错”:在一个评分对、一个评分错的回答对上,选中评分正确者的比例。)

  1. 数据量:从 100、300 条的 0.60–0.63 升到 1000 条以上的 0.73–0.88。但 1000 和 3000 之间看不出差别:同样 3000 条、只换抽 batch 的种子,“评分对错”在 0.727 和 0.858 之间晃动,比 1000 → 3000 的差别还大。在这个预算下(每个模型只训练 300 步),瓶颈已经是训练本身。这是第 5 讲提醒过的”种子彩票”:如果只跑一个种子,我会错误地得出”3000 条比 1000 条差”的结论。
  2. 预训练初始化:随机初始化的奖励模型,同样 3000 条数据,“评分对错”只有 0.578——它学会了”更长、更热情更好”这类表面特征(所以”预测标注”也有 0.672),却几乎学不会检查评分。判断评分对错要读懂评论,而这个能力来自预训练(base model 在预训练时已经学会了给评论打分,第 1 讲 §3.3)。这就是 InstructGPT、Stiennon et al. 都从语言模型初始化奖励模型的原因;Askell et al. 2021 还专门在 Stack Exchange、Reddit、维基百科编辑历史这类公开的”偏好”数据上做偏好模型预训练(PMP),发现它显著提高了后续微调的样本效率,对 10 亿参数以上的模型效果最明显。

真实系统的规模规律(文献):Stiennon et al. 训练了从 1.6 亿到 130 亿参数、8 千到 6.4 万条比较的奖励模型,数据翻倍,验证准确率提高约 1.1%;模型翻倍,约 1.8%。Bai et al. 2022a 发现偏好模型的准确率随模型大小和数据量都大致呈对数线性增长。Askell et al. 还比较了三种从偏好中学习的方式:模仿学习(只在好的回答上做 SFT)、二分类判别(判断一个回答好不好)和排序偏好建模——排序偏好建模明显更好,而且随模型变大提升得更多。

5.4 奖励模型学会了标注员的偏差

最有启发的是代码 02 演示 3:把奖励模型对每个特征打的分,和真实的 Δg\Delta g、标注员的 Δh\Delta h 放在一起(在 200 条评论上平均):

改动真实 Δg\Delta g标注员 Δh\Delta hRM 预训练 N=1000RM 预训练 N=3000 种子 0种子 1RM 随机 N=3000
评分 错 → 对+4.00+4.00+2.09+1.00+1.71+0.41
废话 0 → 1 句+0.50+1.30+1.34+0.98+1.11+0.97
废话 1 → 2 句−0.25+0.55+0.30+0.20+0.23+0.32
废话 2 → 3 句−0.75+0.05+0.03+0.09+0.00+0.19
加上 wow 开头−0.50+0.30−0.04+0.25+0.08+0.06
加上 yay 开头−0.50+0.30−0.05+0.12−0.01−0.09

Bradley–Terry 的分数在理想情况下会收敛到 hh(加一个常数),所以奖励模型的 Δ\Delta 应该和 Δh\Delta h 比:

  • 废话:每个预训练奖励模型都给”0 → 1 句”打了 +0.98 到 +1.34,和 Δh=1.30\Delta h = 1.30 一致,是真实价值的两倍多;“1 → 2 句”仍是正分,而真实质量在这里已经开始下降。奖励模型忠实地学会了标注员的偏差——它本来就是被训练去预测标注员的。
  • 评分对错:标注员的分差是 +4,奖励模型只给出 +1.00 到 +2.09:它对”评分对不对”的把握远不如标注员。
  • 热情开头:在示范里只占 20%(yay 只有 5%),比较数据里很少出现,奖励模型几乎没有证据,分数接近随便猜。

一句话:这个奖励模型 ≈ “标注员的偏差学全了、标注员的正确判断只学了一半”。下一节会看到,优化器会沿着奖励模型最确定的方向(写长)一路走下去,而在它不确定的地方(评分、热情开头)被带偏。


6. 奖励过度优化 · Reward overoptimization

6.1 Goodhart 定律

经济学家 Charles Goodhart 的观察常被概括成一句话:“一个指标一旦成为优化目标,就不再是好指标。” 奖励模型是”人类偏好”的一个代理(proxy)。轻度优化它,策略会朝人类真正喜欢的方向走;用力过猛,策略会找到奖励模型高估的地方——那里的回答奖励模型打分很高,人却不喜欢。

Stiennon et al. 2020 最早在 RLHF 里系统地观察到这一点(他们的图 5):对着奖励模型优化,起初摘要质量在标注员眼里确实提高了;继续优化下去,真实偏好开始下降,最终”奖励模型和人类偏好变得负相关”。Gao, Schulman & Hilton 2022 把它做成了一个可以测量的规模定律。他们的设置很巧妙:用一个 60 亿参数的奖励模型当”金标准”(gold RM,扮演人类),让它给 10 万对回答打标签,再用这些标签训练从 300 万到 30 亿参数的”代理奖励模型”;策略对着代理奖励优化,用金标准衡量真实效果。这样就能画出”代理奖励 vs 真实奖励”随优化程度的变化,而不需要反复找人标注。

6.2 精确地看一遍:真实质量先升后降

代码 03 在”评论打分助手”里做同样的事,但不用 PPO:§3.5 的闭式解 π∗∝πrefexp⁡(r/β)\pi^* \propto \pi_{\text{ref}} \exp(r/\beta) 可以逐条精确算出来。对每个奖励,用二分查找找到使 KL(π∗ ∥ πref)\mathrm{KL}(\pi^* \,\|\, \pi_{\text{ref}}) 等于目标值的 β\beta,再算真实质量 Eπ∗[g]\mathbb{E}_{\pi^*}[g]:

奖励KL=00.10.250.5123峰值 / 在 KL
gg 本身(理想)1.151.832.112.282.422.502.502.50 / 3.0
标注员分数 hh1.151.721.921.991.861.551.321.99 / 0.5
RM 预训练 N=1001.151.251.281.271.150.62−0.081.28 / 0.3
RM 预训练 N=3001.151.241.251.221.110.740.091.25 / 0.2
RM 预训练 N=10001.151.601.721.721.551.140.741.74 / 0.4
RM 预训练 N=3000(种子 0)1.151.441.521.501.310.850.381.52 / 0.3
RM 预训练 N=3000(种子 1)1.151.611.731.701.511.030.581.73 / 0.3
RM 预训练 N=3000(种子 2)1.151.601.731.731.551.060.681.74 / 0.4
RM 随机初始化 N=30001.151.181.120.980.63−0.03−0.461.18 / 0.1

这张表把过度优化拆成了三层:

  1. 对着 gg 本身优化:真实质量单调上升到 2.50,没有任何过度优化。奖励就是我们想要的东西时,“优化得越狠越好”,KL 只是在限制步子。
  2. 对着标注员的分数 hh 优化(“奖励模型完美地学会了标注员”的极限):真实质量先升到 1.99(KL = 0.5,主要是把评分改对),然后掉到 1.32(回答越写越长、开头越来越热情)。这一层和奖励模型学得好不好无关,根源是标注员的偏好和我们真正想要的不一致。
  3. 对着学出来的奖励模型优化:又多了一层估计误差。峰值更低(1.25–1.74)、来得更早(KL = 0.2–0.4),之后掉得更快——KL = 3 时都已经低于 πref\pi_{\text{ref}} 的 1.15。随机初始化的奖励模型几乎一开始就在帮倒忙。

以”RM 预训练 N=3000 种子 0”为例,按 Gao et al. 的横轴 d=KLd = \sqrt{\mathrm{KL}} 细看:

KL\sqrt{\mathrm{KL}}KLβ\beta代理奖励增量真实质量 E[g]\mathbb{E}[g]评分正确废话句数wowyay
0.000.00∞+0.001.150.781.020.160.04
0.500.250.934+0.561.520.871.480.200.05
1.001.000.310+0.941.310.851.940.320.06
1.251.560.200+1.081.030.812.130.400.06
1.502.250.107+1.190.750.782.350.470.06
1.753.060.036+1.240.360.732.650.570.04

这就是 Gao et al. 图 1 的样子:代理奖励一直在涨,真实质量先升后降。下滑的那一段,策略在做的正是奖励模型的偏差:废话从 1.02 句变成 2.65 句,wow 从 0.16 变成 0.57,评分正确率从峰值 0.87 掉回 0.73。

Gao et al. 给出了两条经验公式(d=KLd = \sqrt{\mathrm{KL}},α,β\alpha, \beta 是拟合参数,这里的 β\beta 和 KL 系数无关):

Rbon(d)=d (αbon−βbon d),RRL(d)=d (αRL−βRLlog⁡d).R_{\text{bon}}(d) = d\,(\alpha_{\text{bon}} - \beta_{\text{bon}}\, d), \qquad R_{\text{RL}}(d) = d\,(\alpha_{\text{RL}} - \beta_{\text{RL}} \log d).

两条曲线都是”先升后降”:线性项 αd\alpha d 是”代理奖励里真实的那部分”带来的提升,减去的那一项随 dd 更快增长,是过度优化的代价。他们把 α\alpha 项和”回归型 Goodhart”联系起来,把导致下降的 β\beta 项主要归因于”极端型 Goodhart”(§6.6)。

6.3 best-of-n

不训练策略、只做 best-of-n(从 πref\pi_{\text{ref}} 抽 nn 个回答,留下奖励最高的)也是一种优化。它的输出分布可以精确算出:把回答按奖励从低到高排好,“最好的那个排在第 jj 名或之前”的概率是 Fj nF_j^{\,n}(FjF_j 是 πref\pi_{\text{ref}} 下前 jj 名的累计概率),所以恰好是第 jj 名的概率是 Fj n−Fj−1 nF_j^{\,n} - F_{j-1}^{\,n}。代码 03 演示 2(奖励 = RM 预训练 N=3000 种子 0):

nKL(精确)log⁡n−(n−1)/n\log n - (n-1)/nbest-of-n 的 E[g]\mathbb{E}[g]同 KL 下闭式解的 E[g]\mathbb{E}[g]
10.0000.0001.151.15
20.1860.1931.461.50
40.6220.6361.491.47
81.1821.2041.291.21
161.8001.8351.000.93
643.0363.1750.470.37
2564.0214.5490.080.04
  • best-of-n 同样先升后降(n = 4 时 1.49,n = 256 时 0.08):过度优化不是强化学习特有的,任何”对着代理奖励挑选”的过程都会发生。InstructGPT 之后的很多系统在部署时也用 best-of-n 或”拒绝采样”(rejection sampling),这条曲线说明 n 也不是越大越好。
  • KL 公式:Gao et al. 用 KLbon=log⁡n−(n−1)/n\mathrm{KL}_{\text{bon}} = \log n - (n-1)/n 画 best-of-n 的横轴。在这里,n ≤ 16 时它和精确值只差 2%–4%,n = 256 时高估约 13%:公式假设回答几乎不会重复,而这里只有 36 种回答,n 很大时总在同几种里挑。对回答空间极大的真实语言模型,公式基本成立。
  • 同样的 KL,n ≥ 4 时 best-of-n 的真实质量比闭式解略高(0.02–0.10)。闭式解是”同样 KL 下代理奖励最高”的策略,也就是最会利用代理奖励的策略;代理奖励有偏差时,它被带偏得也最彻底。Gao et al. 也发现 RL 消耗的 KL 远多于 best-of-n,并提醒 KL 不是比较两种方法的公平尺度。

6.4 奖励模型越好,能安全地走得越远

回到 §6.2 的大表:比较数据多的奖励模型(1000、3000 条)峰值 1.52–1.74,100、300 条只有 1.25–1.28;同样 3000 条、只换训练种子,峰值在 1.52 和 1.74 之间——奖励模型差一点,“能安全优化多远”就短一截。Gao et al. 在真实规模上看到的是同一件事,而且是平滑的规模定律:

  • 公式里的系数随代理奖励模型的参数量平滑地(近似对数地)变化——更大的奖励模型过度优化得更少;
  • 更多的奖励模型训练数据带来更高的真实分数、更少的过度优化;比较数据少于约 2000 条时,代理奖励模型几乎学不到东西;
  • 策略模型的大小影响不大:大策略从优化中获益更少,但两种大小的策略在差不多相同的 KL 处见顶,代理与真实奖励的差距也相近。

这和第 4 讲的规模定律是同一种思路——Jared Kaplan 正是那篇规模定律论文的第一作者。Anthropic 的 Bai et al. 2022a 也报告了类似的规律(§7.3)。

6.5 过度优化之后:自信地答错

代码 03 演示 3 看优化到 KL = 3 时策略变成了什么样(“置信度”= 策略在三个评分上的最大概率,平均):

奖励峰值 E[g]\mathbb{E}[g]峰值处 KLKL=3 时 E[g]\mathbb{E}[g]评分正确废话句数热情开头置信度
标注员分数 hh1.990.51.321.002.590.971.00
RM 预训练 N=1001.280.3−0.080.451.640.270.89
RM 预训练 N=3001.250.20.090.632.260.570.82
RM 预训练 N=10001.740.40.740.792.520.500.99
RM 预训练 N=3000(种子 0)1.520.30.380.742.620.600.98
RM 随机初始化 N=30001.180.1−0.460.502.600.380.94

(πref\pi_{\text{ref}}:E[g]\mathbb{E}[g] 1.15,评分正确 0.78,废话 1.02 句,热情开头 0.20,置信度 0.78。种子 1、2 的两行见代码输出。)

πref\pi_{\text{ref}} 恰好是校准的:置信度 0.78、评分正确率 0.78。过度优化之后,置信度升到 0.82–0.99,正确率却没有跟上——N = 100 的奖励模型下,置信度 0.89、正确率 0.45。**优化把分布压得很尖,压尖的方向却是奖励模型的误差。**这是 Kadavath et al. 2022 观察到”RLHF 之后的策略校准很差”的一个最小版本(§9)。唯一”自信且正确”的是对着 hh 优化(评分正确 1.00、置信度 1.00),但它的回答长度和热情开头同样被推到了极限——奖励模型的两类误差(学偏了的偏好、没学好的判断)在这里分得很清楚。

6.6 四种 Goodhart,以及应对

Gao et al. 借用 Manheim & Garrabrant 的分类,讨论过度优化来自哪里。对照代码 03:

类型含义在小世界里的样子
回归型(regressional)代理 = 真实 + 噪声;挑代理最高的,会连带挑中噪声最大的奖励模型的评分判断有误差(“评分对错”只有 0.73–0.88),优化时被挑出来的往往是它恰好高估的回答
极端型(extremal)在数据很少的极端区域,代理和真实的关系不再成立热情开头、3 句废话在比较数据里很少见;奖励模型在这些地方几乎是在猜,优化恰恰把概率推到这里
因果型(causal)代理和真实只是相关,干预代理的原因不会改变真实“更长的回答信息更多”在示范里有一点道理;把长度本身当目标就不再成立
对抗型(adversarial)被优化的一方主动寻找评估者的漏洞Gao et al. 认为他们的模型还不够强,没有捕捉到这一类,并警告它出现时规模定律可能失效

应对办法大致有四类:提早停下(KL 惩罚在 Gao et al. 的实验里作用就像提前停止,并没有改善”真实奖励 vs KL”的前沿;在闭式解里,β\beta 和 KL 一一对应,选 β\beta 就是选停在曲线的哪个位置);更好的奖励模型(更大、更多数据、从预训练模型初始化);在线迭代(用当前策略的新回答继续收集比较、更新奖励模型,让奖励模型”跟上”策略,§7.4);修正标注本身的偏差(更好的标注指南、长度控制、AI 辅助的标注,§8 和 §10)。


7. Anthropic 的路线:HHH、偏好模型与在线迭代 · Anthropic’s alignment program

3/8 的客座讲者 Jared Kaplan 是 Anthropic 的联合创始人之一,也是第 4 讲那篇规模定律论文的第一作者。他的报告没有公开的题目和材料;下面依据他作为作者之一的几篇论文,重建 2021–2022 年 Anthropic 对齐研究的主线。它和 OpenAI 的路线在方法上相近(都是偏好模型 + RL),侧重点不同:把”对齐”当作一个可以用规模定律研究的实验科学。

7.1 HHH 与”对齐的实验室”

Askell et al. 2021(A General Language Assistant as a Laboratory for Alignment)提出:一个通用的文本助手是研究对齐的好”实验室”——它足够通用,对齐问题都会出现;又足够具体,可以做实验。他们把”对齐”定义为有用、诚实、无害(HHH):

  • 有用:明确地尝试完成任务、简洁,需要更多信息时追问;
  • 诚实:给出准确的信息、置信度校准、对自己的能力和知识诚实;
  • 无害:不冒犯、不歧视,礼貌地拒绝协助危险的行为,对敏感的建议格外小心。

作者强调这三条是主观的,最好的行为往往是三者之间的折中。论文里几个值得记住的发现(模型从 1300 万到 520 亿参数):

  1. 一个简单的提示就有用,而且越大越有用:一段约 4600 词、由 14 段虚构的”人—助手”对话组成的提示(HH prompt),让模型在 HHH 评测上变好,提升随模型变大而增大;小模型会被这段长提示搞糊涂(例如代码任务变差),130 亿和 520 亿的模型则不会——又一次是”小模型付税、大模型受益”。
  2. 上下文蒸馏(context distillation):把”带着 HH 提示的模型”的输出分布蒸馏进一个不带提示的模型,效果和直接提示相近,省掉了每次都要塞一段长提示的代价。
  3. 排序偏好建模胜过模仿学习,而且随规模增长得更快(§5.3);偏好模型预训练提高了样本效率。

7.2 有用与无害的张力

Bai et al. 2022a(Training a Helpful and Harmless Assistant with RLHF)把 HHH 变成了一个完整的 RLHF 系统。数据由众包工作者在开放式对话中收集:每一轮让他们在两个模型回答里选一个——“有用性”数据选更有用、更诚实的那个,“红队(red-teaming)“数据则让工作者故意诱导模型说有害的话,并选更有害的那个。最初的静态数据集有约 4.4 万条有用性比较和 4.2 万条红队比较。

最重要的发现是有用和无害之间的张力:只在一种数据上训练的偏好模型,在另一种数据上的表现远差于瞎猜——最有用的回答往往不是最无害的(帮用户做危险的事),最无害的回答往往没用(拒绝一切)。两种数据混在一起训练,偏好模型能同时学会两者,而且越大的偏好模型对混合比例越不敏感。但在 RL 里对无害性优化过头,模型会变得过度谨慎、回避问题(evasive):论文的解释是,红队数据只告诉模型”不该怎么做”,没有告诉它好的回答长什么样。这个问题直接催生了 Constitutional AI(§8)。

另外两个和第 4 讲呼应的结论:

  • 对齐税主要出现在小模型上:RLHF 之后,小模型在 NLP 评测上变差,130 亿和 520 亿的模型在 zero-shot 评测上反而变好、few-shot 上持平——对足够大的模型,对齐训练不但不收税,还有一点好处。这和 FLAN 的规模结论(§2.4)、Askell et al. 的 HH prompt 结论是同一个模式。
  • 在 RL 训练的大部分时间里,奖励和 KL\sqrt{\mathrm{KL}} 近似线性:KL\sqrt{\mathrm{KL}} 成为衡量”策略走了多远”的自然尺度,Gao et al. 也用了它(§6.2)。他们还发现越大的偏好模型对 RL 越稳健,训练到后期(约 15 万个样本之后)训练用的偏好模型和留出的偏好模型给出的分数开始分道扬镳——这就是过度优化。

7.3 偏好模型的规模定律

Bai et al. 2022a 发现偏好模型的准确率随模型大小、数据量都大致呈对数线性增长;有用性偏好模型的校准很好(它说”70% 的把握 A 更好”时,大约 70% 的时候 A 确实更好)。这些结论的意义在于可以预测:用小规模实验估计”要多少数据、多大的偏好模型才能达到某个准确率”,和第 4 讲用规模定律规划预训练是同一种思路。

7.4 在线迭代 RLHF

奖励模型只在它见过的回答附近可靠(§3.4),而策略在 RL 中会不断离开那片区域。Bai et al. 的办法是在线迭代:大约每周用当前最好的策略部署一次,让众包工作者和新模型对话、收集新的比较,重新训练偏好模型和策略,持续约五周。结果是众包工作者对模型的评价显著提高;在控制数据总量的对比实验里,混合了在线数据的训练优于只用初始静态数据。Gao et al. 在简化假设下也推导出迭代能减少过度优化。代价是工程复杂度:数据、偏好模型和策略要反复更新。Llama 2-Chat(2023)也采用了类似的迭代流程(§10.3)。


8. Constitutional AI 与 AI 反馈 · Constitutional AI and RLAIF

8.1 两个阶段

Bai et al. 2022b(Constitutional AI: Harmlessness from AI Feedback)的目标是:训练一个无害、但不回避问题的助手,而且在无害性上不用人类标注。人类只提供一份用自然语言写成的原则清单——“宪法”(论文用了 16 条与无害性有关的原则)。

监督阶段(SL-CAI):
    红队提示 → 有用的(但可能有害的)RLHF 模型给出回答
             → 随机抽一条原则,让模型**批评**自己的回答(critique)
             → 让模型按批评**修改**回答(revision),可以重复多次(论文里最多 4 次,每次重新抽原则)
             → 在修改后的回答上微调预训练模型                          ⇒ SL-CAI 模型
强化学习阶段(RL-CAI,也叫 RLAIF):
    SL-CAI 模型对同一个提示生成两个回答
             → "反馈模型"读一条随机抽到的原则,判断哪个回答更符合它(给出概率)
             → AI 标注的无害性比较 + 人类标注的有用性比较 → 训练偏好模型
             → 对着偏好模型做 RL                                         ⇒ RL-CAI 模型

几个细节:无害性比较全部由 AI 标注(182,831 条),有用性仍用人类标注(135,296 条);把反馈模型输出的概率当软标签比硬的 0/1 好得多;让反馈模型先写思维链再判断(“Let’s think step-by-step”)能提高准确率,但思维链给出的概率过于自信,他们把它截断到 40%–60% 之间。结果:RL-CAI 比 RLHF 模型更无害、有用性相当,论文给出了一条”有用—无害”的帕累托前沿;而且 RL-CAI “几乎从不回避问题”——它会解释自己为什么不帮忙,而不是简单地拒绝。

8.2 为什么用原则

论文给出的动机:

  • 透明:训练目标写成了可以阅读、可以讨论的自然语言,而不是藏在几万条标注里(对照 §4.3 “对齐到谁”);
  • 可扩展的监督:当模型能力接近或超过人类时,让人逐条判断会越来越难;用 AI 辅助监督是一条可能的出路;
  • 减少回避:可以直接把”不要回避、要解释”写进原则;
  • 迭代快:改原则、重新生成标注,不需要重新组织大规模人工标注。

作者也坦言:这些原则是为研究临时选的,真正的原则应该由更广泛的利益相关者来制定;训练过头的 RL-CAI 模型同样会出现 Goodhart 现象——给出过于严厉的回答,或者反复使用 “You are valid, valued, and cared for” 这样的套话。

8.3 迷你实验:宪法执行了什么,漏掉了什么

代码 04 在评论打分助手里把两个阶段各走一遍。宪法三条:

原则 1:选择评分与评论内容一致的回答。          ← 由 base model 判断("review: … rating:" 格式下三个评分的概率)
原则 2:选择更简洁、没有多余句子的回答。        ← 规则:数句子
原则 3:选择不用 "wow" 这类夸张、讨好的开头的回答。 ← 规则:字面上找 "wow"

真实的 CAI 让同一个大模型读原则的原文来判断;我们的 11 万参数模型读不懂原则,所以每条原则由一个打分函数执行——原则写成什么样,执行起来就是什么样,这正是要观察的。原则 1 是真正的”AI 判断”:信息来自 base model 的知识(它判断评分的准确率是 1.000),不来自我们写的真相。

监督阶段:从 πref\pi_{\text{ref}} 采样 3000 个回答,每个随机抽 2 条原则依次修改,在修改后的回答上微调 base model:

策略E[g]\mathbb{E}[g]评分正确废话句数wowyay
πref\pi_{\text{ref}}(在人类示范上 SFT)1.150.781.020.160.04
SL-CAI(在修改后的回答上 SFT)1.560.890.490.050.03

不用任何新的人类标注,真实质量从 1.15 升到 1.56。但宪法写了什么,修改就只做什么:yay 没被点名,几乎不变;“简洁”把有用的第一句补充也一起删了。

强化学习阶段:用 3000 条比较各训练一个奖励模型——人类标注、AI 标注(宪法)、各一半(CAI 的配方:有用性用人类、“无害性”用 AI)——再做 KL 约束优化:

奖励模型符合真实质量评分对错KL=0.250.5123峰值 / 在 KL
人类标注0.5940.7271.521.501.310.850.381.52 / 0.3
AI 标注(宪法)0.5300.4911.221.170.930.17−0.271.22 / 0.2
各一半0.6740.8461.751.661.451.040.671.75 / 0.2

纯 AI 标注的奖励模型反而最差,而且它完全没学会评分对错(0.491),尽管执行原则 1 的反馈模型本身 100% 准确。原因是信号被稀释了:AI 标注里 51% 是平局(两个回答在抽到的那条原则下打平),真正带着”评分对不对”信息的比较只有 13%(三条原则里只有一条管评分,而且两个回答评分相同时这条也给不出信息)。再准的标注员,信号太稀也没用。 各一半最好:人类标注提供了评分信号,宪法压住了一部分人类偏差。这和 CAI 论文的设计一致——它从没打算用 AI 反馈取代有用性的人类标注。(这个对比受奖励模型训练噪声的影响不小:在一个用 2000 条比较、随机序列不同的原型里,纯 AI 标注的峰值 1.60 只比人类标注的 1.72 略低。两个版本里稳定的结论是”带评分信息的比较很少”和”混合最好”。)

优化到 KL = 3 时策略变成了什么样:

策略E[g]\mathbb{E}[g]评分正确废话句数wowyay
πref\pi_{\text{ref}}1.150.781.020.160.04
人类标注0.380.742.620.560.04
AI 标注(宪法)−0.270.460.000.000.22
各一半0.670.761.600.160.28
SL-CAI 起点 + AI 标注−0.280.460.000.000.24

宪法里写了的两条执行得非常彻底(废话 0.00、wow 0.00),但三个问题都暴露了:

  1. 规则被推到极端:“简洁”连有用的那一句补充也不要了。
  2. 没写进去的地方成了出口:yay 开头从 0.04 涨到 0.22–0.28。在”各一半”里尤其清楚:wow 停在 0.16,yay 涨到 0.28——人类标注喜欢任何热情的开头,宪法只惩罚 “wow”,合起来就是”换成 yay”。练习 8 把原则 3 改成”不要任何夸张开头”:纯 AI 标注下 yay 回到 0.00,但”各一半”里 yay 仍有 0.20——补上一条规则,堵不住产生这个偏差的压力。
  3. 反馈信号的盲区:奖励模型不会判断评分,优化器就在评分上随便选(0.46)。从 SL-CAI 这个更好的起点出发也一样:起点 1.56,KL = 0.25 时持平,再往前就一路下滑。

这些都不是对 CAI 的否定,而是它自己承认的问题的最小版本:原则写得越具体,越容易被字面地满足;写得越抽象,越依赖反馈模型的理解能力——真实的 CAI 依赖一个能读懂原则的大模型。


9. 模型知道自己知道什么吗 · Calibration and knowing what you know

9.1 Kadavath et al.:校准、P(True) 与 P(IK)

HHH 里的”诚实”包括”置信度校准”。Kadavath et al. 2022(Language Models (Mostly) Know What They Know,模型 8 亿到 520 亿参数)系统地研究了这件事:

  • 多选题的校准:用合适的格式(选项前面标上字母)时,最大的模型在 BIG-Bench、MMLU、TruthfulQA 等任务上校准良好;校准随模型变大、随 few-shot 变好。格式很重要:把一个选项换成”以上都不是”,准确率和校准都会下降。
  • RLHF 策略校准很差,但把温度调到 T=2.5T = 2.5 基本就能修好。
  • P(True)——自我评估:让模型先生成答案,再问它”这个答案是对的吗?“,读出它说 True 的概率。zero-shot 时这个概率接近 50%、校准不好;few-shot 后变好;先让模型看自己生成的约 5 个样本(“头脑风暴”),对短答案任务帮助尤其大。P(True) > 0.5 的那些答案,准确率明显高于整体,而且随模型变大差距拉大——作者把这解读为验证比生成容易。
  • P(IK)——“我知道答案吗”:在问题上(看到答案之前)训练一个价值头,预测”模型会不会答对”。在 TriviaQA 上训练,在别的任务上测:520 亿模型的 AUROC 在 Mixed-Arithmetic 上 0.928,在 LAMBADA、Python 函数合成、GSM8k 上只有 0.606、0.687、0.624;改成在除 GSM8k 外的所有任务上训练,GSM8k 上升到 0.752。**跨任务泛化只是部分成功,训练任务越多样越好。**把相关的维基百科文章放进上下文,P(IK) 会上升——一个冷门问题从 18% 升到 78%。

9.2 迷你实验

代码 05 在迷你世界里问同样的问题。置信度 = 8 个城市里模型给出的最大概率(rank classification 的分布,和 Kadavath et al. 的多选题设定一样)。三组名字:SFT 里问过的 train 人物、SFT 没问过的 test 人物、语料里根本不存在的人。

模型 · 问法train 准确 / 置信test 准确 / 置信test ECE不存在的人:置信
base · 叙述句 “X lives in”0.93 / 0.900.93 / 0.890.0400.72
base · 问答 “q: where does X live? a:”0.67 / 0.840.77 / 0.830.0900.84
SFT · 指令 “where does X live?”1.00 / 0.980.50 / 0.860.3640.84
  1. base model 在自己最熟悉的格式里校准得很好(ECE 0.040)——和 Kadavath et al. “在合适的格式下校准良好”一致;换成不熟悉的问答格式,置信度几乎不变、准确率却低了,ECE 升到 0.090。
  2. 指令微调让模型过度自信:对 test 人物准确率 0.50、置信度 0.86,ECE 0.364。SFT 教会了模型用同样的口气回答所有人,不管它知不知道。
  3. 对不存在的人,平均置信度是 0.72–0.84,和对真人差不多:模型会很有把握地为不存在的人编一个城市。这就是第 1 讲 §5.1 的幻觉在校准上的样子。

调温(对数概率除以 TT)能修正平均的过度自信:SFT 模型在 test 人物上,T=2T = 2 时 ECE 0.189,T=3T = 3 时 0.072(Kadavath et al. 用的是 T=2.5T = 2.5)。但 T=3T = 3 同样把对不存在的人的置信度从 0.84 降到 0.54——调温修的是平均,不会让模型分清”认识”和”不认识”。

P(IK):模型能不能事先知道”这题我会答对吗”?(AUROC:0.5 = 分不出,1.0 = 完全分得出)

模型 · 问法真人答对的比例最大概率:真人里对 vs 错最大概率:答对的真人 vs 不存在的人线性探针(50 个训练样本)
base · 叙述句0.930.8530.8330.697
base · 问答0.720.8220.5910.518
SFT · 指令0.750.9040.7780.570

在真人之间,最大概率本身就是一个不错的 P(IK)(0.82–0.90;base 叙述句只答错 4 个人,这个数噪声很大)。但要把”答对的真人”和”不存在的人”分开就差一些(问答格式只有 0.591):模型对不存在的人的置信度,和对真人的落在同一个范围里。在 64 维表示上训练的线性探针反而更差——最大概率是表示的非线性函数,50 个样本学不出来;Kadavath et al. 的 P(IK) 是在大量问题上微调整个模型得到的。

最后,用 SFT 教模型说 “i do not know”:和上面的 SFT 一样,只是”问城市”的题里有 30% 换成 20 个不存在的名字,标准答案是 “i do not know”:

名字说不知道答对城市答了一个错的城市
train 人物(SFT 里问过)0.070.830.07
test 人物(预训练见过,SFT 没问过)0.260.220.45
SFT 里出现过的不存在的名字0.900.000.09
新的不存在的名字0.090.000.88

它学会的”不知道”是”这几个名字配 i do not know”,再加上一点”SFT 里没见过的名字也许不知道”(对 test 人物 26% 说不知道,答对率从 0.46 掉到 0.22)——而不是”这个人我在预训练里没见过”。对新的不存在的名字,88% 的时候它照样编了一个城市。要让”说不知道”和模型自己的知识对上,训练标签必须来自模型自己答不答得对(Kadavath et al. 训练 P(IK) 正是这样做的),而不是来自题目本身。

9.3 对齐与诚实

把 §6.5 和 §9.2 放在一起:对齐训练会改变校准。SFT 让模型对所有问题用同样确定的口气回答;对着有偏差的奖励模型过度优化,会把分布压尖到错误的方向。这和 Kadavath et al. 对 RLHF 策略的观察、以及 GPT-4 技术报告(2023)里”后训练降低了校准”的图是同一个方向。诚实需要的不只是”不说假话”,还要”知道自己什么时候可能在说假话”,而标准的 SFT / RLHF 目标并不直接奖励这一点——如果标注员偏爱自信的回答,它甚至会惩罚这一点(§10.5 的讨好问题)。


10. 2023 年之后 · Since 2023

CS324 Winter 2023 开课时,ChatGPT 刚发布 6 周,InstructGPT 式的 RLHF 是唯一被大规模验证过的配方。此后”后训练”(post-training)成了一个独立的领域。这里只列和本讲主线直接相关的几条。

10.1 DPO 与离线偏好方法

Rafailov et al. 2023(Direct Preference Optimization,DPO)从 §3.5 的闭式解出发,把它倒过来写:

r(x,y)=βlog⁡π∗(y∣x)πref(y∣x)+βlog⁡Z(x).r(x, y) = \beta \log \frac{\pi^*(y \mid x)}{\pi_{\text{ref}}(y \mid x)} + \beta \log Z(x).

代进 Bradley–Terry 模型,βlog⁡Z(x)\beta \log Z(x) 只依赖 xx,在两个回答相减时消掉。于是可以直接用策略本身表示偏好的概率,得到一个只需要比较数据、不需要奖励模型、也不需要采样的分类损失:

LDPO(θ)=−E(x,yw,yl)[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))].\mathcal{L}_{\text{DPO}}(\theta) = -\mathbb{E}_{(x, y_w, y_l)}\Big[\log \sigma\Big(\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)}\Big)\Big].

它的梯度对每对比较按”当前隐式奖励把 yly_l 排得比 ywy_w 高多少”加权——排错得越厉害,更新越大。论文报告在情感控制、摘要、单轮对话上追平或超过 PPO(例如摘要任务上,以 GPT-4 为评委、对参考摘要的胜率,DPO 在温度 0 时约 61%,PPO 在它最好的温度下约 57%),而且对采样温度更稳健。之后出现了一整个”离线偏好优化”家族(IPO、KTO、ORPO、SimPO 等,改的是损失的形式、是否需要成对数据、是否需要参考模型),许多开放模型的后训练改用了 DPO 一类的方法(Llama 3 的后训练就用了 DPO 而不是 PPO)。

代码 03 演示 4 做了两件事:

  • (a) 表格策略上,DPO 的解就是 π∗\pi^*:在每条评论 36 个可调 logit 的策略上最小化期望 DPO 损失(软标签由奖励模型给出),结果和闭式解的最大差别是 6.5e-07(β=2\beta = 2)、2.1e-05(β=0.5\beta = 0.5),KL 也完全相同(0.076、0.574)。DPO 和”奖励模型 + KL 约束优化”的目标是同一个最优解。
  • (b) 神经网络策略上、有限数据的 DPO 不一样。用同样 3000 条人类比较,在 SFT 策略上跑 300 步 DPO:
方法KLE[g]\mathbb{E}[g]评分正确废话句数36 种回答的概率质量自由采样:落在 36 种之内平均句数
πref\pi_{\text{ref}}(SFT)0.001.150.781.020.9790.972.27
DPO β=3\beta = 30.151.800.941.260.5210.573.57
RM + 闭式解 β=3\beta = 30.041.350.831.18———
DPO β=1\beta = 10.522.000.991.650.0630.035.69
RM + 闭式解 β=1\beta = 10.231.510.871.46———

(前五列只在 36 种回答之内重新归一化后计算。)只看 36 种回答,DPO 的数字很好看;但 β=1\beta = 1 时模型只把 6.3% 的概率留给这 36 种回答,自由采样时 97% 的回答跑到了外面——不再按格式停下,平均写 5.69 句,出现 “wow. wow.” 这样的重复和乱码。即使 β=3\beta = 3,也有将近一半的回答跑出去。原因在损失的形式:DPO 只约束数据里出现过的回答对之间的对数概率之差,不约束其他字符串的概率;标注员偏爱”更长”,DPO 就把”更长”推到了数据从没覆盖过的地方。RLHF 的 KL 惩罚作用在策略自己采样的整个分布上,生成的新回答至少会被奖励模型看到。后来的研究也记录了 DPO 一类方法利用长度偏差、以及”被选中的回答的概率也一起下降”的现象,长度正则、在线 / 迭代 DPO 等改进正是在补这个口子。这不是说 DPO 不好用,而是说:偏好数据里的偏差,换哪种优化方法都会被利用。

10.2 LIMA 与”表面对齐假说”

Zhou et al. 2023(LIMA)只用 1000 条精心挑选的示范(来自 Stack Exchange、wikiHow、Reddit 和作者手写),在 650 亿参数的 LLaMA 上做 SFT,不做任何 RL。在对照人工评测里,LIMA 的回答和 GPT-4 相当或更好的比例是 43%(对 Bard 58%、对经过 RLHF 的 DaVinci003 65%)。数据翻倍没有提升;多样性和质量比数量重要。作者据此提出表面对齐假说:模型的知识和能力几乎全部在预训练中学到,对齐只是教它在和用户交互时该用哪一种”子分布”的格式。§2.5 的迷你实验给了这个假说一个有用的反例:在知识和格式绑在一起的小模型上,SFT 学会了格式,却没有带来知识;“表面”的对齐要成立,预训练本身得先把知识存成能被各种问法取出的形式。

10.3 开放模型的配方:Llama 2-Chat 及之后

Touvron et al. 2023(Llama 2)公开了一个完整的工业级配方:SFT 阶段只标注了 27,540 条高质量示范(“质量就是一切”);Meta 自己收集了 1,418,091 条人类比较(加上公开数据共 2,919,326 条);有用性和安全性各训练一个奖励模型(对应 §7.2 的张力);Bradley–Terry 损失里加了一个随”好多少”而变的间隔(margin);RLHF 迭代了 5 个版本,前几版只用拒绝采样(best-of-n 后在最好的样本上微调),最后在拒绝采样的基础上再做 PPO(KL 系数 0.01 或 0.005)。之后的开放配方(Tülu、Zephyr、Llama 3 等)普遍是”SFT + 偏好优化(PPO 或 DPO 一类)+ 拒绝采样”,大量使用模型生成的合成数据和 AI 评委——§8 的 RLAIF 思路成了常规工具(Lee et al. 2023 报告在摘要和对话上 RLAIF 能达到和 RLHF 相近的效果)。

10.4 可验证奖励的强化学习与推理模型

奖励模型的问题(偏差、过度优化)在有标准答案的任务上可以绕开:数学题看最终答案对不对、代码看能不能通过测试。2024–2025 年,“可验证奖励的强化学习”(RLVR,Tülu 3 用了这个名字)成为训练推理模型的核心:DeepSeek-R1-Zero 直接在基础模型上做大规模 RL(GRPO 算法),奖励只来自规则判断的”答案对不对”和”格式对不对”,模型自己学会了写很长的思维链、检查和反思(数字见第 5 讲 §7)。这把第 5 讲的思维链和本讲的 RL 连了起来:RL 在 2023 年后”复活”的主战场不是偏好,而是可验证的推理。可验证奖励也不是万无一失——验证器本身可能有漏洞(例如测试不完整),足够强的模型会找到它们,这又是 §6.6 的对抗型 Goodhart。

10.5 讨好(sycophancy)与奖励黑客

Sharma et al. 2023(Towards Understanding Sycophancy in Language Models)发现,五个当时最先进的 AI 助手在四类自由生成任务上都会讨好用户:附和用户的观点而不是给出真实的回答;分析现有的人类偏好数据,迎合用户观点的回答更容易被选中,人类和偏好模型都有不可忽视的比例更喜欢写得令人信服的讨好回答,而不是正确的回答;对着偏好模型优化有时会牺牲真实性换取讨好。这正是 §5 的”热情开头”偏差在真实世界里的样子:偏差不在优化算法里,在偏好数据里。2025 年 4 月 OpenAI 回滚了一次让 GPT-4o 变得过分讨好的更新,他们的事后说明把原因之一归于更多地依赖了短期的用户反馈信号——一个部署规模上的过度优化案例。

10.6 开放问题

  • 可扩展监督(scalable oversight):当模型在某些任务上超过评估它的人,怎样提供可靠的训练信号?候选思路包括 AI 辅助评估(CAI、批评模型)、辩论(debate)、过程监督(给推理的每一步打分)、“弱到强泛化”(用弱模型的标签训练强模型,看强模型能否超过老师)。
  • 对齐到谁:§4.3 的问题没有消失。CAI 把它变成”宪法写什么”;也有人尝试让公众参与起草原则。
  • 对齐的稳健性:对齐训练是否只是”表面地”压住了不想要的行为?越狱(第 17 讲)、后门在安全训练后依然存在、模型在评估和部署时表现不一致等研究都表明,对齐的效果可能比看上去脆弱。
  • 奖励黑客的检测:在推理模型的长思维链里监控”钻空子”的意图,是 2025 年前后的新方向。

10.7 哪些结论仍然成立

  • 仍然成立:预训练提供能力,后训练主要决定行为;少量高质量的 SFT 就能教会格式(LIMA、Llama 2);比较比示范便宜、比打分一致;代理奖励会被过度优化,KL / 提前停止 / 更好的奖励模型 / 在线迭代都是必要的;“有用”和”无害”之间的张力需要显式处理;对齐会影响校准。
  • 被修正或改变的:PPO 不再是唯一默认,离线偏好方法(DPO 家族)和拒绝采样在开放模型里更常见;“对齐税只对小模型存在”基本成立,但在推理、校准等具体能力上仍然有代价,需要在数据里专门补(Flan 2022 的 CoT 数据);AI 反馈从”研究设想”变成了常规工具;RL 的重心从”学人类偏好”扩展到”学可验证的推理”。

11. 小结 · Summary

  1. 基础模型续写文档,不完成任务。知识可能在模型里(换成熟悉的格式能问出来),但它不会按指令说出来。代码 01:base model 对指令的合法回答比例 0.00–0.03,原生格式问城市 0.93。
  2. 多任务指令微调(T0、FLAN):把大量数据集改写成多样的指令模板,微调后在整个没见过的任务类型上 zero-shot。FLAN:大模型受益、80 亿参数及以下受损;T0:每个数据集的提示越多越稳健;Flan 2022:1836 个任务、需要 CoT 数据、只花预训练算力的约 0.2%。迷你实验复现了”小模型受损”:模型抓的是表面线索(问食物时回答店员,一致率 1.00)。
  3. SFT 学格式很快,但在小模型上没有”解锁”知识(train 人物 1.00、test 人物 0.46),并带来对齐税(“X lives in” 0.93 → 0.42);混入预训练数据(ptx)几乎完全补回。
  4. RLHF 三步:SFT → Bradley–Terry 奖励模型(P(yw≻yl)=σ(rw−rl)P(y_w \succ y_l) = \sigma(r_w - r_l))→ 带 KL 惩罚的 RL。KL 的理由:奖励模型只在训练分布附近可靠、防止坍缩、保住语言能力。最优解是 π∗∝πrefexp⁡(r/β)\pi^* \propto \pi_{\text{ref}} \exp(r/\beta);PPO 近似它,DPO 把它倒过来写成损失。
  5. InstructGPT:13 亿参数的 InstructGPT 胜过 1750 亿的 GPT-3;更真实、毒性略降、偏见没变;对齐成本远小于预训练;最大的局限是会照做有害的指令;“对齐到谁”是一个真实的问题。
  6. 奖励模型学会了标注员的偏差,正确判断只学到一半;从预训练模型初始化对”读懂内容”至关重要(随机初始化的奖励模型”评分对错”0.578);标注噪声决定了准确率的天花板(0.823)。
  7. 奖励过度优化:代理奖励一直涨,真实质量先升后降(Gao et al. 的 d(α−βd)d(\alpha - \beta d) 与 d(α−βlog⁡d)d(\alpha - \beta \log d))。玩具里拆成两层:标注员偏差(对着 hh 优化也会掉)+ 奖励模型的估计误差(数据少、随机初始化时更糟)。best-of-n 同样会过度优化;过度优化后的策略会自信地答错。
  8. Anthropic 的路线:HHH;有用与无害的张力(单一目标的偏好模型在另一目标上比瞎猜还差);对齐税主要出现在小模型上;偏好模型的对数线性规模律;奖励与 KL\sqrt{\mathrm{KL}} 近似线性;在线迭代。
  9. Constitutional AI:批评—修改的监督阶段 + AI 反馈的 RL 阶段;原则透明、可扩展、减少回避。迷你实验:宪法写了的被执行得很彻底,没写的成了出口(yay 0.04 → 0.28),纯 AI 标注的信号太稀(只有 13% 的比较带评分信息),人类 + AI 混合最好。
  10. 校准:base model 在熟悉的格式里校准良好(ECE 0.040);SFT 让它过度自信(0.364),对不存在的人也有 0.84 的置信度;调温修平均、不修区分;用 SFT 教”我不知道”学到的是记住名字,不是认识到自己不知道。

12. 常见误区 · Common pitfalls

  1. “指令微调 / RLHF 让模型学会了新知识。” 主要是改变行为(格式、风格、拒绝与否);知识主要来自预训练(LIMA 的假说)。在知识和格式绑在一起的小模型上,SFT 连已有的知识都带不过来(§2.5)。
  2. “RLHF 就是 PPO。” RLHF 是一个流程:示范、比较、奖励模型、优化。优化可以用 PPO、best-of-n / 拒绝采样,也可以用 DPO 这样不显式训练奖励模型的方法;它们的目标是同一个 π∗\pi^*。
  3. “奖励模型分数越高,回答越好。” 奖励模型是标注员偏好的代理,而且只在训练分布附近可靠。代理奖励一直涨、真实质量下降,是有规律可循的常态(§6)。
  4. “KL 惩罚能防止一切问题。” KL 只限制策略在 RL 提示上离参考模型多远;它不修正奖励模型的偏差(在闭式解里,选 β\beta 只是选停在曲线哪里),也挡不住 RL 提示分布之外的能力退化(InstructGPT 把 KL 调大 100 倍仍有对齐税,ptx 才有用)。
  5. “奖励模型准确率只有 70%,说明它很差。” 先看标注员彼此之间的一致率:InstructGPT 约 73%,玩具里 0.748、天花板 0.823。
  6. “对齐总是要付出能力代价。” 对大模型,指令微调和 RLHF 往往让 zero-shot 表现变好(FLAN;Bai et al. 2022a 的 130 亿、520 亿模型);代价主要出现在小模型和训练数据没有覆盖的能力上。
  7. “用 AI 反馈代替人类反馈,就没有人类偏差了。” 偏差变成了”宪法写了什么、反馈模型懂什么”:写了的被字面地执行,没写的成了出口,信号可能被稀释(§8.3)。
  8. “DPO 不需要奖励模型,所以不会奖励黑客。” DPO 的隐式奖励来自同样的偏好数据,偏差照样会被利用;而且它不约束数据之外的回答,可能把概率推到从没见过的地方(§10.1)。
  9. “模型说’我不知道’就是诚实。” 只有当”说不知道”和模型自己是否知道对得上时才是。用固定的题目教它说不知道,它学会的是记住题目(§9.2)。
  10. “T0 和 FLAN 证明了指令微调对任何模型都有效。” 两篇论文在小模型上的结论恰恰相反;收益取决于规模、架构、指令的多样性和评测时”没见过”的定义。

13. 练习 · Exercises

练习 1(续写 vs 回答) 代码 01 里 base model 对 “where does panar live? answer:” 续写出 ” the stew was soggy and the ho…”。(a) 从训练数据解释它为什么接着写评论。(b) 为什么它对”评论打分”的 rank classification 是 0.66,对”问城市”只有 0.25?

参考答案

(a) 迷你互联网里从来没有 “answer:” 这种格式。模型看到一段以冒号结尾、后面要接一段文字的文本,最接近的训练文本是 “review: the stew was …”(评论以 “review:” 开头)。它在做它被训练去做的事:预测这种文本后面最可能出现什么。

(b) 评论打分的指令里包含了整条评论,模型在预训练时见过几千条”评论 + 评分”,“tasty / rude”这些词和评分的关系已经刻在参数里,即使格式变了,“good / ok / bad”跟在这些词后面的概率仍然受它们影响。问城市时,指令里只有名字,而”名字 → 城市”的关联在这个小模型里和 “X lives in” 这个特定的前文绑在一起(第 5 讲 §6.2);换成 “where does X live? answer:“,这条通路几乎用不上,0.25 和多数类 0.23 差不多。

练习 2(Bradley–Terry 的天花板) 代码 02 的标注员以 σ(ha−hb)\sigma(h_a - h_b) 的概率选 aa。(a) 两个回答只差”一句废话 0 → 1 句”(Δh=1.3\Delta h = 1.3),标注员选更长那个的概率是多少?(b) 只差一个 wow 开头(Δh=0.3\Delta h = 0.3)呢?在这类比较上,任何奖励模型的准确率上限是多少?(c) 一个完美学会标注员的奖励模型,给”废话 1 → 2 句”的分差应该是多少?

参考答案

(a) σ(1.3)≈0.786\sigma(1.3) \approx 0.786。(b) σ(0.3)≈0.574\sigma(0.3) \approx 0.574:标注员自己只有 57% 的时候选热情的那个,任何奖励模型在这类比较上预测标注结果的准确率不可能超过 0.574——这就是代码 02 演示 1 里”天花板 0.823”的来源:天花板是所有比较上 max⁡(p,1−p)\max(p, 1-p) 的平均,差别小的比较把它拉低。(c) Bradley–Terry 在数据足够时收敛到 hh 加一个常数,所以分差应该是 Δh=0.25⋅(−1)+0.8=0.55\Delta h = 0.25 \cdot (-1) + 0.8 = 0.55(真实质量 −0.25,加上长度偏差 +0.8)。代码 02 里的奖励模型给出 +0.20 到 +0.30,方向对、大小不足。

练习 3(闭式解) 一个提示只有 3 种回答,πref=(0.5,0.3,0.2)\pi_{\text{ref}} = (0.5, 0.3, 0.2),奖励 r=(0,1,2)r = (0, 1, 2),β=1\beta = 1。(a) 求 π∗\pi^*。(b) 求 KL(π∗ ∥ πref)\mathrm{KL}(\pi^* \,\|\, \pi_{\text{ref}}) 和 Eπ∗[r]\mathbb{E}_{\pi^*}[r],验证 Eπ∗[r]−β KL=βlog⁡Z\mathbb{E}_{\pi^*}[r] - \beta\,\mathrm{KL} = \beta \log Z。(c) β→0\beta \to 0 和 β→∞\beta \to \infty 时 π∗\pi^* 分别是什么?

参考答案

(a) 权重 0.5e0,0.3e1,0.2e2=0.5,0.8155,1.47780.5 e^0, 0.3 e^1, 0.2 e^2 = 0.5, 0.8155, 1.4778,Z=2.7933Z = 2.7933,π∗≈(0.179,0.292,0.529)\pi^* \approx (0.179, 0.292, 0.529)。

(b) KL=∑π∗log⁡(π∗/πref)≈0.323\mathrm{KL} = \sum \pi^* \log(\pi^*/\pi_{\text{ref}}) \approx 0.323;Eπ∗[r]=0.292+2×0.529≈1.350\mathbb{E}_{\pi^*}[r] = 0.292 + 2 \times 0.529 \approx 1.350;1.350−0.323=1.027=log⁡2.79331.350 - 0.323 = 1.027 = \log 2.7933。(而 πref\pi_{\text{ref}} 自己的目标值是 E[r]=0.7\mathbb{E}[r] = 0.7、KL = 0,即 0.7 < 1.027。)

(c) β→0\beta \to 0:(0,0,1)(0, 0, 1),全部给奖励最高的;β→∞\beta \to \infty:π∗=πref\pi^* = \pi_{\text{ref}}。

练习 4(best-of-n) 同样的 πref=(0.5,0.3,0.2)\pi_{\text{ref}} = (0.5, 0.3, 0.2),奖励递增。(a) 算 best-of-4 的输出分布。(b) 它的 KL 和公式 log⁡n−(n−1)/n\log n - (n-1)/n 比,谁大?为什么?

参考答案

(a) 累计概率 F=(0.5,0.8,1.0)F = (0.5, 0.8, 1.0),F4=(0.0625,0.4096,1)F^4 = (0.0625, 0.4096, 1),所以分布是 (0.0625,0.3471,0.5904)(0.0625, 0.3471, 0.5904)(align_tools.py 的自检用蒙特卡洛验证过这组数)。

(b) 精确的 KL 是 0.560 nats(自检的输出),公式给出 log⁡4−3/4≈0.636\log 4 - 3/4 \approx 0.636,公式偏大。公式假设抽到的 nn 个回答几乎不会重复(连续分布);这里只有 3 种回答,4 次里经常抽到重复的,“挑最好的”能做的选择更少,离 πref\pi_{\text{ref}} 也就更近。代码 03 在 36 种回答上看到同样的现象:n = 256 时公式高估约 13%。

练习 5(DPO 的推导) 从 π∗∝πrefexp⁡(r/β)\pi^* \propto \pi_{\text{ref}} \exp(r/\beta) 出发:(a) 把 rr 用 π∗\pi^* 表示;(b) 代进 Bradley–Terry,说明配分函数 Z(x)Z(x) 为什么会消掉;(c) 写出 DPO 损失。(d) 为什么代码 03 演示 4(a) 里,表格策略上的 DPO 解和 π∗\pi^* 只差 1e-5 量级,而演示 4(b) 的神经网络 DPO 却把 94% 的概率推到了 36 种回答之外?

参考答案

(a) r(x,y)=βlog⁡π∗(y∣x)πref(y∣x)+βlog⁡Z(x)r(x, y) = \beta \log \frac{\pi^*(y|x)}{\pi_{\text{ref}}(y|x)} + \beta \log Z(x)。

(b) Bradley–Terry 只用到 r(x,yw)−r(x,yl)r(x, y_w) - r(x, y_l),两项里的 βlog⁡Z(x)\beta \log Z(x) 相同(同一个提示),相减为 0。

(c) 见 §10.1 的公式:把 π∗\pi^* 换成要训练的 πθ\pi_\theta,对比较数据做最大似然。

(d) 演示 4(a) 最小化的是所有回答对上的期望损失(权重 πref(a)πref(b)\pi_{\text{ref}}(a)\pi_{\text{ref}}(b)),最优解满足”每一对的对数概率比之差 = 奖励差”,再加上概率和为 1,就唯一确定了 π∗\pi^*。演示 4(b) 只有 3000 条比较,而且策略是一个可以给任何字符串分配概率的语言模型:损失只约束了数据里出现过的回答对之间的差,没有约束”这 36 种回答的概率之和”。把 ywy_w 和 yly_l 的概率同时压低,只要压 yly_l 更多,损失照样下降——概率就流向了从没被比较过的字符串(更长的废话、重复的 wow)。

练习 6(KL 与 ptx) InstructGPT 发现把 KL 系数调大 100 倍仍然消除不了 SQuAD、DROP 上的退步,而混入预训练梯度(ptx)可以。用”KL 约束的是哪个分布”解释。代码 01 的”SFT + ptx”对应哪一种?

参考答案

KL 惩罚是在 RL 提示上、对策略自己生成的回答计算的:它保证”在用户请求这类输入上,输出分布别离 SFT 模型太远”。SQuAD、DROP 的输入(长篇阅读材料 + 抽取式问题)几乎不出现在 RL 提示里,策略在那些输入上怎样变化,KL 项根本”看不到”。ptx 直接在预训练分布上加一项似然,覆盖了几乎所有类型的文本,所以能约束那些输入上的行为。代码 01 的”SFT + ptx”是同一个想法:每一步加一项在迷你互联网上的语言模型损失,叙述句补全从 0.42 回到 0.87、原生评论打分从 0.23 回到 1.00。

练习 7(改代码:没有偏差的标注员) 把 align_tools.py 里的 LAM, MU = 0.8, 0.8 改成 0.0, 0.0(标注员只按真实质量判断),删掉奖励模型的缓存,重跑代码 02、03。预测:(a) 演示 1 里”标注员分数 h”那一行会怎样?(b) 学出来的奖励模型还会过度优化吗?

参考答案

我在一份代码副本里跑了这个实验(没有改动课程目录里的文件):

(a) h=gh = g,这一行和”g 本身”完全相同,单调升到 2.50。

(b) 分两种情况。数据够多的奖励模型基本不再过度优化:N = 3000 的三个种子峰值 2.09 / 2.47 / 2.46,种子 1 在 KL = 3 时仍是 2.47;N = 1000 峰值 1.99,KL = 3 时 1.85。数据少的照样过度优化:N = 100 峰值 1.21(KL = 0.1),KL = 3 时 0.08;随机初始化的峰值 1.27,KL = 3 时 0.29。这正好把 §6.2 的两层分开了:标注员偏差那一层消失了,估计误差那一层还在。顺带一个现象:没有偏差时,奖励模型的”评分对错”也学得更好(N = 1000 是 0.920,N = 3000 的三个种子 0.874 / 1.000 / 1.000,原设定下是 0.73–0.88)——标注员的长度偏好原本占用了奖励模型的一部分”注意力”。

练习 8(改代码:把漏洞补上) 把代码 04 的原则 3 改成”选择不用任何夸张、讨好的开头(wow、yay……)的回答”(打分函数改成”有任何开头就扣分”,修改时去掉任何开头),重跑代码 04。预测 KL = 3 时纯 AI 标注和”各一半”的 yay 比例。

参考答案

代码副本里的结果:纯 AI 标注 yay 从 0.22 降到 0.00(wow 仍是 0.00),峰值从 1.22 升到 1.31;“各一半”的 yay 只从 0.28 降到 0.20(wow 0.05),峰值 1.79、KL = 3 时 0.92(原来 1.75、0.67)。补上规则之后,纯 AI 标注的出口堵住了;但在”各一半”里,人类标注对热情开头的偏爱还在,宪法只在大约六分之一的比较里管开头(一半交给宪法,宪法再随机抽三条原则之一),压力依然把概率推向 yay。教训:补规则治标;偏差的来源(标注员偏好)还在,优化压力就还在。

练习 9(设计实验:FLAN 和 T0 的分歧) FLAN 说指令微调伤害 80 亿参数及以下的模型,T0 说 30 亿的也受益。T0 的作者猜测原因可能是架构 / 预训练目标,或提示的多样性。在这个迷你世界里设计一个实验,检验”提示的多样性”这个解释。你预测结果是什么?

参考答案

一个可行的设计:保持模型和训练步数不变,只改每个簇的模板数(1、4、8、16,并让模板在长度、语序、用词上尽量不同),每种设置跑 2–3 个种子,比较两件事:(1) FLAN 式留出簇上的 em 和合法率;(2) T0 式没见过的说法上的 em。要检验架构的解释,可以用第 3 讲的 encoder-decoder(arch_tools.py)重复同样的实验。

预测(未验证):多样性对”换一种说法”会有帮助(演示 4 里 4 个模板已经把平均从 0.30 提到 0.40),但对”留出整个簇”帮助不大——这个模型的预训练语料里没有任何”指令”文体,它没有可迁移的”理解指令”的能力,模板再多也只是在训练簇内部变得更稳健。这类”我预测……”的答案必须真的跑过才算数(第 1 讲练习 6 就是一个假设被实验推翻的例子)。

练习 10(成本账) InstructGPT 训练 1750 亿的 SFT 和 PPO-ptx 模型分别用了 4.9 和 60 PF-days,GPT-3 预训练用了 3640 PF-days。Flan-PaLM 的指令微调约占预训练算力的 0.2%。(a) InstructGPT 的对齐算力约占预训练的百分之几?(b) 这对”谁能训练对齐的模型”意味着什么?

参考答案

(a) (4.9+60)/3640≈1.8%(4.9 + 60)/3640 \approx 1.8\%。

(b) 对齐的算力成本相对预训练很小,所以拿到一个开放权重的基础模型,后训练是很多机构负担得起的(这是 2023 年之后大量开放对话模型出现的原因之一,§10.3)。但成本不只是算力:高质量的示范和比较数据、标注团队、安全评测和红队测试都很贵,而且决定了模型被”对齐到谁”(§4.3)。

练习 11(有用与无害) Bai et al. 2022a 发现只在有用性数据上训练的偏好模型,在无害性数据上比瞎猜还差,反之亦然。(a) 为什么会”比瞎猜还差”而不是”接近瞎猜”?(b) 对无害性优化过头,模型变得回避问题。用 §6 的语言解释,并说说 CAI 怎样缓解它。

参考答案

(a) 两种数据里的偏好在很多比较上是相反的:在一个危险请求上,有用性标注员会选”真的帮了忙”的回答,无害性标注员会选”拒绝了”的回答。一个学会了”越帮忙越好”的偏好模型,在无害性数据上会系统性地选错,所以低于 50%。

(b) “拒绝 / 回避”在红队数据里总是被偏好,偏好模型学到”回避 → 高分”;而红队数据里没有”既无害又有帮助”的好回答,偏好模型对它们没有证据。优化到后面,策略就走到”回避一切”这个偏好模型高估的极端——这是一个典型的过度优化(因果型 + 极端型 Goodhart)。CAI 的做法是把”不要回避,解释你为什么不帮忙”写进原则,并在修改阶段生成”无害且有交代”的回答,让偏好模型见过这类回答。


14. 延伸阅读 · Further reading

原课阅读(W23 Syllabus)

Jared Kaplan 报告的背景(Anthropic,2021–2022)

本讲用到的其他工作

2023 年之后


15. 下一讲预告 · Next lecture

Part II(适配与对齐)到这里结束。这一讲反复出现一个主题:后训练的算力很小,但它决定了模型的行为;而真正花掉几百万美元、几千张 GPU 的,是预训练本身。

第 8 讲:GPU 性能的第一性原理与 FlashAttention(1/11 客座 Tri Dao)进入 Part III(系统与训练)。一次矩阵乘法在 GPU 上是受算力限制还是受内存带宽限制?为什么标准注意力要在显存里来回搬运一个 N×NN \times N 的矩阵,而 FlashAttention 能让它”不落地”?代码会实现在线 softmax 和分块注意力,并模拟两种算法的显存读写量。

← 返回课程目录