您现在的位置是:首页 >技术交流 >InstructGPT 论文阅读笔记网站首页技术交流

InstructGPT 论文阅读笔记

beingstrong 2023-06-27 00:00:03
简介InstructGPT 论文阅读笔记

目录

简介

数据集                                

详细实现

实验结果

参考资料


简介

InstructGPT 模型是在论文《Training language models to follow instructions with human feedback》被提出的,OpenAI在2022年1月发布了这篇文章。

论文摘要翻译:把语言模型做得更大并不意味着让它们更好的遵循用户的意图。例如,大型语言模型可能会生成不真实、有毒或对用户没有帮助的输出。换句话说,这些模型没有与他们的用户对齐。本文中我们展示了一种通过微调人类反馈来使语言模型与用户在一系列任务中对齐意图的方法。从一组标注员手写的prompts和从OpenAI API提交的prompts开始,我们收集了一个有标注员演示的预期模型行为的数据集,用该数据集使用有监督学习微调了GPT-3模型。我们接着收集了一个模型输出结果排名数据集,用它通过RLHF(reinforcement learning from human feedback)来进一步微调这个有监督模型,我们把生成的模型称为InstructGPT。在我们的prompt 数据集的人类评估中,1.3B参数的InstructGPT模型结果比175B参数的GPT-3结果更被接受,尽管少了100倍的参数。此外,InstructGPT模型在提高真实性和减少有毒输出生成的同时,在公共NLP数据集上具有最小的性能回归。尽管InstructGPT仍然会犯一些简单的错误,但我们的结果表明,根据人类的反馈进行微调是使语言模型与人类意图对齐的一个有前景的方向

在前言部分开头就提到大语言模型可以通过给一些任务示例、被prompted的方式来执行一系列NLP任务,但是这些模型经常有一些不符合意图的行为,如捏造事实、产生有偏见或有毒的文本,或者完全不遵循指令。出现这些行为的原因是因为大语言模型的目标函数--预测从互联网得到的文本的下一个token,与“有用且安全地遵循用户的指令”这一目标是不同。因此作者们说语言模型的目标函数是misaligned。

