极市导读
如何让语言模型更懂你?训练语言模型以遵从人类指令,详解InstructGPT 背后的 RLHF 技术。>>加入极市CV技术交流群,走在计算机视觉的最前沿
本文目录
1 InstructGPT:训练语言模型以遵从人类指令
(来自 OpenAI)
1.1 背景:如何让语言模型更懂你?
1.2 InstructGPT 的新发现
1.3 InstructGPT 背后的 RLHF 技术
1.4 InstructGPT 训练数据集
1.5 InstructGPT 具体的模型和训练策略
1.6 InstructGPT 实验结果
太长不看版
2022年底-2023年初由 OpenAI 提出的 ChatGPT 和 GPT-4,在一系列生成,对话,翻译和多模态任务中取得了震惊世界的效果。而这两个工作的基础是发布于2018年-2020年的 GPT,GPT-2,GPT-3 模型。GPT 系列模型的特点是巨大的模型,巨大的训练语料数据和巨大的算力成本。
| 模型 | 发布时间 | 参数量 | 预训练数据量 |
|---|---|---|---|
| GPT | 2018 年 6 月 | 1.17 亿 | 约 5GB |
| GPT-2 | 2019 年 2 月 | 15 亿 | 40GB |
| GPT-3 | 2020 年 5 月 | 1,750 亿 | 45TB |
表格来自:大师兄:预训练语言模型之GPT-1,GPT-2和GPT-3
本文主要介绍 InstructGPT 模型。
-
GPT 第1代模型定出了 GPT 系列模型的基本架构,即:GPT 的系列架构都是基于 Transformer 的 Decoder。
2. GPT-2 定出了 GPT 做各种下游任务的模式,即可以通过使用 Prompt 以一种 Zero-Shot 的方式完成下游任务,无需 Fine-Tuning,无需下游任务的领域内有标签数据。
3. GPT-3 不再执着于 Zero-Shot 的方式,即一条下游任务的数据都不用。而是把注意力集中在 Few-Shot 的方式,即只使用少量下游任务的数据。但是,GPT-3 强调把模型做得很大,最大的模型约 175B 的参数,大到这样的模型可以很好地完成 Few-Shot 的下游任务。预训练好的 GPT-3 在迁移到下游任务时,不进行任何的参数更新,仅仅依靠输入的例子和对问题的描述来完成。
GPT 到 GPT-3 更详细的介绍在:
GPT系列来龙去脉大起底(一)|第一代 GPT:无标注数据预训练生成式语言模型
GPT系列来龙去脉大起底(二)|GPT-2:GPT 在零样本多任务学习的探索
GPT系列来龙去脉大起底(三)|GPT-3:大型语言模型是少样本学习器
本文介绍 InstructGPT 模型,它让 GPT 类模型得以遵从人类的指令。
介绍 InstructGPT 模型之前我们首先去到 ChatGPT 的官网:Introducing ChatGPT。OpenAI 的官方博客在介绍 ChatGPT 的方法部分中,可以注意到这么2段话,并附带了这样一张图:
We trained this model using Reinforcement Learning from Human Feedback (RLHF), using the same methods as InstructGPT, but with slight differences in the data collection setup.
ChatGPT is fine-tuned from a model in the GPT-3.5 series, which finished training in early 2022. You can learn more about the 3.5 series here. ChatGPT and GPT-3.5 were trained on an Azure AI supercomputing infrastructure.
这里我们提炼出两点关于 ChatGPT 的关键信息:
ChatGPT 这个震惊世界的大模型训练方法其实是来自于本文介绍的这个 InstructGPT 的思想。InstructGPT 所使用的主要技术手段就是这个 Reinforcement Learning from Human Feedback (RLHF)。
https://openai.com/research/instruction-following
ChatGPT 由 GPT-3.5 微调得到,那么这个 GPT-3.5 究竟是什么也没有论文和技术报告,但是李沐老师给出了他的猜测:
https://www.youtube.com/watch?v=zfIGAwD1jOQ&t=599s
这个链接是 OpenAI 关于 GPT-3.5 的介绍博客:
https://platform.openai.com/docs/model-index-for-researchers
关于 Reinforcement Learning from Human Feedback (RLHF) 这个技术,大致可以分为这么3部分:
1. 构造一个带有人类指令的数据集,进行有监督微调: 作者们聘请了 40 个人的团队来标数据,主要是针对用户提交给 OpenAI API 的问题 (Prompts) 标了一些期望的回复 (human-written demonstrations),并使用这个标注的数据微调 GPT-3,这一步是个有监督学习 (Supervised Fine-Tuning)。但是值得注意的是,SFT 的数据集是一种对话形式的数据集,带有 Prompt,这种数据集的采集成本很大,所以通常数据的量级不大。
2. 构造一个新数据集,训练一个 Reward Model: 对第1步训练的模型喂入一些 Prompt,使它输出多个结果。人类来打分,所得到的这些包含 {Prompt 和人类给的分数} 的数据集训练一个 Reward 模型。这个模型的作用是预测人类更喜欢模型的哪个输出。
3. 使用这个 RM 作为奖励函数,并使用 PPO 算法微调第1步训练的模型以最大化这个奖励: 将第1步训练的 LLM 模型视为策略 (Policy),第2步训练的 Reward 模型视为环境 (Environment),采用 PPO 的 RL 方法训练 LLM 模型,得到最终的模型。
作者将生成的模型称为 InstructGPT。InstructGPT 是一个与人类偏好对齐的语言模型。作者训练了3个 InstructGPT,分别是 1.3B, 6B, 175B 参数量。在人工评估中,1.3B 参数 InstructGPT 模型的输出好于 175B GPT-3 的输出,同时参数少 100 倍。此外,InstructGPT 模型在输出的真实性上有改进,同时有毒的输出更少了。InstructGPT 的结果表明,使用人工反馈进行微调是对齐语言模型和人类意图的一个很有前景的方向。
关于 InstructGPT 的更详细介绍如下。
1 InstructGPT:训练语言模型以遵从人类指令
论文名称:Training language models to follow instructions with human feedback
论文地址:
https://arxiv.org/pdf/2203.02155.pdf
1.1 背景:如何让语言模型更懂你?
以 GPT-3 为代表的语言模型在面对各式各样的下游任务,可以在不训练任何参数的情况下,仅仅借助其强大的 In-Context Learning 的能力完成下游任务,这显示出无监督预训练出来的语言模型有着强大的生成能力。虽然说,我们给 GPT-3 一些 Prompt,它就能生成文本,但是一个问题是它生成的文本是不受控的。可能生成一些瞎编的,错误的,有害的,甚至是废话。或者说,GPT-3 这样训练出的大语言模型本身并不使它们更擅长遵循用户的意图。
为什么会出现这种现象? 李沐老师这里给出了个通俗易懂的解释:
https://www.youtube.com/watch?v=zfIGAwD1jOQ&t=599s
很简单,因为大语言模型无监督训练方法是 "从互联网上的大量语料库中学习根据上文来预测下一个词" ,它做的是个生成任务。而不是 "根据人类的指令生成有帮助,无害的对应答案" 。换句话讲,你喂进去的文本里有什么,它就学到了什么,没法和人类的意图一致。在实际应用当中,如果我们部署这样的语言模型是会出问题的。
文本里面假如有这样的语料:{请给我算一道数学题,题目是 3+9=,答案是 12} ,那么使用这样的文本无监督训练好的模型,那么训练好以后你问它:"请给我算一道数学题,题目是 3+9=,答案是:",它就可能会输出正确的答案 12。
文本里面假如有这样的语料:{我说美国总统的任数,你来回答名字,题目是第44任,答案是奥巴马},那么使用这样的文本无监督训练好的模型,那么训练好以后你问它:"我说美国总统的任数,你来回答名字,题目是第44任,答案是:",它就可能会输出正确的答案奥巴马。
但是,你的文本是一段一段的文章,一本一本的书,谁能够保证这个文本里面有类似 {请给我算一道数学题,题目是 3+9=,答案是 12} 这么精确的,带有人类指令的话?
1. 假如 GPT-3 的训练文本中有很多类似的数据,那么训练好以后你问它:"请给我算一道数学题,题目是 3+9=,答案是:",它就可能会输出正确的答案 12。你问它:"我说美国总统的任数,你来回答名字,题目是第44任,答案是:",它就可能会输出正确的答案奥巴马。
2. 假如 GPT-3 的训练文本中没有类似的数据,我们其实就很难对模型的输出进行有效的控制。因为道理也很简单,训练好以后你问它:"请给我算一道数学题,题目是 3+9=,答案是:",它就可能会输出一堆乱七八糟不知所云的回答,而不会输出正确的答案 12。你问它:"我说美国总统的任数,你来回答名字,题目是第44任,答案是:",它就可能会输出一堆乱七八糟不知所云的回答,而不会输出正确的答案奥巴马。
本文介绍的 InstructGPT 这个技术力求语言模型在明面上遵循人类的意图,同时在暗面上满足:
-
生成内容对人类有帮助:能帮人解决问题。 -
生成内容诚实:不应该制造信息或误导用户。 -
生成内容无害:不应该对人或环境造成身体、心理或社会伤害。
InstructGPT 的作者团队首先构造一个带有人类指令的数据集,他们聘请了 40 个人的团队来标数据,主要是针对用户提交给 OpenAI API 的问题 (Prompts) 标了一些期望的回复 (human-written demonstrations),并使用这个标注的数据微调 GPT-3,这一步是个有监督学习。
问:简单地把语言模型再加大可以做到类似的事情吗?
答:已有的大语言模型似乎并不能遵循用户的意图,而且还可能会输出不真实、有毒的内容或者是废话。换句话说,这些模型与他们的用户没有对齐 (Align)。
1.2 InstructGPT 的新发现
1. 相比 GPT-3 的输出,打标签的人更喜欢 InstructGPT 的输出: 比如在作者的测试集上,打标签的人更喜欢 1.3B 参数 InstructGPT 的输出相比于 100 倍大小的 175B GPT-3 的输出。InstructGPT 和 GPT-3 具有相同的架构,不同之处仅仅在于 InstructGPT 在人类数据上进行了微调。
2. InstructGPT 在生成内容的真实性上好于 GPT-3: 在一些 TruthfulQA 评估的数据及上面,InstructGPT 生成真实和信息丰富的答案大约是 GPT-3 的两倍。并且 InstructGPT 生成一些 "编造" 答案大约是 GPT-3 的一半。
3. InstructGPT 在生成内容的毒性上比 GPT-3 略有改进,但依然存在偏见: 作者通过 RealToxicityPrompts 这个数据集来评价语言模型生成内容的毒性,评价方法包含自动评价和人工评价。InstructGPT 模型产生的有毒输出比 GPT-3 少约 25%。InstructGPT 在 Winogender 和 CrowSPairs 数据集上相比于 GPT-3 并没有显着改善。
4. 可以通过修改 RLHF 微调过程来最小化公共 NLP 数据集上的性能回归。
5. InstructGPT 对那些不打训练集标签的人 ("held-out" labelers) 依然有泛化能力: 作者发现那些不打训练集标签的人相比 GPT-3 的输出,更喜欢 InstructGPT 输出。
6. 公共 NLP 数据集不能反映 InstructGPT 的性能: 作者将在人类偏好数据 (InstructGPT) 上微调的 GPT-3 与在两个不同公共 NLP 任务上微调的 GPT-3 (FLAN 和 T0) 进行比较。人类偏好数据数据集由各种 NLP 任务组成,且每个任务都涵盖一些自然语言的指令。在 API 提示分布上,FLAN 和 T0 模型的表现略低于 SFT 基线,并且标注工相比于 GPT-3 微调的模型,明显更喜欢 InstructGPT。
7. InstructGPT 模型对 RLHF 微调分布之外的指令具有很好的泛化能力: 作者定性地探究 InstructGPT 的能力,发现 InstructGPT 能够遵循一些这样的指令,比如:总结代码的功能,问一些关于代码的问题。但是这些指令在微调的数据中很罕见。相比之下,GPT-3 也可以执行这些任务,但需要更仔细地设计 prompt,并且通常不会很好地遵循这些指令。这说明 InstructGPT 即使是在几乎没有直接监督信号的任务上,仍能保留一些基本能力。
8. InstructGPT 仍然犯简单的错误: InstructGPT 有时仍然无法遵循指令,甚至会编造事实,为一些简单问题生成冗长且复杂的回答,或者无法检测到带有错误前提的指令。
总体而言,InstructGPT 的结果表明,尽管安全性和可靠性还有待提高,但是使用人类偏好微调大型语言模型可以显着提高它们在很多任务上的行为。
1.3 InstructGPT 背后的 RLHF 技术
如图2所示,Reinforcement Learning from Human Feedback (RLHF) 大致可以分为这么3部分:
1. 让标注工标注一个数据集。 数据部分就是人类的指令 (主要是针对用户提交给 OpenAI API 的问题),标签部分就是标注工写的一些期望的回复。使用这个标注的数据通过有监督学习 (Supervised Fine-Tuning) 的范式微调 GPT-3。 得到的模型也可以看成是 RL 里的一个 Policy (给定输入指令输出期望回复)。
2. 第一步的模型,对于每个指令生成多个回复。让标注工再标注一个新数据集。 数据部分就是人类的指令,标签部分就是标注工对于几个回复的排序。使用这个新数据集训练一个打分模型 (Reward Model)。 这个模型的作用是预测人类更喜欢模型的哪个输出。
3. 根据第2步得到的打分模型,使用 PPO 算法微调第1步训练的模型: 将第1步训练的 LLM 模型视为策略 (Policy),第2步训练的 Reward 模型视为环境 (Environment),采用 PPO 的 RL 方法训练 LLM 模型以最大化奖励,RL 学习的训练目标是最大化打分模型的输出奖励值。RL 微调之后的结果为最终得到的模型。
1.4 InstructGPT 训练数据集
InstructGPT 训练数据集其实包含3部分,如下图3所示。
1. 有监督学习 (Supervised Fine-Tuning) 训练数据集:
第1步微调的数据中,Prompt 部分主要来自 Playground。
用户使用 Playground,其输入的指令也会被继续用来重复训练后续版本的 InstructGPT 模型。作者还基于用户 ID 创建了训练集、验证集和测试集,以便验证集和测试集不包含来自数据在训练集中的用户的数据。为了避免模型学习潜在敏感客户细节的模型,作者过滤训练拆分中的所有提示以进行个人身份信息 (personally identifiable information, PII)。
这个数据集大约有 13k 条,每条包括指令和标注工写的回复作为标签。
2. 打分模型 (Reward Model) 训练数据集:
第2步打分模型训练数据中,主要是由标注工对第1步模型的多个数据进行排序,得到这样一个数据集。
这个数据集大约有 33k 条,每条包括指令和标注工对第1步模型输出回复的排序作为标签。
3. 强化学习微调数据集:
第3步 RL 算法训练数据中,没有任何人类的标签。依靠打分模型作为 RL 的环境完成训练。
这个数据集大约有 31k 条,每条仅有指令。
图3中的 train 代表训练集,valid 代表验证集,labeler 代表标注工写的 Prompt,customer 代表用户通过 API 给的 Prompt。这些 Prompt 非常多样化,包括生成、问答、对话、摘要、提取和其他自然语言任务。作者要求标注者们尽力推断写提示的用户真实的意图,对于不清楚的输入就跳过。而且考虑回复的真实性,以及规避掉有毒和有害的输入。
为了去写所有的 Prompt 的回复,作者团队雇佣了40位严格挑选的合同工,这些合同工对不同的人口统计群体的偏好很敏感,他们擅长识别可能有害的输出。
1.5 InstructGPT 具体的模型和训练策略
InstructGPT 从 GPT-3 预训练好的模型开始:
1. 先经过第1步的有监督学习 (Supervised Fine-Tuning) 的范式微调 16 Epochs。 作者发现 SFT 模型在1个 Epoch 后开始在验证集上过拟合。但是作者又发现训练更多的 Epoch,尽管增加了过拟合,但是有助于打分模型的评分和人类偏好评分。
2. 打分模型是一个 6B 参数的模型,输出一个标量表示分数。 为了提高这个打分的计算效率,作者采用了这样的一个策略。给标注工看一个 Prompt,和 个模型的输出,让标注工对这9个输出谁好谁坏做个排序。标注工对于这个 Prompt 其实就是要比较 次。
假设打分模型的参数为 , 训练数据用 来表示, 训练打分模型的目标函数是:
这里解释几点:
-
有负号是因为想让后面的期望值越大越好。 -
最后除以 是因为这个期望值其实是计算了 次, 取个平均值。 -
是输入 Prompt, 和 是两个模型输出结果, 是人类更偏爱的结果。 -
和 是打分模型的对应给分, 希望他俩差距越大越好。
至于为什么选 而不是更小的值, 是因为 9 个输出就一共能比较 次。也就是说, 我把9个输出喂入打分模型, 花了9个时间, 但是相当于是比较了36次, 单位时间比较了4次, 计算效率还可以。如果换做 个输出一共才能比较 次, 也就是说, 我把4个输出喂 入打分模型, 花了4个时间, 但是相当于是比较了6次, 单位时间比较了1.5次, 计算效率较低。
3. PPO 算法微调第1步的 SFT 模型。
PPO 算法微调的目标函数是:
式中, 表示第3阶段实时更新的 GPT 模型, 也是 RL 算法中的 Policy, 用, 其中 是模型参数。 表示第1步的 SFT 模型。 是第3阶段 Prompt 的数据集, 是训练 GPT-3 的数据集。
这个式子的意思是:
对于 中的每一个 Prompt , 通过语言模型 (RL 算法中的 Policy) 生成一个回复 , 把 和 喂给打分模型得到分数 。通过优化语言模型的参数 使得打分模型的分数越大越好。
第2项的意思是说: 阶段初始的模型是 , 实时更新的模型是 , 那么 PPO 算法其实是不希望这俩模型之前差距太大, 所以就给目标函数减去了一项 KL 散度, 以减轻过度优化。当 和 完全一样时, 。
第3项的意思是说:RL 阶段希望语言模型的输出更像人类, 但是可能对于原来的生成任务而言性能就不那么好了。因此这一项 的意思是说从 GPT-3 的预训练文本中采样一些文本 , 希望模型尽量增大生成文本 的概率。
1.6 InstructGPT 实验结果
InstructGPT 主要实验结果如下图4所示,x轴代表不同大小和尺寸的3个模型,y轴代表模型的输出跟 175B 大小的 SFT 模型相比更受欢迎的频率:175B 大小的 SFT 模型跟自己相比更受欢迎的频率是0.5。
可以看到最下面的线是 GPT-3,相比 175B 大小的 SFT 模型差距甚远。GPT (prompted) 表示 GPT-3 在 Prompt 上做比较多的调整之后的模型。这个模型是有一些提升的,而且这个提升是要好过简单放大模型带来的提升的。用了 RL 算法的模型 PPO 和 PPO-ptx 的提升巨大,甚至是 1.3B 模型的性能已经超越了 175B SFT 模型的性能。
参考:
https://www.youtube.com/watch%3Fv%3DzfIGAwD1jOQ%26t%3D599s

公众号后台回复“极市直播”获取100+期极市技术直播回放+PPT
极市干货
# 极市平台签约作者#
科技猛兽
知乎:科技猛兽
清华大学自动化系19级硕士
研究领域:AI边缘计算 (Efficient AI with Tiny Resource):专注模型压缩,搜索,量化,加速,加法网络,以及它们与其他任务的结合,更好地服务于端侧设备。
作品精选

