查看原文
其他

ChatGPT 和 InstructGPT 技术解析

推荐关注↓

来源:机器学习研习院

GPT (Generative Pre-Trained Transformer) 是 OpenAI 发布的一系列预训练模型,其目的就是以 Transformer 模型为基础,使用预训练技术,构建通用的文本模型。目前已经公布的模型有:文本预训练 GPT-1,GPT-2,GPT-3,图像预训练 iGPT,多模态预训练 GPT-4。最近非常热门的 ChatGPT 和今年年初公布的 InstructGPT 是一对姊妹模型,有时它们也被叫做 GPT3.5,其模型结构和训练方式都完全一致,即都使用了指示学习(Instruction Learning)和人工反馈的强化学习(Reinforcement Learning from Human Feedback,RLHF)来指导模型的训练,它们的不同仅仅是采集数据的方式有所差异。

因此,要搞懂 ChatGPT,我们先从 InstructGPT 开始。

背景知识

在介绍 ChatGPT/InstructGPT 之前,我们先了解它们依赖的基础算法。

1.GPT系列

文本预训练模型 GPT-1,GPT-2,GPT-3 都采用的以 Transformer 为核心的结构(如下图所示),不同的是模型的层数和词向量长度等超参。

GPT系列的模型结构(其中 Trm 指的一个 Transformer)

GPT-1 比 BERT 诞生略早几个月,它们都是采用的以 Transformer 为核心的结构,不同的是 GPT-1 通过自左向右生成式的构建预训练任务,然后得到一个通用的预训练模型,这个模型和 BERT 一样都可用来做下游任务的微调。GPT-1 当时在 9 个 NLP 任务上取得了 SOTA 的效果。

相比 GPT-1,GPT-2 并没有在模型结构上大作文章,只是增加了更多的参数和更多的训练数据。GPT-2 最重要的思想是提出了“所有的有监督学习都是无监督语言模型的一个子集”的思想,这个思想也是提示学习(Prompt Learning)的前身。GPT-2 在诞生之初也引发了不少的轰动,它生成的新闻足以欺骗大多数人类,达到以假乱真的效果。

GPT-3 被提出时,除了它远超 GPT-2 的效果外,引起更多讨论的是它 1750 亿的参数量。GPT-3 除了能完成常见的 NLP 任务外,研究者还发现 GPT-3 能够写 SQL,JavaScript 等语言的代码,能够进行简单的数学运算。GPT-3 的训练使用了情境学习(In-context Learning),它是元学习(Meta-learning)的一种,元学习的核心思想在于通过少量的数据寻找一个合适的初始化范围,使得模型能够在有限的数据集上快速拟合,并获得不错的效果。

虽然 GPT 系列模型的效果越来越惊艳,然而一个备受诟病的问题就是预训练模型的偏见性。因为预训练模型都是通过海量数据在超大参数量级的模型上训练出来的,对比完全由人工规则控制的专家系统来说,预训练模型就像一个黑盒子。没有人能够保证预训练模型不会生成一些包含种族歧视,性别歧视等危险内容,因为它的几十 GB 甚至几十 TB 的训练数据里肯定包含类似的训练样本。因此有了后来 InstructGPT 和 ChatGPT 的提出动机,它们的优化目标主要是:

  • 有用的(Helpful);
  • 可信的(Honest);
  • 无害的(Harmless)。

2.指示学习VS提示学习

指示学习(Instruct Learning)是 Deepmind 的 Quoc V.Le 团队2021年在《Finetuned Language Models Are Zero-Shot Learners》这篇文章中提出的思想。指示学习和提示学习(Prompt Learning)的目的都是去挖掘语言模型本身具备的知识。不同的是 Prompt 是激发语言模型的补全能力,例如根据上半句生成下半句;而 Instruct 是激发语言模型的理解能力,它给出更明显的指令,让模型去做出正确的行动。

我们可以通过下面的例子来理解这两种不同的学习方式:

  1. 提示学习:给女朋友买了这个项链,她很喜欢,这个项链太____了。
  2. 指示学习:判断这句话的情感:给女朋友买了这个项链,她很喜欢。选项:A=好;B=一般;C=差。

指示学习的优点是它经过多任务的微调后,也能够在其他任务上做 zero-shot,而提示学习都是针对一个任务的。泛化能力不如指示学习。我们可以通过下图来理解微调,提示学习和指示学习。

