【论文学习】InstructGPT:Training language models to follow instructions with human feedback

前言:
语言模型的输出依赖于预训练的数据集,研究者想要探索无监督领域的模型,使其仅仅依赖无标签的数据就可以实现不错的效果,为了让模型的泛化性能尽可能的强,研究者会提供尽可能大的数据集。但这样的训练方法存在两个问题:一、有效性。模型的性能依赖于训练时使用的文本,但是研究者并不知道无标签的大批量的数据集是否可以使模型学习到解决指定任务的能力,可能对于特定领域来说,模型根本没见过这样的数据;二、安全性,模型可能输出一些不应该输出的东西。最简单的方法是——使用一些有标注的数据,即使这样的方法与研制无监督领域模型的初衷相悖。

Abstract

把语言模型做大并不会使它们更好地遵循人类的意图。由于语言模型的输出的灵活性,它们可能生成一些不真实的、有毒的或是对用户没有帮助的输出。也就是说模型并不能和用户站在同一边。在这篇论文里,研究者通过以人类的反馈对模型进行微调来使得模型能够遵循用户的意图。从标注的prompts和通过OpenAI API提交的prompts里,研究者收集了一个标注者的演示的数据集,演示内容是想要模型学习到的一些行为,然后用这个数据集对GPT-3做微调。在这之后,研究者收集了一个模型输出的评分的数据集,然后用强化学习的方法再微调模型。得到的模型称为InstructGPT。从结果上来看,人类评估反映1.3B的InstructGPT的表现要优于175B的GPT-3,而在公开的NLP数据集上面,尽管InstructGPT的表现有轻微的下降,但是它在输出的真实性和降低有毒的输出上取得了很大的进步。尽管InstructGPT仍然会犯一些简单的错误,但结果说明用人类反馈来做微调是一个不错的方向。

Introduction

语言模型会生成一些不符合用户需求的输出,是因为它在预训练时使用的目标函数——预测某个文本中的下一个词,与模型创建者的目标”安全且有效地遵循用户的指令“不一致。研究者希望模型更有帮助性、更真诚、更无害。
研究者使用强化学习的方法来训练出一个更好的模型InstructGPT,具体的过程可以见下图:
【论文学习】InstructGPT:Training language models to follow instructions with human feedback_第1张图片
步骤一:
从收集到的prompts数据集中取出一些prompt,然后让标注者标注对应的答案,再用这些数据微调GPT-3得到模型SFT;
步骤二:
输入prompt,让模型生成几个输出,然后让标注者对答案进行排序,然后用这些排序数据训练一个奖励模型RM,能够对答案进行打分,打分的大小顺序满足训练使用的这些答案的顺序;
步骤三:
再让STF去生成一些答案,把答案放到RM里面去打分,然后去优化STF的参数使得它生成更高的分数。最后得到InstrctGPT。

步骤一和步骤二都需要人工标注,区别在于步骤一的生成式的标注要比步骤二的判别式的标注贵很多,同样的标注时间和成本,联合步骤一和步骤二得到的数据要比值用步骤一得到的数据多很多,在这上面训练出来的模型性能可能会好一些。

研究者发现:

  • 标注者觉得InstrcutGPT要比GPT-3好很多
  • InstrctGPT在真实性上有了一定的提升
  • 在有毒性上有少量的提升,但在偏见上没有提升(认为护士都是女的等偏见)
  • 在用强化学习做微调的时候,把预训练的目标函数加进来,可以减缓模型泛化能力的下降
  • 非标注者也觉得InstructGPT要比GPT-3好
  • 把GPT-3在其他的一些公用数据集上做微调,效果没有InstructGPT好
  • 对于在微调中少量或是不存在的任务,模型也表现出一定程度上的泛化性
  • InstrcutGPT仍然会犯错误

Methods and experimental details

Dataset

prompt数据集的来源:
首先让标注者手写一部分prompt,然后用些prompt按照上述步骤微调一个InstructGPT,开放这个模型让用户使用,得到用户提出的prompt,对它进行安全性和重复性上的过滤,并根据用户ID划分训练集,验证集,测试集(同一用户提出的问题可能具有相似性,避免测试集和验证集出现类似问题)。

得到prompt数据集后,再基于它得到对应的三个数据集:

  1. SFT数据集,让标注者写下prompt的答案
  2. RM数据集,让标注者对模型输出进行排序
  3. PPO数据集,不做调整

不过在让标注工标注数据时,主要还是关注模型的帮助性,无害性和真实性仍是靠大力出奇迹(chatGPT也是)

Models

SFT: 在之前得到的SFT数据集上训练了16个epochs。尽管第一个epoch就过拟合了,但是发现训练更多的epoch还是能对后面的步骤产生帮助。

RM:
把SFT最后的softmax去掉,换成输出为标量分数的线性层,然后把问题和答案一起放进模型中来训练这个模型得到RM。在论文里研究者使用6B的RM而不是175B的RM,因为大模型一方面容易不稳定(这是预训大模型的通病,loss可能不能稳定下降),另一方面训练太贵。
模型训练的损失函数如下,是pairwise ranking loss:
【论文学习】InstructGPT:Training language models to follow instructions with human feedback_第2张图片

论文中令K=9,意味着一次损失函数要对36次比较做计算。相比于一次损失函数对一次比较做计算,这样的方法一方面减少了计算量(前者只需要计算9次 r θ r_\theta rθ,后者需要计算36次 r θ r_\theta rθ),另一方面减缓了过拟合(梯度更新次数变少了)

RL:
使用强化学习优化算法PPO,它的作者就职于OpenAI。

之所以要训练RM和RL两个模型,核心原因还是因为让标注者标注出所有的prompt对应的答案实在是太贵了,只能退而求其次去标注模型生成的答案的排序,此时考虑强化学习中的在线学习方法,即模型在做出行动后,需要人来对模型进行反馈,然后模型做出对应的更新。训练RM就是为了学习人来对模型进行反馈。SFT在拿到prompt并生成对应的答案后,由RM进行打分,再根据这个打分去更新模型,然后用更新的模型生成新的答案,并进行下一步分学习,这就是强化学习的过程。

它的目标函数如下:
【论文学习】InstructGPT:Training language models to follow instructions with human feedback_第3张图片
上述的学习过程可能会使得模型输出的答案与初始的STF答案偏离越来越大,这可能使得模型效果变差,因此加入了一个KL散度作为罚项,避免强化学习的RL模型和STF模型的输出相差太大。具体来说 π ( y ∣ x ) \pi(y|x) π(yx) 是把模型输出的每一个token的softmax对应概率相乘得到的结果。
为了保留它的泛化性,再把原始的预训练目标函数拿过来。

对目标函数做梯度下降即可。

Result

【论文学习】InstructGPT:Training language models to follow instructions with human feedback_第4张图片

Discussion

  1. 相比于预训练,这三个步骤的训练成本很低(样本数小了很多倍)
  2. 模型的行为跟数据的标注工息息相关

你可能感兴趣的:(学习,语言模型,自然语言处理)