在GPT-2出现之后,人们清楚地意识到:语言模型的能力远超研究人员最初的预期。仅仅通过训练模型使其能够预测下一个单词,就已经使它们具备了翻译、摘要生成和问答等令人惊讶的功能,而这些功能并非通过针对特定任务的训练获得的。

然而,仍然存在一个重大的局限性。尽管GPT-2能够在不同任务中表现出泛化能力,但它仍然难以可靠地适应新环境。其性能往往取决于精心设计的提示语,而对于许多实际应用来说,进行微调仍然是必要的。人工智能系统虽然变得越来越灵活,但它们仍然无法像人类那样通过上下文来真正学习新的任务。

随后,GPT-3将这一理念进一步推向了极致。这篇论文并没有探讨语言模型是否能够在不进行微调的情况下完成任务,而是探索了一个更为雄心勃勃的问题:如果将语言模型的规模扩大到极端程度,会发生什么?这个问题的答案让人工智能领域的几乎所有人都感到惊讶。

GPT-3证明了:当一个语言模型的规模足够大时,它往往可以直接从提示语本身所提供的示例中学习新的任务。无需重新训练,也无需进行梯度更新,只需要用自然语言编写一些示例即可。

例如,如果你向模型展示几个英法翻译的例子,它就能够正确地运用这种模式来处理新的句子;如果你提供一些问答示例,它通常能够立即理解任务要求并生成合理的回答。这种现象后来被称为“少样本学习”和“上下文学习”。

更重要的是,GPT-3提出了一种完全不同的与人工智能系统交互的方式。不必为每个任务分别训练模型,同一个模型可以根据接收到的指令和示例动态地调整自己的行为。

这个理念最终成为了ChatGPT等现代人工智能系统的基础。

与许多具有影响力的AI论文一样,由于GPT-3论文的篇幅庞大、包含大量的技术实验以及详尽的基准测试结果,阅读起来可能会有一定的难度。因此,在这篇文章中,我会以清晰易懂的方式为大家解读其中的内容。我们将探讨这篇论文试图解决的问题、少样本学习的工作原理、为什么规模扩展变得如此重要、GPT-3是如何被训练出来的,以及为什么这篇论文从根本上改变了现代人工智能研究的发展方向。

读完这篇文章后,你应该能够理解GPT-3背后的核心理念,也会明白为什么这篇论文会成为大型语言模型发展史上的一个重要里程碑。

论文概述

在这篇文章中,我们将回顾Open AI的Tom Brown等人撰写的论文《语言模型是少样本学习者》。

这篇论文介绍了GPT-3,并证明了一个能够改变现代人工智能研究方向的事实:大型语言模型可以直接从提示语和示例中学习新的任务,而无需像GPT-1那样进行针对特定任务的微调。

与针对每项新任务重新训练模型不同,GPT-3通常能够通过自然语言指令、一次性示例或少量样本提示来动态适应新任务。

该论文还提出了“上下文学习”的概念,在推理过程中,模型实际上是从提示本身所包含的模式中学习的。

如果你想直接阅读原文,可以点击以下链接:语言模型是少量样本学习者(PDF版本)

下面是一张简明的信息图,概括了我们在本篇综述中将要讨论的内容:

GPT-3简介

目录:

先修知识

为了更好地理解这些内容,你最好已经掌握一些基础知识。

阅读本系列之前的文章会特别有帮助:

GPT-3直接继承了那些早期论文中提出的许多理念,尤其是预训练、零样本学习以及大规模语言建模等技术。

以下这些知识也会对理解本文有所帮助:

  • 对自然语言处理以及机器如何处理文本有基本的了解

  • 大致了解Transformer模型的工作原理(无需掌握复杂的数学细节)

  • 熟悉监督学习、无监督学习和零样本学习

  • 对提示语以及语言模型如何生成文本有基本的认知

  • 了解机器学习的基本概念,如训练数据、参数、缩放和推理等

不过,你并不需要成为一名人工智能研究人员才能阅读这篇文章。

我会尽量使解释通俗易懂,重点讲解GPT-3背后的核心理念,而不会陷入复杂的数学公式或学术术语中。

执行摘要

在GPT-3出现之前,像GPT-2这样的模型就已经展现出了令人惊讶的能力:一个仅被训练用于预测下一个单词的语言模型,仍然能够完成许多原本并未经过专门训练的任务。翻译、总结、回答问题——这些能力似乎都是随着模型规模的扩大而自然形成的。

但依然存在一些局限性。

即便使用GPT-2,要想获得良好的性能,往往也需要精心设计提示语或进行额外的微调。实际上,大多数自然语言处理系统仍然遵循同样的模式:首先训练一个大型模型,然后针对每一项新任务单独对其进行重新训练或微调。

GPT-3彻底改变了这种工作流程。

根据作者的观点,如果一个语言模型的规模足够大,它就可以仅通过分析上下文来直接学习各项任务。无需修改模型的参数,只需向它提供一些示例,模型就能自行完成后续的学习过程。

这篇论文将这种现象称为“零样本学习”。

例如,你不需要为翻译任务单独训练一个模型,而是可以这样编写提示语:

  • dog → chien

  • cat → chat

  • house → ?

这时GPT-3很可能会给出正确的答案:“maison”。

重要的是,这种学习过程并不是通过传统的梯度更新来实现的,也没有进行任何意义上的重新训练。所有学习内容都是通过在提示语中提供的示例在上下文窗口内完成的。

这一变化标志着语言模型的使用方式发生了根本性的转变。

不再需要为每一项任务单独构建专门的系统,GPT-3表明,只要模型规模足够大,它就能够通过阅读指令和示例来动态适应各种任务。这篇论文将这种能力称为“上下文内学习”,而GPT-3的诸多创新之处恰恰在于证明了这一理念在大规模应用时所能发挥出的强大作用。