模型微调,提示学习,指示学习三者的异同

3.人工反馈的强化学习

因为预训练得到的模型并不是可控的,在生成模型中,训练数据的分布是影响生成内容质量的一个最重要因素。我们自然希望模型并不仅仅只受训练数据的影响,而是人为可控的,输出内容和人类喜欢的内容对齐(alignment)。人类喜欢的不止包括生成内容的流畅性和语法的正确性,还包括生成内容的有用性、真实性和无害性。

我们知道强化学习通过奖励(Reward)机制来指导模型训练,奖励机制可以近似看做是损失函数。奖励的计算要比损失函数更灵活和多样,这带来的代价是奖励的计算是不可导的,因此不能直接拿来做反向传播。强化学习的思路是通过对奖励的大量采样来拟合损失函数,从而实现模型的训练。同样人类反馈也是不可导的,那么我们也可以将人工反馈作为强化学习的奖励,基于人工反馈的强化学习便应运而生。

RLHF 最早可以追溯到 Google 在2017年发表的《Deep Reinforcement Learning from Human Preferences》,它通过人工标注作为反馈,提升了强化学习在模拟机器人以及雅达利游戏上的表现效果。

人工反馈的强化学习的基本原理

InstructGPT/ChatGPT 中还用到了强化学习中一个经典的算法:最近策略优化(Proximal Policy Optimization,PPO)。PPO 算法由 OpenAI 提出,是一种新型的策略梯度算法,策略梯度算法对步长十分敏感,但是又难以选择合适的步长。PPO 提出了新的目标函数可以在多个训练步骤实现小批量的更新,解决了策略梯度算法中步长难以确定的问题。

InstructGPT/ChatGPT 原理解读

有了上面这些基础知识,我们再去了解 InstructGPT 和 ChatGPT 就会简单很多。简单来说,InstructGPT/ChatGPT 都是采用了 GPT-3 的网络结构,通过指示学习构建训练样本来训练一个反应预测内容效果的奖励模型(RM),最后通过这个奖励模型的打分来指导强化学习模型的训练。InstructGPT/ChatGPT 的训练流程如下图所示。

InstructGPT的计算流程:(1)有监督微调(SFT);(2)奖励模型(RM)训练;(3)通过PPO根据奖励模型进行强化学习。

从上图中我们可以看出,InstructGPT/ChatGPT 的训练可以分成三步,其中第二步和第三步是奖励模型和强化学习对SFT模型的反复迭代和优化。

  1. 根据采集的 SFT 数据集对 GPT-3 进行有监督微调(Supervised FineTune,SFT);
  2. 收集人工标注的对比数据,训练奖励模型(Reword Model,RM);
  3. 使用 RM 作为强化学习的优化目标,利用 PPO 算法微调 SFT 模型。

接下来,我们将分别了解下 InstructGPT/ChatGPT 的数据集采集和模型训练两个方面的内容。

1.数据集采集

InstructGPT/ChatGPT 的训练分成 3 步,每一步需要的数据有些许差异。

1. SFT数据集

SFT 数据集是用来训练第一步有监督模型,即采集新数据,按照 GPT-3 的训练方式对 GPT-3 进行微调。因为 GPT-3 是一个基于提示学习的生成模型,因此 SFT 数据集也是由“提示-答复”对组成的样本。SFT 数据一部分来自使用 OpenAI PlayGround 的用户,另一部分来自 OpenAI 雇佣的 40 名标注工(labeler)。他们对标注工进行了培训,在这个数据集中,标注工根据内容自己编写指示,满足下面三点要求:

  • 简单任务:标注工给出任意一个简单的任务,同时确保任务的多样性;
  • Few-shot 任务:标注工给出一个指示,以及该指示的多个“指示-答复”对;
  • 用户相关的:从接口中获取用例,然后让标注工根据这些用例编写指示。

2. RM数据集

RM 数据集用来训练第二步奖励模型,我们需要为 InstructGPT/ChatGPT 的训练设置一个奖励目标。这个奖励目标不必可导,但是一定要尽可能全面且真实的对齐我们需要的模型生成内容。很自然的,我们可以通过人工标注的方式来提供这个奖励,通过人工对可以给那些涉及偏见的生成内容更低的分从而鼓励模型不去生成这些人类不喜欢的内容。InstructGPT/ChatGPT 的做法是先让模型生成一批候选文本,让后通过标注工根据生成数据的质量对这些生成内容进行排序。

