SFT 不够吗?为什么需要 RLHF?这是一道很普遍的面试题,如果能深入理解一下 ChatGPT 两阶段训练背后真正的动机是什么,那么心中自然会有答案了。
我恰好在多种情境中实践过模仿学习、强化学习以及逆强化学习,熟悉它们之间的不同组合方式。
因此,我想要分享我的一些经验和想法。这些观点可能并不完全正确,但我希望它们能为你带来一些灵感。
接下来我会从动机的角度切入,依次介绍两阶段训练的内容。直至最后得出结论。
时间回到 2020 年。假如你在 OpenAI 任职,你手上恰好有一个 GPT-3,下一步该干嘛?
从 GPT-2 和 GPT-3 的论文中可以看出,你可能想要通过一种可以 scaling 的统一的建模方式解决所有的 NLP 任务。
想要解决 NLP 任务的话,就要告诉 GPT-3 你要它做什么,因此你真正需要的是一个对话语言模型。
现在你的思路应该是,做一下 GPT-3 的 bad case 分析,看看究竟还差在哪儿。
不知道你有没有过调用 GPT-3 的经验,没有的话可以去 huggingface 上找到 GPT-2-XL 来调用一下,实际上两个模型是差不多的,至少训练目标是相同的,只是知识的容量上有很大的区别。
假如你输入了一个 prompt:“中国的首都是”,此时你想要的 prompt+response 应该是:“中国的首都是北京”。对吧?
然而,你实际上看到的 prompt+response 很可能是:“中国的首都是北京,美国的首都是华盛顿”(这是真实的 case)。
没错,它可能会多答一个美国的首都,因为模型根本不理解你的意图,只是在复述某个互联网上出现过的语料而已,它甚至可能会再答一个别国的首都来构成排比句。
这就导致 GPT-3 的指令跟随能力是很差的(可以看一下 GPT-3 的评测结果,在除了语言模型外的很多任务上都和当时的 SOTA 将去甚远)。
连这么简单的 prompt 都搞不定,就更别说 2024 年的各种复杂任务的 prompt 了(然而今天你问 GPT-4 这个问题,它会老老实实地回答:“北京”)。
好了,你现在知道 GPT-3 的指令跟随能力不行了,接下来呢?
你可能会问,为什么会有 RLHF 这个选项?这不是对齐步骤才用的吗?
其实啊,现在实际上已经在做对齐了,是在做“互联网语言模型”到“对话语言模型”的对齐。

“互联网语言模型”到“对话语言模型”的对齐
这时候你一拍脑瓜说,要不用 RLHF 吧!毕竟 PPO 就是 OpenAI 自家的技术。于是乎你收集了 prompt 数据、偏好数据,训练得到了一个 reward model,然后做了一堆实验。最后发现,为什么在 RL 的采样阶段得到的 reward 总是这么低呢?我们知道,RL 的时候 agent 获得正向反馈的比例不能过低,不然它就会一直受打击,从此一蹶不振。其实这还是跟 GPT-3 的原始语料有关系。刚刚说了,问答语料在互联网所有语料中的比例是相当小的。因此你很可能会发现,你对同一个 prompt 采样了 100 个回答,其中连一个跟随指令的都没有!所以绝不能让模型这么漫无边际的试错,要简单明了地让模型知道,到底什么才是回答问题应有的样子。于是决定,找人把这些 prompt 对应的 response 标一下,然后做 SFT。第二天你就开始实践了,搞出了第一版,我们可以称之为 GPT-3.5-SFT。其实这也是 AlphaGo-Lee 的第一阶段用人类棋手的棋谱做 SFT 的原因,对于一个随机策略来说,想要学到像样的走子模式实在是太难了。虽然 GPT-3 不是随机策略,但对于其对齐目标来说,也没比随机好太多。至于没有 SFT 的 AlphaGo-Zero 为什么能成功,那可能是因为比起人类的语言,围棋的“语言”,终究还是太简单了。更重要的是,我觉得 DeepMind 当时一定是用了更高效的工程架构和更强大的算力,不然训练难度会比 AlphaGo-Lee 提升不止一星半点。看到这里你可能都不耐烦了。你想说:“喂!搞清楚,我问的是为什么 SFT 之后还需要 RLHF!”当训练出 GPT-3-SFT 后,你迫不及待地开始了测试。你发现,GPT-3-SFT 大体上有了指令跟随的效果。基本上让它答啥它就答啥,大的方向上不会跑偏了。
不过,你很快又发现了新问题:
为什么呢?因为先前你的目标是做“对话语言模型”,而不是做“可用性强且安全的语言模型”。
现在你需要将你的对话语言模型对齐到可用性强且安全的对话语言模型上去。

