第 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 作为奖励。模型接收真实影评的开头,需要续写出积极的后文。
实践步骤
- 下载三样东西:IMDB 数据集、参考模型(
gpt2_imdb,在 IMDB 上额外微调过一个 epoch 的 GPT-2)、奖励模型(IMDB 上微调过的 BERT 分类器)。 - 加载数据:IMDB 含五万条带正负情感标注的影评,先筛掉少于 200 字符的,再分词,用
LengthSampler随机截断成不定长的开头。 - 加载两份带值头(value head)的 GPT-2:一份用于优化,一份冻结作参考模型算 KL。
- 初始化
PPOTrainer,它负责后续的设备分配与优化。 - 加载 BERT 分类器,确认它对一句明显正面和一句明显负面的输入给出的 logits 方向正确,再把正面类 logit 接成奖励。
- 开训。教程给的复现配置是单卡 NVIDIA A800-SXM4-80GB,占用约 10GB 显存,耗时约 35 分钟。
- 训练前后各采样一批续写做对照,同时记录平均奖励和平均 KL。
常见误区
- 只盯奖励曲线。 奖励一路上涨而 KL 也在飙升,往往意味着模型在钻奖励模型的空子,而不是真的写得更好。两条曲线要一起看。
- 忘了参考模型。 少加载一份冻结模型,KL 项就没了,训练很快退化。
- 拿奖励模型的分数当真实评价。 奖励模型只是人类偏好的一个有噪声的代理,最终结论要靠人读几十条样本。
动手练习
按默认配置跑完一轮,保存训练前后各 50 条续写。先算两组的平均奖励差;再自己逐条读一遍,标注「确实更积极」「更积极但不通顺」「没变化」三类,统计比例。然后把 KL 系数调小一半重跑,比较三类比例的变化——这就是奖励攻击(reward hacking)最直观的一次现场演示。
要点回顾
RLHF 不神秘:生成、打分、带约束地优化。工程上最容易忽略的是那条 KL 约束和奖励模型本身的可靠性。看奖励涨了就宣布成功,是这个方法最常见的自欺。教程结尾那句「阅读后请检查你的大模型是否在冷笑」,说的正是这件事。
参考来源
- 上海交通大学《动手学大模型》系列编程实践教程,第十一章「RLHF 安全对齐」:documents/chapter11,核验日期:2026-09-06。