InstructGPT论文精读--Training language models to follow instructions with human feedback

总结

InstructGPT 的训练方法就是ChatGPT的训练方法

Abstract

作者认为,语言模型越大本质上并不能让它更好地遵循人类的意图,它可能会生成一些不真实的、有毒的、对用户没有帮助的输出。也就是模型并没有和用户对齐。
作者通过用human feedback微调模型的方式找到了对齐模型和用户的方法。具体在本文做了两件事情:

  1. 从一组标签员写的Prompt和通过OpenAI API提交的Prompt开始(即这两部分都是由人写的prompt,不过可能第二部分是用户,他们写的prompt有些可能需要被过滤掉), 然后收集了一组由Labeler人工去写的回答,作为我们希望的模型行为(desired model behavior)的数据集,我们使用监督学习来微调GPT-3
  2. 收集一个对模型输出进行排序的数据集,使用来自RLHF来进一步微调这个监督模型。

结果表明:

  • 1.3B 参数 InstructGPT 模型的输出优于 175B GPT-3 的输出,尽管参数少了 100 倍。
  • InstructGPT 模型显示出真实性的提高和有毒输出生成的减少,
  • 在公共 NLP 数据集上的性能没有损失多少。

尽管 InstructGPT 仍然犯简单的错误,但我们的结果表明,根据人类反馈进行微调是使语言模型与人类意图保持一致的一个有前途的方向。

Introduction

大型语言模型 (LM) 可以通过给出一些任务示例作为输入作为“prompt”从而执行一系列自然语言处理 (NLP) 任务。然而,这些模型通常会表达意外行为例如编造事实、生成有偏见或有毒的文本,或者干脆不关注用户指示。语言模型的目标函数(从互联网预测网页上的下一个token)与“有用且安全地遵循用户的指示”的目标不同,也就是这个模型是misaligned。

也就是本文希望语言模型to be helpful, honest and harmless.

作者专注于调整语言模型的微调方法。具体来说,我们使用来自人类反馈的强化学习(RLHF)去微调GPT3。具体步骤如下图:

  1. SFT:收集示例数据,并训练一个监督的policy。一个prompt数据集和一个标注者认可的期待的输出行为,进行监督训练。
  2. 训练奖励模型(RM):一个prompt和多个输出结果作为数据,标注这对结果的好坏进行排序,这些数据被用来训练奖励模型。
  3. 进行PPO强化学习对该RM:给一个新的prompt, 用step1的policy生成结果,用step2的RM计算结果的reward,使用PPO根据reward更新policy。

步骤 2 和 3 可以连续迭代;收集更多关于当前最佳策略的比较数据,该策略用于训练新的 RM,然后训练新的policy。在实践中,我们的大部分比较数据来自我们的监督policies,部分来自我们的 PPO policies。


InstructGPT训练步骤

3 Methods and experimental details

3.1 High-level methodology

见上面调整语言模型的微调方法

3.2 Dataset

我们的提示数据集主要由提交给 OpenAI API 的文本提示组成,特别是那些在 Playground 界面上使用早期版本的 InstructGPT 模型(通过对演示数据子集进行监督学习进行训练)的文本提示。4 使用 Playground 的客户被告知,只要使用 InstructGPT 模型,他们的数据都可以通过定期通知来训练更多模型。在本文中,我们不使用在生产中使用 API 的客户的数据。我们通过检查共享长公共前缀的提示来启发式地删除重复提示,并将每个用户 ID 的提示数量限制为 200 个。我们还根据用户 ID 创建训练、验证和测试拆分,以便验证集和测试集不包含来自训练集中数据的用户的数据。为了避免模型学习潜在的敏感客户详细信息,我们筛选训练拆分中的所有提示以获取个人身份信息 (PII)。
Prompt数据集的构造是由两步来组成的,有先后顺序关系

  1. 训练第一个非常早期的InstructGPT:要求标注人员自己写各种提示词prompt,包括以下三种提示词1) Plain:要求标注人员构思任意任务,且有足够的多样性;2) Few-shot:我们要求标注员构思一条指令,并为该指令提供多个查询/响应对;3) User-based:我们在 OpenAI API 的等API内测申请中收集到了一些用户声明的用例。我们要求标注员根据这些用例编写相应的提示词。这些prompt来用于训练初试化instructGPT
  2. 得到Prompt数据集:将步骤1的model作为playground,供给用户使用,将用户通过调用该模型的API产生的数据(prompt/问题)收集起来。这里限制每个用户id 200个提示,划分训练集、验证集、测试集是基于userid划分的。

从这些prompt数据集,产生三个不同的数据集进行模型微调:

  1. SFT dataset: 13k训练prompts(来自API和标注人员的标注), 包含标注员提供的演示样本,用于训练我们的 SFT 模型(即prompt一部分是由标注人员写的,一部分是从API获取的,prompt对应的所有的答案都是由标注人员写的)
  2. RM dataset: 33k训练prompts(来自API和标注人员的标注),包含标注员对模型输出的排序结果,用于训练我们的奖励模型(RM)(只需要排序就行)
  3. PPO dataset: 31k训练prompts(完全只来自API), 不含任何人工标注,这些数据用作强化学习人类反馈(RLHF)微调的输入