本文的研究目标

作者认为,现有自然语言处理系统最大的局限性之一就是它们过于依赖针对特定任务的训练。尽管到GPT-3问世时,各种模型的性能已经有了显著提升,但大多数系统仍然需要为每一项新任务单独进行微调。

在实际应用中,这种做法引发了许多问题。

首先,每项任务都需要标注过的数据。如果你想让模型来总结文章、回答问题、分析情感倾向或进行文本翻译,通常需要数千甚至数百万个精心准备好的示例数据。收集这些数据成本高昂、耗时漫长,对于那些规模较小或特定领域的任务而言,这种做法往往并不现实。

其次,每新增一项功能都需要重新进行训练。即使基础模型已经在海量文本上完成了预训练,开发人员仍然需要针对具体的应用场景反复对其进行再训练或微调。

本文认为,这种工作流程本质上效率低下。更重要的是,作者指出这种方式与人类的学习方式截然不同——人类往往只需看几次示范或简单的说明就能理解一项任务,我们通常并不需要数千个标注过的示例才能弄清楚要求是什么。

这就是GPT-3背后的核心问题:

语言模型能否直接从上下文中学习新任务,而无需依赖参数更新或针对特定任务的重新训练?

这个问题贯穿了本文中的所有实验。作者们并没有测试GPT-3是否能够掌握某个经过精心优化的基准任务,而是在探索一个更广泛的问题:通过扩大语言模型的规模,是否能够让这些模型仅凭提示、示例和自然语言指令就能动态地适应新的任务需求。

核心理念

从根本上说,GPT-3依然是基于与GPT-2相同的基本原理构建的:通过训练让语言模型预测序列中的下一个词元。训练目标本身其实非常简单——给定一段文本,模型会学习如何逐一猜测接下来的内容。

表面上看,GPT-3似乎只是GPT-2的升级版而已。在某些方面确实如此,它的规模大幅扩大,参数数量达到了1750亿,并且是在来自Common Crawl、WebText、书籍和维基百科等来源的更为庞大且多样化的数据集上训练而成的。

但本文指出,当语言模型的规模不断扩大时,一些更有趣的现象开始出现。

GPT-3不再仅仅是更好地记忆文本模式,它开始具备了直接从提示中学习任务的能力。当模型在输入数据中看到相关示例时,它往往能够无需任何额外训练或参数调整就能正确地完成后续操作。

例如,如果提示中包含一些问答对或翻译示例,GPT-3就可以理解这项任务的结构,并为新的输入生成类似的输出结果。换句话说,提示本身就成为了临时性的学习环境。

这就是本文所提出的关键概念性转变。

传统的机器学习方法通常会将训练阶段与推理阶段分开:模型先通过更新参数来学习知识,之后再被用于进行预测。而GPT-3打破了这种界限——它在预训练阶段确实会学习知识,但在推理阶段也能根据接收到的上下文动态调整自己的行为。

作者将这种行为称为“上下文学习”。

这一理念之所以重要,是因为该模型并不会为每项任务都重新进行训练。在处理提示信息的过程中,不会发生任何梯度更新。相反,GPT-3是从嵌入在上下文窗口中的示例中学习的。

这标志着我们在理解语言模型方式上发生了一个微妙但重要的变化:提示信息不再仅仅是一种输入手段,它实际上已经成为一种用于指导模型行为的“轻量级接口”。

方法论

GPT-3之所以能产生如此大的影响,其中一个原因在于其背后的训练过程其实非常常见。与许多那些引入全新架构或复杂学习算法的研究论文不同,GPT-3主要是建立在之前已经存在的理念基础上的。不同之处在于,GPT-3将这些理念进行了大规模的扩展和应用。

根据作者的说法,GPT-3的核心训练目标仍然是传统的自回归语言建模。简单来说,该模型会读取文本,并反复学习如何预测序列中的下一个词。这种训练方法与GPT-2所采用的方法是一样的。

整个训练过程在概念上其实非常直观:

  • 训练一个规模庞大的Transformer模型

  • 为它提供海量的互联网文本数据

  • 通过反复训练,使其能够准确预测下一个单词

真正发生变化的是训练的规模。

GPT-3所使用的训练数据量高达数千亿个词条,这些数据来源于Common Crawl、WebText、各类书籍以及维基百科等资源。论文还提到,OpenAI对Common Crawl数据集进行了筛选和清理,以提高数据质量并减少重复内容。

但方法论中最重要的部分并不在于模型是如何被训练的,而在于模型在训练完成后的使用方式

传统上,自然语言处理系统往往依赖微调技术。在预训练好语言模型之后,开发人员会针对每项具体任务,使用较小的标记数据集对该模型进行再次训练。然而GPT-3采用了完全不同的方法。

GPT-3并不需要对模型进行重新训练,而是直接在提示信息中描述具体的任务要求。

论文研究了三种主要的应用场景:

  • 零样本学习:模型仅接收一条自然语言指令

  • 单样本学习:模型接收一个具体的任务示例

  • 少样本学习:模型在解决新问题之前会先接收多个示例

例如,一个翻译提示可能如下所示:

dog → chien
cat → chat
house → ?

然后GPT-3会根据这个模式进行预测,结果可能是:

maison

值得注意的是,在整个过程中并没有发生任何重新训练。模型的权重完全没有发生变化,它仅仅是利用提示信息中的内容来判断用户要求完成的是什么任务。

在实际应用中,这种机制使得该模型所接收的输入信息变得远比普通的输入数据更具效力。它相当于一个临时工作空间,在这个空间里,模型能够识别各种模式、调整自身的行为,并动态地运用所学的知识。

