问题背景:会续写,不代表会帮忙

论文 Training language models to follow instructions with human feedback 是 InstructGPT 的技术报告,也是理解 ChatGPT 这类指令跟随模型的重要论文。

这篇论文想解决的问题很朴素:语言模型会预测下一个词,不等于它会按用户意图办事。

GPT-3 这类预训练语言模型的训练目标是 next token prediction,也就是根据互联网上的大量文本预测下一个 token。这个目标很强,能让模型学到语法、知识、推理模式和很多任务形式;但它和真实产品里的目标并不完全一致。用户真正想要的是:

  • 有帮助:能解决任务,而不是机械续写。
  • 诚实:不知道时不要瞎编。
  • 无害:不要生成有毒、偏见、危险或误导性的内容。

这就是论文里说的 alignment 问题:模型优化的训练目标,和用户真正关心的行为目标不一致。

一个典型例子是:用户问“用两句话总结下面这段文本”,预训练模型可能只是继续写文本、模仿网页风格,或者生成看起来合理但原文没有的信息。它不是不会写,而是没有被明确训练成“一个会跟随指令的语言模型”。

InstructGPT 的核心思想是:既然“好回答”很难用一个自动指标定义,那就让人来比较、示范和打分,再把这些反馈转成模型能优化的训练信号。

核心思路:用人类反馈校准模型行为

InstructGPT 不是换了一个全新模型结构,而是在 GPT-3 架构基础上,用人类反馈做了三步微调:

  1. SFT(Supervised Fine-Tuning):让标注员写高质量回答,先教模型模仿。
  2. RM(Reward Model):让标注员比较多个模型回答,训练一个奖励模型判断哪个更好。
  3. PPO(Reinforcement Learning):用奖励模型给回答打分,再用强化学习继续优化语言模型。

可以把它理解成:

  • SFT 负责“入门”:先学会大致怎么回答指令。
  • RM 负责“审美”:学会人类更喜欢哪类回答。
  • PPO 负责“强化”:让模型朝奖励模型偏好的方向继续改。

论文把最终模型称为 InstructGPT。其中默认的 InstructGPT 指的是 PPO-ptx 版本,也就是 PPO 训练时混入预训练分布的梯度,用来减少对通用 NLP 能力的破坏。

Prompt 的边界:临时引导不是默认能力

在 InstructGPT 之前,让 GPT-3 跟随指令的常见做法是写更复杂的 prompt,比如在用户输入前面加几个示例,让模型进入“指令回答模式”。这确实有用,论文也比较了 GPT-3 prompted 版本。

但 prompt 有几个问题:

  • 它依赖用户或产品方持续调 prompt,稳定性有限。
  • 它没有真正改变模型的偏好,只是在上下文里临时引导。
  • 它容易被输入分布影响,遇到复杂、敏感或格式约束任务时仍然不可靠。

InstructGPT 的结果很直接:从 GPT-3 到 few-shot prompted GPT-3,再到 SFT,再到 PPO,每一步都带来了明显提升。也就是说,prompt engineering 能改善行为,但如果要把“跟随指令”变成模型的默认能力,就需要训练过程本身参与进来。

数据来源:真实用户任务比 Benchmark 更复杂

论文的数据主要来自 OpenAI API Playground 中早期 InstructGPT 模型的用户 prompt,以及标注员自己写的 prompt。为了避免数据泄露和评估污染,论文做了几件事:

  • 训练、验证、测试按 user ID 切分,避免同一用户的数据同时出现在训练和测试里。
  • 对训练集中的 prompt 做 PII 过滤。
  • 对每个 user ID 的 prompt 数量做上限限制。
  • 最早期没有足够 instruction-style prompt 时,让标注员手写多样化任务作为冷启动数据。

训练中用到三类数据:

  • SFT 数据:约 13k 个训练 prompt,表中精确数是 12,725,用来训练监督微调模型。
  • RM 数据:约 33k 个训练 prompt,表中精确数是 33,207,用来收集排序并训练奖励模型。
  • PPO 数据:约 31k 个训练 prompt,表中精确数是 31,144,不需要人工标签,用作强化学习阶段的输入。

这些任务并不是传统 NLP benchmark 那种整齐划一的分类、抽取、问答。论文统计的 API prompt 分布里,生成类占 45.6%,开放问答占 12.4%,头脑风暴占 11.2%,聊天占 8.4%,改写占 6.6%,摘要占 4.2%,分类占 3.5%,其他占 3.5%,封闭域问答占 2.6%,抽取占 1.9%。

