ChatGPT的论文尚未放出,也不知道会不会有论文放出,但是根据公开资料显示,其训练方式,跟OpenAI之前的一个工作——InstructGPT基本无异,主要是训练数据上有小的差异,因此我们可以从InstructGPT的论文中,窥探ChatGPT强大的秘密。本文主要(粗略)解读一下InstructGPT的论文——Training language models to follow instructions with human feedback.
InstructGPT和后面的ChatGPT,都是OpenAI在大模型alignment问题上的研究成果,什么是模型的alignment呢?在InstructGPT论文中作者是这么说的:
“For example, large language models can generate outputs that are untruthful, toxic, or simply not helpful to the user. In other words, these models are not aligned with their users. (ChatGPT翻译:大型语言模型可以生成不真实、有毒、或者对用户没有帮助的输出。换句话说,这些模型与用户不匹配。)
就是说,模型的输出,跟我们期待的,可能有所不一致。这个跟人类的需求的对齐问题,就是所谓的alignment问题。李宏毅老师的视频(Chat GPT (可能)是怎麼煉成的 - GPT 社會化的過程,https://www.youtube.com/watch?v=e0aKI2GGZNg)中把对大模型的跟人类需求一致性的改善过程,称为大模型的“社会化”过程,我认为十分的形象,大模型在预训练过程中见识了各种各样的数据,因此针对一个prompt会输出什么东西,也可能是多种多样的,但是预训练数据中出现的数据模式,不代表都是人类在使用模型时希望看到的模式,因此需要一个社会化的过程,来规范模型的“言行举止”。
我家警长出境,正在“调教”
下面我举个例子:
对于GPT这样的自回归式生成模型,也就是大家常见的“续写”模型,我们给一个输入:“ACL会议的主题是什么”,我们自然是希望模型直接告诉我们问题的答案,也就是上图中蓝色机器人的回答。但是模型的输出可能跟我们期待的差别巨大,输出一连串的问题,即图中红色机器人的输出。为什么呢?因为无论是“一个问题后面接一个回答”,还是“一个问题后面接另一个问题”,都是训练语料中可能经常出现的模式,因此,你让模型根据一个问题来续写,那无论是续写问题的答案,还是续写更多的问题,对于模型来说都是合理的。这就是问题所在,如果让经过大规模语料(可能也没任何人知道数据集里到底都有些啥乱七八糟玩意儿)预训练的模型,在输出时符合人类的期待?
下面直接讲一讲OpenAI是如何处理alignment问题的,论文中的这个图就已经十分清楚:
InstructGPT
这里顺便也放出ChatGPT训练的流程图,基本可以等于复制粘贴:
ChatGPT
(不能说很像,只能说是一模一样了,所以我们可以当做是一对孪生姐妹了,可能吃的饲料略有不同,再就是ChatGPT出生的晚,家庭条件相对来说更好一些,是从GPT-3.5出发的,而InstructGPT是从GPT-3继续训练的。)
我们先不看上面的三个步骤,自己想一想,通过前文对问题背景的介绍,我们应该如何解决模型跟人类期待不匹配的问题?最直接的办法,就是我们人工构造一大批数据(人们自己写prompt和期待的输出),完全符合人类的期待的模式,然后交给模型去学。然而,这显然代价太大了。因此,我们得想办法怎么让这个过程变得更轻松一点:
<prompt,output>
pair打分,评价这个output跟prompt搭不搭。上面的三步,就是图中展示的三个步骤,可以看出就是老师(人类)先注入一些精华知识,然后让模型试着模仿老师的喜好做出一些尝试,然后老师对模型的这些尝试进行打分,打分之后,学习一个打分机器,最后打分机器就可以和模型配合,自动化地进行模型的迭代,总体思路称为基于人类反馈的强化学习,RLHF。
能实现这样的方式,我觉得前提就是——这个模型本身已经比较强大了。只有模型本身就比较强大了,才能人类提供少量的精华数据,就可以开始进行模仿,同时在第二步产出较为合理的输出供人类打分。所以这里的GPT-3作为出发点,是这一套流程能行得通的保证之一,而ChatGPT又是从GPT-3.5出发的,那效果肯定更加好了。
InstructGPT论文中,给出了上述三个步骤,分别制造/标注了多少样本:
前两步的prompts,来自于OpenAI的在线API上的用户使用数据,以及雇佣的标注者手写的。最后一步则全都是从API数据中采样的,下表的具体数据:
总共加起来,也就77K的数据,而其中涉及人工的,只有46K。真心不多!也就是GPT-3继续在77K的数据上进行了进一步微调,就得到了InstructGPT。
初始的种子数据集,需要标注者来编写prompts,而不是从API数据中采样,这是因为API接口中的prompts数据,多数都不是那种”人类要求模型干什么事儿“这类instruction-like prompts,多数都是续写之类的,这跟本文的出发点——希望模型能按照人类的要求做事儿,有点不匹配,所以需要标注者现场编写。具体这些标注者被要求写这么三种数据:
下表则展示了OpenAI的客户在日常使用时的用途分布,即API数据的分布(这也是RM数据集的大致分布):
(但奇怪的是,论文中找不到SFT数据集的分布,感觉应该跟RM的分布差别挺大的,而从数据质量上讲,这部分应该是质量最高的,可能是属于商业机密?)
以上就是InstructGPT的方法论,以及大家最关心的数据收集过程。至于模型怎么训练,这些不重要,毕竟99.99%的人都没法训练GPT-3,更别提GPT-3.5了。但是这里有一个地方确实也需要说一嘴,打分模型(RM模型)也是基于GPT-3进行训练的,使用的是6B的版本,具体就是在进行SFT训练之后,把最后的embedding层去掉,改成输出一个标量。
效果其实不必多说,大家已经十分熟悉ChatGPT多么强大,InstructGPT其实类似。最终的结论就是,在”听指挥“方面,1.3B版本的InstructGPT,就可以超过比自己大100倍的175B版本的GPT-3了:
下面是一个例子:
总的来说,这篇文章就是在介绍OpenAI是怎么把GPT-3这个野孩子调教得听人类指挥的,而且这个调教成本,并没有那么大,相比于GPT-3预训练的成本,InstructGPT仅使用了77K的数据进行微调,这基本不值一提。最终,InstructGPT生成的结果,在真实性、无害性、有用性方面都有了很大的提高(但是对偏见这种问题依然没有改善)。
除此之外,另外作者团队通过大量的实践,总结了一下几个重要结论:
以上。
写作不易 如果觉得有所收获的话
大家就点一个赞吧 :)
2023年的第1/52篇原创笔记 和我一起挖掘有趣的AI研究吧!
经过“调教”之后的警长