论文反复强调,这种能力并非通过针对特定任务的专门设计而产生的,而是由于模型的规模足够大所自然形成的。GPT-3并没有被分别训练用于翻译、总结、推理或问答等任务;事实上,当这个通用语言模型的规模达到一定程度时,它似乎就能自然而然地具备这些能力。

微调 vs 零样本学习 vs 少样本学习

无需重新训练,但需要提示中的几个示范案例

通过指令加上几个输入输出示例来说明任务

权重不变;学习过程发生在特定的上下文环境中

虽然具有灵活性,但仍然可以借助示范案例来辅助学习

能够根据上下文中的示例快速进行调整

同时需要预训练知识和提示中的示例

往往比零样本学习的效果要好得多,有时甚至接近微调模型的水平

无需重新训练即可实现扩展

使用时计算成本也很低

灵活性与性能表现之间达到了良好的平衡

对提示的质量和示例的选择非常敏感

GPT-3以及基于上下文的学习方法

通过上下文中的示例来理解任务内容

方面

微调

零样本学习

少样本学习

定义

模型会在针对特定任务的标注数据上接受额外训练

模型仅依靠指令来完成任务,而不需要任何示例

模型通过提示中提供的少量示例来学习如何完成该任务

训练要求

需要特定的、带有标注的数据集进行训练

不需要专门的训练或示例

任务的呈现方式

通过单独的训练阶段完成

通过自然语言指令给出

学习过程

模型权重在训练过程中会不断更新

权重不会被更新

灵活性

通常专门用于完成某一项任务

在多种任务中都具有很高的灵活性

适应性

需要针对新任务进行重新训练

通过提示信息就能立即适应新任务

对数据的依赖性

严重依赖于标注过的数据集

主要依靠预训练获得的知识

性能表现

在特定类型的基准任务中往往表现最佳

通常不如经过微调的模型性能好

跨任务的扩展性

扩展成本高昂且难度较大

具有极高的扩展性

计算成本

由于每次都需要进行新的训练,因此计算成本较高

在实际使用过程中计算成本较低

示例

在情感分析数据集上对模型进行微调

“判断这句话的情感倾向”

“正面:我非常喜欢这部电影。负面:这部电影很无聊。句子:故事情节非常精彩 →”

主要优势

在经过精心训练的任务中能够取得很高的准确率

结构简单,泛化能力较强

主要劣势

在跨任务的扩展性方面表现较差

可能会误解任务的要求或意图

最常与……相关联

传统的人工智能语言处理系统,GPT-1时代的相关技术

GPT-2风格的提示机制

核心理念

针对每项任务进行专门训练

通过指令来推断任务的具体要求

模型架构

从架构角度来看,GPT-3并没有采用任何彻底全新的设计。事实上,这篇论文中最值得关注的一点就是,其核心架构与GPT-2几乎完全相同。OpenAI依然沿用了仅包含解码器的Transformer模型,并通过自回归目标函数对这类模型进行训练。

从高层次来看,Transformer架构是通过一种称为“注意力机制”的方式来处理文本的。与那些较早期的循环模型不同,Transformer能够在整个文本序列中寻找关联,从而确定哪些词语彼此之间最为相关。

更具体地说,GPT-3依赖于“自注意力机制”,这种机制使模型在生成文本时能够权衡上下文中的各种信息。这样一来,模型就能更好地捕捉词语、句子以及概念之间的长距离关联关系。

此外,GPT-3还是一个“自回归模型”——它通过根据前面的所有内容来预测下一个字符,从而顺序地生成文本。这种基于自回归的目标函数设计,同样是GPT-3与GPT-2的共同基础。

那么,如果架构基本上没有变化,那么究竟是什么发生了改变呢?

答案就是规模。

GPT-3在模型规模、训练数据量以及训练过程中所需的计算资源方面都进行了大幅提升。GPT-3的最大版本包含了1750亿个参数,这一数字远远超过了GPT-2仅15亿个参数的规模。

该论文还测试了多种不同规模的模型,这些模型的参数数量从1.25亿到1750亿不等。进行这样的实验非常重要,因为作者们想要研究随着模型规模的扩大,其功能会如何发生变化。

GPT-3的架构包括以下组成部分:

  • 仅包含解码器的Transformer结构

  • 2048个字符组成的上下文窗口

  • 在相似的目标函数指导下训练而成的多种不同规模模型

  • 能够帮助模型高效处理上下文关系的注意力机制

这篇论文最重要的发现之一是:随着模型规模的扩大,其性能会呈现出平稳的提升趋势。规模更大的模型在翻译、问答、推理以及小样本学习等多种任务中,都能表现出更优异的性能。

这一观点贯穿了整篇关于GPT-3的论文。

作者们认为,与其依赖那些为特定任务量身定制的系统,不如让语言模型在足够大的规模下,并通过足够多样化的数据进行训练——这样,许多高级功能就会自然而然地显现出来。换句话说,“扩大模型规模”本身已经成为了一种研究策略。

这种转变之所以重要,是因为GPT-3所取得的成果并非源于复杂的架构创新。论文中的论点其实非常简单,但在某种程度上却令人感到十分惊讶:

当一个相对标准的Transformer架构被大幅度扩展其规模时,它就会展现出完全新的特性和能力。

Transformer-Decoder-Architecture

注意:原始图表展示了来自《Attention Is All You Need》一书的完整Transformer架构(编码器–解码器)。为了便于理解,并且因为这些内容与GPT风格的模型密切相关,所以这里使用的图片被裁剪掉了其中与编码器相关的内容,只保留了解码器部分,因为GPT模型就是基于这种仅包含解码器的Transformer架构设计的。

