我曾经以为,ChatGPT 之所以能这么流畅地跟我对话,能回答问题、写代码、还能拒绝不当请求,是因为它读遍了互联网上所有的文字,自然而然地就学会了这些能力。但后来我试了几个开源模型,比如 LLaMA 的原始版本,发现它们虽然也能生成文字,但很多时候根本不像是在“对话”——更像是一个人在自言自语,或者突然开始写作文,而且经常给出一些莫名其妙甚至危险的回答。这时候我才意识到,预训练只是让模型学会了“接话”,而真正让它学会“说人话”的,是那一步很多人听过但没细究过的技术——RLHF(Reinforcement Learning from Human Feedback)。

这篇文章,我会用我自己的理解过程,把 RLHF 的三个阶段——监督微调、奖励模型训练、PPO 强化学习——完整拆开,讲清楚每一步在做什么、为什么这么设计、以及我踩过哪些理解上的坑。
预训练出来的模型,其实是个“废话大师”
先想一个问题:一个只在互联网文本上训练出来的语言模型,它的行为目标是什么?预测下一个 token。它没有“我要回答用户的问题”这个概念,也没有“这个答案好不好”的判断。你给它一个 prompt,它只会根据训练数据里的统计规律,续写出一段最像人话的文本。但“像人话”和“有帮助”是两码事——比如你问“怎么做一个炸弹”,它可能真的会把网上搜来的步骤照搬给你,因为它见过太多这样的文本,不知道这是危险的。
所以,要让模型变成“助手”,我们得教它两件事:什么是一个好回答,以及怎么主动生成好回答。RLHF 就是为此设计的。
第一步:监督微调,硬塞一批“标准答案”
最直接的想法:既然模型不会好好回答,那我们就给它一批人类写好的高质量对话数据,让它直接模仿。这一步叫监督微调(SFT),也就是用标注员写的 prompt-回答配对,继续训练模型,让模型学会输出类似人类偏好的回答。
在 OpenAI 的 InstructGPT 论文中,他们先找了一批标注员,写各种各样的 prompt,然后针对每个 prompt 写出一个高质量的回答,组成一个数据集。用这个数据集对预训练模型(比如 GPT-3)做几轮微调,就得到了一个 SFT 模型。这个模型已经比原版好很多了,至少看起来像个助手了。但问题也来了:它只是“模仿”,并没有真正理解“为什么这个回答更好”。而且,标注员写的回答数量有限,不可能覆盖所有场景,模型一旦遇到没见过的 prompt,就容易“乱说话”。
这时候,我们需要一种方法,让模型能从更少的人类反馈中泛化,并且能自己判断回答的好坏。这就引出了 RLHF 的核心——奖励模型。
第二步:训练奖励模型,让 AI 学会打分数
我最早以为,奖励模型就是直接给一篇文章打分,像老师给作文打分一样。但仔细看论文后发现,人类其实很不擅长给出一个绝对分数,但非常擅长比较:“A 比 B 更好”。所以,RLHF 的奖励模型训练数据,是一堆比较数据:同一个 prompt,模型生成两个不同的回答,标注员选择哪个更好。
具体来说,对于同一个 prompt,SFT 模型会生成多个不同的回答(通过调整温度等参数),然后标注员把这些回答按好坏排序。奖励模型要学习的就是一个函数,输入 prompt 和回答,输出一个标量分数,并且这个分数要满足:更好的回答,分数更高。训练时通常使用 Bradley-Terry 模型或者简单的 pairwise ranking loss:让好回答的分数比坏回答的分数高出一定 margin。
这个过程可以用一个表格来对比奖励模型和人类打分的区别:
| 对比维度 | 人类直接打分 | 人类比较排序 |
|---|---|---|
| 难度 | 高,很难给绝对分数 | 低,直觉比较 |
| 一致性 | 低,不同人标准不同 | 相对较高 |
| 奖励模型训练 | 需要大量绝对分数 | 只需要比较对,更高效 |
奖励模型的结构通常就是 SFT 模型去掉最后的生成头,换成一个回归头,输出一个分数。比如 InstructGPT 的奖励模型有 6B 参数,就是在 SFT 模型上改的。
有了奖励模型,是不是直接把 SFT 模型生成的回答扔给它打分,然后选出高分的回答就行了?这样太慢,而且不能精细化调整模型行为。我们需要一种方法,让模型在生成回答时,就能主动“讨好”这个奖励模型。这就是强化学习上场的时候。
第三步:PPO 强化学习,让模型学会看人眼色
强化学习的框架很简单:模型(策略)输出一个回答,环境(奖励模型)给一个分数,模型根据分数调整自己,下次争取拿更高分。但这里有一个关键问题:如果模型只追求奖励分数最大化,它可能会学出一些奇怪的、但是被奖励模型错判为高分的回答(reward hacking)。比如,奖励模型可能因为训练数据里长回答更容易被偏好,结果模型就学会输出一堆废话来刷分。
为了防止这种情况,RLHF 在优化目标里加了一个KL 散度惩罚项:让当前的策略模型不要离初始的 SFT 模型太远。也就是说,你既可以优化奖励,又得保证自己说的话还像人话,不能跑偏。这个惩罚项的系数 β 是一个很重要的超参数,太大了模型学不到新东西,太小了模型容易作弊。
实际使用的算法是 PPO(Proximal Policy Optimization),一种在稳定性和效率之间平衡得很好的策略梯度算法。它每次会采样一批 prompt,用当前策略模型生成回答,奖励模型打分,然后计算优势函数,更新策略参数,同时控制更新幅度不要太大。整个过程可以看作:模型在“试探”如何生成回答,然后根据奖励信号微调自己的生成概率分布,同时保持与 SFT 模型输出的相似性。
我踩过的一个坑:一开始我以为 KL 惩罚只是为了防止模型“乱说话”,但后来发现,它还有一个更根本的作用——模仿人类偏好分布的平滑性。人类偏好本身不是绝对化的,同一句话可能有人觉得好有人觉得不好。KL 惩罚让模型不会过度拟合某一种片面的偏好,而是保留一定的多样性。
为什么 RLHF 这么麻烦,不直接搞成端到端?
你可能会问:既然奖励模型也是从人类偏好数据训练出来的,那为什么不直接用这些偏好数据去微调语言模型,非要搞一个强化学习循环?
这确实是一个好问题,而且后来有人真的这么干了——DPO(Direct Preference Optimization)就是直接优化偏好数据,不需要显式训练奖励模型,也不用 PPO。它的核心思想是:在偏好数据上,最优策略的隐式奖励函数可以直接用策略本身表示出来,然后通过一个简单的二分类 loss 来优化。DPO 训练更稳定,实现更简单,在不少任务上效果和 RLHF 相当。但是,RLHF 有一个优势:奖励模型可以泛化到未见过的回答上,而 DPO 只能利用已有的偏好数据,当需要探索更复杂的回答策略时,RL 的在线采样能力可能更有利。
这里用一张表来对比两种方法:
| 特性 | RLHF (PPO) | DPO |
|---|---|---|
| 训练复杂度 | 高,需训练奖励模型+RL | 低,直接微调 |
| 在线探索 | 有,可探索新回答 | 无,仅利用已有数据 |
| 稳定性 | 需要精细调参(KL 系数等) | 较稳定 |
| 效果 | 在复杂任务上可能更好 | 很多任务上可比拟 |
目前,业界主流还是 RLHF,但 DPO 等简化方法正在快速追赶。
RLHF 真的能让模型看懂“眼色”吗?
我的判断是:RLHF 让模型学会了“迎合”人类标注员的偏好,但并没有真正让模型理解人类意图。它更像是一种行为层面的对齐,而不是认知层面的对齐。奖励模型捕捉的是标注员当下的偏好,这些偏好可能不一致、有偏见,甚至可以被模型利用。
一个典型的局限:幻觉。RLHF 很难纠正模型编造事实的倾向,因为奖励模型本身也不一定知道答案的真假,它只能根据回答的“语言表现”打分,比如回答是否流畅、自信、详细。如果模型自信地编造了一个答案,奖励模型很可能给高分。所以,RLHF 后的模型依然会胡说八道,只是胡说时显得更“真诚”了。
另一个局限:偏好对齐的不可扩展性。标注员的人力有限,能覆盖的领域和场景也有限。当模型遇到极其小众的 prompt 时,RLHF 的约束可能失效,模型会暴露出原始预训练的行为。
尽管如此,RLHF 仍然是目前让大语言模型变得“可用”的关键一步。没有它,ChatGPT 不会这么礼貌,Claude 不会这么无害,我们和 AI 的交互还停留在“续写模式”。
最后,留一个思考题:如果有一天,人类反馈的成本变得极低,比如用 AI 生成反馈,那么 RLHF 的流程会变成什么样? 这可能就是 RLAIF(AI 反馈强化学习)在探索的方向。
我在写这篇文章时,反复翻阅了 InstructGPT 论文、Anthropic 的 HHH 论文、Hugging Face 的 RLHF 博客 以及 OpenAI 对齐研究博文,这些资料帮助我理清了 RLHF 的细节,建议你也去读一读。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/166.html