3. PPO数据集

InstructGPT/ChatGPT 的 PPO 数据没有进行标注,它均来自 GPT-3 的 API 的用户,其中占比最高的包括生成任务(45.6%),QA(12.4%),头脑风暴(11.2%),对话(8.4%)等。

4. 数据分析

因为 InstructGPT/ChatGPT 是在 GPT-3 基础上做的微调。因为涉及了人工标注,它们数据总量并不大。下表展示了三份数据的来源及其数据量:

InstructGPT/ChatGPT 的数据分布

OpenAI 论文的附录A对数据的分布进行了更详细的描述。这里列出几个可能影响模型效果的信息:

  • 数据中 96% 以上是英文,其它 20 个语种例如中文、法语、西班牙语等加起来不到 4%,这可能是 InstructGPT/ChatGPT 能进行其它语种的生成,但效果远不如英文的原因;
  • 提示种类共有 9 种,而且绝大多数是生成类任务,这可能会导致模型有覆盖不到的任务类型;
  • 40 名外包员工来自美国和东南亚,分布比较集中且人数较少, InstructGPT/ChatGPT 的训练目标一个价值观正确的预训练模型,它的价值观是由这 40 个外包员工的价值观组合而成。而这个比较窄的分布可能会生成一些其他地区比较在意的歧视,偏见问题。

此外,ChatGPT 的博客中讲到 ChatGPT 和 InstructGPT 的训练方式相同,不同点仅仅是它们采集数据上有所不同,但是目前并没有更多的资料来说明其数据采集上到底有哪些细节上的不同。考虑到 ChatGPT 仅仅被用在对话领域,这里我们猜测 ChatGPT 在数据采集上有可能:1. 提高了对话类任务的占比;2. 将提示的方式转换为 Q&A 的方式。

2.训练任务

InstructGPT/ChatGPT 有三步训练方式。这三步训练会涉及三个模型:SFT,RM以及PPO。

1. 有监督微调(SFT)

这一步的训练和 GPT-3 一致。在 OpenAI 论文里研究者们发现让模型适当过拟合有助于后面两步的训练。

2. 奖励模型(RM)

因为训练 RM 的数据是标注工根据生成结果排序的结果,所以它可以看做一个回归模型。RM 结构是将 SFT 训练后的模型的最后嵌入层去掉。它的输入是 Prompt 和 Reponse,输出是奖励值。具体的讲,对每个 Prompt,InstructGPT/ChatGPT 会随机生成 K 个输出( 4≤K≤9 ),然后它们向标注工成对的展示输出结果,也就是每个 prompt 共展示 CK2个结果,然后标注工从中选择效果更好的输出。在训练时,InstructGPT/ChatGPT 将每个 prompt 的 CK2 个响应对作为一个 batch,这种训练方式要比传统的按样本为 batch 的训练方式更不容易过拟合,因为这种方式每个 prompt 仅会输入到模型中一次。

奖励模型的损失函数如下式所示。这个损失函数的目标是最大化标注工更喜欢的响应和不喜欢的响应之间的差值。

其中 rθ (x,y) 是提示 x 和响应 y 在参数为 θ 的奖励模型下的奖励值,yw 是标注工更喜欢的响应结果,yl 是标注工不喜欢的响应结果。D 是整个训练数据集。

3. 强化学习模型(PPO)

强化学习和预训练模型最近两年非常火热。不少研究者认为强化学习不太适合应用到预训练模型中,因为很难通过模型的输出内容建立奖励机制。而 InstructGPT/ChatGPT 反直觉的做到了这点,它通过结合人工标注,将强化学习引入到预训练语言模型是 InstructGPT/ChatGPT 这个算法最大的创新点。

PPO 的训练集完全来自 API。它通过第二步得到的奖励模型来指导 SFT 模型的继续训练。很多时候强化学习是非常难训练的,InstructGPT/ChatGPT 在训练过程中就遇到了两个问题:

  1. 随着模型的更新,强化学习模型产生的数据和训练奖励模型的数据的差异会越来越大。OpenAI 研究者的解决方案是在损失函数中加入KL惩罚项