参考文献: Brownlee, J. Transformer模型中的编码器与解码器,《Machine Learning Mastery》。

实验

为了验证GPT-3是否真的能够仅通过上下文信息进行学习,作者在范围非常广泛的自然语言处理任务中对该模型进行了测试。这篇论文并没有聚焦于某一个特定的基准测试,而是探讨了同一个预训练模型是否能够仅仅依靠提示和示例来适应各种不同类型的问题。

这些实验涵盖了多个领域,包括:

  • 语言建模与文本补全

  • 问答系统

  • 语言之间的翻译

  • 阅读理解

  • 常识推理

  • Winograd风格的推理任务

  • 完形填空与句子补全

  • 算术运算及词汇操作等合成性推理问题

这些实验的特别之处在于它们的评估方式本身。

作者并没有为每个基准测试分别对GPT-3进行微调,而是完全通过提示来测试该模型。他们在三种不同的环境中对GPT-3进行了评估:

  • 零样本学习:模型仅接收任务描述

  • 一次样本学习:模型接收一个示例

  • 少样本学习:提示中包含多个示范案例

例如,在翻译任务中,提示中可能会给出一些英法对照的例子,然后要求模型按照这些例子进行翻译;在问答任务中,模型会先看到几个示例问题及其答案,然后再尝试回答新的问题。

重要的是,在这些评估过程中,模型的参数从未发生过任何变化。既没有梯度更新,也没有重新训练的过程,更没有任何针对特定任务的优化措施。GPT-3在执行每一项任务时,使用的都是完全相同的预训练权重。

这也是这篇论文与传统自然语言处理系统最大的不同之处之一。

在当时,大多数最先进的模型都是通过在对精心准备的数据集进行有监督的微调来取得优异的性能的。而GPT-3则试图验证:一个大型的语言模型是否能够仅仅通过理解提示中的模式,就能在不同任务中表现出通用性。

本文还探讨了模型规模增大时性能的变化情况。OpenAI训练了多个版本的GPT-3,这些模型的参数数量从1.25亿增加到1750亿不等,然后研究了这种规模变化对零样本学习、一次样本学习和少量样本学习效果的影响。
根据作者的研究,规模更大的模型在利用上下文信息方面表现得更为出色。少量样本学习的效果随着模型规模的扩大而显著提升,这表明大型模型并非只是记住了更多的信息,而是具备了更强的动态适应新任务的能力。

主要研究结果

在这个部分,GPT-3不再仅仅被看作是一个“规模更大的语言模型”,而显得具有完全不同的特性。
文章指出,在几乎所有实验中都存在一个明显的规律:随着模型规模的增加,其性能会持续提升。当GPT-3的参数数量从数百万增加到数千亿时,它在理解指令、适应上下文以及完成那些原本并未经过专门训练的任务方面表现得更加出色。
但最令人惊讶的结果并不只是更高的测试分数。
真正的突破在于:少量样本学习在大规模应用中确实能够发挥有效作用
在许多任务中,GPT-3在少量样本学习方面的表现与经过精心微调的系统相当接近,在某些情况下甚至超过了后者。这一成果非常显著,因为GPT-3在整个训练过程中并没有针对具体任务更新其权重,所有功能的提升都是通过指令输入来实现的。
其中一个最典型的例子出现在问答测试中。
在TriviaQA测试中,当提示中提供的示例数量增加时,GPT-3的表现也会显著提升。文章指出,虽然它的零样本学习能力已经具有很强的竞争力,但一次样本学习和少量样本学习方法使它的表现更进一步,在相同的封闭式测试环境中,它甚至能够达到或超越一些经过精心微调的系统。
零样本学习、一次样本学习与少量样本学习
来源:Brown等人(2020年),《语言模型其实是少量样本学习者》,图1.2。
这种规律在整篇论文中多次出现:

  • 少量样本学习方法的表现始终优于零样本学习方法

  • 规模更大的模型能更有效地利用上下文信息

  • 模型规模的扩大不仅提高了准确率,也增强了其适应能力

最后这一点尤为重要。
文章认为,模型规模的扩大并不仅仅有助于它们记住更多信息或生成更加流畅的文本,而是使它们具备了更强的上下文学习能力。换句话说,大型模型能够更直接地从指令中推断出任务的结构和规律。<作者们还观察到,随着模型规模的增大,零样本学习与少样本学习之间的性能差距也会进一步扩大。较小的模型很难从提示中有效学习知识,而较大的模型则往往能够仅通过少量的示例就能理解任务要求。

<这一发现之所以具有历史意义,是因为它改变了研究人员对人工智能系统能力发展的认知方式。

<在GPT-3出现之前,人们通常认为模型的扩展主要是为了提升现有的性能指标。但GPT-3证明了另一种可能性:当模型规模足够大时,完全新的行为模式可能会出现。

<正因如此,这篇论文才具有如此重要的影响力。它不仅仅报告了更优异的测试成绩,还提供了证据表明,模型的规模本身就能催生出全新的学习机制。

针对特定任务的观察结果

<如果深入研究这篇论文的内容,就会发现关于GPT-3的描述其实更为复杂:它的各项能力发展极不均衡。在某些领域,该模型的表现非常出色,但在其他方面却存在明显不足。

<翻译就是一个典型的例子。尽管GPT-3并非专门为翻译任务而设计的,但只要给它提供少量的示例,它依然能够生成令人满意的结果。根据论文的研究,随着模型规模的增加,少样本翻译任务的性能会大幅提升,尤其是进行英语翻译时。

<该模型在问答测试中也表现良好,尤其是在闭卷环境中——在这种场景下,答案必须直接从模型参数中提取出来。像TriviaQA这样的任务,当GPT-3从零样本学习模式切换到少样本学习模式时,其性能会有显著提升。