这点很重要:真实用户并不是只拿模型做标准测试集任务,而是大量使用开放式生成、想法扩展、改写、聊天和辅助写作。也正因为如此,只在公开 NLP 数据集上做 instruction tuning,并不一定能覆盖真实产品里的使用方式。

SFT:用人工示范建立指令响应能力

SFT 是最容易理解的一步。给定一个 prompt,标注员写出理想回答,然后用这些 prompt-response 对微调 GPT-3。

形式上,它还是普通的语言模型监督学习:最大化人工示范回答的概率。假设 prompt 是 \(x\),人工示范答案是 \(y = (y_1, y_2, ..., y_T)\),SFT 的目标就是让模型在看到 \(x\) 和前面的答案 token 时,更高概率预测下一个人工答案 token:

\[\max_\theta \sum_{t=1}^{T} \log \pi_\theta(y_t | x, y_{<t})\]

也可以理解为:把“用户指令 + 人类理想回答”拼成一段训练文本,对回答部分做 teacher forcing。训练时,模型不需要自己探索,也不需要知道哪个答案更好,只需要尽量复刻标注员写出的答案。

这一步的作用是把模型从“网页续写器”先拉到“指令响应器”。例如:

  • 用户要求“列出五个职业发展建议”,模型应该列建议,而不是继续补全一个网页。
  • 用户要求“用两句话总结”,模型应该控制长度,而不是无限展开。
  • 用户给出一段文本做封闭域问答,模型应该只基于原文回答,而不是调动自己记忆里的类似事实。

论文里 SFT 还有几个值得注意的训练细节:

  • 它不是从零训练模型,而是从预训练 GPT-3 初始化,只做指令数据上的微调。
  • SFT 训练了多个 epoch。论文提到验证集 loss 在 1 个 epoch 后会过拟合,但继续训练反而能提升奖励模型分数和人工偏好评分。这说明语言模型 loss 和“人觉得好不好”并不完全一致。
  • 最终 SFT checkpoint 不是按语言模型验证 loss 选,而是按 reward model 在验证集上的分数选。也就是说,从 SFT 阶段开始,模型选择就已经向人类偏好靠拢。
  • SFT 是后续 RM 和 PPO 的基础。RM 通常从 SFT 模型初始化,PPO 也从 SFT 策略继续优化。

SFT 的优点是稳定、简单、成本相对可控。只要有高质量示范数据,就能显著改善指令遵循能力。它的问题也很明显:人类必须为每个 prompt 写完整答案,而写一个好答案比判断两个答案哪个更好贵得多。

不过,SFT 有天然上限。因为它只告诉模型“这个回答是好的”,却没有直接告诉模型“两个看起来都还行的回答中,哪个更符合人类偏好”。现实中,大量质量差异是相对的:更简洁、更准确、更少废话、更会遵守格式、更不瞎编。

这就需要第二步奖励模型。

RM:把人类偏好变成可学习的奖励信号

奖励模型的训练方式是:对同一个 prompt,让多个模型生成多个回答,然后请标注员排序。排序之后可以拆成两两比较,比如回答 A 优于回答 B、回答 C 优于回答 D。

奖励模型输入 prompt 和 response,输出一个标量 reward。它的目标不是预测下一个 token,而是预测“人更喜欢哪个回答”。

奖励模型通常可以看成“去掉最后词表输出层的语言模型 + 一个标量打分头”。普通语言模型最后会输出词表上每个 token 的概率;奖励模型最后只输出一个数,例如 \(r_\theta(x, y) = 2.3\)。这个分数本身没有绝对意义,重要的是同一个 prompt 下不同回答的相对高低。

论文中的损失函数可以直观理解为:

  • 如果人类更喜欢回答 \(y_w\) 而不是 \(y_l\);
  • 奖励模型就应该让 \(r(x, y_w)\) 大于 \(r(x, y_l)\);
  • 两者差距越符合排序,loss 越低。

论文用的是类似 Bradley-Terry 的 pairwise preference 建模:

\[loss(\theta) = -E[\log(\sigma(r_\theta(x, y_w) - r_\theta(x, y_l)))]\]

其中 \(x\) 是 prompt,\(y_w\) 是 winner,\(y_l\) 是 loser,\(r_\theta\) 是奖励模型。

为什么不用 1-7 分这种绝对打分,而是做排序?因为绝对分数很难校准。不同标注员对“4 分”和“5 分”的理解可能不一样,同一个标注员在不同时间的判断也可能波动。但在同一个 prompt 下,比较两个回答哪个更好,通常更稳定。