“对话语言模型”到“可用性强且安全的语言模型”的对齐
你恐怕忍不住想,刚刚已经成功应用 SFT 了,我现在是不是可以再来一遍?
当然可以了,不过横在你面前的困难是:
思考良久,你决定用使用模型生成的答案。这时一个计划浮现在你眼前:
- 可以先让 GPT-3-SFT 给你的 prompt 数据集生成一些答案,然后人工标一下哪些答案是好的,接着用这些答案给 GPT-3-SFT 做微调。得到的模型叫做 GPT-3-SFT-2
- 再让 GPT-3-SFT-2 生成一些答案,然后再人工标一下哪些答案是好的,接着再用这些答案给 GPT-3-SFT-2 做微调,得到的模型叫做 GPT-3-SFT-3
再让 GPT-3-SFT-3 生成一些答案……
你不禁要问:“难道我是大怨种吗?一遍一遍地请人标?一遍遍地跑这个流程,多麻烦啊!”你说:“我就不能一次性标个够,然后让模型来帮我标哪些答案是好的吗?我难道不能……哎?这么说,我这已经是在做 RLHF 了?”然而,聪明的你想到了之前的问题:“可是……之前在把互联网语言模型对齐到对话语言模型的时候,遇到过一个 reward 始终偏低,得到的都是负反馈的问题。”实际上这回就不用担心了,因为 GPT-3-SFT 已经是一个对话语言模型了,它已经会给出答案了,只是答案的质量参差不齐。因此对于同一个 prompt,它生成的答案的 reward 的分布会相对比较均匀。而且这回你不仅可以标注哪些是好的,还可以标注哪些是坏的。强化学习也可以支持你使用负反馈(当然,我实测过魔改 SFT 的 loss 也能支持,就是会不太稳定,当你解决稳定性问题后,会发现得到的算法十分像 off-policy 版的策略梯度,只不过 loss 里多了些东西)。你还可以对同一个 prompt 生成多个答案,然后标注出一个排序列表,接着来它一个 Learning To Rank 来建模奖励模型(比方说 OpenAI 实际使用的 pairwise-loss)。这样奖励模型的泛化性更好,对齐后的模型的泛化性自然也就更好了。当然,还有 RLHF 还有一些额外的好处。例如,如果用 PPO 的话,在 token 的奖励分配上也会获得不小的提升。这下似乎得到一个不错的方案了。你废寝忘食,日以继夜地跑 RL 的迭代,终于开发出了 GPT-3.5。ps:故事到这里就结束了(怎么感觉写成《ChatGPT演义》了哈哈哈)。我们总结一下,为什么 SFT 之后还需要用 RLHF,那就是:RLHF 大法好。有迭代上的便利,能针对模型的真实的输出做定向调整,能天然地利用负反馈,有很强的泛化性,还能处理 token 的奖励分配。
因此本应该从头到尾都用 RLHF,但由于两阶段对齐目标不同,导致第一阶段不得不用 SFT。接下来自然是用效果更好的 RLHF 了。来源:https://www.zhihu.com/question/651021172/answer/3515756475