<文本补全和完形填空这类任务也是GPT-3的强项。该模型能够很好地延续语言模式、完成句子结构,并根据上下文推断出缺失的词语。在LAMBADA这样的数据集上,采用少样本学习方法时,GPT-3的性能提升尤为明显。

<不过,这篇论文也如实指出了GPT-3的弱点。

<在某些需要大量推理能力的测试中,GPT-3的表现明显不佳,尤其是那些涉及自然语言推理的任务。即使对于规模最大的模型来说,ANLI这样的数据集依然是一个难以克服的挑战。

<一些阅读理解任务也暴露了GPT-3的局限性。在某些情况下,它生成的答案虽然听起来合理,但实际上并没有真正理解文章的内容。这一点在整篇论文中都被反复提及:流畅的语言生成能力并不等同于深入的理解能力。

<一个非常值得注意的现象是,GPT-3对提示的设计方式极为敏感。

<在很多任务中,示例的编写方式、格式或排列顺序都会显著影响模型的性能。只要稍作调整,就能大幅提升准确率。

这表明GPT-3的运作机制中存在某些重要的因素。

该模型并非仅仅从内存中检索固定的知识,而是严重依赖上下文线索来推断人们期望它表现出什么样的行为。即使是提示语的微小变化,也可能会改变模型对任务本身的理解。

实际上,这篇论文为人工智能领域引入了一个全新的概念:即提问的方式与模型本身一样重要。

这一见解后来发展成了我们现在所称的提示工程

泛化能力与记忆机制

关于GPT-3,人们最关心的问题之一就是:该模型究竟是真正掌握了有用的规律,还是仅仅记住了互联网上的大量信息。

由于GPT-3是在包括Common Crawl在内的庞大网络数据集上训练出来的,因此这个问题显得尤为重要。对于这样一个规模庞大的模型来说,我们完全有理由质疑它的优异表现究竟是源于真正的泛化能力,还是因为在训练过程中偶然接触到了评估数据中的某些内容。

作者们非常重视这个问题,并在论文中专门用了一整节来探讨他们所称之为数据污染的现象。

根据这篇论文的研究,OpenAI仔细分析了训练数据与评估时使用的基准数据集之间的重叠部分,发现确实存在某种程度的“数据污染”现象。也就是说,某些评估数据集中的内容出现在了模型的训练语料库中。

然而,作者们认为这种重叠程度并不足以完全解释GPT-3的优异表现。

对于许多评估指标来说,即使考虑到了数据污染的影响,GPT-3的性能提升依然十分显著。论文还指出,一些专门用于测试模型适应能力和推理能力的任务,尽管这些内容在训练数据中出现的概率很低,但GPT-3在这些任务上依然表现优异。

另一个值得注意的现象是,GPT-3仍然存在过拟合训练数据的问题。这意味着,即使经过了大规模的训练,该模型也并没有完全记住所有看到的内容。

这一细节很重要,因为它说明GPT-3实际上是在学习各种统计规律和语言模式,而不是简单地存储了数据集的完整副本。

当然,记忆机制在某种程度上仍然是存在的。大型语言模型确实能够复现训练文本中的一些片段,尤其是当某些罕见或重复出现的词汇在训练过程中频繁出现时。论文并没有否认这一点,而是认为,仅仅依靠记忆机制是无法解释GPT-3在翻译、推理、问答以及上下文学习等任务上所取得的优异表现的。

实际上,这些证据表明GPT-3的运作机制要复杂得多。

GPT-3似乎是从大规模文本数据中吸收各种规律、关系和任务结构,然后能够在新的情境中灵活地运用这些知识。这与仅仅复制存储在内存中的答案是完全不同的。

这种区分成为了现代人工智能研究中的核心争论点之一。GPT-3迫使研究人员更加仔细地思考:对于一个语言模型来说,“理解”某事物究竟意味着什么,以及记忆、模式识别与真正的泛化能力之间的界限究竟在哪里。

讨论

在这篇文章中,GPT-3所具有的更广泛影响开始变得清晰起来。

根据作者的观点,大型语言模型所做的可能不仅仅是简单地预测文本。通过训练海量的语言数据,这些模型似乎能够学习到与各种任务本身相关的模式。

这一观点改变了我们对于语言建模的理解方式。

传统上,自然语言处理系统都是建立在明确的监督机制之上的。如果你想让一个模型进行文本翻译、回答问题、总结文档或分析情感倾向,你就需要使用带有标签的示例来专门训练它来完成这些任务。

GPT-3则提供了一种不同的可能性。

文章指出,许多任务其实已经隐含在自然语言数据之中了。在预训练阶段,模型会接触到互联网上大量关于解释、翻译、对话、推理模式、指令以及问答对等的示例。随着训练规模的扩大,模型便能够间接地学习到这些行为模式。

在实际应用中,这意味着模型并不总是需要经过重新训练才能完成新的任务。相反,一些提示或示例就可以激活模型在预训练阶段就已经掌握的能力。

这就是为什么在GPT-3中,提示机制会变得如此有效的原因。

提示本身并不仅仅是在提供信息,而是在引导模型朝向其学习到的表示结构中已经存在的行为模式发展。

同时,作者也谨慎地没有夸大这些结果的效果。

在整个文章中,他们多次强调GPT-3仍然存在不稳定性。有些输出结果确实令人信服,而另一些则明显错误、毫无逻辑意义或存在逻辑漏洞。

这种特性也正是GPT-3的重要特征之一。

这个模型往往表现得比实际情况更加自信。即使其背后的推理过程薄弱或事实依据有误,它仍然能够生成流畅的解释和具有说服力的答案。但在一些需要深入推理或阅读理解的测试任务中,GPT-3的表现依然存在明显不足。

