总结GPT系列以及ChatGPT训练步骤
一、引言
$\quad$ 近期ChatGPT在大众眼里的热度越来越热,它Prompt出了我的焦虑,于是最近一直在补大模型相关的工作。另外,北京市经济和信息化局在北京人工智能产业创新发展大会上,其中提到支持头部企业打造对标ChatGPT的大模型,着力构建开源框架和通用大模型的应用生态。加强人工智能算力基础设施布局,加速人工智能基础数据供给 。为此我趁机把所学到的知识重新梳理并分享给大家。
$\quad$ 对于ChatGPT表现案例的总结已经非常多了,这里我通过针对相关技术原理的解剖以及实践方法论的对比等方式与大家供述,主要针对想要使用和复现属于自己的GPT-3或ChatGPT进行了直观的梳理,由于笔者知识水平有限,再加上目前无法了解ChatGPT的具体实现技术和细节问题,文中定有错误和疏漏之处恳请尊敬的各界人士不齐赐教。
二、GPT系列
$\quad$ Generative Pre-Trained Transformer(GPT)系列是OpenAI的一系列预训练论文, GPT的目的就是通过Transformer为基础模型,使用预训练技术得到通用的文本模型。目前已经公布论文的有文本预训练GPT-1,GPT-2,GPT-3,以及图像预训练iGPT。
模型 | 发布时间 | 层数 | 头数 | 词向量长度 | 参数量 | 预训练数据量 |
---|---|---|---|---|---|---|
GPT-1 | 2018年6月 | 12 | 12 | 768 | 1,17亿 | 约5GB |
GPT-2 | 2019年2月 | 48 | - | 1600 | 15亿 | 40GB |
GPT-3 | 2020年5月 | 96 | 96 | 12888 | 1,750亿 | 45TB |
表1. 历代GPT相关信息 |
$\quad$ GPT-1比BERT诞生略早几个月。它们都是采用了Transformer为核心结构,不同的是GPT-1通过自左向右生成式的构建预训练任务,然后得到一个通用的预训练模型,这个模型和BERT一样都可用来做下游任务的微调。GPT-1当时在9个NLP任务上取得了SOTA的效果,但GPT-1使用的模型规模和数据量都比较小,这促使了GPT-2的诞生。
$\quad$ 对比GPT-1,GPT-2并未在模型结构上大作文章,主要使用了更多参数的模型和更多的训练数据。GPT-2最重要的思想是提出了“ 所有的有监督学习都是无监督语言模型的一个子集”的思想,这个思想也是提示学习(Prompt Learning)的前身。GPT-2在诞生之初也引发了不少的轰动,它生成的新闻足以欺骗大多数人类,达到以假乱真的效果。甚至当时被称为“AI界最危险的武器”,很多门户网站也命令禁止使用GPT-2生成的新闻。
$\quad$ GPT-3被提出时,除了它远超GPT-2的效果外,引起更多讨论的是它1750亿的参数量。GPT-3除了能完成常见的NLP任务外,研究者意外的发现GPT-3在写SQL,JavaScript等语言的代码,进行简单的数学运算上也有不错的表现效果。GPT-3的训练使用了情境学习(In-context Learning),它是元学习(Meta-learning)的一种,元学习的核心思想在于通过少量的数据寻找一个合适的初始化范围,使得模型能够在有限的数据集上快速拟合,并获得不错的效果。
初代GPT-3展示了三个重要能力:
- 语言生成:遵循提示词(prompt),然后生成补全提示词的句子 (completion)。这也是今天人类与语言模型最普遍的交互方式。
- 上下文学习 (in-context learning): 遵循给定任务的几个示例,然后为新的测试用例生成解决方案。很重要的一点是,GPT-3虽然是个语言模型,但它的论文几乎没有谈到“语言建模” (language modeling) —— 作者将他们全部的写作精力都投入到了对上下文学习的愿景上,这才是 GPT-3的真正重点。
- **世界知识 (world knowledge)**:包括事实性知识 (factual knowledge) 和常识 (commonsense)。
三、ChatGPT
$\quad$ ChatGPT是改进的instructGPT,ChatGPT并非是凭空就突然有了这么强大的能力,而是OpenAI在语言智能上历经数年的探索和积累,一代代的演进之后,一方面语言模型在几乎大部分的NLP任务上都取得效果,另一方面基于人的反馈学习能够更好的理解需求生成对人更有帮助的内容,同时借助对话式交互的形态,变成一个人人都可以测试的产品(门槛相比API更低),产生巨大的影响力。深入地理解ChatGPT的技术,就需要追溯其背后一代代的技术演进上。
$\quad$ 最近非常火的ChatGPT和今年年初公布的InstructGPT是一对姐妹模型,是在GPT-4之前发布的预热模型,有时候也被叫做GPT3.5。
3.1 技术原理
$\quad$ InstructGPT/ChatGPT都是采用了GPT-3的网络结构,通过指示学习构建训练样本来训练一个反应预测内容效果的奖励模型(RM),最后通过这个奖励模型的打分来指导强化学习模型的训练。InstructGPT/ChatGPT的训练流程如图6所示:
第一阶段:启动阶段的监督策略模型
$\quad$ 为了让GPT3.5初步具备理解指令中蕴含的意图,首先会从测试用户提交的prompt(就是指令或问题)中随机抽取一批,靠专业的标注人员,给出指定prompt的高质量答案,然后用这些人工标注好的<prompt,answer>数据来Fine-tune GPT3.5模型。经过这个过程,我们可以认为GPT3.5初步具备了理解人类prompt中所包含意图,并根据这个意图给出相对高质量回答的能力。
第二阶段:训练回报模型(Reward Model, RM)
$\quad$ 这个阶段的主要目的是通过人工标注训练数据,来训练回报模型。具体而言,随机抽样一批用户提交的prompt(大部分和第一阶段的相同),使用第一阶段Fine-tune好的冷启动模型,对于每个prompt,由冷启动模型生成K个不同的回答,于是模型产生出了<prompt,answer1>,<prompt,answer2>….<prompt,answerK>数据。之后,标注人员对K个结果按照很多标准(相关性、富含信息性、有害信息等诸多标准)综合考虑进行排序,给出K个结果的排名顺序,这就是此阶段人工标注的数据。
细节:接下来,我们准备利用这个排序结果数据来训练回报模型,采取的训练模式其实就是经常用到的pair-wise learning to rank。对于K个排序结果,两两组合,形成$\dbinom{k}{2}$个训练数据对,ChatGPT采取pair-wise loss来训练Reward Model。RM模型接受一个输入$<prompt,answer> $,给出评价回答质量高低的回报分数Score。对于一对训练数据<answer1,answer2>,我们假设人工排序中answer1排在answer2前面,那么Loss函数则鼓励RM模型对$<prompt,answer1> $的打分要比$<prompt,answer2> $的打分要高。
$< prompt, <answer1,answer2>,<answer1,answer3>> $
归纳下:在这个阶段里,首先由冷启动后的监督策略模型为每个prompt产生K个结果,人工根据结果质量由高到低排序,以此作为训练数据,通过pair-wise learning to rank模式来训练回报模型。对于学好的RM模型来说,输入<prompt,answer>,输出结果的质量得分,得分越高说明产生的回答质量越高。
第三阶段:采用强化学习来增强预训练模型的能力
$\quad$ 本阶段无需人工标注数据,而是利用上一阶段学好的RM模型,靠RM打分结果来更新预训练模型参数。具体而言,首先,从用户提交的prompt里随机采样一批新的命令(指的是和第一第二阶段不同的新的prompt,这个其实是很重要的,对于提升LLM模型理解instruct指令的泛化能力很有帮助),且由冷启动模型来初始化PPO模型的参数。然后,对于随机抽取的prompt,使用PPO模型生成回答answer, 并用上一阶段训练好的RM模型给出answer质量评估的回报分数score,这个回报分数就是RM赋予给整个回答(由单词序列构成)的整体reward。有了单词序列的最终回报,就可以把每个单词看作一个时间步,把reward由后往前依次传递,由此产生的策略梯度可以更新PPO模型参数。这是标准的强化学习过程,目的是训练LLM产生高reward的答案,也即是产生符合RM标准的高质量回答。
$\quad$如果我们不断重复第二和第三阶段,很明显,每一轮迭代都使得LLM模型能力越来越强。因为第二阶段通过人工标注数据来增强RM模型的能力,而第三阶段,经过增强的RM模型对新prompt产生的回答打分会更准,并利用强化学习来鼓励LLM模型学习新的高质量内容,这起到了类似利用伪标签扩充高质量训练数据的作用,于是LLM模型进一步得到增强。显然,第二阶段和第三阶段有相互促进的作用,这是为何不断迭代会有持续增强效果的原因。