那怎么避免模型出现这些不符合意图的行为,让语言模型变得helpful、honest、harmless呢?

  • helpful (they should help the user solve their task)
  • honest (they shouldn't fabricate information or mislead the user)
  • harmless (they should not cause physical, psychological, or social harm to people or the environment)

InstructGPT的做法是使用微调的方式来对齐(align)语言模型,特别是使用了RLHF(reinforcement learning from human feedback), 如下图1通过三步来对齐语言模型。

原论文中的Figure 2

数据集                                

在详细的三个步骤说明前,先来看看prompt数据集是怎么得到的:

  • 数据集中的prompt主要来源是用户使用OpenAI API时的prompt输入,特别是通过instructGPT早期版本的playground 接口提交的。对于每个用户ID,最多只取200个prompt。 并通过检查prompt是否有很长的公共前缀来进行去重,在划分train/validation/test数据集时,会通过用户ID来划分,以便验证集和测试集不包含来自训练集中数据的用户的数据。为了避免模型学习到用户的敏感信息,将个人身份信息去除了(personally identifiable information (PII))。
  • 一个有40人的标注团队也写了一些prompt, 共有三种类型的prompt:

    • Plain: We simply ask the labelers to come up with an arbitrary task, while ensuring the tasks had sufficient diversity.

    • Few-shot: We ask the labelers to come up with an instruction, and multiple query/response pairs for that instruction.

    • User-based: We had a number of use-cases stated in waitlist applications to the OpenAI API. We asked labelers to come up with prompts corresponding to these use cases.

基于这这些prompt, 生成了三个数据集:

  • SFT数据集,有标注员提供的prompt的演示输出结果,共13k的训练prompts, 用来训练第一步的SFT模型
  • RM数据集,有标注员标注的模型输出排名,共33k的训练prompts, 用来训练第二步中的RM模型。
  • PPO数据,没有任何人类标注,用来作为第三步的RLHF微调的输入,共31k 的训练数据(数据只来自API,也就是没有使用标注员生成的prompt)

数据集详细大小数据如下图, 数据集中的96%都是英语。

原论文中table 6 

prompt 类型分布如下截图 :

原论文中table 1

更详细的关于数据集的说明在论文附录A, 如何使用筛选测试来挑选标注员以及提供给标注员的标注指南可参考附录B

详细实现

第一步:

使用监督学习来微调GPT-3模型:

  • using a cosine learning rate decay, and residual dropout of 0.2
  • 通过在验证集上的RM 分数来进行SFT的模型选择
  • 一共训练了16 epochs, 虽然在1个epoch之后再验证集上的损失开始出现过拟合,但是发现训练更多的epoch可以同时提升RM和人类偏好评分

第二步:

从第一部分的去掉最后的unembedding layer的SFT模型开始,对于输入的prompt和语言模型输出结果,训练一个奖励模型(RM)输出一个标量奖励。

只使用了6B的模型,不仅节约大量计算,更因为175B的模型的训练很不稳定,所以不适合作为RL的值函数。

对于每个prompt,给每个标注员K=4到K=9的responses 来排序,故会生成inom{K}{2}个比较对。如果直接将比较对shuffle组成一个数据集,只对数据集进行一次训练就会过拟合。而如果将一个prompt的inom{K}{2}比较对作为同一个batch的元素,这不仅节省了计算量(对于每一个completion只需要一次前向传播,而不是对K个completion要有inom{K}{2}个前向传播),并且不会过拟合,可以极大的提高验证集准确率和log loss。

奖励模型的损失函数定义为下式,是一个pairwise的ranking loss。 

loss(	heta ) = - frac{1}{inom{K}{2}} E_{(x, y_w, y_l) sim D}[log(sigma (r_{	heta} (x, y_w) - r_{	heta}(x, y_l)))]

式中r_{	heta}(x, y) 是参数为	heta的奖励模型对于prompt x和completion y的标量输出,对于比较对 y_w 和y_ly_w是更被接受的completion,D是人工比较对的数据集。

由于RM损失对奖励的偏移是不变的,因此使用偏差对奖励模型进行规范化(normalize),以便在进行强化学习之前标注员演示达到平均得分0。

第三步:

使用PPO来对SFT模型在试验环境中进行微调, 试验环境是一个展示随机的用户prompt并期望给出一个response的bandit 环境。对于给定的prompt和response, 环境根据第二部分的奖励模型给出一个奖励并结束这一回合。

给每个token添加了一个从SFT 模型得到的per-token KL penalty 以防止奖励模型的过度优化, 值函数是从奖励模型(RM)初始化得到的,将这个模型称为“PPO”。

为了修复在公共NLP数据集上的performance regressions, 将预训练梯度加入到PPO梯度,这些模型被称为“PPO-ptx"。 

因此,在RL训练过程中是最大化如下组合目标函数:

objective(phi ) = E_{(x, y)sim D_{pi_{phi}^{RL}}} left[ r_{	heta}(x, y) - eta log(pi_{phi}^{RL} (y|x) / pi^{SFT} (y|x)) 
ight] + \ qquad    gamma E_{x sim D_{pretrain} } left[ log(pi_{phi}^{RL} (x)) 
ight]

式中,pi_{phi}^{RL}是学习到的RL策略, pi^{SFT}是第一步的监督训练模型,D_{pretrain} 是预训练数据集。KL奖励系数eta控制KL惩罚的程度,预训练损失系数 gamma控制预训练梯度的程度, 对于“PPO”模型,gamma

为0, 除非特殊说明,论文中的InstructGPT 都是指PPO-ptx 模型。

Baseline:  

  • 比较PPO模型与SFT模型和GPT-3的效果, 也比较了在prompt中加入一些例子给GPT-3(称为GPT-3-prompted)。
  • 在FLAN和T0数据集比较InstructGPT 与微调的175B的GPT-3。 分别在大约100万个样本上对它们进行微调,并选择在验证集中获得最高奖励模型分数的checkpoint。

(模型的更多训练细节在附录C。)

实验结果

几个关键结论:

  • 与GPT-3的输出相比,标注员明显更喜欢InstructGPT输出(如下图)。

原论文中的Figure 1
  • 模型可以泛化到没有参与过训练标注的标注员的喜好
  • 公共 NLP 数据集不能反映如何使用语言模型
  • InstrucGPT 相比与GPT-3在真实性上有所提高
  • InstrucGPT 相比与GPT-3在有毒内容上有一点点提高,但是在偏见上没有提高
  • 通过修改RLHF的微调程序,可以减小在公共NLP数据集上的performance regressions。
  • InstructGPT模型显示了对RLHF微调分布之外的指令的有效的泛化
  • InstructGPT仍然会犯一些简单的错误

参考资料

1. Ouyang, Long, Jeff Wu, Xu Jiang, Diogo Almeida, Carroll Wainwright, Pamela Mishkin, Chong Zhang, et al. n.d. “Training Language Models to Follow Instructions with Human Feedback.” 

2. https://openai.com/research/instruction-following 

3. InstructGPT 论文精读【论文精读·48】_哔哩哔哩_bilibili

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。