因此,这篇文章并没有将GPT-3视为一种已经完全成熟的智能系统。

相反,它所提供的证据表明,扩大语言模型的规模确实能够开启那些之前较为薄弱或缺失的功能。这些结果虽然足以说明这一技术方向具有重大意义,但还不足以证明进一步的研究已经没有必要了。

这种平衡正是使这篇文章具有影响力的原因之一。它既有着远大的目标,同时也坦诚地指出了目前仍存在的局限性。

局限性

尽管围绕GPT-3的研究引发了广泛关注,但该论文依然具有可信度,其中一个原因在于作者们非常坦诚地指出了该模型的不足之处。这篇论文并未声称少样本学习能够解决自然语言处理领域的所有问题,也没有假装GPT-3在所有任务上都能表现出稳定的性能。

在许多情况下,传统的经过微调的系统依然表现得更好。

尽管GPT-3在多种基准测试中取得了令人瞩目的成绩,但在一些需要大量推理能力的任务上,它仍然存在明显的不足,尤其是在自然语言推理和某些阅读理解任务中。

论文还指出,GPT-3的成功在很大程度上取决于其模型的规模。规模较小的GPT-3版本在少样本学习能力方面表现较弱,而只有当模型参数数量达到极其庞大的程度时,才能取得最佳效果。

这就带来了一个实际性的问题:训练GPT-3需要耗费巨大的计算资源、专门的基础设施以及海量数据。最大的GPT-3模型拥有1750亿个参数,是通过在大型数据集上使用大规模GPU集群进行训练的。

实际上,在当时,世界上很少有机构有能力真正复制这一研究成果。

论文还讨论了与偏见和公平性相关的问题。由于GPT-3是从庞大的互联网数据集中学习知识的,因此它不可避免地会吸收这些数据中存在的社会偏见、刻板印象以及有问题的语言模式。

这一点尤其值得关注,因为该模型能够生成极具说服力的文本。那些错误或带有偏见的输出,即使具有误导性或危害性,听起来也可能非常权威可信。

作者们还探讨了另一个问题,即数据污染。由于GPT-3是在大规模的网络语料库上训练的,因此某些基准测试数据集中的内容可能会无意中出现在训练数据中。论文对此进行了深入分析,并承认确实存在这种数据重叠现象,但作者认为,仅凭数据污染这一因素并不能完全解释最终的研究结果。

如此大规模地开发模型还会带来环境和经济方面的成本。训练像GPT-3这样的模型需要消耗大量的计算资源和能源,这就引发了关于人工智能研究可持续性和可及性的讨论。随着模型规模的不断扩大,前沿研究的进展越来越依赖于工业级别的基础设施支持。

这种矛盾至今依然存在。

GPT-3的成功证明了模型规模扩大所带来的巨大潜力,但同时也暴露出了先进人工智能研究日益集中的趋势。大型语言模型的未来确实充满希望,但其开发成本也在不断上升。

结论

论文以一个非常简单的结论收尾:模型规模的扩大会改变它们所能完成的任务类型。

作者认为,GPT-3证明了:当语言模型的规模足够大时,它就能够直接从上下文中学习任务内容,而无需进行梯度更新或针对特定任务的微调训练。

这一理念代表了自然语言处理发展方向的重大转变。

多年来,机器学习的标准工作流程大致如下:

  • 先对模型进行预训练

  • 再针对特定任务对其进行微调

  • 最后部署该专用系统

GPT-3则引入了一种不同的模式。

与反复重新训练模型以适应新任务不同,同一个预训练好的模型往往只需通过提示信息就能进行调整。上下文窗口中的指令和示例就足以引导模型产生所需的行为。

换句话说,新的工作流程应该是这样的:

  • 仅进行一次训练

  • 通过提示信息动态调整模型行为

这种变化的重要性不仅在于其便捷性,更在于它改变了研究人员对模型泛化能力的认知。

论文指出,许多传统上被认为属于监督学习范畴的功能,其实都可以通过大规模语言建模自然地实现。翻译、问答、推理、总结,甚至任务适应能力,都可以在仅使用“下一个词预测”这一训练方法构建的统一系统中得以体现。

不过,作者们在得出这些结论时也保持了谨慎的态度。

GPT-3确实非常强大,但它还不够可靠,还不能被视为解决智能或推理问题的完整方案。论文多次指出了它在逻辑性、事实准确性、偏见控制以及一致性方面的不足之处。

尽管如此,这个核心观点依然不容忽视。

GPT-3证明了:扩大语言模型的规模并不会仅仅提升其表达能力,它还能让模型产生一些在小型系统中根本不存在的新功能。这一发现彻底改变了现代人工智能研究的发展方向,也为后续出现的那些基于提示信息进行学习的系统奠定了基础。

最终启示

如果GPT-1开创了大规模预训练后进行微调的模式,而GPT-2证明了语言模型无需针对特定任务进行训练也能取得很好的泛化效果,那么GPT-3则将这一理念推向了新的高度。

它表明,语言模型甚至可以在推理过程中开始学习新的功能。

这才是这篇论文所蕴含的真正核心思想。

在GPT-3出现之前,大多数人工智能系统仍然属于特定任务专用型。即便是那些强大的预训练模型,也需要额外的监督训练才能在实际应用中发挥作用。

GPT-3打破了这一传统模式。

我们不再需要为翻译、总结、问答或推理等不同任务分别构建不同的模型,同一个模型可以根据接收到的提示信息动态调整自己的行为。上下文窗口中的示例实际上就成为了指导模型行为的临时指令。

