InstructGPT 论文精读【论文精读】

ChatGPT
- Chat GPT 既没有发表在 NeurlPS 上面,也没有发表在 EMNLP ,甚至连一篇论文都没有
ChatGPT 的四个应用
Samples
1、ChatGPT asks the clarifying questions to debug code

2、ChatGPT initially refuses to answer a question that could be about illegal activities but responds after the user clarifies their intent
- ChatGPT 能在安全性上避免进行一些非法的回答

3、ChatGPT is able to understand the reference (“it”) to the subject of the previous question (“fermat’s little theorem”)
- ChatGPT 是能够理解上下文的,它能够记住之前的问题(它能够做一个 8000 词的上下文,也就是说如果回答是在 8000 词以内的话是能够联系上下文的)

4、ChatGPT provides responses to follow-up instructions
- ChatGPT 是能够理解自己的局限性的,它明白自己有哪些事情是自己做不到的

以上是官方给出的应用样例,还有一些其他的应用:
- 把它伪装成一个操作系统,让它来执行代码
GPT-3发布之后的一两年之内,出现了上百种应用,和 GPT-3 相比,ChatGPT 是基于对话的形式,而且是多轮对话,ChatGPT 更加自然一点,符合人的交互习惯,所以不出意外的话,未来也会出现越来越多的应用
(根据 OpenAI 的一贯作风,它会先发布模型,过几个月之后再发论文,目前只有模型和博客,论文暂时还没有发布)
Methods
ChatGPT 用的是跟 InstructGPT 相同的方法
- InstructGPT 其实跟 GPT 更相近,它的数据格式是一个 prompt
- ChatGPT 的输入是一个对话的形式,所以说在数据收集上面和 InstructGPT 有一点不同:在标注数据的时候需要做成多轮对话的形式

(这张图和 Instruct GPT 也是相同的)
ChatGPT 是在 GPT3.5系列的基础上进行微调得来的
- 这里的 GPT3.5 应该就是在GPT-3 代码的基础上进行修改得到的
InstructGPT
- OpenAI 的工作都是基于前面的工作,工作是具有连续性的
- InstructGPT 这篇文章发表于 2022 年 3 月 4 日
- 论文链接:https://arxiv.org/abs/2203.02155
Title

- 训练语言模型,使得它们能够服从人类的一些指示
语言模型每次是给定一段东西,然后去预测下一个词,它是一个自监督模型,所以认为它是没有标号的。如果想让语言模型去解释某一个概念的话,就需要文本中出现过类似的东西,因此模型的行为取决于文本搜集的好坏。一般用来训练的文本大概都是几十亿、几百亿的词,所以具体里面有什么东西是不清楚的,只是大概知道文本质量的好坏,然后进行一定的清洗。因此模型的精细度是不够的,所以对整个模型的控制比较弱,一般就是大力出奇迹,把数据输入进去,得到什么样的模型就是什么
这样的问题在于:
- 有效性:如果想让模型去做某个事情,但是模型始终学不会怎么办?因为文本中没有相应的东西。
- 安全性:模型输出一些不应该输出的东西怎么办?这对于大公司来讲将会造成很大的灾难
最简单的办法就是标注一些数据,所以这篇文章的省流版本就是标注一点数据,然后将语言模型做一次微调,这样就能获得更好的效果
- 整个 OpenAI 或者说现在这些大的模型都是号称往无监督或者是自监督的方向发展,现在如果说还是需要进行数据标注,效果会很好,如果这么说的话,就是自相矛盾了,所以文章需要进行包装
Author