来确保 PPO 模型的输出和 SFT 的输出差距不会很大。

  1. 只用 PPO 模型进行训练的话,会导致模型在通用 NLP 任务上性能的大幅下降,OpenAI 研究者的解决方案是在训练目标中加入了通用的语言模型目标

这个变量在论文中被叫做 PPO-ptx。

综上,PPO的训练目标为式为:


InstructGPT/ChatGPT 的性能分析

InstructGPT/ChatGPT 的效果是非常棒的,尤其是引入了人工标注之后,让模型“价值观”的正确程度和人类行为模式的“真实性”都大幅提升。

优点

  • InstructGPT/ChatGPT 的效果比 GPT-3 更加真实:GPT-3 本身就具有非常强的泛化能力和生成能力,再加上 InstructGPT/ChatGPT 引入了不同的标注工进行提示编写和生成结果排序,这使得我们在训练奖励模型时对更加真实的数据会有更高的奖励;
  • InstructGPT/ChatGPT 在模型的无害性上比 GPT-3 效果要有些许提升:OpenAI 的研究者发现 InstructGPT/ChatGPT 在歧视、偏见等数据集上并没有明显的提升。这可能是因为 GPT-3 本身就是一个效果非常好的模型,它生成带有有害、歧视、偏见等情况的有问题样本的概率本身比较低。同时,仅仅通过 40 个标注工采集和标注的数据很可能无法让模型在这些方面进行充分的优化;
  • InstructGPT/ChatGPT 具有很强的 Coding 能力:GPT-3 本身就具有很强的 Coding 能力,而且也有部分 OpenAI 的内部员工参与了数据采集的工作,因而训练出来的 InstructGPT/ChatGPT 具有非常强的 Coding 能力也就不意外了。

缺点

  • InstructGPT/ChatGPT 会降低模型在通用 NLP 任务上的效果
  • 有时候 InstructGPT/ChatGPT 会给出一些荒谬的输出:虽然 InstructGPT/ChatGPT 使用了人类反馈,但限于人力资源有限。影响模型效果最大的还是有监督的语言模型任务,人类只是起到了纠正作用。就像一个学生,虽然有老师对他指导,但也不能确定学生可以学会所有知识点;
  • 模型对指示非常敏感:这个可能是标注工标注的数据量不够,因为指示是模型产生输出的唯一线索;
  • 模型对简单概念的过分解读:这可能是标注工在进行生成内容的比较时,倾向于给给长的输出内容更高的奖励。
  • 对有害的指示可能会输出有害的答复:例如 InstructGPT/ChatGPT 也会对用户提出的“ AI 毁灭人类计划书”给出行动方案。这个是因为 InstructGPT/ChatGPT 假设标注工编写的指示是合理且价值观正确的,并没有对用户给出的指示做更详细的判断。

未来工作

到此我们已经了解了 InstrcutGPT/ChatGPT 的技术方案和它们的问题,那么我们也可以从中看出一些未来的优化角度:

  • 人工标注的降本增效:InstrcutGPT/ChatGPT 雇佣了 40 人的标注团队,但从模型的表现效果来看,这 40 人的团队是不够的。如何让人类能够提供更有效的反馈方式,将人类表现和模型表现有机和巧妙的结合起来是非常值得研究的课题;
  • 模型对指示的泛化/纠错等能力:指示作为模型产生输出的唯一线索,模型对他的依赖是非常严重的,如何提升模型对指示的泛化能力以及对错误指示的纠错能力是一个非常重要的工作;
  • 避免通用任务性能下降:我们需要设计一个更合理的人类反馈的方式,或是更前沿的模型结构,让生成结果的对齐性和通用 NLP 任务的性能达到平衡。



- EOF -



加主页君微信,不仅Python技能+1

主页君日常还会在个人微信分享Python相关工具资源精选技术文章,不定期分享一些有意思的活动岗位内推以及如何用技术做业余项目

加个微信,打开一扇窗





推荐阅读  点击标题可跳转

1、Nature 总结 ChatGPT 六个编程技巧

2、ChatGPT的工作原理,这篇文章说清楚了!

3、Pandas + ChatGPT:交互式数据分析!



觉得本文对你有帮助?请分享给更多人

推荐关注「Python开发者」,提升Python技能



点赞和在看就是最大的支持❤️

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存