这里有一个工程细节很有意思:标注员不是每次只比较两个回答,而是会对 \(K=4\) 到 \(K=9\) 个回答排序。这样一次排序可以产生 \(K(K-1)/2\) 个两两比较,采集效率更高。但同一个 prompt 下的比较高度相关,如果简单打散训练,奖励模型容易过拟合。论文选择把同一 prompt 下的所有比较作为一个 batch element 来处理。

举个例子,同一个 prompt 下有 4 个候选回答,标注员排序为:

\[A > C > B > D\]

那么可以得到 6 个偏好对:

  • A 优于 C、B、D。
  • C 优于 B、D。
  • B 优于 D。

奖励模型训练后,就能把“人类排序”压缩成一个可微的打分函数。后续 PPO 阶段不可能每生成一个回答就请人打分,所以 RM 的角色就是当“人类偏好的代理评委”。

但 RM 也有风险:它学到的是标注数据里的偏好近似,不是真正的人类价值本身。如果 RM 对某些模式误判,PPO 会专门朝这些误判方向优化,把小偏差放大成明显行为问题。这就是为什么后面需要 KL 约束、人工评估和持续迭代。

PPO:在奖励模型引导下继续优化策略

有了奖励模型后,就可以把语言模型当成一个策略模型:输入 prompt,输出 response;奖励模型给 response 打分;然后用强化学习优化策略。

论文使用 PPO(Proximal Policy Optimization)。直觉上,PPO 会鼓励模型生成奖励模型更喜欢的回答。

这里的强化学习环境其实很简单,不是 AlphaGo 那种多步复杂环境,而更像一个 single-step bandit:

  1. 环境采样一个用户 prompt。
  2. 当前策略模型 \(\pi_\phi^{RL}\) 生成一个完整回答。
  3. 奖励模型读取 prompt 和回答,输出一个 reward。
  4. 这一轮结束,用 PPO 更新策略模型。

把它翻译成语言模型语境:

  • 状态:prompt 和已经生成的 token。
  • 动作:下一个 token。
  • 策略:语言模型的 token 分布。
  • 回报:完整回答结束后,奖励模型给出的分数,再加上一些约束项。

但这里不能只追求 reward 最大化,否则会出现 reward hacking:模型可能找到奖励模型的漏洞,生成一些奖励模型高分但人类并不真正喜欢的文本。为了约束模型不要偏离 SFT 模型太远,论文加入了 KL penalty。

也就是说,PPO 阶段同时追求两件事:

  • 回答要让奖励模型打高分。
  • 新策略不要和 SFT 模型差得太离谱。

论文里的 RL 目标可以粗略写成:

\[reward = r_\theta(x, y) - \beta \log \frac{\pi_\phi^{RL}(y|x)}{\pi^{SFT}(y|x)}\]

第一项 \(r_\theta(x, y)\) 来自奖励模型,鼓励回答更符合人类偏好。第二项是 KL 约束的近似写法,惩罚 RL 策略相对 SFT 策略偏移太远。\(\beta\) 越大,模型越保守;\(\beta\) 越小,模型越容易追逐奖励模型。

为什么 PPO 从 SFT 模型开始,而不是直接从 GPT-3 开始?因为 SFT 已经把模型带到了一个比较合理的指令回答区域。PPO 在这个基础上做“偏好微调”更稳。如果直接从原始 GPT-3 开始做 RL,探索空间太大,奖励模型也更容易被奇怪输出攻击。

PPO 还有一个实际作用:它能优化那些很难用监督学习表达的偏好。例如两个回答都正确,但一个更简洁;两个回答都遵守任务,但一个语气更符合用户预期;两个摘要都覆盖重点,但一个更少幻觉。这些差异很难靠单一参考答案训练出来,却适合通过偏好排序和 reward 优化。

论文还提出 PPO-ptx:在 PPO 梯度之外,混入一部分预训练数据上的语言模型梯度。它的目的不是提升人类偏好分,而是缓解 alignment tax。完整目标可以理解为:

  • PPO 目标:在用户 prompt 上提高奖励模型分数。
  • KL 约束:不要偏离 SFT 策略太远。
  • Pretraining mix:继续保持对预训练分布的语言建模能力。

这三股力量分别对应“更符合偏好”“别优化过头”“别忘掉通用能力”。InstructGPT 默认指的 PPO-ptx,本质上就是在这三者之间做折中。

Alignment Tax:对齐不能以遗忘能力为代价

Alignment tax 可以理解为:为了让模型更符合人类偏好,模型在其他能力上付出的代价。

