instructGPT论文精读

背景
最近的ChatGPT等大模型太火爆,看看openAI发布的instructGPT(ChatGPT姊妹版模型)论文,记录一下阅读过程。(并不是直接翻译,加入了一些自己的理解,仅供参考,大佬请移步原文 InstructGPT:Training language models to follow instructions with human feedback

论文题目:InstructGPT:Training language models to follow instructions with human feedback

摘要

在服从用户输入的指令,正确理解用户实际意图上,参数越来越大的模型,并不会表现的越来越好。大模型有时候会产生一些有害的、虚假的内容,或者是一些对用户问题毫无帮助的内容。这种情况可以被认为是模型没有和用户的想法对齐。在这篇论文中,我们通过一种基于人类反馈的微调方法,使得在各种任务上,模型能够对齐人类的想法。首先,筛选一批openAI的API上提交的prompt,由labeler编写对应的response,建立一个有监督数据集,用来进行有监督微调。然后,收集了一批对模型输出进行打分排序的数据,最后用这部分数据对模型进行微调,最终的模型成为instructGPT。对一部分prompt进行人工评估后发现,尽管GPT-3的参数有175B,是instructGPT的100倍以上,但1.3B的instructGPT表现却更好。此外,虽然在公开NLP数据集任务的性能有所下降,但模型在输出的真实性、减少有害内容的输出上的表现都有所提升。而且尽管instructGPT还会犯些小错误,但我们的结果已经证明,基于人类反馈的微调是一个有潜力的方向。

1.instruction

大语言模型可以通过给一些提示的方法,在输入中提供一些示例,来执行很多自然语言处理任务。但模型本身经常会有一些超出预料的行为,比如说编造事实,输出有偏见或者有害的内容,或者根本不理会用户的指令。这是因为很多大语言模型的训练目的就是为了预测下一个token,这和理解用户指令,且输出安全、正确的内容就不是一回事。因此,这种训练方式下的大语言模型的目标是非对齐的,从应用角度来说,修正这种产出期望之外的行为是至关重要的。

通过在训练模型遵循用户偏好下输出,这方面的对齐研究已经有了一些进展,包括可以进行明确的指令,或者是些相对模糊的,比如保持真实性、不要偏见、不要输出有毒或者有害的内容。通过Askell的说法,我们希望语言模型是有帮助的(能帮助用户完成任务),诚实的(不应该编造信息或者误导用户),无害的(不会对任何人或者环境造成物理上、心理上甚至是社交伤害)。

我们把焦点放在了利用fine-tuning方法去训练模型的对齐能力,具体是使用基于人类反馈的强化学习方法去fine-tuning GPT-3,让它能够服从各种指令。这种方法利用人类的偏好作为奖赏信号去微调模型。一开始,根据在专门设计的screening 测试的表现,我们雇佣了一批40人的labeler团队去标记数据。然后,收集一批通过openAI API提交的prompt和一些labeler自己写的prompt,由labeler编写模型期望的输出,用这部分数据集训练有监督模型baseline。接下来,我们收集了baseline模型在API上提交的prompt下的输出,并且由labeler对这些输出进行两两比较。在这个比较数据集上,去训练一个奖赏模型(RM),使得模型能够预测哪个输出更符合人类的偏好。最后,用这个RM模型作为奖赏函数,通过PPO算法微调之前的有监督模型baseline,最大化奖赏分数(图2)。这一个过程,让模型能够对齐一小部分群体的偏好(主要是我们的labeler和研究人员),而不是广泛的人类价值观。最终训练完的模型称为instructGPT。
图2

我们主要是靠labeler去评估模型在测试集上输出质量,测试集里的prompt是来自没有在训练集中出现过的用户数据。我们也在很多公开的NLP数据集上进行评估。总共训练三个不同大小的模型(1.3B、6B、175B),所以的模型结构都和GPT-3一样。主要的发现点如下所示:

  1. 相比GPT-3,labeler明显认为instructGPT的输出更好。在测试集上,尽管参数量相差100倍,1.3B的模型仍然比175B的GPT-3表现要好。这两个模型有相同的结构,不同之处仅仅在于instructGPT是在人类标注的有监督数据集上微调的。甚至在提供了一些示例(few-shot prompt)给GPT-3的情况下,结论仍然成立。在85±3%的情况下,175B的instructGPT模型优于同样大小的GPT-3,71±4%的情况下优于few-shot下的GPT-3.根据labeler反馈,instructGPT输出的内容更好,而且能很好的服从指令中的限制。
  2. 在输出内容的真实性上,instructGPT比GPT-3有所提升。在TruthfulQA测试中,instructGPT输出真实有效回答的次数是GPT-3的两倍。在来自API的prompt的closed-domain任务中,模型的输出应该全部来自于输入(例如总结或者closed-domain QA任务),instructGPT编造输入之外的信息的次数只有GPT-3的一半(21% VS 41%)。
  3. 在有毒性方面,instructGPT相较GPT-3有一些小的提升,但偏见性方面没有差距。为了衡量有毒性,我们在RealTOxicityPrompt数据集上,进行了自动和人工评估。当prompt比较respectful时,instructGPT输出有毒内容的情况比GPT-3要少25%。在Winogender和CrowSPairs数据集上,instructGPT没有明显提升。
  4. **通过调整RLHF微调过程,可以最大程度的减少模型在公开NLP数据集上的性能退步。**在RLHF微调期间,我们发现模型在公开NLP数据集上的性能有所下降,特别是在SQuAD、DROP、HellaSwag、WMT 2015法英翻译数据集上。在一些我们比较关系的任务上,和对齐过程随之而来的是在这些任务上的性能下降,这是个典型的对齐税。通过在PPO更新过程中加入预训练数据,但不引入labeler的打分,可以大幅减少性能下降。
  5. **对于那些没有提供训练数据的labeler们,模型的输出仍然有很好的泛化性。**为了测试模型的泛化性能,我们在没有提供训练数据的这部分labeler上进行了初步的测试,结果他们也认为instructGPT的回答比GPT-3要好,和提供训练数据的labeler的评分一致。尽管如此,还需要更多的工作去研究在更广泛的群体上模型的表现会是如何,以及当人类不认同期望的输出时模型的行为会是什么样的。
  6. **公开NLP数据集并不能反映模型的使用情况。**我们分别对比了在人类偏好数据上微调过的GPT-3和在两种不同的公开NLP数据集(FLAN和T0++)上微调的GPT-3模型。这些数据集包含了各种各样的NLP任务,每种任务都带有自然语言指令。在来自API的prompt上进行测试发现,公开数据集上训练的模型的表现比SFT模型要差一些,labeler明显更偏好于instructGPT的输出(同baseline相比,instructGPT在73.4±2%的情况下获胜,而T0和FLAN版本的胜率分别为26.8±2%和29.8±2%)。
  7. **在没有出现在RLHF微调过程中的指令上,instructGPT也展现了有前景的泛化性。**定量去探讨instructGPT的能力,发现它能够遵循像总结代码、回答代码相关问题的指令,有时候甚至是不同语言下的指令,而这些指令在微调过程中非常少。对比GPT-3,虽然也可以执行这些任务,但需要非常严格的prompt过程,而且通常在这些领域并不能正确理解指令。这个结果令人兴奋,因为它意味着模型能够泛化“遵循指令”概念。在非常少的监督数据下,能够维持对齐能力。
  8. **instructGPT还是会犯些小错误。**比如,它并不总是能够正确的理解指令,会捏造事实,对一些简单问题不会直接给出答案,或者有错误前提时不能识别指令。

2 相关工作

关于对齐和从人类反馈中学习的研究。在前人的基础上,我们利用人类意图去对齐模型,即基于人类反馈的强化学习(RLHF)。一开始这项技术是为了训练模拟环境中和游戏中的机器人,最近开始被用于微调语言模型,让模型学会总结文本。在对话、翻译、语义解析、生成故事、评论生成、证据提取等领域,反过来又受到了类似工作的影响,开始使用人类的反馈作为奖赏。Madaan利用人类书写的反馈去增强prompt,提升GPT-3的性能。也有一些文本领域的研究,利用带先验的RL对齐客户。而我们的工作可以看做是RLHF在多领域任务上对齐语言模型的直接应用。
模型对齐能力的具体含义,最近也受到了很多研究者的关注。Kenton列出了一些语言模型因为对齐而引发的问题,包括产生有害的内容,错位的游戏目标。在现有研究中,Askell提出语言助手可以作为对齐研究的测试平台,研究一些简单的baseline和缩放性质。
训练模型去遵循指令。我们的工作也涉及到了语言模型的跨任务泛化性,语言模型在一系列的公开NLP数据集上进行微调(通常是带有对应的指令),然后在不同的多个NLP数据集上进行测试。这方面的研究工作已经有很多,只是在训练和测试数据,指令格式,模型参数大小,或者是其他实验细节上有所不同。这些研究都有一个共同的发现,那就是用带有指令的NLP数据微调语言模型,不管是在zero-shot或者few-shot场景下,都能够提升模型在下游任务上的性能。

评估语言模型的危害性。修正语言模型行为的一个目的就是当模型在现实世界中应用的时候,能够减缓模型带来的危害性。这些危害已经被广泛的文章所说明。语言模型会产生有偏见的内容,泄露隐私数据,产生误导,被恶意使用,需要详细了解的请阅读WEidinger的文章。语言模型在特定领域的应用也会伴随着风险和挑战,例如在对话领域。建立一个标准去持续的评估这些危害,特别是关于有害性、刻板印象和社会偏见方面,这是个新兴但持续发展的领域。但因为善意的干预得语言模型带来的副作用,使得这项工作要想取得巨大的进步是十分困难的。比如说,由于训练数据里的偏见关系,在减少模型有毒性的同时,也会降低它在少数群体文本上的能力。
修正语言模型的行为来减轻危害。已经有很多方法能够改变语言模型的输出行为。Solaiman和Dennison在小规模、高价值的数据集上微调模型,能够提高模型在QA任务上继承这些价值观的能力。Ngo移除了那些语言模型有很大概率产生研究人员设定的触发短语的文本数据。用过滤后的数据集训练后,虽然模型产生的有害内容减少了,但性能方面也出现了显著的下降。Xu用了一系列方法去提高聊天机器人的安全性,包括数据过滤、在输出内容时特殊词语锁定、控制安全性token,和human-in-loop数据收集。其他减轻语言模型的方法有word embedding正则,数据增强,全空间投影让敏感token分布更均匀,不同的目标函数,或者是随机停止分析等等。还有的是另外一个语言模型来控制模型的输出,很多这些方法都被应用于减轻语言模型的有毒性。

3. 方法和实验细节

3.1高级方法
我们用的和Ziegler和Stiennon应用在风格延续、总结领域的方法一致,一开始我们需要预训练模型,一些我们希望模型产生对齐内容的prompt集合,和专门训练人类labeler的团队。然后开始下面的三个步骤:
step 1:收集期望的数据,训练监督策略。根据输入的prompt,labeler提供了一批期望模型输出的内容。用这部分数据对预训练后的GPT-3模型进行有监督微调。
step 2:收集对比数据,训练奖赏模型。给定一个prompt,对比模型的输出,由labeler决定哪个输出更好。这部分数据训练一个奖赏模型来预测哪个输出会更受人类偏好。
step 3:利用PPO算法,基于奖赏模型来优化策略。用RM模型的输出作为奖赏,用PPO算法微调监督策略来优化奖赏。
step 2和step 3可以重复循环,基于当前的策略收集更多的对比数据,用来训练新的RM模型,然后再微调策略模型。在实际应用中,对比数据的大部分都来自于监督策略,另外一些来自于PPO策略。
(说人话就是给一批prompt,人类去写对应的期望的输出,用这部分数据先有监督训练出一个初始模型;然后再给一批prompt,用初始模型产生这部分prompt对应的多个不同输出内容,人类对这多个内容进行打分,用这批打分数据训练出一个奖赏模型,奖赏模型的目的是判断哪个输出最受人类喜欢;最后,用PPO算法建立一个循环迭代优化,即给一个prompt,用初始模型产生一个输出,奖赏模型判断这个输出会得多少分,作为奖赏,最终目标是让模型的输出得到的奖赏最大,也就是尽可能的受人类喜欢。一轮结束后,会得到一批同一个输入不同输出的奖赏分数,这个再拿来训练奖赏模型,新的奖赏模型再进入新一轮的迭代优化)

3.2 数据集

prompt数据集主要由openAI上提交的prompt构成,特别注意的是当时的API的模型是instructGPT的早期版本,模型只在期望数据集上经过监督学习。每次用户使用API时都会被提醒他们的数据将会被用于训练模型。在这篇文章中,并没有使用生产环境的API上的数据。通过公共前缀对prompt进行去重,且同一个用户ID的prompt数不超过200.训练集、验证集和数据集的切分都是基于用户ID,因此训练集中的数据不会出现在验证集和测试集中。为了防止模型学习到潜在的敏感用户信息,训练集中的prompt经过PII过滤。
为了训练初版instructGPT模型,我们要求labeler自己写prompt,因为需要一个初始的instruction的prompt数据源开始第一步,而且这些prompt很少出现在GPT-3模型API提交的prompt里。labeler写的prompt主要有下面三种:

  1. 简单。labeler随意写出一些prompt,只要确保这些prompt涉及的面足够广。
  2. few-shot。带有指令的,且有一个指令有多个response。
  3. user-based。和用户使用需求先关的prompt。

基于这些prompt,收集了三部分数据用于fine-tuning:(1)SFT数据集,用于训练SFT模型。(2)RM数据集,labeler对模型的输出进行打分排序数据,用来训练RM模型。(3)PPO数据集,没有labeler参与,用作RLHF微调的输入。SFT数据集包括来自API和labeler的一共13k训练prompt,RM数据集包含33k训练prompt,同样是来自API和labeler,PPO数据集一共包含31k条只来自API的prompt。更多关于数据集细节见table6.
在这里插入图片描述

在这里插入图片描述
table1中展示了API上提交的prompt的种类分布,大多数是生成式任务,而不是QA或者分类任务。table 2中是一些由研究人员模仿API上提交的prompt写的。更多的prompt细节见附录A。

3.3 任务

训练任务来源有两个:(1)labeler编写的prompt。(2)通过API提交的prompt。这些prompt种类分布特别广泛,包括生成类、QA、对话、总结、提取、和其他类型的自然语言任务(Table 1)。数据集96%是英语语料,但在4.3节中,我们也探讨了模型在其他语言和代码任务上的性能。
对于每种自然语言prompt,通常都伴随着直接对应的自然语言指令(e.g. 写一篇关于聪明青蛙的故事),也有一些是few-shot方式(e.g. 提供两个关于青蛙故事的例子,提示模型再输出一个新的),或者是隐式的延续(e.g. 提供一个青蛙故事的开头)。在每个例子中,我们要求labeler尽可能的推测写下prompt的意图,并且跳过那些不明确的。根据提供的指南,labeler还要求考虑到那些有害的回复,存在像有偏见或者有毒的有害输出。

3.4 人工标注数据收集
为了收集评估所需要的数据,我们通过Upwork和ScaleAI雇佣了一个40人的团队。相比较早期在总结任务上收集人类偏好数据的相关工作,我们的输入数据来自各个领域,偶尔还包含有争议或者敏感话题。我们的最终目标是找到一批对不同群体偏好敏感,且能够很好的识别出哪些内容是潜在有害的labeler。为此,我们在这些维度上对labeler进行了一场screening 测试,去衡量这些labeler的表现,最终只有表现好的会作为labeler。更多筛选细节见附录B.1。
在训练和评估期间,我们的对齐标准并不是始终一致:比如说当一个用户要求一个有潜在危害性的回复,在训练期间,回复对用户的有用性排在第一位,但是在最后的评估期间,要求labeler首先考虑真实性和无害性。
正如Sitennon所说的,整个项目期间,我们合作十分密切。labeler在入职时会有一套入职培训流程,包括给不同的任务写指令,在开放式聊天室回答labeler的问题。
研究的一个初始目的是关注模型如何产生受到其他labeler偏好的数据,我们雇佣了另一批没有提供训练数据的labeler,他们来自同一个公司,但是没有经过screening测试。
尽管任务很复杂,我们发现labeler之间的认同率相当高:训练labeler在72.6±1.5%的情况下彼此认同,对剩余的labeler,在77.3±1.3%。为了和Stiennon的结果比较,研究人员之间的认同率在73±4%。

3.5 模型
我们从GPT-3预训练大语言模型开始,这些模型在庞大的互联网数据上完成训练,能够适应各种各样的下游任务,但在特征行为上表现却很差。以这些模型为基础,我们用下面三种技术训练模型:

  1. 有监督微调(SFT)。在labeler提供的期望数据上进行有监督微调GPT-3模型。训练了16个epoch,使用cosine学习率衰减,dropout=0.2。根据模型在验证集上的RM分数挑选出合适的作为SFT模型。和Wu的看法相似,我们发现SFT模型在1 epoch后会出现过拟合,但同时我们发现多训练几个epoch有助于提高模型的RM分数和人类偏好表现。

  2. 奖赏模型(RM)。移除SFT模型的最后的unembedding层,用prompt和response作为模型输入,奖赏分数作为模型输出来训练模型。在本研究中,我们只使用了6B大小的RM模型,这可以节省很大一部分算力。我们发现训练175B的RM很不稳定,因此不适合在RL期间作为价值函数。
    在Stiennon的工作中,RM模型的数据集是由同一个输入两个不同模型的输出互相比较构成的,他们使用了交叉熵loss函数,比较结果作为label----奖励的差值代表着相对于另一个response,这个response被labeler偏好的概率。
    为了加快比较数据的收集,我们向labeler提供了k=4到k=9个response去排序,最终每个prompt得在这里插入图片描述个排序结果。因为排序结果和每个任务联系密切,如果简单的打乱这些排序结果组成一个数据集,一轮训练就会造成奖赏模型过拟合。所以,我们将每个prompt的所有排序结果作为一个batch。这样每次模型只要计算一次前向传播,训练效率大大提高,而且不再出现过拟合,验证集上的准确率和log loss也都有所提高。
    奖赏模型的loss函数如下所示:
    在这里插入图片描述
    最后,当奖赏模型的loss不再随奖赏分数变化时,对奖赏模型进行标准化,使得均值为0.

  3. 强化学习(RL)。使用PPO算法来微调SFT模型,随机提供一个prompt,产生一个对应的response,根据prompt和response,奖赏模型输出奖赏分数。此外,每个token添加了KL惩罚函数以此减轻奖赏模型的过拟合,价值函数的初始化来自RM。整个模型称为PPO。

(未完待续)

猜你喜欢

转载自blog.csdn.net/yaogepila/article/details/131333133