- 作者基本上都是 OpenAI 的员工,带“*”的是主要作者
Abstract
把语言模型变大并不能代表它们会更好地按照用户的意图来做事情,大的语言模型很可能会生成一些不真实的、有害的或者是没有帮助的答案。换句话说,这些模型没有和用户站在一起(目标一致,达成合作)
- 如果读者的关注点主要在研究上面,就可能会低估这一段话的重要性。因为在研究上,很多时候训练一个模型,在标准数据集上把整个分数刷上去就行了。但是在工业上的部署,也就是在 AI 模型的落地上面,安全性和有效性是非常重要的。
- 比如一个机器学习的产品,因为有一些地方没有做到位,从而引发争议导致整个产品下线,这种例子很多:比如 2015 年有用户反馈 Google 的照片服务将黑人的标签识别成了 Gorilla(大猩猩) ,导致 Google 紧急上线将 Gorilla 这个标签在模型中删掉。三年之后,Google photos 还是把 Gorilla 整个标签去掉了,也就是说,如果照片中有真的 Gorilla 的话,Google 是不会将它识别出来的;2021 年纽约时报报道说 Facebook 因为它的 AI 算法把它的黑人视频加了一个灵长类动物的标签而道歉,跟之前的黑猩猩事件如出一辙;微软发布的一个小冰聊天机器人的英文版在推特上发布 16 小时之后,用户发现它有一点种族歧视的语言,然后微软就紧急将它下架了,然后重新训练一个模型上线之后结果又乱讲话,最后导致整个产品被下线;最近的例子,Meta 发布了一个叫做 Galactica 的模型(https://galactica.org/explore/,由 paper with code 团队发布),它能够做很多学术相关的事情,比如讲一个公式翻译成一个语言来进行描述或者说将一段代码用数学公式写出来,以及解决数学题,在模型发布不久之后,就有人发现这个模型会生成一些错误的或者是有偏见的但是听上去很正确的东西,他认为这个是一个非常危险的事情,等于是在一本正经的胡说八道并且使别人相信了,这些批评导致模型在发布的三天之后,Meta 就将这个模型下架了。。。
所以当将一个机器学习的模型部署到产品中的时候需要非常小心,需要特别注意它出错的地方,避免在公关上出现问题。通常对于简单的分类问题来说相对会好一点,只需要将标号中一些有争议性的标号拿掉,但是语言模型的输出特别灵活
- 一方面研究者享受这种灵活性带来的巨大的应用场景
- 另一方面,这种灵活性的输出,导致出错的概率会更大
GPT-3 发布这么久,有出过什么事情吗?
- 其实是有的,只是 OpenAI 作为一个创业公司,媒体对创业公司的容忍度相对来讲会高一些
- 但是如果是一些大厂,比如 Google 这样的大公司,把 GPT-3 这种模型做成一个产品的形式时,一旦出现什么问题,就会出现很大的公关问题
- 事实上,ChatGPT 已经在安全性上做了很多工作,避免去回答一些非法的问题,实际上大家早就找到了各种可能性来绕开这些限制
- 14:34
- 其实有很多的可能性让ChatGPT发表一些不适当的言论,只是现在 OpenAI 的口碑比较良好,如果说换一个大厂将同样的模型发表出来,结果就不一样了
这篇文章中展示了怎样对语言模型和人类的意图之间做 align ,具体使用的方法是使用人类的反馈进行微调(fine-tuning with human feedback)
- 注意这里使用的是 human feedback,不是使用的带标签的数据
具体做法是写了很多的 prompt ,在 OpenAI 的 API 上收集到各种问题,然后用标注工具将这些问题的答案写出来,这样就标注了一个数据集,然后在这个数据集上对 GPT-3 的模型做微调
然后又收集了一个数据集,这个数据集就是对每个模型的输出(问它一个问题,它可能会输出很多模型,因为它是一个概率采样的问题)进行人工标注,标注出好坏的顺序,有了这个顺序之后,再用强化学习继续训练出一个模型,这个模型就叫做 InstructGPT
所以作者主要做了两件事情:
- 首先标注了一些数据,将问题和答案都写出来然后训练一个模型
- 接下来又做了一个排序的数据集,然后用强化学习再训练出一个模型
因此一共有两个模型,结果证明在人类的评估上面, InstructGPT (有标号的数据集)1.3B 的模型参数要好过最大的 GPT-3,也就是175B,也就是说一个 1% 大小的模型的效果反而更好一点。另外 InstructGPT 能在真实性上更高地降低有害的答案出现的概率。在公开的 NLP 数据集上,它的性能也没有显著的下降。
因此,等价于是说 InstructGPT更小,但是效果更好,而且在一些别的公开数据集上性能也没有变差
- 当然,不得不承认的是 InstructGPT 还是会犯一些简单的错误
整个摘要的核心思想是说,作者标记了一个数据集,然后在这个数据集上比 GPT-3 要小 100 倍的模型然后在上面做微调的效果比最大的 GPT-3 模型的效果可能还要好一些
- 对于这个结果,也不是特别意外,因为标注的数据集信噪比更加好一点,所以学习起来更加简单一点,不需要那么大的模型
- transformer 模型就是对整个数据做压缩,把整个数据信息压缩进模型的参数,信噪比越高,而且标注的信息和最后要评估的数据集可能更近一点,所以就导致不需要压缩那么多的东西
- 信噪比:方差即不确定性,不确定性即信息。也就是说对于一组样本来说,其方差越大,代表样本中含有的信息越多,所以可以将方差看作信息量的一个度量。因此,信噪比的统计学含义就是:能够被模型解释的信息与不能够被模型解释的信息之比。
- 虽然 OpenAI 和一些大的厂都是在说,训练一个特别大的模型,根本不需要标注,效果特别好,实际上在实用上来讲,如果这个方向一路走到底的时候,计算能力不一定能吃得消,而且数据可能增长到某个程度之后,可能覆盖的地方还是存在问题,而在那些想要的特性但是模型做不到的地方适当加入一些人类的标注,其实相对来讲更加划算
所以一个好的方法需要平衡算力的需求和人类标注的代价
Introduction
- 导论就是摘要中所讲的故事的一个稍微详细的版本,首先讲问题,然后讲方法,最后讲结果
大的语言模型能够通过提示的方式把任务作为输入,但是这些模型也经常会有一些不想要的行为,比如说捏造事实,生成有偏见的、有害的或者是没有按照想要的方式来,这是因为整个语言模型训练的目标函数有问题
- 语言模型的目标函数是在网上的文本数据中预测下一个词,即给定一个文本中的一段话,然后预测这段话后面的词
- 这个目标函数和想让根据人的指示来生成安全的、有帮助的答案其实是不一样的,所以作者把真正训练的目标函数和所想要让这个模型做的事情之间的差距叫做语言模型目标函数是没有 align
所以这篇文章的目的就是让语言模型更好一点:
- 希望语言模型能够更有帮助性,能够解决想让它解决的事情
- 能够更加真诚,不要捏造事实,要实事求是
- 无害,既不要生成让人反感的输出,也不要生成一些可能对别人造成危害的输出
具体实现的方法:
1、基于人类反馈的强化学习(reinforcement learning from human feedback,RLHF)(之所以选用 RLHF 这个方法可能是因为 OpenAI 其实是做强化学习起家的,这篇文章几位作者之前都是做强化学习的,强化学习的一个方法就是去仿照人,比如说打游戏或者做机器人之类的,这里这个技术可以同样用过来,使模型能够仿照人来生成答案或者是生成符合人偏好的答案)
图二(InstructGPT 怎样从 GPT-3 一步一步训练而来的,一共标注了两块数据,生成了三个模型)

- ----第一步----
- 首先找了各种人来写各种各样的问题(这个问题在 GPT 中叫做 prompt ,具体来说就是向一个 6 岁的小孩解释什么是月亮;这些问题也可能是来自之前用户在向 GPT-3 提交的各种问题中筛选出来的)
- 然后继续让人写答案(比如说例子中问题的答案就是一些人去了月球。。。)
- 在有了问题和答案之后,就可以将这两个拼成一段话,然后在这个上面对 GPT-3 进行微调
- 因此,虽然这是人类标注的数据,但是在 GPT 眼中都是一样的,都是给定一段话然后预测下一个词,所以在微调上跟之前的在别的地方做微调或者是做预训练没有任何区别
- GPT-3 的模型在人类标注的数据上微调出来的模型叫做 有监督的微调(supervised fine-tuning),这是训练出来的第一个模型,其实训练出来的这个模型也能用,但是它的问题在于生成答案是一件很贵的事情,所以很难让人把所有各式各样的答案都写出来
- ----第二步----(在标注上更加简单一点)
- 给定一个问题,让上一步训练好的预训练模型 SFT 生成答案
- GPT 每一次预测一个词的概率,可以根据这个概率采样出很多答案,通常来说可以用 beam search
- 这里生成了四个答案,然后把这四个答案的好坏进行人工标注,进行排序标注
- 有了这些排序之后,再训练一个模型奖励模型(Reward Model,RM),这个模型是说给定 prompt 得到输出,然后对这个输出生成一个分数,可以认为这个分数是一个奖励或者是打分,使得对答案的分数能够满足人工排序的关系(大小关系保持一致),一旦这个模型生成好之后,就能够对生成的答案进行打分
- ----第三步----
- 继续微调之前训练好的 SFT,使得它生成的答案能够尽量得到一个比较高的分数,即每一次将它生成的答案放进 RM 中打分,然后优化 SFT 的参数使得它生成的答案在 RM 中获得更高的分数
如果在第一步人工标注数据的时候能够生成足够多的答案的话,其实不需要后面两步也是可行的,但是考虑到写一个答案做生成式的标注远远复杂于对模型生成的答案进行好坏的排序的这种判别式的标注
所以第二步的好处在于让数据标注变得更更加简单,能够更快速的得到更多的标注信息,所以有了第二步之后,就可以使得在同样的标注成本下能够得到更多的数据,可能模型的性能会更好一些
最后训练出来的模型就叫做 InstructGPT ,它是 GPT-3 经过以上三个步骤训练得来的
从技术要点上来看,有以下几个技术:
- 第一步中的数据标注的实现
- 第二步中的数据排序的实现
- 微调和 GPT-3 的微调是一样的
- RM 模型的训练
- 有了 RM 模型之后,如何通过强化学习来训练
最后是关于结果的一些描述:
1、标注人员觉得 InstructGPT 的答案要比 GPT-3 的答案明显要好很多
2、InstructGPT 在真实性上要比 GPT-3 好一些
3、InstructGPT 在生成有害的输出上要比 GPT-3 好一点,因为它可以说不想回答某一个问题,但是在偏见(比如性别歧视)上并没有太大的提升
4、在做微调的时候通常是根据某一个目标做微调,可能会使得模型在一些别的任务上的性能会下降。作者的做法是在做强化学习的时候,将最原始的目标函数拿回来,使得虽然在做完微调之后在这种 QA 上面做的更好一点,但是在一些其他的任务,比如说公有的 NLP 数据集上也不至于说性能下降很多
5、虽然在整个过程中进行了人工标注,但是标注这个事情非常有主观性,因为是写一段文字或者是判断两段话的好坏,作者找了一些没有标注数据参与训练的标注人员,只是从结果的角度去评估 InstructGPT 的话他们还是觉得 InstructGPT 要比 GPT-3 好一些(人与人之间的喜好是有一定的相关性的)
6、作者将 GPT-3 在 InstructGPT 的数据和其他的公用数据集 FLAN 和 T0 上进行了微调,最后比较发现,还是在自己的数据上微调出来的效果会好一些,也就是说别人的数据可能和自己的数据在分布上不太一致,所以意味着微调对数据还是比较敏感的
7、作者标注了大量的问题,但是因为语言模型比较灵活,不可能将所有的问题都标注出来,所以作者发现虽然标注的问题里面只有少部分是总结代码或者是问代码相关的问题,在训练完之后发现实际的模型在这方面的表现还是不错的,也就是说所训练出来的模型其实是有一些泛化性的,因此这也意味着其实也没有必要一定要将所有不同的问答类型全部标注,模型根据之前的先验知识具有一定的泛化性
8、模型也还是会犯一些简单的错误,因为文中所展示的都是一些模型所表现出来的比较出乎意料的东西,但是可能在一些大家习以为常的地方很可能会出错,所以在这一点上可以认为 InstructGPT 或者说甚至现在的 ChatGPT 多多少少还是像一个玩具,而不是一个工具
- 工具不需要惊喜,但是需要保证可用性,不能在一些正常的地方出错
Related work
Methods and experimental details
本文所使用的方法就是前面工作的方法,只是前面的工作主要用在文本样式的一致性和渐进式总结(类似于问答的场景下),方法本身没有本质上的区别(这些技术虽然都是 openAI 前面的研究,但是并不是 InstructGPT 的原创,这些技术之前就有了,只不过 InstructGPT 使用这些技术在一个新的数据集上重新训练了一下)
Dataset
1、prompt 数据集
来源:
首先标注人员写了很多的问题,这些问题包括:
- Plain:让标注人员写任何的问题
- Few-shot:让标注人员写一个指令,有各种不同的指令,然后里面有后续的一些问题回答
- User-based:用户提供了一些想要支持的应用场景,然后将其构建成任务
有了这些最初构建出来的 prompt 之后,作者训练了第一个 InstructGPT 模型,得到这个模型之后,将其放在 playground 中供大家使用。大家在使用的过程中可能又会提出一些问题,然后又把这些问题采集回来,并进行筛选
- 对每个用户最多采用 200 个问题
- 在划分训练集、验证集、测试集的时候是根据用户的 ID 来划分的(这个也很重要,当收集了很多来自不同用户的各种问题之后,不能把这些问题放在一起进行随机划分,因为一个用户可能会问一些类似的问题,如果这个问题同时出现在训练集和测试集中,就会造成数据污染,所以按照用户进行划分更加公平)
- 如果问题中包含了很多的用户信息,比如出现了人名,就将其过滤掉
通过这个方法就得到了更多的 prompt。
这也是一个比较常见的思路,比如说要做一个机器学习的产品,训练模型需要数据。这个数据一开始可以人工标注一点数据,但是人工标注的数据和真正用户用的肯定是存在一定的差距,有了一些数据之后就能够训练出一个模型出来,这个模型不一定要特别好,可以将其作为内侧模型供大家使用。在用户使用过后就能收集到更多的数据,能够进一步提升模型的质量。在不断进行迭代提升之后,就能够得到一个比较好的数据集,而且能够持续地进行下去,这也是一般发布产品的思路。
- 如果是一个创业公司,做东西可能会随便一点。当发布一个产品,如果没做好,用户的容忍度会比较大,而且在使用用户的数据上面也更加容易
- 但是如果是大公司的话,发布的任何东西,虽然可能只是供大家娱乐,但是如果大家对这个东西的质量跟自己的预期有点差距之后,可能后果比较严重。而且大公司在使用用户的数据方面可能会受到更多的抵制
在有了这些 prompt 之后就产生了三个不同的数据集,数据集之间可能共享了一些问题:
- SFT 数据集:让标注人员直接写答案。用来训练 SFT 模型的数据集中有 13000 个样本。
- RM 数据集:用来训练一个 RM 模型,只需要进行排序就可以了。用来训练 RM 模型的数据集中有 33000 个样本。
- PPO 数据集:用来训练强化模型,也就是 InstructGPT 。这个时候就不需要标注(标注来自于 RM 模型的标注)。用来训练 InstructGPT 模型的数据集中有 31000 个样本。
表 1 展示了 prompt 数据集中使用 API 的用户的用途分布情况

- 最多的是生成一些东西,其次是一些开放性的回答、头脑风暴等
表 2 中展示了一些例子

- 头脑风暴:列出五个能够使我保持对事业的热情的五个想法
- 生成类:生成一个短故事
- 重写:给定百老汇 show 的总结,将其中的要点列出来
在文章的附录 A 中提供了大量的 prompt 的例子





Tasks
任务的多元性还是挺高的
Human data collection
这一小节主要讲述的是怎样进行数据的标注
作者在 Upwork(美国招聘合同工常用的网站) 和 ScaleAI(一个数据标注公司) 上招了一个 40 人组成的团队,在附录 B 中有对人员的筛选过程进行详细的描述
- 具体来说,需要进行测试,看这个人工作做得怎么样(这个在实际的产品中还是比较重要的,招人标注数据不难,但是想要招到比较满意的、能够提供足够质量数据的人其实并不容易。对于这一块也有相关的研究工作,专门研究怎样去挑选标注人员,甚至通过强化学习来选人)
在标注的过程中,希望能够做到,尽量将帮助性排在第一位;在评测的时候尽量把真实性和无害性排在第一位
- 标注数据的时候给的指示和最终评估的时候不同
作者和标注人员紧密合作,因为整个任务相对来说还是比较开放的,而且比较难,所以需要不断地与标注人员进行沟通,在几个月的时间跨度中进行合作,因为生成类和比较长的对话的判断都是一些比较模棱两可的任务,因此需要的是熟练的标注人员
- 这也是为什么作者招了一个由 40 个合同工组成的团队,这样的话就能够保证可以持续地跟这些标注人员进行沟通,他们也能够知道到底要干什么事情
- 像简单的图片标注,可能随便找一些人进行标注就可以了
这些标注人员的一致性还是比较高的
- 72% 左右的情况下,大家是相互同意对方的一些评测。这就意味着这个任务可能具有二相性,但是大家的意向基本一致
如果之前没有做过数据标注,而且需要找人进行数据标注的话,可以参考作者所采用的方法,他的描述还是比较详细的
- 特别是在附录中提供了很多的模板,又可能能够直接套用
- 作者还提供了标注网页的 UI 的样式,可以进行参考
数据标注其实比较偏工程化,这一块里面还是有很多的技术可以学习的,有很多的论文,以及专业的公司。如果有这方面的需求,可以参考其他人的做法,不需要从零开始,因为有很多的技术是可以借鉴的
Models
总共有三个模型:
1、Supervised fine-tuning(SFT)
等价于将 GPT-3 模型标注好的 prompt 和答案进行重新训练,总共训练了 16 个 epoch
- 因为数据比较少,总共只有 13000 个数据,所以 GPT 的模型训练一个 epoch 就过拟合了。这个模型也不是直接使用,而是用来初始化后面的模型,所以作者发现过拟合其实是没有问题的,对后面还能起到一定的帮助作用
2、Reward Modeling(RM)
将 GPT-3 模型最后的 unembedding layer 去掉
- 正常 GPT 进入最后一个输出层之后,放进 softmax 输出一个概率。现在 softmax 可以不用,在后面加上一个线性层来投影,即将所有词的输出投影到一个值上面,就是一个输出为 1 的线性层,就可以输出一个标量的分数,而且这个奖励是在 prompt 和回复上面一起训练得来的
这里使用的是一个 6B 大小的RM,没有用最大的 175B
- 作者发现 175B 大小的模型训练起来不是特别稳定(在比较大的模型训练,其实不稳定是它的一个比较大的痛点,而且现在也没有特别好的解决方案)。如果模型训练不稳定的话,在后面 RL 里面训练会比较麻烦
- 此外,用小一点的模型也能够节省算力
因为输入的标注是排序,而不是让用户标注的值,仅仅是一个顺序,因此需要将这个顺序转换成一个值,作者使用的损失函数是排序中常见的 Pairwise-ranking loss:

- pairwise 是说对一个 prompt 取出一对它的答案 yw 和 yl (假设 yw 的排序比 yl 高),先把 x(问题) 和 yw(回答)放进奖励模型计算出对应的奖励分数,再把 x(问题) 和 yl(回答)也放进奖励模型计算出对应的奖励分数
- 因为 yw 的排序比 yl 要高,也就意味着希望 yw 对应的奖励要比 yl 大,将这两个奖励值相减之后希望将最终的结果变的越大越好(这里使用的是 Logistic Loss)
- 44:38
- 对于每个 prompt 会生成 9 个答案
- 如果一个答案比另外一个答案排序高的话,尽量使得它们之间的奖励分数差距比较大
对于不同的变种,为什么要选择这样的损失函数?在前面的工作中使用的是 K=4 ,这里使用 K=9 有两个原因
1、当 K=4 时,做标注的时候只需要对 4 个答案进行排序就可以了,而现在需要对 9 个答案进行排序,感觉上排序会变得更加复杂,但其实对问题进行标注的时候可能需要花很多的时间去看懂 prompt 要干什么事情,可能需要花更多的时间去看懂一个问题,在看明白了一两个答案之后,其它答案可能长得差不多,因为只需要进行排序,都是模型生成的答案,所以对 9 个答案进行排序不一定比对 4 个答案进行排序时间长很多(并不存在倍数关系),算上读题的时间,可能总共时间就多了 30%~40%,而不是更多
- 但是反过来讲,因为对 9 个答案进行了排序,产生了 36 个排序关系,等于标注信息多了 9 倍,也就意味着可能没有花超过两倍的时间,但是标注信息多了 6 倍(K=4 时只有 6 个排序信息)
2、
- 在计算的时候,最贵的事情是将 x 和 y 放进 RM 模型里面(它是一个 6B 的 GPT-3 的模型),所计算的值是可以复用的,所以只需要进行 9 次奖励值的计算就可以了(计算了 9 次,算出了 36 个标号,等价于节省了 倍的时间 ,K 越大节省的时间就越多,因此从计算上来讲,K 的值越大也是有好处的)
之前的工作不仅是 K=4 ,而且在标注的时候只标注最好的一个,也就是说从 4 个答案中选出最好的答案,在计算损失的时候就不是 pairwise ,因为没有两两比较信息,将一个二分类的逻辑回归问题变成了一个多分类的 softmax ,等于是在从 4 个值里面选出最大的值
- 使用 softmax 最大的好处是在标注的时候是四选一,而不是进行排序。但是这样做的问题是容易过拟合
现在改成了全部答案的排序使得整个问题变得复杂一点:不是要学习得到一个分数然后选出最大的值,而是说要学一个分数使得整个 9 个答案的排序能够保留下来。所以标号变多了之后,发现过拟合就会好一些,这也是作者对之前的一些方法进行改动的原因
3、Reinforcement learning(RL)
这里用到的模型是强化学习中的 PPO ,
- 强化学习中的算法有很多,PPO 是其中之一
- 使用 PPO 是因为 PPO 也是 OpenAI 之前的工作,PPO 的作者也在本文的作者之列,所以挑选了一个自己比较熟悉的
PPO 模型简单来讲就是在下面的目标函数上进行随机梯度下降

- 50:13
- 强化学习中,模型叫做 policy (策略),这里的 RL policy 其实就是 GPT-3 模型
- SFT 是之前在标好的问题和答案的数据上面用监督的微调训练出来的模型
- RL 模型一开始要初始化成为 SFT 模型,所以这两个模型在一开始的时候是一样的
这个目标函数和之前的主要区别是:(数据分布是随着模型的更新变化的,在强化学习中称为环境会发生变化)
之前已经标好了数据,为了么要训练一个 rθ 之后再训练一个模型出来,为什么不直接训练?
- 主要原因是标注的只是一个排序,而不是标注的答案
- 给定一个模型,然后生成多个输出,由标注人员进行排序,再计算梯度,然后再对模型进行更新;下一次又生成新的数据,然后进行标注,这在 RL 中比较常见,叫做在线学习。如果想要做成在线学习的形式就需要实时对模型的生成结果进行排序,会造成人力或者是算力的浪费。所以在这个地方需要学习一个函数来替代掉这个人,rθ 其实就是在学习人的排序从而给模型实时的反馈,这就是为什么这里需要训练两个模型
第二项
第三项
整个 RL 模型简单来说就是一个 PPO 的目标函数加上一个原始的 GPT-3 的目标函数结合在一起。可以看到它还是一个相对来讲比较简单的 RL 算法,其实比作者之前的工作还要简单一点
- 在之前的工作中尝试在 RL 里面多走几个来回,现在只是在之前预训练好的模型之后,通过 RL 模型再跑一步,中间不需要人工进行数据标注
- 作者在实际操作过程中发现,这样对有一些任务有效果,但是对有些任务没有必要
- 对于一些比较复杂的任务,比如缩写任务,因为 y 的变化可能会比较大,所以重新进行标注可能会好一点
- 但相对来讲比较简单一点的任务,在 rθ 变化没有那么大的情况下其实没有太大的必要
小结

InstructGPT总共干了三件事情:
1、数据:将 prompt 和答案标出来,然后用最正常的 GPT 微调出一个模型
2、训练一个奖励模型去拟合人对模型中多个输出之间的排序,训练好之后将其放入到强化学习的框架中
3、通过强化学习模型调整 SFT 模型,使得输出的结果在排序上更符合人的喜好
Results

- 59:58
- 有三个不同大小的模型:原始的 GPT-3 ,1.3B~175B
- y 轴表示和 175B 的 SFT 模型相比的胜率,正常的话是一半一半
- GPT-3 在 prompt 上做比较多的调整,可以从图中看到有提升,但是跟有标注的比还是比较远的
- 实验结果也验证了导言中所说的用一个 1% 的模型,其实是能够打败 175B 的模型(是在一个特定的测试集上面,因为这个测试集和训练数据集是有一定的耦合性的)
- 在 GPT-3 这篇论文中也提到过,在没有看过任何训练数据的情况下,使用大力出奇迹的方式出来的模型,比用过训练数据的模型可能效果还要好一些,但也只是针对一些相对来讲比较简单的任务
- 在这篇文章中,整个任务是比较复杂的,prompt 比较长,而且答案也并不简单,在看过标注信息的前提下,提升还是比较大的
Discussion
1、作者认为整个三个模型的训练的代价和预训练相比,相对来讲比较低
- 因为样本比较少,就算是使用了 175B 的模型,样本数也足足小了几万倍或者几十万倍
2、局限性
- 数据是由 40 个合同工标注出来的,这个模型的行为和这 40 个人是息息相关的,不一定能代表以后所有的用户,所以后续还需要招一些人或者是用户来提升模型的能力
- 比如这里面的数据主要是英语,所以在别的语言上肯定是有一定的差距的
- 在模型上面也不是完全安全,还是会出现各种问题
总结
从技术上来讲,InstructGPT是一个比较实用的技术,它提供了一个方法:给定一个比较大的语言模型,怎样通过标注一些数据能迅速地提升它在某一个你所关心领域上的性能,使其能够达到一个实用的阶段
- 这也给想用生成模型做产品提供了一个实际可操作的思路
作者在一开始提到了三个目标:想要语言模型更加有帮助性,说更多的真话,以及无害性
- 实际上这篇文章主要还是在讲帮助性,也讲了整个数据标注的时候,也是优化帮助性
- 所以从创新性和完成度的角度,这篇文章一般,也为只是优化了一个相对来讲比较简单的目标,而没有同时考虑到剩下两个目标去显式地优化它们
另外后面这个 RL 模型可能也是没有必要做的
- 可以选择在训练第一个模型的时候多标注一点数据,或者说可以用文本合成这样的方法来快速增大数据
- 这样做的好处就是在做微调的时候,直接将之前的代码拿过来用就可以了,而不需要去做 RL ,RL模型所带来的一系列复杂度的东西可以转移到数据上面,因为对数据进行处理相对来讲比较简单,那么整个模型的训练和部署就会变得更加简单
- 因此从实用性的角度来看,这样做的效果可能会更好一些
所以其实就是显式地优化了帮助性这一个目标,使用了相对来讲比较复杂的 RL 算法也没有成功地说明使用它的必要性
从一个创业公司的角度来讲,需要尽快地把产品做出来,效果做上去,其他的东西可能就没有那么重要,但是同样的做法,openAI 也许能做,但是别的公司不一定能做,在安全性上没有做太多完善的情况下,很有可能会引发公关危机
----end----
其它参考
1、https://openai.com/blog/chatgpt/
2、《Training language models to follow instructions with human feedback》,https://arxiv.org/abs/2203.02155
3、统计学中的信噪比怎么理解,https://www.zhihu.com/question/37522785