论文观察到,直接用 PPO 做 RLHF 后,模型在人类偏好评测上变好了,但在一些公开 NLP 数据集上会退化,比如 SQuAD、DROP、HellaSwag、WMT 2015 法英翻译等。

这其实很好理解。PPO 训练的目标变成了“在 API prompt 分布上拿到高 reward”,它不再纯粹保持原始语言建模能力。如果优化太猛,模型可能在标准任务上的泛化能力下降。

PPO-ptx 的做法是把预训练分布的 log likelihood 也放进目标里,让模型一边朝人类偏好靠拢,一边不要忘掉原来学到的语言能力。论文发现,这能显著减少公开 NLP 数据集上的性能退化,同时不明显损害人类偏好评测结果。

这是 InstructGPT 里非常值得关注的一点:alignment 不只是“把模型调得更听话”,还要控制副作用。一个实际可用的对齐技术,必须尽量低 tax,否则大家会因为能力损失而不愿意采用。

核心结果:1.3B InstructGPT 也能胜过 175B GPT-3

论文最有冲击力的结果是:1.3B 参数的 InstructGPT 输出,比 175B 参数的 GPT-3 输出更受标注员偏好。

注意这不是说 1.3B InstructGPT 在所有能力上超过 175B GPT-3,而是在论文的 API prompt 分布、人类偏好评价下,标注员更喜欢它的回答。这说明:对真实用户任务来说,模型是否按意图回答,有时比单纯扩大参数更重要。

论文还报告:

  • 175B InstructGPT 相比 175B GPT-3,回答有 85±3% 的时间更受偏好。
  • 175B InstructGPT 相比 few-shot prompted 175B GPT-3,回答有 71±4% 的时间更受偏好。
  • InstructGPT 更容易遵守显式约束,比如字数、段落数、格式要求。
  • 在封闭域任务中,InstructGPT 的幻觉更少。论文摘要中给出的数字是:InstructGPT 幻觉率约 21%,GPT-3 约 41%。

从产品视角看,这些指标都非常关键。一个指令跟随模型不只是要“聪明”,还要可控、稳定、少编、能按格式交付。

安全评估:真实性提升,但偏见和有害指令仍棘手

论文还评估了真实性、有毒输出和偏见。

在 TruthfulQA 上,InstructGPT 比 GPT-3 更常生成真实且有信息量的回答。论文摘要里说,InstructGPT 生成 truthful and informative answers 的频率大约是 GPT-3 的两倍。尤其在被提示“不确定就回答 I have no comment”时,PPO 模型更倾向于避免自信地说错。

在 RealToxicityPrompts 上,结果更微妙:

  • 如果 prompt 明确要求生成安全、尊重的回答,InstructGPT 的毒性低于 GPT-3,论文摘要提到约减少 25%。
  • 如果没有 respectful prompt,这个优势会消失。
  • 如果明确要求模型生成有毒内容,InstructGPT 甚至可能比 GPT-3 更容易照做。

这说明 InstructGPT 学到的核心能力是“跟随指令”,但“跟随指令”和“拒绝有害指令”不是同一件事。论文也承认,当用户要求潜在有害内容时,模型仍可能服从。

在 Bias 评估上,InstructGPT 没有显著优于 GPT-3。也就是说,RLHF 改善了许多“指令跟随行为”,但并没有自动解决社会偏见问题。

数据分布差异:为什么 FLAN/T0 还不够

论文还比较了在公开 NLP instruction 数据集上微调的模型,比如 FLAN 和 T0。结果是:这些模型比原始 GPT-3 好,也接近带精心 prompt 的 GPT-3,但不如 SFT 和 InstructGPT。

原因主要有两个:

  1. 公开 NLP 数据集更偏向容易自动评测的任务,比如分类、问答、翻译、摘要。
  2. 真实 API prompt 中,大量任务是开放式生成、头脑风暴、改写、聊天,这些任务很难用传统 benchmark 完整覆盖。

这给我们的启发是:训练数据的分布很重要。想做真实可用的指令跟随模型,不能只在“学术任务集合”上优化,还要覆盖用户实际会怎么用。

方法价值:把 RLHF 做成工程闭环

我觉得 InstructGPT 的贡献不只是“用了 RLHF”,而是把一套对齐流程工程化了:

  • 从真实用户 prompt 中构造训练分布。
  • 用标注员示范建立初始行为。
  • 用偏好排序训练奖励模型。
  • 用 PPO 优化模型行为。
  • 用 KL penalty 和预训练梯度控制过优化与能力退化。
  • 用人类偏好、真实性、毒性、偏见、公开 NLP benchmark 多维度评估。

更重要的是,它证明了一个现象:在用户体验层面,微调目标可能比模型规模更关键。

