论文标题:Training language models to follow instructions with human feedback
论文链接:https://arxiv.org/abs/2203.02155
论文来源:OpenAI
一、概述
大型语言模型(Large language models,LLMs)可以通过被prompted来执行一系列NLP任务,这通常以给出一些任务相关的样本的方式来完成。然而LLMs经常会展现出一些非预期的行为。这些行为包括编造事实、生成有偏见或有毒的文本,或者简单地不按照用户的指令进行操作。这是因为很多最近的LLMs使用的语言建模目标(预测来自互联网网页的下一个token)与“有帮助且安全地按照用户的指令行事”的目标是不同的。因此,我们可以说语言建模目标是未对齐的(misaligned)的。避免这些非预期行为对于那些部署并用于数百种应用的语言模型来说尤其重要。
我们通过训练这些语言模型以便它们能根据用户的意图进行行动,以此来对语言模型进行对齐。这包括显式的意图,如按照指令行事,以及隐式的意图,如保持真实,不展现偏见、有毒或者其他有害的行为。使用Askell等人(2021)的概念来说就是我们希望语言模型能够helpful(帮助用户解决他们的任务)、honest(不应该编造信息或误导用户)并且harmless(不应该对人类或环境造成物理、心理或社会伤害)。
我们主要关注对齐LLMs的微调方法。具体来说,我们使用人类反馈的强化学习(Reinforcement Learning from Human Feedback,简称RLHF)来微调GPT-3,使其遵循一大类的书面指令。这项技术使用人类的偏好作为奖励信号来微调我们的模型。我们首先聘请一支由40名承包商组成的标注者团队来对我们的数据进行标注(基于他们在筛选测试中的表现)。我们收集了一份由人编写的,用于描述在OpenAI API提交的(主要是英文)提示以及一些标注者编写的提示上期望的输出行为的演示数据集,并使用此数据集来训练我们的监督学习baseline。接下来,我们收集了一份包含了我们的模型在更大的API 提示集上的输出的,由人类标记的比较数据集(就是用模型得出每个提示的多个响应,然后由人工为这些响应的好坏程度排序)。然后,我们在这个数据集上训练一个奖励模型(Reward Model,RM),以预测我们的标注者更喜欢哪个模型输出。最后,我们将这个RM作为奖励函数,并使用PPO(proximal policy optimization)算法来微调我们的监督学习baseline以最大化这个奖励。下图说明了这整个流程。这个过程将GPT-3的行为与特定人群(主要是我们的标注者和研究员)的明确偏好对齐,而不是任何更广泛的“人类价值观”,我们将在下文进一步讨论这个问题。我们将最终得到的模型称为InstructGPT。
我们主要通过一些保留标注者(没有参与构建训练数据)来评估模型,同时也在一些自动评估的公共NLP数据集上进行了评估。InstructGPT主要包括三种不同的size(1.3B, 6B和175B参数),所有模型都采用GPT3架构。本文的一些主要结论如下:
①与GPT-3的输出相比,标注者明显更喜欢InstructGPT的输出。
②与GPT-3相比,InstructGPT模型的真实性(truthfulness)有所提高。
③与GPT-3相比,InstructGPT在毒性方面略有改善,但在偏见方面并没有如此。
④我们可以通过修改我们的RLHF微调过程来最小化公共NLP数据集上的性能下降。
⑤在面对没有提供训练数据的保留标注者评估时,InstructGPT可以很好地泛化。
⑥公共NLP数据集不能反映我们的语言模型是如何被使用的。
⑦InstructGPT模型对RLHF微调分布之外的指令显示出有前景的泛化能力。
⑧InstructGPT仍然会犯简单的错误。
总的来说,我们的研究结果表明,使用人类偏好对大型语言模型进行微调可以显著改善它们在各种任务上的行为,尽管要提高它们的安全性和可靠性还有很多工作要做。
二、方法和实验细节
概览
InstructGPT的方法流程事先需要一个预训练语言模型、一个我们希望生成对齐输出的提示分布以及一个经过培训的人类标注者团队。接着我们采用以下三个步骤(也就是上面流程图的步骤):
①收集演示数据并训练一个监督策略。作者的团队会为输入的提示分布提供期望行为的演示。然后,他们使用监督学习方法在这些数据上对预训练的GPT-3模型进行微调。
②收集比较数据并训练奖励模型。作者收集了一组模型输出之间的比较数据,标注者会指示他们更喜欢给定输入的哪个输出。然后,作者训练一个奖励模型(Reward Model, RM)来预测人类更喜欢的输出。
③使用PPO算法根据奖励模型优化策略。作者将奖励模型的输出作为一个标量奖励,并使用PPO算法对监督策略进行微调以最大化这个奖励。
第二步和第三步可以连续迭代;作者会在当前最佳策略上收集更多的比较数据,然后用这些数据训练一个新的奖励模型和策略。在实践中,大部分比较数据来自于监督策略,但也会有一些来自于PPO策略。
数据集
我们的提示数据集主要由提交到OpenAI API的文本提示组成,特别是使用较早版本的InstructGPT模型(通过对我们的演示数据子集进行监督学习训练)在Playground界面上使用的提示。Playground的用户被告知他们的数据可能会通过定期通知在使用InstructGPT模型时用于进一步训练其他模型。在本文中,我们没有使用来自API生产环境中的客户数据。我们通过检查具有共同长前缀的提示来启发式地去重,并将每个用户ID的提示数量限制为200个。我们还根据用户ID创建了训练、验证和测试集,以便验证集和测试集不包含训练集中的用户数据。为了避免模型学习到可能包含敏感客户详细信息的内容,我们对训练集中的所有提示进行个人可识别信息(personally identifiable information, PII)的过滤。
为了训练第一批InstructGPT模型,我们要求标注者自己编写提示。这是因为我们需要一种初始的类似指令的提示来源来启动这个过程,而这类提示通常不会被提交到API上的常规GPT-3模型。我们要求标注者编写三种类型的提示:
①普通提示:我们只是要求标注者提出任意的任务,同时确保任务具有足够的多样性。
②少样本提示:我们要求标注者提出一条指令,并为该指令提供多个查询/响应对。
③用户相关提示:我们在OpenAI API的等待列表申请中列出了一些使用案例。我们要求标注者提供与这些使用案例相对应的提示。
从这些提示中,我们生成了三个不同的数据集,用于我们的微调过程:
①SFT数据集:其中包含标注者演示用来训练SFT模型的示例数据。
②RM数据集:其中包含标注者对模型输出进行排名的数据,用于训练奖励模型(RM)。
③PPO数据集:不包含任何人工标签,仅作为RLHF微调的输入。该数据集仅来自API。
我们的SFT数据集包含约13,000个训练提示(来自API和标注者编写),RM数据集有33,000个训练提示(来自API和标注者编写),PPO数据集有31,000个训练提示(仅来自API)。下面的表6中提供了更多数据集大小的详细信息。
为了了解我们数据集的组成,下表显示了API提示的用例类别分布(特别是RM数据集)。大多数用例是生成型的,而不是分类或问答型。
下表显示了一些说明性的提示(由研究人员编写,模仿提交给InstructGPT模型的提示类型):
任务
我们的训练任务来自两个来源:(1)由我们的标注者编写的提示数据集,和(2)提交到我们API上早期InstructGPT模型的提示数据集(见下表)。这些提示非常多样化,包括生成、问答、对话、摘要、抽取和其他自然语言任务(见上面表1)。我们的数据集超过96%是英文,但在实验中,我们还测试了模型对其他语言指令的响应能力以及完成编程任务的能力。
对于每个自然语言提示,任务通常是通过自然语言指令直接指定的(例如,“写一个关于一只聪明的青蛙的故事”),但也可以通过少样本示例间接指定(例如,给出两个青蛙故事的例子,并提示模型生成一个新的故事),或通过隐含的延续(例如,提供一个关于青蛙的故事的开头)。在每种情况下,我们要求标注者尽力推断提示的用户的意图,并要求他们跳过任务非常不清楚的输入。此外,我们的标注者还考虑到隐含的意图,如响应的真实性以及可能有偏见或有害语言的输出,他们会根据我们提供的指示和他们的最佳判断进行标注。
人类数据收集
为了生成我们的演示数据和比较数据,并进行主要评估,我们在Upwork和ScaleAI上雇佣了大约40名承包商。与早期关于摘要任务收集人类偏好数据的工作相比,我们的输入涵盖了更广泛的任务范围,并且偶尔可能涉及有争议和敏感的话题。我们的目标是选择一组对不同人群的偏好敏感,并且擅长识别潜在有害输出的标注者。因此,我们进行了一项筛选测试,旨在衡量标注者在这些方面的表现。
在训练和评估过程中,我们的对齐标准可能会发生冲突:例如,当用户请求潜在有害的响应时。在训练过程中,我们优先考虑对用户的有益性(不这样做需要做出一些困难的设计决策,我们将其留给未来的工作。然而,在我们的最终评估中,我们要求标注者优先考虑真实性和无害性(因为这是我们真正关心的)。
我们在项目过程中与标注者密切合作。我们有一个入职过程,对标注者进行项目培训,为每个任务编写详细的说明,并在共享聊天室中回答标注者的问题。
作为一个初步研究,以了解我们的模型在其他标注者偏好方面的泛化能力,我们雇佣了一组独立的标注者,他们不参与任何训练数据的生成。这些标注者来自同样的供应商,但没有经过筛选测试。尽管任务是复杂的,我们发现标注者之间的一致性相当高:训练标注者之间的一致性为72.6% ± 1.5%,而对于保留标注者,这个数字为77.3% ± 1.3%。作为对比,Stiennon等人(2020年)在摘要工作中研究者之间的一致性为73% ± 4%。
模型
我们首先使用GPT-3预训练语言模型作为起点。这些模型是在广泛的互联网数据分布上进行训练的,并且适用于各种下游任务,但其行为特征尚未完全明确。从这些模型开始,我们使用三种不同的技术训练模型:
监督微调(Supervised fine-tuning, SFT)。
我们使用监督学习方法,对GPT-3模型进行我们的标注者演示数据的微调训练。我们进行了16个epoch的训练,使用余弦学习率衰减,并设置残差dropout为0.2。我们根据验证集上的RM得分进行最终的SFT模型选择。与Wu等人(2021年)类似,我们发现我们的SFT模型在经过1个epoch的验证损失后开始过拟合;然而,我们发现训练更多的epoch对RM得分和人类偏好评分都有帮助,尽管会产生过拟合现象。
奖励建模(Reward modeling, RM)。
从移除最终非embedding层的SFT模型开始,我们训练一个模型,输入是提示和响应,输出是一个标量奖励。在本文中,我们只使用了6B RM模型,因为这样可以节省计算资源,并且我们发现175B RM模型训练可能不稳定,因此不适合在RL期间用作值函数。
在Stiennon等人(2020年)的工作中,RM是在相同输入的两个模型输出之间的比较数据集上进行训练的。他们使用交叉熵损失,将比较作为标签——奖励的差异表示人类标注者更喜欢其中一个响应的对数几率。
为了加快比较数据的收集速度,我们向标注者展示到个响应供其排序。这为每个显示给标注者的提示产生了个比较。由于每个标注任务内的比较高度相关,我们发现如果我们简单地将比较混洗到一个数据集中,对数据集进行一次遍历会导致奖励模型过拟合。相反,我们将每个提示的所有个比较作为单个批次元素进行训练。这样做在计算上更加高效,因为它只需要对每个补全(也就是下面公式中的一个)进行一次RM的前向传播(而不是个补全的次前向传播),并且由于不再过拟合,它实现了更好的验证准确性和对数损失。
具体的,奖励模型的损失函数为:
❝ ❞
这里的是提示和补全在参数下的奖励模型的标量输出,是和对中更被偏好的那一个,是人类对比数据集。
最后,由于RM损失对奖励的偏移是不变的,我们使用偏差对奖励模型进行规范化,以便在进行强化学习之前标注者演示达到平均得分0。
强化学习(Reinforcement learning, RL)
同样地按照Stiennon等人(2020年)的工作,在我们的环境中使用PPO算法来微调SFT模型。我们的环境是一个老虎机环境(bandit environment),它呈现一个随机的用户提示,并期望对此进行响应。根据给出的提示和响应,环境会根据奖励模型产生一个奖励,并结束这一回合。为了减少对奖励模型的过度优化,我们在每个token处增加了一个来自SFT模型的逐token KL(Kullback-Leibler)惩罚。我们将价值函数初始化为RM。这些模型在本文中称为为“PPO”。
我们还试验了将预训练梯度混合到PPO梯度中,以修复公开NLP数据集上的性能退化问题。这些模型称为“PPO-ptx”。他们在RL训练中最大化以下组合目标函数:
❝ ❞
这里的是学习的RL策略,是有监督训练的模型,是预训练分布。和是KL奖励系数和预训练损失系数,分别控制KL惩罚项和预训练梯度。对于“PPO”模型,设置为0。除另有说明外,本文中InstructGPT指PPO-ptx型号。
Baseline
我们将我们的PPO模型的性能与我们的SFT模型和GPT-3进行比较。我们还将GPT-3与在给定少量前缀“提示”的情况下进行比较,这些前缀可以将其“引导”进入遵循指令的模式(GPT-3-prompted)。这个前缀是附加在用户指定的指令之前的。我们还将InstructGPT与在FLAN和T0数据集上微调的175B GPT-3进行比较,这两个数据集都包含各种NLP任务,每个任务都配有自然语言的指令(数据集在所包含的NLP数据集和使用的指令风格上有所不同)。我们分别在大约100万个样例上进行微调,并选择在验证集上获得最高奖励模型分数的检查点。
另外本文的实验主要在API分布和公共NLP数据集这两部分上进行评估。
三、实验
API分布
公共NLP数据集
定性结果