最近,OpenAI的预训练模型ChatGPT给人工智能领域的研究人员留下了深刻的印象和启发。毫无疑问,它非常强大,与之交流十分有趣,还能编写代码。它在多个方面的表现远超自然语言处理研究者的预期。因此,我们不禁要问:ChatGPT是如何变得如此强大的?它的种种强大功能究竟是怎么来的?在本文中,我们将探讨ChatGPT的突现能力,追溯这些能力的来源,希望能提供一个全面的技术路线图,解释GPT-3.5模型系列及相关大型语言模型是如何逐步演变为现在的强大状态的。
我们希望本文能促进大型语言模型的透明度,成为开源社区共同努力复现GPT-3.5的参考。
给国内同胞的话:
在国际学术界,ChatGPT/GPT-3.5被视为划时代的创新,它与之前的常见语言模型(如Bert、Bart、T5)的差别,简直是导弹与弓箭之间的差距,我们必须高度重视。
在我与国际同行的交流中,全球主流学术机构(如斯坦福大学、加州大学伯克利分校)和主要工业研究院(如谷歌大脑、微软研究院)已全面接纳大模型。
目前,国内的技术水平、学术视野和治学理念与国际前沿存在的差距不仅未缩小,反而在扩大,如果这种情况持续下去,我们很可能面临技术断层的风险。
此为存亡之秋。
多年后,面对行刑队,奥雷里亚诺·布恩迪亚上校将回忆起父亲带他去看冰块的那个遥远的下午。——《百年孤独》 加西亚·马尔克斯
一、2020版的初代GPT-3和大规模预训练
初代GPT-3展现了以下三个重要能力:
语言生成:根据提示词生成完整的句子。这是与语言模型交互最常见的方式。
上下文学习:根据几个示例,为新的测试案例生成解决方案。GPT-3的论文几乎不涉及“语言建模”,而是全力以赴地探讨了上下文学习的潜力。
世界知识:包括事实性知识和常识。
这些能力从何而来?
基本上,这些能力都来源于大规模预训练:在包含3000亿单词的语料库上,预训练了拥有1750亿参数的模型。其中:
语言生成能力来源于语言建模的训练目标。
世界知识来源于庞大的训练语料库。
模型的1750亿参数用于存储这些知识,Liang等人的研究进一步验证了这一点。他们发现知识密集型任务的表现与模型的大小密切相关。
上下文学习的来源及其泛化能力仍然难以确切知道。直觉上,这种能力可能源于训
练期间,相同任务的数据点被顺序地安排在同一批次中。尽管如此,为什么语言模型的预训练会促进上下文学习,以及上下文学习的行为与微调(fine-tuning)为何如此不同,这些问题仍然没有得到广泛的研究。
值得一提的是,初代 GPT-3 的性能究竟如何?实际上,这一点并不容易确定。一方面,它在某些特定查询上能够给出合理的回应,并在许多数据集上展现出不错的性能;另一方面,它在许多任务上的表现仍不如一些较小的模型,如T5(参见其原始论文)。从当前ChatGPT的标准看,初代 GPT-3 很难被视为“智能”的。Meta开源的OPT模型试图复制初代 GPT-3,但其性能与现代标准相比也显得较弱。尽管如此,OPT可能是一个足够好的初代 GPT-3 的开源近似模型了(根据OPT的论文和斯坦福大学的HELM评估)。
尽管初代GPT-3看似不强,但随后的实验证明,它具有巨大的潜力。这些潜力后来通过代码训练、指令微调(instruction tuning)和基于人类反馈的强化学习(reinforcement learning with human feedback, RLHF)被解锁,最终展示出极为强大的突现能力。
二、从2020版GPT-3到2022版ChatGPT
从最初的GPT-3起,为了展示OpenAI是如何发展到ChatGPT的,我们可以看一下GPT-3.5的进化路径:
在2020年7月,OpenAI发布了初代 GPT-3,模型指数为davinci的论文。此后,该模型不断进化。2021年7月,Codex的论文发布,其中初始的Codex是基于(可能是内部的)120亿参数的GPT-3变体进行的微调。随后,这个120亿参数的模型演变成了OpenAI API中的code-cushman-001。在2022年3月,OpenAI发布了指令微调的论文,其监督微调部分对应了davinci-instruct-beta和text-davinci-001。到2022年4月至7月期间,OpenAI开始对code-davinci-002模型进行Beta测试,也称其为Codex。接下来,code-davinci-002、text-davinci-003和ChatGPT都是从code-davinci-002进行指令微调得到的。
虽然Codex听起来像是一个专注于代码的模型,但code-davinci-002可能是针对自然语言处理最强大的GPT-3.5变体(优于text-davinci-002和-003)。code-davinci-002很可能在文本和代码上都经过训练,然后根据指令进行调整。2022年5-6月发布的text-davinci-002是一个基于code-davinci-002的有监督指令微调模型。在text-davinci-002上进行的指令微调可能降低了模型的上下文学习能力,但增强了模型的零样本能力。然后是text-davinci-003和ChatGPT,它们都在2022年11月发布,使用的是基于人类反馈的强化学习进行的指令微调版本。
总的来说,在2020到2021年期间,OpenAI通过代码训练和指令微调加强
了GPT-3的能力。当他们完成了code-davinci-002的开发时,所有的核心功能都已经就位。后续的指令微调,无论是通过有监督学习还是强化学习,主要做的工作可能包括以下几点:
指令微调并不是给模型注入新的能力——所有的能力在预训练中已经形成。指令微调的作用更多是激发和优化这些已有能力。这主要是因为指令微调的数据量远远少于预训练的数据量(预训练阶段培养了模型的基础能力)。
指令微调使GPT-3.5在不同技能上有了更明显的分化。例如,text-davinci-003更擅长上下文学习,而ChatGPT则更擅长处理对话。
通过指令微调,模型在牺牲一定性能的情况下更符合人类的期待和要求。OpenAI的研究人员在他们的论文中提到这种现象为“对齐税”(alignment tax)。许多论文报道了在基准测试中,code-davinci-002表现出最佳性能(但不一定符合人类的期望)。在code-davinci-002进行指令微调后,模型能够生成更符合人类期望的响应,例如:更安全、公平的对话回复、拒绝回答超出模型知识范围的问题。
三、Code-Davinci-002和Text-Davinci-002:在代码上训练,在指令上微调
在code-davinci-002和text-davinci-002之前,有两个中间阶段的模型,分别是davinci-instruct-beta和text-davinci-001。这两个模型在许多方面都不如后来的-002版本(例如,text-davinci-001在链式推理能力上较弱)。因此,在本节中,我们将重点介绍-002型号。
这两个模型展现出与初代GPT-3明显不同的三种重要能力:
响应人类指令:以前的GPT-3输出往往是训练集中常见的句子。现在的模型能够根据指令/提示词生成更合理的回答。
泛化到未见过的任务:当用于调整模型的指令数量超过一定规模时,模型能够在完全未见过的新指令上生成有效的回答。这种能力对于实际部署至关重要,因为用户总是会提出新的问题。
代码生成和理解:由于模型在代码上接受过训练,因此具备了处理编程语言的能力。
利用思维链进行复杂推理:初代GPT-3在这方面几乎无能为力。而code-davinci-002和text-davinci-002表现出足够强大的思维链推理能力。
思维链推理之所以重要,是因为它可能是解锁模型突现能力和超越传统缩放法则的关键。
这些能力从何而来?
与之前的模型相比,两个主要的不同在于指令微调和代码训练。具体来说:
能够响应人类指令的能力直接来源于指令微调。
对未见过的指令进行有效反馈的泛化能力在指令数量超过一定程度后自然出现,T0、Flan和FlanPaLM的论文进一步证明了这一点。
使用思
维链进行复杂推理的能力很可能是代码训练的一个意外产物。我们有以下事实作为一些支持:
1. 最初的GPT-3没有接受过代码训练,它在思维链推理方面几乎无能为力。
2. 虽然text-davinci-001模型经过了指令微调,但根据第一版思维链论文的报告,它在思维链推理方面的能力非常弱——这表明指令微调可能不是形成思维链的原因,代码训练才是。
3. PaLM模型包含了5%的代码训练数据,能够进行思维链推理。
4. Codex论文中的代码数据量达到159G,约占初代GPT-3训练数据总量的28%。code-davinci-002及其后续变体能进行思维链推理。
5. 在HELM测试中,Liang等人对不同模型进行了广泛评估。他们发现针对代码训练的模型具有很强的语言推理能力,包括拥有120亿参数的code-cushman-001。
6. 我们在AI2的工作也表明,当配备复杂的思维链时,code-davinci-002在重要的数学基准GSM8K上是目前表现最好的模型。
7. 直觉上,面向过程的编程(procedure-oriented programming)与人类逐步解决任务的过程相似,面向对象编程(object-oriented programming)与人类将复杂任务分解为多个简单任务的过程相似。
以上所有观察结果都显示了代码与推理能力/思维链之间的关联。这种相关性对研究社区来说是一个非常有趣的问题,但目前尚未得到很好的理解。然而,还没有确凿的证据表明代码训练就是思维链和复杂推理能力的直接原因。思维链的来源仍是一个开放的研究问题。
此外,代码训练的另一个可能的副产品是对长距离依赖的处理能力。如Peter Liu所指出:“语言中的下一个词预测通常是非常局部的,而代码通常需要更长的依赖关系来完成某些事情,比如括号的匹配或引用远处的函数定义”。我想进一步补充的是:由于面向对象编程中的类继承,代码也可能帮助模型建立编码层次结构的能力。我们将这一假设的验证留给未来的工作。
另外还需注意一些细节差异:
text-davinci-002与code-davinci-002:
1. Code-davinci-002是基础模型,text-davinci-002是在code-davinci-002基础上进行指令微调的产物(见OpenAI的文档)。它在以下数据上进行了微调:(一)人工标注的指令和预期输出;(二)由人工标注者选择的模型输出。
2. 当存在上下文示例时,Code-davinci-002更擅长上下文学习;当没有上下文示例/零样本时,text-davinci-002在零样本任务完成方面表现更好。从这个角度看,text-davinci-002更符合人类的期待(因为编写一个任务的上下文示例可能比较麻烦)。
3. OpenAI不太可能故意牺牲上下文学习的能力以换取零样本能力——上下文学习能
力的降低更多是指令微调的一个副作用,OpenAI 称其为“对齐税”。
001 模型(code-cushman-001 和 text-davinci-001)与 002 模型(code-davinci-002 和 text-davinci-002)的比较:
1. 001 模型主要针对纯代码或纯文本任务设计;002 模型则深度整合了代码训练和指令微调,兼顾代码和文本处理。
2. Code-davinci-002 可能是第一个深度整合了代码训练和指令微调的模型。证据表明:code-cushman-001 能够进行一定的推理但在纯文本任务上表现不佳,text-davinci-001 在纯文本任务上表现良好但在推理任务上表现不佳。code-davinci-002 则能够在这两方面都表现出色。
3.2 这些能力是预训练后就已存在,还是通过微调注入的?
在这一阶段,我们已经认识到指令微调和代码训练的关键作用。关键的问题是如何进一步分析代码训练和指令微调的具体影响?具体来说:上述三种能力是否已在初代GPT-3中存在,仅通过指令和代码训练被激活或解锁?或者这些能力在初代 GPT-3 中并不存在,而是通过指令和代码训练后才被注入的?
如果这些能力已在初代 GPT-3 中存在,那么在 OPT 模型中也应能见到这些能力。
因此,要复现这些能力,或许可以通过对 OPT 进行指令和代码调整。但是,code-davinci-002 也可能不是基于最初的 GPT-3 davinci,而是基于比初代 GPT-3 更大或不同的模型。如果是这种情况,可能就无法通过调整 OPT 来复现。研究社区需要进一步了解 OpenAI 到底训练了什么样的模型作为 code-davinci-002 的基础模型。
我们有以下假设和证据:
code-davinci-002 的基础模型可能不是初代 GPT-3 davinci 模型。以下是证据:
1. 初代的 GPT-3 在 2016-2019 年的 C4 数据集上训练,而 code-davinci-002 的训练集可能延伸至 2021 年。因此 code-davinci-002 可能在 2019-2021 年版的 C4 上训练。
2. 初代的 GPT-3 有一个大小为 2048 词的上下文窗口。code-davinci-002 的上下文窗口则为 8192。GPT 系列使用绝对位置嵌入 (absolute positional embedding),直接对绝对位置嵌入进行外推而不经过训练是比较困难的,并可能严重影响模型性能。
无论基础模型是初代的 GPT-3 还是后来训练的模型,遵循指令和零样本泛化的能力都可能已经存在于基础模型中,后来通过指令微调被解锁(而不是注入)。
1. 这主要是因为 OpenAI 的论文报告的指令数据量大小仅为 77K,远少于预训练数据量,说明大部分基础能力是通过大规模预训练形成的,而指令微调主要起到优化和调整这些能力的作用。
2. 其他指令微调论文也进一步证实了指令数据集大小对模型性能的影响。例如,Chung et al. (2022) 的工作中显示,Flan-PaLM 的指令微调仅占预训练计算的0.4%。一般而言,指令数据量远小于预训练数据。
模型的复杂推理能力可能在预训练阶段通过代码数据注入:
1. 代码数据集的规模与上述指令微调情况不同。这里的代码数据量足够大,可以占据训练数据的重要部分(例如,PaLM 模型中有8%的代码训练数据)。
2. 如上所述,code-davinci-002之前的模型text-davinci-001大概没有在代码数据上进行过微调,所以其推理/思维链能力非常差,正如第一版思维链论文中所报告的那样,有时甚至比参数量更小的code-cushman-001还差。
区分代码训练和指令微调效果的最佳方法可能是比较code-cushman-001、T5和FlanT5:
1. 因为它们具有相似的模型大小(110亿和120亿),相似的训练数据集(C4),它们最大的区别就是有没有在代码上进行过训练/进行过指令微调。
2. 目前还没有这样的比较研究。我们把这个留给未来的研究。
四、text-davinci-003和ChatGPT,基于人类反馈的强化学习的威力
在目前阶段(2022年12月),text-davinci-002、text-davinci-003和ChatGPT之间几乎没有严格的统计比较,主要是因为:
1. text-davinci-003和ChatGPT在撰写本文时刚发布不到一个月。
2. ChatGPT不能通过OpenAI API调用,所以在标准基准上测试它比较困难。
因此,这些模型之间的比较更多是基于研究社区的集体经验(统计上不是很严格)。不过,我们相信初步的描述性比较仍然可以揭示模型的机制。
我们首先注意到以下text-davinci-002,text-davinci-003和ChatGPT之间的比较:
所有三个模型都经过指令微调。
text-davinci-002是一个经过监督学习指令微调的模型。
text-davinci-003和ChatGPT是基于人类反馈的强化学习的指令微调模型。这是它们之间最显著的区别。
这意味着这些新模型的行为大多是RLHF的产物。
那么让我们看看RLHF触发的能力:
翔实的回应:text-davinci-003生成的回答通常比text-davinci-002更长。ChatGPT的回答则更加冗长,以至于用户必须明确要求“用一句话回答我”,才能得到更加简洁的回答。这是RLHF直接的产物。
公正的回应:ChatGPT通常对涉及多个实体利益的事件给出非常平衡的回
答。这也是 RLHF 的产物。
拒绝不当问题:这是内容过滤器和由 RLHF 触发的模型自身能力的结合,过滤器过滤掉一部分,然后模型再拒绝一部分。
拒绝其知识范围之外的问题:例如,拒绝在 2021 年 6 月之后发生的新事件(因为它没在这之后的数据上训练过)。这是 RLHF 最神奇的部分,因为它使模型能够隐式地区分哪些问题在其知识范围内,哪些问题不在其知识范围内。
需要注意的两点:
1. 所有的能力都是模型本来就有的,而不是通过 RLHF 注入的。RLHF 的作用是触发/解锁突现能力。这个论点主要来自于数据量大小的比较:因为与预训练的数据量相比,RLHF 占用的计算量/数据量要少得多。
2. 模型知道它不知道什么不是通过编写规则来实现的,而是通过 RLHF 解锁的。这是一个非常令人惊讶的发现,因为 RLHF 的最初目标是让模型生成符合人类期望的回答,这更多是让模型生成安全的句子,而不是让模型知道它不知道的内容。
幕后发生的事情可能是:
ChatGPT: 通过牺牲上下文学习的能力换取建模对话历史的能力。这是一个基于经验的观测结果,因为 ChatGPT 似乎不像 text-davinci-003 那样受到上下文演示的强烈影响。
text-davinci-003:恢复了 text-davinci-002 所牺牲的上下文学习能力,提高零样本的能力。我们不确定这是否也是 RLHF 或其他因素的副产品。根据 instructGPT 的论文,这是来自于强化学习调整阶段混入了语言建模的目标(而不是 RLHF 本身)。
五、总结当前阶段 GPT-3.5 的进化历程
至此,我们已经详细检查了沿着进化树出现的所有能力,下表总结了演化路径:
- 语言生成能力 + 基础世界知识 + 上下文学习都来源于预训练(davinci)。
- 存储大量知识的能力来自于 1750 亿的参数量。
- 遵循指令和泛化到新任务的能力来自于扩大指令学习中的指令数量(Davinci-instruct-beta)。
- 执行复杂推理的能力很可能来自于代码训练(code-davinci-002)。
- 生成中立、客观的能力、安全和翔实的答案来自与人类的对齐。具体来说:
1. 如果是监督学习版,得到的模型是 text-davinci-002。
2. 如果是强化学习版 (RLHF),得到的模型是 text-davinci-003。
3. 无论是有监督还是 RLHF,模型在很多任务的性能都无法超过 code-davinci-002,这种因为对齐而造成性能衰退的现象叫做对齐税。
对话能力也来自于 RLHF(ChatGPT),具体来说它牺牲了上下文学习的能力,来换取建模对话历史、增
强安全过滤和精确控制输出的能力。从宽泛意义上讲,我们可以将此归纳为一个在多轮对话中保持一致性和连贯性的增强。
从现实应用的角度来看,这种转变意味着模型在对话任务中更加人性化和互动,但它可能牺牲了一些文本生成的多样性和创造性。这种取舍是机器学习模型设计中的常见现象,特别是在追求特定性能指标时。
综上所述,我们观察到 GPT-3.5 系列模型在其演化过程中有多种能力的变化和发展。每一步的进展都围绕着如何更好地理解和生成人类语言的问题展开,同时尝试在自动化生成的语言的可靠性、安全性和相关性方面做出平衡。
对未来研究的建议和期待:
1. 深入分析和比较各个版本的模型在特定任务上的表现,尤其是在多轮对话和复杂推理任务上。这将有助于我们更好地理解各种微调策略和训练数据如何影响模型的终端性能。
2. 进一步研究和开发新的训练技术,特别是那些可以在不牺牲一方面能力的情况下增强其他方面能力的技术。例如,如何在增强模型的对话能力的同时,保持其在上下文学习和长篇生成中的能力。
3. 考虑到安全性和偏见问题,开发更为精细的模型评估和调整方法,确保生成的语言不仅是高质量的,还要公正和无害。
通过上述的讨论和分析,我们可以看出 GPT-3.5 模型系列在追求更好的人机交互体验、更高的任务适应性和更安全的内容生成方面的努力。未来的研究可以在这些基础上继续发展,探索更多可能性,以实现在自动语言处理领域的进一步突破。
背景:KKAI问答交流学习交流-GPT