22年3月来自OpenAI的论文“Training language models to follow instructions with human feedback”。
让语言模型变得更大并不一定意味着它们能够更好地遵循用户的意图。例如,大语言模型可能会生成不真实、有害或对用户毫无帮助的输出。换句话说,这些模型与用户并不一致。这里提到的是一种通过人工反馈进行微调的方法,使语言模型在各种任务上与用户意图保持一致。从一组标注员编写的提示和通过 OpenAI API 提交的提示开始,收集了一个标注员演示所需模型行为的数据集,用这个数据集通过监督学习对 GPT-3 进行微调。然后,收集一个模型输出排名数据集,用这个数据集带人工反馈的强化学习(RLHF)进一步微调这个监督模型。这个模型称为 InstructGPT。在提示分布的人工评估中,尽管参数少了 100 倍,但 1.3B 参数 InstructGPT 模型的输出比 175B GPT-3 的输出更受欢迎。此外,InstructGPT 模型在真实性方面有所改进,有害输出生成有所减少,同时在公共 NLP 数据集上的性能回归最小。尽管 InstructGPT 仍然会犯一些简单的错误,但人工反馈的微调是使语言模型与人类意图保持一致的一个有希望的方向。
该方法遵循 (Ziegler 2019 )和 (Stiennon 2020 )的方法,去应用于文体延续和摘要领域。从一个预训练的语言模型(Radford,2019;Brown,2020;Fedus,2021;Rae,2021;Thoppilan,2022)开始,一个产生对齐输出的提示分布,以及一组训练有素的人工标记员。然后应用如图展示的三个步骤:(1) 有监督微调 (SFT),(2) 奖励模型 (RM) 训练,以及 (3) 通过近端策略优化 (PPO) 在该奖励模型上进行强化学习。蓝色箭头表示此数据用于训练一个模型。在步骤 2 中,框 A-D 是模型中的样本,由标注员进行排序。
提示数据集主要由提交给 OpenAI API 的文本提示组成,特别是那些在 Playground 界面上使用早期版本的 InstructGPT 模型(通过监督学习在演示数据的子集上进行训练)的提示。使用 Playground 的客户被告知,他们的数据可以在使用 InstructGPT 模型时通过定期通知用于训练进一步的模型。不用在产品中使用 API 的客户数据。检查共享一个长公共前缀的提示来启发式地删除重复提示,并将每个用户 ID 的提示数限制为 200 个。还根据用户 ID 创建训练、验证和测试的数据拆分,以便验证和测试集不会包含数据在训练集中的用户数据。为了避免模型学习潜在的敏感客户详细信息,过滤训练中获取个人身份信息 (PII)的所有提示。
为了训练第一批 InstructGPT 模型,要求标注员自己编写提示。这是因为需要一个初始的指令式提示源来引导该过程,而这些类型的提示通常不会提交给 API 的常规 GPT-3 模型。要求标注员编写三种提示:
• 简单:只要求标注员提出一个任意任务,同时确保任务具有足够的多样性。
• 少量样本:要求标注员提出一条指令,以及该指令的多个查询/响应对。
• 基于用户:在 OpenAI API 的候补名单申请中陈述许多用例。要求标注员提出与这些用例相对应的提示。
根据这些提示,生成了三个不同的数据集,用于微调程序:(1)SFT 数据集,带有用于训练SFT 模型的标注员演示;(2)奖励模型 RM 数据集,带有用于训练RM 模型输出的标注员排名;(3)PPO 数据集,没有任何人工标签,用作 RLHF 微调的输入。SFT 数据集包含大约 13k 个训练提示(来自 API 和标注员编写),RM 数据集有 33k 个训练提示(来自 API 和标注员编写),PPO 数据集有 31k 个训练提示(仅来自 API)。如表提供了有关数据集大小的更多详细信息。
关于数据集的组成,在下表中展示了API 提示(特别是 RM 数据集)用例类别的分布。大多数用例都是生成性的,而不是分类或 QA。
在下表中展示了一些指令性提示(由研究人员编写,模仿提交给 InstructGPT 模型的提示类型)。
训练任务有两个来源:(1)由标注员编写的提示数据集,和(2)通过API 提交给早期 InstructGPT 模型的提示数据集。这些提示非常多样化,包括生成、问答、对话、总结、提取和其他自然语言任务。数据集超过 96% 是英语,但是模型也响应其他语言指令和完成编码任务的能力。
对于每个自然语言提示,任务通常直接通过自然语言指令指定(例如“写一个关于一只聪明青蛙的故事”),但也可以通过少量示例(例如给出两个青蛙故事的例子,并提示模型生成一个新的)或隐式延续(例如提供一个关于青蛙故事的开头)间接指定。在每种情况下,要求标注员尽力推断编写提示的用户意图,并要求他们跳过任务非常不清楚的输入。此外,标签员还会考虑到隐含的意图,例如回应的真实性,以及潜在的有害输出,例如偏见或有毒的语言,并以提供的指令和他们的最佳判断为指导。
为了生成演示和比较数据并进行主要评估,在 Upwork 和 ScaleAI 上聘请一支由大约 40 名合同工组成的团队。与早期收集的总结任务中人类偏好数据工作(Ziegler,2019;Stiennon,2020;Wu,2021)相比,输入涵盖的任务范围要广泛得多,有时还会涉及有争议和敏感的话题。目标是选择一组对不同人口群体偏好敏感且善于识别潜在有害输出的标注员。因此,进行一项筛选测试,旨在衡量标注员在这些方面的表现。选择在这次测试中表现良好的标注员。
在训练和评估期间,对齐标准可能会发生冲突:例如,当用户请求潜在有害的响应时。在训练期间,优先考虑对用户的帮助(不这样做需要做出一些艰难的设计决策)。但是,在最终评估中,要求标注员优先考虑真实性和无害性(因为这是真正关心的)。
与 (Stiennon 2020 )一样,在项目过程中与标注员密切合作。有一个入职流程来培训项目的标注员,为每个任务编写详细的指令,并在共享聊天室中回答标注员的问题。
作为一项初步研究,了解模型如何很好地推广到其他标注员的偏好,聘请一组单独的标注员,他们不提供任何训练数据。这些标注员来自同一提供商,但不接受筛选测试。
尽管这项任务非常复杂,但标注者之间的一致性率相当高:训练标注员彼此一致性的比率为 72.6 ± 1.5%,而对于保留标注员而言,这一数字为 77.3 ± 1.3%。相比之下,在 (Stiennon 2020) 的总结工作中,研究人员之间的一致性为 73 ± 4%。
从 (Brown 2020) 的 GPT-3 预训练语言模型开始。这些模型是在广泛的互联网数据分布上训练的,可适应广泛的下游任务,但行为特征不明显。从这些模型开始,用三种不同的技术训练模型:
监督微调 (SFT)。用监督学习在标签演示上对 GPT-3 进行微调。训练了 16 个epochs,使用余弦学习率衰减和 0.2 残差 dropout。根据验证集上RM 分数进行最终的 SFT 模型选择。与 (Wu 2021) 类似,SFT 模型在 1 个epoch后在验证损失上过拟合;然而,尽管存在这种过拟合,但训练更多epochs有助于提高 RM 分数和人类偏好评分。
奖励建模 (RM)。从移除最终非嵌入层的 SFT 模型开始,训练一个模型来接收提示和响应,并输出标量奖励。仅使用 6B RM,因为这样可以节省大量计算,并且175B RM 训练可能不稳定,因此不太适合用作 RL 期间的价值函数。在 (Stiennon2020) 的论文中,RM 是在相同输入两个模型输出之间的比较数据集上进行训练的。他们使用交叉熵损失,将比较作为标签——奖励的差异表示人类标注员更喜欢这个响应而不是另一个响应的log概率。为了加快比较收集速度,给标注员提供 K = 4 到 K = 9 个响应进行排序。由于每个标记任务中的比较都高度相关,如果只是将比较混入一个数据集,则对数据集的一次传递会导致奖励模型过拟合。相反,将每个提示中的所有比较作为单个批处理元素进行训练。这在计算上更加高效,并且由于它不再过拟合,因此它实现了大加改善的验证准确率和对数损失。
强化学习 (RL)。再次遵循 (Stiennon2020) 的做法,用 PPO (Schulman,2017) 在环境中微调 SFT 模型。该环境是一个老虎机环境,它会显示随机客户提示并期望对提示做出响应。给定提示和响应,它会产生由奖励模型确定的奖励并结束该episode。此外,在每个 token 处从 SFT 模型中添加每个 token 的 KL 惩罚,以减轻奖励模型的过度优化。价值函数从 RM 进行初始化。这些模型称为“PPO”。还尝试将预训练梯度混合到 PPO 梯度中,修复公共 NLP 数据集上的性能回归。这些模型称为“PPO-ptx”。
基线。将 PPO 模型的性能与 SFT 模型和 GPT-3 进行比较。还与 GPT-3 进行比较,提供一个少样本前缀以“提示”它进入指令跟随模式(GPT-3 提示)。此前缀被添加到用户指定的指令之前。
此外,在 FLAN(Wei,2021)和 T0(Sanh,2021)数据集上将 InstructGPT 与微调的 175B GPT-3 进行比较,这两个数据集都包含各种 NLP 任务,并结合针对每个任务的自然语言指令(数据集在所包含的 NLP 数据集和使用的指令样式方面有所不同)。分别在大约 100 万个示例上对它们进行微调,并选择在验证集上获得最高奖励模型分数的检查点。
要评估模型的“对齐”程度,首先需要明确对齐在此上下文中的含义。对齐的定义历来是一个模糊且令人困惑的话题,有各种相互竞争的提案(Chen,2021;Leike,2018;Gabriel,2020)。继 (Leike2018)之后,目标是训练按照用户意图行事的模型。更实际地,为了完成语言任务,用类似于 (Askell 2021 )的框架,他们将模型定义为“有用、诚实且无害”的对齐模型。
为了有用,模型应该遵循指令,但也应该从少数提示或其他可解释的模式(例如“Q:{question}\nA:”)推断出意图。由于给定提示的意图可能不明确或模棱两可,依赖于标注员的判断,主要指标是标注员偏好评分。但是,由于标注员不是生成提示的用户,因此用户的实际意图和标注员仅通过阅读提示所认为的意图之间可能会存在差异。
目前还不清楚如何在纯生成模型中衡量诚实度;这需要将模型的实际输出与其对正确输出的“信念”进行比较,而且由于模型是一个大黑盒子,无法推断其信念。相反,使用两个指标来衡量真实性——模型关于世界的陈述是否真实:(1) 评估模型在封闭域任务(“幻觉”)上编造信息的倾向,以及 (2) 使用 TruthfulQA 数据集 (Lin et al., 2021)。不用说,这只能捕捉到真实性实际含义的一小部分。
与诚实度类似,衡量语言模型的危害也带来了许多挑战。在大多数情况下,语言模型的危害取决于它们的输出在现实世界中的使用方式。例如,生成有毒输出的模型在部署的聊天机器人环境中可能会造成伤害,但如果用于数据增强以训练更准确的毒性检测模型,甚至可能会有所帮助。在项目早期,让标注员评估输出是否“具有潜在危害”。但是,后来停止了这种做法,因为它需要过多地推测输出最终将如何使用;特别是因为数据也来自与 Playground API 接口交互的客户(而不是来自产品用例)。
因此,用一套更具体的代理(proxy)标准,旨在捕获部署模型中可能最终造成伤害的不同行为方面:让标注员评估输出在一个客户助理的环境中是否不合适、是否贬低受保护的群体或是否包含性或暴力内容。还在旨在衡量偏见和毒性的数据集上对模型进行基准测试,例如 RealToxicityPrompts(Gehman,2020)和 CrowS-Pairs(Nangia,2020)。
总而言之,可以将定量评估分为两个独立的部分:
API 分布评估。主要指标是人类对来自训练分布相同来源的一组提示偏好评分。当使用 API 中的提示进行评估时,只选择未包含在训练中的客户提示。但是,鉴于训练提示旨在与 InstructGPT 模型一起使用,它们很可能对 GPT-3 基线不利。因此,还对 API 上提交给 GPT-3 模型的提示进行评估;这些提示通常不是“指令遵循”风格,而是专门为 GPT-3 设计的。在这两种情况下,对于每个模型,都会计算其输出优先于基线策略的频率;选择175B SFT 模型作为基线,因为它的性能接近中等水平。此外,要求标注员根据 1-7 Likert 量表判断每个响应的整体质量,并为每个模型输出收集一系列元数据。
公共 NLP 数据集上的评估。会评估两种类型的公共数据集:一种是捕捉语言模型安全性的某个方面,特别是真实性、毒性和偏见,另一种是捕捉传统 NLP 任务(如问答、阅读理解和总结)的零样本性能。还会在 RealToxicityPrompt 数据集(Gehman,2020)上对毒性进行人工评估。