预训练让模型拥有广泛能力,但 RLHF 让这些能力以更符合人类意图的方式释放出来。一个不太严谨但很形象的说法是:

  • 预训练解决“会不会”。
  • SFT 解决“像不像”。
  • RM 解决“好不好”。
  • PPO 解决“能不能稳定变好”。

局限性:它对齐的是特定人群的偏好

论文对自身局限写得很诚实,主要包括以下几点。

第一,对齐对象并不是“全人类价值观”。模型对齐的是一组特定标注员、研究者指令、API 用户 prompt 分布共同塑造出来的偏好。标注员大约 40 人,主要是英语使用者,来自 Upwork 和 ScaleAI,并不代表所有用户和所有受影响群体。

第二,大部分比较只由 1 名标注员完成。对于价值判断、敏感内容、文化差异明显的任务,单一偏好并不总是可靠。

第三,模型仍然会犯简单错误。论文明确提到,InstructGPT 仍可能不遵守指令、编造事实、给简单问题写很长的模糊回答,或者没识别出带错误前提的指令。

第四,有害指令处理不足。由于训练中更偏向 helpfulness,如果用户要求模型生成有害内容,模型可能仍然会照做。这也是 ChatGPT 类系统必须重点补强的安全能力。

第五,偏见问题没有显著改善。RLHF 并不是自动消除偏见的银弹。

工程启发:训练指令跟随模型时真正要抓什么

如果要训练一个真正可用的指令跟随模型,重点不只是“要不要做 RLHF”。更关键的是:指令跟随模型的质量不是单点技术决定的,而是数据、偏好、优化约束、安全策略和评估体系共同决定的。

  1. 先定义模型要服务的任务分布。 做通用问答、代码助手、客服、办公写作、搜索增强问答,所需数据分布完全不同。没有真实任务分布,SFT 和 RM 都容易训练成“看起来会回答”,但上线后不稳定的模型。

  2. SFT 解决的是行为冷启动,不是最终偏好。 高质量示范数据能让模型学会基本格式、语气和任务模式,但它无法覆盖所有“哪个回答更好”的细微差别。SFT 数据要重质量和覆盖面,不宜只堆数量。

  3. RM 决定 PPO 的上限,也决定很多风险。 PPO 优化的不是人类本身,而是奖励模型。如果 RM 对啰嗦、迎合、空泛安全话术、格式化废话给了高分,策略模型就会放大这些偏差。奖励模型需要持续校准,而不是训练一次就结束。

  4. 优化偏好时要保留原有能力。 RLHF 会改变模型行为,也可能伤害原来的知识、推理、翻译、阅读理解等能力。KL penalty、pretraining mix、能力回归测试和人工抽检,本质上都是为了控制 alignment tax。

  5. 安全不能只依赖“让模型更听话”。 InstructGPT 说明指令遵循能力会提升,但坏指令也可能被更好地执行。真正可用的指令跟随模型还需要拒答数据、安全偏好、红队样本、策略边界和上线后的监控。

  6. 评估要覆盖用户体验,而不只是公开榜单。 公开 benchmark 能测一部分能力,但很难衡量是否遵守约束、是否少幻觉、是否语气合适、是否能处理真实长尾需求。上线前要有贴近业务的人工偏好评测和失败案例集。

  7. 对齐对象必须说清楚。 “人类偏好”不是一个天然统一的东西。标注员、产品团队、客户、终端用户和受影响群体可能有不同偏好。做模型对齐时,至少要明确:数据来自谁,标注规则是谁写的,冲突偏好如何处理。

总结:预训练给能力,对齐给可用性

InstructGPT 的核心不是神秘的强化学习公式,而是一个很清晰的工程闭环:

  • 先用人类示范告诉模型“应该怎么答”。
  • 再用人类偏好告诉模型“哪个答得更好”。
  • 然后用奖励模型把偏好变成可优化信号。
  • 最后用 PPO 在不偏离太远的前提下优化模型。

这套流程让 1.3B InstructGPT 在人类偏好上超过了 175B GPT-3,也显著改善了指令遵循、真实性和可控性。但它没有彻底解决幻觉、偏见、有害请求和“到底对齐谁”的问题。

用我自己的话总结:预训练给了模型广泛的语言能力,而基于人类反馈的微调,让这些能力更容易以用户想要的方式表现出来。

参考资料

  1. Training language models to follow instructions with human feedback
  2. Learning to summarize with human feedback
  3. Proximal Policy Optimization Algorithms
  4. Training language models to follow instructions with human feedback - OpenAI