从实际应用来看,这种设计使人工智能系统摆脱了狭隘的专门化限制,朝着更加灵活的方向发展:

  • 从特定任务专用型系统

  • 发展为能够即时适应各种任务的通用模型

之所以这一点尤为重要,是因为GPT-3并非通过复杂的符号推理系统或精心设计的数据处理流程来实现这一成就的。该模型仍然是使用相对简单的“下一个标记预测”目标进行训练的。然而,在足够大的规模下,它确实展现出了一些全新的行为特征。

回过头来看,这篇论文与其说是GPT系列的终结,不如说是一个新时代的开始。

如今许多定义现代人工智能的概念,其起源都可以直接追溯到GPT-3:

  • 提示工程

  • 指令遵循系统

  • 上下文学习

  • 对话式AI助手

  • 通用基础模型

归根结底,像ChatGPT这样的系统之所以能够存在,正是因为GPT-3证明了:利用提示本身,就可以成为与智能体进行交互的强大工具。

正因如此,这篇论文具有历史性的意义。

它不仅仅改变了语言模型的规模,更彻底地改变了人们使用这些模型的方式。

GPT-1与GPT-2与GPT-3:关键差异

仅通过预训练即可实现零样本学习

大规模预训练能够支持少样本学习和上下文学习

单阶段语言模型训练

相同的语言模型训练方法,但规模大幅扩大

仅需根据提示和示例进行学习,无需重新训练

主要通过零样本提示来完成任务

可以通过零样本、单样本和少样本提示来完成各种任务

学习方式

先学习通用的语言表示结构,然后再进行专项训练

直接学习通用的语言模式

能够直接从上下文中推断出所需完成的任务

泛化能力

在微调任务之外的泛化能力较弱

跨任务的泛化能力更强

具有很强的上下文适应能力和上下文学习能力

提示的作用

提示开始发挥重要作用

提示成为系统行为的核心要素

推理能力

在推理过程中能够进行泛化

在推理过程中能够动态适应新情况

架构设计

经过大规模扩展的仅包含解码器的Transformer

模型规模

最多15亿个参数

最多175亿个参数

上下文窗口长度

最多支持1024个标记

支持2048个标记的上下文窗口

训练数据来源

WebText互联网数据集

包含Common Crawl、WebText、书籍和Wikipedia在内的大规模多源数据集

核心能力

零样本学习

少样本学习和上下文学习

性能表现

无需针对特定任务进行训练也能表现出色

仅使用提示进行训练时,其性能往往能与经过微调的系统相媲美

扩展性

扩展性很强

这是本文的核心研究方向之一

主要局限性

计算资源需求极高,且推理能力仍存在局限

主要贡献

证明了多任务零样本学习的可行性

展示了大规模应用下的上下文学习能力

历史意义

推动了通用语言模型的发展方向

为基于提示的AI系统及现代大语言模型应用奠定了基础

该领域因此发生了哪些变化

使用提示进行训练变得可行

提示成为了AI系统的主要交互方式

后续影响

促进了大规模生成式模型的发展

直接影响了ChatGPT、指令调优技术以及各种基础模型的设计

方面

GPT-1

GPT-2

GPT-3

核心理念

预训练后进行微调

训练方法

两阶段训练流程:先预训练再微调

监督机制

下游任务需要标注数据

无需监督微调即可完成任务

任务处理方式

每项任务都需要单独进行微调

作用相对较小

训练完成后,推理能力基本保持不变

基于Transformer的结构

仅包含解码器的Transformer

约1.17亿个参数

较短的上下文长度

书籍语料库及精心筛选的数据集

迁移学习

经过微调后性能很强

扩展性一般

需要标注数据集并且需要进行重新训练

推理能力较弱,零样本学习效果不稳定

提出了现代自然语言处理预训练的范式

构成了现代Transformer自然语言处理技术的基础

预训练成为标准流程

为现代的迁移学习技术提供了灵感

PyTorch实现的GPT架构演化版本

GPT-1:预训练+微调架构

class GPT1(nn.Module):
    def __init__(self, vocab_size, d_model, n_layers):
        super().__init__()
        
        self.token_embedding = nn.Embedding(vocab_size, d_model)
        self.positionembedding = nn Embedding(512, d_model)

        self.transformer_blocks = nn.ModuleList([
            TransformerBlock(d_model)
            for _ in range(n_layers)
        ])

        self.ln_f = nn.LayerNorm(d_model)

        # 语言建模部分
        self.lm_head = nn.Linear(d_model, vocab_size)

    def forward(self, input_ids):
        positions = torch.arange(input_ids.size(1))

        x = (
            self.token_embedding(input_ids)
            + self.positionembedding(positions)
        )

        for block in self.transformer_blocks:
            x = block(x)

        x = self.ln_f(x)

        logits = self.lm_head(x)

        return logits

GPT1继承自nn.Module,后者是PyTorch中用于构建神经网络的基础类。构造函数(init)定义了模型中所有可训练的层。

nn.Embedding(vocab_size, d_model)创建了一个可学习的查找表,该表格能够将标记ID转换为密集向量。词汇表中的每个标记都会被映射到一个大小为d_model的向量上。

位置嵌入层用于添加关于标记顺序的信息。由于Transformer是并行处理各个标记的,因此它们需要明确的位置信息才能理解序列的结构。

nn.ModuleList([...])用于存储多个Transformer块,同时确保PyTorch在训练过程中能够正确地跟踪这些块的参数。每个TransformerBlock通常包含掩码自注意力机制和一个前馈网络。

nn.LayerNorm(d_model)在输出投影之前应用层归一化处理。这一操作有助于稳定训练过程,并改善深度Transformer架构中的梯度流动情况。

语言建模部分(nn.Linear)将隐藏表示重新映射回词汇表空间。输出的向量长度等于vocab_size,从而为每个可能的后续标记生成预测分数。