3.5 Models

InstructGPT的模型是基于GPT3来进行微调的。

3.5.1 Supervised fine-tuning (SFT)

在标注好的demonstrations(prompt和答案)微调GPT3,epoch是16。在一个epoch后就过拟合了,尽管过度拟合,但更多的epoch有助于 RM 分数和人类偏好评级。

3.5.2 Reward modeling (RM)

目标:学习人类对回答质量的偏好标准(如相关性、信息量、无害性)。
删除 SFT 模型开始的最后一个非embedding层,训练一个模型来接收prompt和responce(问题和答案),并输出标量奖励, 也就是奖励分数。在本文中,我们只使用 6B RM,因为这节省了大量计算,并且我们发现 175B RM 训练可能不稳定,因此不太适合在 RL 期间用作值函数。

RM 是在两个模型输出之间对同一输入的比较数据集上进行训练的。他们使用交叉熵损失,将比较作为label——奖励的差异代表标注员更喜欢一种响应而不是另一种响应的对数几率。
K选择了从4到9,对于每个提示会产生C_2^k个比较数据,每个prompt的比较数据作为一个单独的batch element。RM的损失函数如下:
loss (θ) = -\frac{1}{C_2^k}E(x,y_w,y_l)∼D [log (σ (r_θ (x, y_w) − rθ (x, y_l)))]
其中 r_θ (x, y) 是prompt x 和参数为 θ 对于回答 y 的奖励模型的标量输出,yw 是 yw 和 yl pair中的偏好回答,D 是人类比较的数据集。r_θ (x, y_w)是x和yw放入RM模型得到的奖励分数,同理,r_θ (x, y_w)是x和yl放入RM模型得到的奖励分数,由于y_w 是比 y_l偏好更好的回答,就要使得r_θ (x, y_w) − rθ (x, y_l)这值越大越好;σ (r_θ (x, y_w) − rθ (x, y_l))是加了sigmoid函数,之后取了个对数,偏好差异越大,越趋近于0,取负数,就变成最小化,越趋近于0越好。

最后,由于RM损失对奖励的变化是不变的,因此我们使用偏差对奖励模型进行归一化,以使得标注员的回答在进行RL之前达到0的平均分数。

3.5.3 Reinforcement learning (RL)

目标:利用RM的评分优化SFT模型,生成更符合人类偏好的回答。
目标函数:
objective (φ) =E(x,y)∼D_{π_φ^{RL}}[rθ(x, y) − βlog(π_φ^{RL}(y|x)/π^{SFT}(y|x))]+γE_x∼D_{pretrain}[log(π_φ^{RL}(x))]
其中π_φ^{RL}是学习到的 RL 策略(RL模型),π^{SFT}是监督训练模型,Dpretrain 是预训练分布。KL奖励系数β和预训练损失系数γ分别控制KL惩罚和预训练梯度的强度。γ设置为 0 就是“PPO”;不去掉最后一项,InstructGPT 指的是 PPO-ptx模型(添加了预训练梯度)。

π_φ^{RL}初始化是和π^{SFT}一样的,通过更新π_φ^{RL},来最大化上面的目标函数。主要思想就是在线学习的过程,不断更新π_φ^{RL},对于同一个prompt x会产生不同的y,就会有一个迭代的过程。

  • rθ(x, y):x和y放入奖励模型计算奖励分数;
  • βlog(π_φ^{RL}(y|x)/π^{SFT}(y|x))]是添加的KL散度,也是PPO的主要思想:主要是因为随着模型更新迭代越来越不一样,让π_φ^{RL}生成的y 会和原来训练rθ用的y的统计发生偏移,导致奖励模型的奖励分数可能没有原来那么准确。所以加了一个计算kl散度,使得π_φ^{RL}这个新模型不要偏离π_φ^{RL}太远。通过计算y的token的softmax相乘等到一个概率,除以原生的对应的概率,如果是相同的话,这一项就是0,这个目标是越小越好,由于整个目标函数是最大化,所以加负号。
  • γE_x∼D_{pretrain}[log(π_φ^{RL}(x))]: 为了防止模型训练完后只对这里的排序任务效果好,而对其他的NLP任务性能下降,加入了这部分的内容,这一项是语言模型的损失函数,等价于在该新的数据集上做拟合,但是在原始的数据也不要丢弃。

方法:
从新Prompt中采样,使用PPO(近端策略优化)算法生成回答。
RM模型对回答打分,通过策略梯度更新模型参数。
关键约束:添加KL散度惩罚项,防止模型偏离原始语言能力
除此之外还添加了原来预训练模型的损失函数。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容