课程目录

第 11 课 · 动手学大模型(上海交大)

RLHF Safety Alignment

RLHF 安全对齐:把 PPO 跑通一遍

前面十章要么在改参数,要么在测边界。最后一章把两件事合起来:用强化学习让模型的输出向人类偏好靠拢。教程整合了网络资料和 trl 官方示例,做一个最小但完整的 PPO 实验。

学习目标

  • 理解 PPO 在 RLHF 中的三段式流程。
  • 跑通一次完整的 RLHF 训练:奖励模型、参考模型、待优化模型三者如何配合。
  • 观察 KL 散度作为约束项的实际作用。

核心概念

PPO 的运作分三步。Rollout:语言模型根据 query 生成响应。Evaluation:用函数、模型、人工反馈或它们的组合评估这些响应,为每个 query 与 response 对生成一个标量值。Optimization:用 query 与 response 对计算序列中每个 token 的对数概率,分别在训练模型和参考模型上算一遍,两者之间的 KL 散度作为额外的奖励信号,确保生成的响应不会偏离参考模型太远。

这里的 KL 项是整个方法的安全带。没有它,模型会为了骗高奖励而输出退化文本——比如反复堆叠几个高分词。参考模型是训练开始时的那份快照,它定义了「不要跑太远」的那个原点。

实验设置很直白:微调 GPT-2 生成积极的 IMDB 影评,用一个在 IMDB 上微调过的 BERT 情感分类器充当奖励函数,取正面类的 logit 作为奖励。模型接收真实影评的开头,需要续写出积极的后文。

实践步骤

  1. 下载三样东西:IMDB 数据集、参考模型(gpt2_imdb,在 IMDB 上额外微调过一个 epoch 的 GPT-2)、奖励模型(IMDB 上微调过的 BERT 分类器)。
  2. 加载数据:IMDB 含五万条带正负情感标注的影评,先筛掉少于 200 字符的,再分词,用 LengthSampler 随机截断成不定长的开头。
  3. 加载两份带值头(value head)的 GPT-2:一份用于优化,一份冻结作参考模型算 KL。
  4. 初始化 PPOTrainer,它负责后续的设备分配与优化。
  5. 加载 BERT 分类器,确认它对一句明显正面和一句明显负面的输入给出的 logits 方向正确,再把正面类 logit 接成奖励。
  6. 开训。教程给的复现配置是单卡 NVIDIA A800-SXM4-80GB,占用约 10GB 显存,耗时约 35 分钟。
  7. 训练前后各采样一批续写做对照,同时记录平均奖励和平均 KL。

常见误区

  • 只盯奖励曲线。 奖励一路上涨而 KL 也在飙升,往往意味着模型在钻奖励模型的空子,而不是真的写得更好。两条曲线要一起看。
  • 忘了参考模型。 少加载一份冻结模型,KL 项就没了,训练很快退化。
  • 拿奖励模型的分数当真实评价。 奖励模型只是人类偏好的一个有噪声的代理,最终结论要靠人读几十条样本。

动手练习

按默认配置跑完一轮,保存训练前后各 50 条续写。先算两组的平均奖励差;再自己逐条读一遍,标注「确实更积极」「更积极但不通顺」「没变化」三类,统计比例。然后把 KL 系数调小一半重跑,比较三类比例的变化——这就是奖励攻击(reward hacking)最直观的一次现场演示。

要点回顾

RLHF 不神秘:生成、打分、带约束地优化。工程上最容易忽略的是那条 KL 约束和奖励模型本身的可靠性。看奖励涨了就宣布成功,是这个方法最常见的自欺。教程结尾那句「阅读后请检查你的大模型是否在冷笑」,说的正是这件事。

参考来源

  • 上海交通大学《动手学大模型》系列编程实践教程,第十一章「RLHF 安全对齐」:documents/chapter11,核验日期:2026-09-06。