forward()方法中,input_ids.size(1)用于获取序列的长度,而torch.arange(...)则能为每个标记位置生成对应的位置索引。

标记嵌入与位置嵌入相加后,就得到了Transformer的初始输入表示。

随后,模型会依次将这个表示传递给每一个Transformer块:

for block in self.transformer_blocks:
    x = block(x)

正是这种迭代的堆叠方式,使得GPT模型能够逐渐学习到更为抽象的上下文表示信息。

在经过归一化处理后,最终的隐藏状态会被传递到lm_head中,从而生成logits

最终,模型会返回一个logits张量,在推理过程中这个张量通常会通过softmax函数进行处理;而在训练过程中,则可以直接与CrossEntropyLoss一起使用。

GPT-2:零样本多任务架构

class GPT2(nn.Module):
    def __init__(self, vocab_size, d_model, n_layers):
        super().__init__()

        self.token_embedding = nn.Embedding(vocab_size, d_model)
        self.positionembedding = nn.Embedding(1024, d_model)

        self.transformer_blocks = nn.ModuleList([
            TransformerBlock(
                d_model=d_model,
                pre_layer_norm=True
            )
            for _ in range(n_layers)
        ])

        self.final_layer_norm = nn.LayerNorm(d_model)

        self.lm_head = nn.Linear(d_model, vocab_size, bias=False)

    def forward(self, input_ids):
        positions = torch.arange(input_ids.size(1))

        x = (
            self.token_embedding(input_ids)
            + self.positionembedding(positions)
        )

        for block in self.transformer_blocks:
            x = block(x)

        x = self.final_layer_norm(x)

        logits = self.lm_head(x)

        return logits

与GPT-1一样,该模型也是从标记嵌入和位置嵌入开始的。nn.Embedding将标记ID转换为密集向量,而位置嵌入则用于表示序列中各标记的顺序。

一个明显的区别在于位置嵌入的大小更大(为1024而不是512),这使得GPT-2能够处理更长的上下文信息。

Transformer层是通过nn.ModuleList来组织的,但现在的每个TransformerBlock都设置了pre_layer_norm=True这一参数。

这意味着层归一化操作会在注意力机制和前馈操作之前进行,而不是之后。这种“预归一化”设计显著改善了深层Transformer模型的梯度传播效果及训练稳定性。

整个前向传播过程遵循相同的步骤:

  1. 使用torch.arange()生成位置索引

  2. 将标记嵌入和位置嵌入相加

  3. 将处理后的结果传递给多个Transformer层

  4. 进行最终归一化处理

  5. 将输出结果映射到词汇表空间中

具体的处理流程如下:

for block in self.transformer_blocks:
    x = block(x)

GPT-2还在输出层引入了一个小的优化措施:

self.lm_head = nn.Linear(d_model, vocab_size, bias=False)
self.lm_head = nn.Linear(d_model, vocab_size, bias=False)

在大型语言模型中,偏置项几乎没有任何作用,而且还会略微增加参数的数量,因此被去掉了。

最终,该模型会输出logits,其中包含了词汇表中每个词在每个序列位置上的预测分数。

GPT-3:少样本学习/上下文相关学习架构

class GPT3(nn.Module):
    def __init__(
        self,
        vocab_size=50257,
        d_model=12288,
        n_layers=96,
        n_heads=96,
        context_length=2048
    ):
        super().__init__()
        
        self.token_embedding = nn.Embedding(vocab_size, d_model)
        self.positionembedding = nn.Embedding(context_length, d_model)

        self.transformer_blocks = nn.ModuleList([
            TransformerBlock(
                d_model=d_model,
                n_heads=n_heads,
                pre_layer_norm=True,
                sparse_attention=True
            )
            for _ in range(n_layers)
        ])

        self.final_layer_norm = nn.LayerNorm(d_model)

        self.lm_head = nn.Linear(
            d_model,
            vocab_size,
            bias=False
        )

    def forward(self, input_ids):
        positions = torch.arange(input_ids.size(1))

        x = (
            self.token_embedding(input_ids)
            + self.positionembedding(positions)
        )

        for block in self.transformer_blocks:
            x = block(x)

        x = self.final_layer_norm(x)

        logits = self.lm_head(x)

        return logits

与早期的GPT版本相比,这个模型的规模有了显著提升。其嵌入层的参数数量(d_model=12288)以及Transformer层的数量(96层)使得该模型能够学习极其复杂的语言规律及长距离的語言依赖关系。

该模型还使用了96个注意力头:

n_heads=96

多头部注意力机制使模型能够同时关注词与词之间的多种关联关系,从而提升其对上下文的理解能力。

位置嵌入层的长度被增加到了2048,这使得该模型能够处理比GPT-2更长的语序序列。

每个Transformer块都配置了以下参数:

pre_layer_norm=True,
sparse_attention=True

层前归一化有助于提升非常深层次网络的训练稳定性,而稀疏注意力机制则通过限制相互关联的词的数量来降低计算开销。在GPT-3这种大规模模型中,这一点尤为重要,因为对长序列进行全范围注意力计算会耗费巨大的计算资源。

模型的前向传播过程遵循标准的GPT流程:

  1. 将词ID转换为嵌入向量

  2. 添加位置信息

  3. 将处理后的数据传递给多层Transformer模块

  4. 进行最终层归一化处理

  5. 生成词汇表的预测分数

核心的迭代处理过程就是在这里进行的:

for block in self.transformer_blocks:
    x = block(x)

最后,输出层会将隐藏状态映射到词汇空间中,生成用于训练过程中预测下一个词元以及进行文本生成的logits值。

资源:

Comments are closed.