Abstract
最近的研究表明,通过在大量文本语料上进行预训练,然后在特定任务上进行微调,可以在许多自然语言处理任务和基准测试中取得显著进展。尽管这种方法在架构上通常是任务无关的,但它仍然需要特定任务的微调数据集,通常包含数千到数万个示例。相比之下,人类可以通常仅凭几个示例或简单的指令就能完成新的语言任务,而当前的自然语言处理系统在这方面仍然存在较大的困难。在这里,我们展示了扩大语言模型规模可以大大提升任务无关的少量示例表现,有时甚至能与之前最先进的微调方法相媲美。具体而言,我们训练了GPT-3,这是一个拥有1750亿个参数的自回归语言模型,是之前任何非稀疏语言模型的10倍,并测试了它在少量示例设置下的表现。
在所有任务中,GPT-3 在没有任何梯度更新或微调的情况下应用,任务和少量示例仅通过与模型的文本交互来指定。GPT-3 在许多自然语言处理数据集上表现出色,包括翻译、问答和填空任务,以及需要即时推理或领域适应的任务,如解码单词、在句子中使用新词或进行三位数算术运算。同时,我们也发现一些数据集上GPT-3的少量示例学习仍存在困难,以及一些与大规模网页语料训练相关的方法论问题。最后,我们发现GPT-3能够生成新闻文章样本,这些样本在人类评估者看来很难与人类撰写的文章区分开。我们讨论了这一发现以及GPT-3的一般社会影响。
1 Introduction
近年来,自然语言处理系统中出现了一种趋势,即使用预训练的语言表示,这些表示以越来越灵活和任务无关的方式应用于下游任务。最初,通过单层表示学习了词向量 [MCCD13, PSM14] 并将其输入到特定任务的架构中;随后,使用具有多层表示和上下文状态的递归神经网络(RNNs)来形成更强的表示 [DL15, MBXS17, PNZtY18](尽管仍应用于任务特定的架构)。最近,预训练的递归或transformer语言模型 [VSP+17] 已被直接微调,完全消除了对任务特定架构的需求 [RNSS18, DCLT18, HR18]。
这种最后的范式在许多具有挑战性的自然语言处理任务上,如阅读理解、问答、文本蕴涵等,带来了显著的进展,并且基于新架构和算法持续推进 [RSR+19, LOG+19, YDY+19, LCG+19]。然而,这种方法的一个主要限制是,尽管架构是任务无关的,但仍然需要任务特定的数据集和任务特定的微调:要在所需任务上获得强劲的表现,通常需要在特定于该任务的数据集上进行微调,数据集规模从几千到几万例不等。消除这一限制将是有利的,原因有多个。
首先,从实际角度来看,对每个新任务都需要大量标注样本的数据集,限制了语言模型的适用性。语言任务的范围非常广泛,涵盖了从语法纠正到生成抽象概念的例子,再到批评短篇小说等各种内容。对于许多这些任务,收集大量的监督训练数据集是困难的,尤其是当这一过程需要针对每个新任务重复进行时。
其次,利用训练数据中的虚假相关性的潜力随着模型的表现力和训练分布的狭窄性而根本性地增长。这可能会对预训练加微调的范式造成问题,在这种范式中,模型被设计得较大以便在预训练期间吸收信息,但随后在非常狭窄的任务分布上进行微调。例如,[HLW+20] 观察到较大的模型不一定在分布外能更好地泛化。有证据表明,在这种范式下实现的泛化可能较差,因为模型过于特定于训练分布,且在其外部泛化能力不足 [YdC+19, MPL19]。因此,即使微调模型在特定基准测试上的表现名义上达到人类水平,其在实际任务上的表现也可能被夸大 [GSL+18, NK19]。
第三,人类在学习大多数语言任务时并不需要大量的监督数据集——一句简单的自然语言指令(例如:“请告诉我这个句子描述的是快乐还是悲伤”)或最多少量的示例(例如:“这里有两个表现勇敢的例子;请再给一个勇敢的例子”)通常就足以让人类以合理的能力完成新任务。除了指出我们当前NLP技术的概念性限制之外,这种适应性还有实际优势——它使人类能够无缝地混合或切换多种任务和技能,例如在漫长的对话中进行加法。为了更广泛的实用性,我们希望未来的NLP系统能够具备这种流动性和通用性。
一种可能的解决方法是元学习——在语言模型的背景下,意味着模型在训练时发展广泛的技能和模式识别能力,然后在推理时利用这些能力快速适应或识别所需的任务(如图1.1所示)。最近的工作 [RWC+19] 尝试通过我们称之为“上下文学习”的方式来实现这一点:利用预训练语言模型的文本输入作为任务规范的一种形式:模型根据自然语言指令和/或少量任务示例进行条件设定,然后通过预测接下来的内容来完成更多的任务实例。
虽然这种方法初步显示出一些潜力,但其结果仍远逊于微调。例如,[RWC+19] 在 Natural Questions 上仅取得了 4% 的成绩,而其在 CoQa 上的 55 F1 分数也比当前最先进的技术低了超过 35 分。显然,元学习还需要显著改进才能成为解决语言任务的实际可行方法。
另一个近期的趋势可能提供了一条前进的道路。近年来,transformer语言模型的容量大幅增加,从1亿个参数 [RNSS18] 增加到3亿个参数 [DCLT18],再到15亿个参数 [RWC+19],到80亿个参数 [SPP+19],110亿个参数 [RSR+19],最终达到170亿个参数 [Tur20]。每次增加都带来了文本合成和/或下游NLP任务的改善,并且有证据表明,能够很好地与许多下游任务相关的对数损失在规模上表现出平滑的改进趋势 [KMH+20]。由于上下文学习涉及在模型的参数范围内吸收多种技能和任务,因此上下文学习能力可能会随着规模的增加而表现出类似的强劲增长。
图 1.1:语言模型的元学习。在无监督预训练过程中,语言模型发展出一套广泛的技能和模式识别能力。随后,它利用这些能力在推理时快速适应或识别所需的任务。我们使用“上下文学习”一词来描述这一过程的内循环,即在每个序列的前向传播过程中发生的部分。图中的序列并非代表模型在预训练期间所见的数据,而是为了展示有时在单个序列中嵌入了重复的子任务。
在本文中,我们通过训练一个1750亿参数的自回归语言模型(称为GPT-3)来验证这个假设,并测量其上下文学习能力。具体来说,我们在二十多个NLP数据集以及几个新任务上评估GPT-3,这些新任务旨在测试模型对训练集不太可能直接包含的任务的快速适应能力。对于每个任务,我们在三种条件下评估GPT-3:(a)“少量示例学习”,即上下文学习,在这种情况下,我们允许尽可能多的示例填充到模型的上下文窗口中(通常为10到100个示例),(b)“单例学习”,仅允许一个示例,以及(c)“零样本学习”,不允许示例,只给模型提供自然语言的指令。GPT-3理论上也可以在传统的微调设置中进行评估,但我们将此留待未来工作。
图1.2展示了我们研究的条件,并展示了一个简单任务的少量示例学习,该任务要求模型从单词中去除多余的符号。模型的表现随着自然语言任务描述的添加以及模型上下文中的示例数量K的增加而提升。少量示例学习的效果也随着模型规模的增大而显著改善。虽然在这个案例中结果特别引人注目,但模型规模和上下文中的示例数量的总体趋势对于我们研究的大多数任务都适用。我们强调,这些“学习”曲线不涉及梯度更新或微调,仅仅是增加作为条件的示例数量。
图1.2:较大的模型在利用上下文信息方面变得越来越高效。我们展示了在一个简单任务上的上下文学习表现,该任务要求模型从单词中去除随机符号,包括有和没有自然语言任务描述的情况(见第3.9.2节)。大型模型的“上下文学习曲线”更陡峭,显示出从上下文信息中学习任务的能力有所提升。我们在广泛的任务中观察到了类似的行为。
总体而言,在自然语言处理任务中,GPT-3 在zero-shot 和one-shot 设置中取得了有希望的结果,在少量示例设置中,有时与最先进的模型竞争,甚至偶尔超越它们(尽管最先进的模型通常是经过微调的)。例如,GPT-3 在 CoQA 的zero-shot 设置中取得了81.5的 F1 分数,在one-shot 设置中为84.0,在少量示例设置中为85.0。同样,GPT-3 在 TriviaQA 的zero-shot 设置中达到了64.3%的准确率,在one-shot 设置中为68.0%,在少量示例设置中为71.2%,后者在同样的闭卷设置中相对于微调模型而言是最先进的。
GPT-3 同样在旨在测试快速适应或即时推理的任务中表现出one-shot 和few-shot的能力,这些任务包括解码单词、执行算术运算,以及在仅看到一次定义后将新词使用在句子中。我们还展示了在少量示例设置中,GPT-3 能够生成合成新闻文章,人类评估者很难区分这些文章与人类生成的文章。
同时,我们也发现一些任务在few-shot设置中表现不佳,即使是在 GPT-3 的规模下也是如此。这包括自然语言推理任务,如 ANLI 数据集,以及一些阅读理解数据集,如 RACE 或 QuAC。通过对 GPT-3 的优缺点进行广泛的描述,包括这些局限性,我们希望能够刺激对语言模型few-shot学习的研究,并引起对最需要进展领域的关注。
可以通过图 1.3 对整体结果有一个直观的了解,该图汇总了各个任务的结果(尽管它本身不应被视为严格或有意义的基准)。
图 1.3:所有 42 个准确率基准的汇总表现。zero-shot 性能随着模型规模的增加而稳步提升,few-shot性能的增长更为迅速,显示出较大模型在上下文学习方面更为高效。有关 SuperGLUE 的更详细分析,请参见图 3.8,这是一个标准的 NLP 基准测试套件
我们还进行了对“数据污染”(data contamination)的系统性研究——这是在训练高容量模型时逐渐成为一个问题,特别是在使用诸如 Common Crawl 这样的数据集时,因为这些数据集可能包含来自测试数据集的内容,原因是这些内容通常存在于网络上。在本文中,我们开发了系统工具来测量数据污染并量化其扭曲效果。尽管我们发现数据污染对 GPT-3 在大多数数据集上的表现影响较小,但我们确实识别出了一些数据集可能被数据污染所影响的情况,对这些数据集,我们要么不报告结果,要么在报告中用星号标注,具体取决于数据污染的严重程度。
除了上述内容,我们还训练了一系列较小的模型(参数范围从1.25亿到130亿),以便将它们的表现与 GPT-3 在zero-shot 、one-shot 和few-shot 设置下进行比较。总体而言,我们发现,在这三种设置下,大多数任务的模型容量与性能之间的关系相对平滑;一个显著的模式是,zero-shot 、one-shot 和few-shot 性能之间的差距往往随着模型容量的增加而扩大,这可能表明较大的模型在元学习方面更为高效。
最后,鉴于 GPT-3 展示出的广泛能力,我们讨论了关于偏见、公平性和更广泛社会影响的担忧,并尝试对 GPT-3 在这些方面的特征进行初步分析。
本文的其余部分组织如下:第2节描述了我们训练和评估 GPT-3 的方法和流程。第3节展示了在zero-shot 、one-shot 和few-shot 设置下的任务结果。第4节讨论了数据污染(训练-测试重叠)的问题。第5节讨论了 GPT-3 的局限性。第6节讨论了更广泛的影响。第7节回顾了相关工作,第8节作结。
2 Approach
我们的基本预训练方法,包括模型、数据和训练,类似于 [RWC+19] 中描述的过程,通过相对简单地扩展模型规模、数据集规模和多样性以及训练时长来实现。我们对上下文学习的使用也与 [RWC+19] 类似,但在这项工作中,我们系统地探索了上下文内学习的不同设置。因此,我们在本节开始时明确定义并对比了我们将评估 GPT-3 的不同设置,或理论上可以评估 GPT-3 的设置。这些设置可以视为在它们依赖于多少任务特定数据的光谱上。具体而言,我们可以在这个光谱上识别出至少四个点(参见图 2.1 以获取示意图):
Fine-Tuning (FT) 近年来,微调(FT)已成为最常见的方法,它涉及通过在特定任务的监督数据集上训练来更新预训练模型的权重。通常使用成千上万到数十万的标注示例。微调的主要优点是许多基准测试上的强大性能。主要缺点是每个任务都需要一个新的大型数据集,可能导致对分布外数据的泛化能力较差 [MPL19],以及可能利用训练数据中的虚假特征 [GSL+18, NK19],这可能导致与人类表现的不公平比较。在这项工作中,我们不对 GPT-3 进行微调,因为我们的重点是任务无关的性能,但 GPT-3 在理论上可以进行微调,这也是未来工作的一个有前景的方向。
Few-Shot (FS) 在这项工作中,我们将“few-shot(FS)”这一术语用于指代在推理时给模型提供少量任务示例作为条件 [RWC+19] 的设置,但不允许更新权重。如图 2.1 所示,对于一个典型的数据集,一个示例包含上下文和期望的完成(例如,一个英语句子及其法语翻译),few-shot的方法通过提供 K 个上下文和完成示例,然后给出一个最终的上下文示例,模型需要提供完成结果。我们通常将 K 设置在 10 到 100 之间,因为这是模型上下文窗口(nctx = 2048)能够容纳的示例数量。few-shot的主要优点是大幅减少了对任务特定数据的需求,并且降低了从大型但狭窄的微调数据集中学习过于狭窄分布的潜力。主要缺点是这一方法的结果迄今为止远逊于最先进的微调模型。此外,仍然需要少量的任务特定数据。如名称所示,语言模型中描述的few-shot与其他机器学习上下文中使用的few-shot [HYC01, VBL+16] 相关——两者都涉及基于广泛的任务分布(在这里隐含于预训练数据中)进行学习,然后快速适应新任务。
One-shot(1S)“One-shot(1S)”与few-shot 类似,只允许一个示例,以及任务的自然语言描述,如图 1 所示。之所以将one-shot 和few-sho、zero-shot区分开来,是因为它最接近一些任务传达给人类的方式。例如,当要求人类在劳动力服务(如 Mechanical Turk)上生成数据集时,通常会提供一个任务示例。相反,如果没有给出示例,有时很难传达任务的内容或格式。
zero-shot(0S)“zero-shot(0S)”与one-shot 类似,只是没有示例提供,模型仅依赖于描述任务的自然语言指令。这种方法提供了最大的便利性、潜在的鲁棒性,并避免了虚假的关联(除非这些关联在预训练数据的大范围中普遍存在),但也是最具挑战性的设置。在某些情况下,没有事先的示例可能使人类也难以理解任务的格式,因此这种设置在某些情况下可能会显得“过于困难”。例如,如果有人被要求“制作一张200米短跑世界纪录的表格”,这个请求可能会有歧义,因为表格的格式或应包括的内容可能不清楚(即使进行仔细的澄清,确切理解所需内容也可能很困难)。尽管如此,对于某些设置,zero-shot是最接近人类执行任务的方式——例如,在图 2.1 的翻译示例中,人类可能仅凭文本指令就能知道该怎么做。
图 2.1 通过英语到法语翻译的示例展示了四种方法。在本文中,我们重点关zero-shot 、one-shot 和few-shot,旨在将它们作为不同的问题设置进行比较,而不是竞争替代方案,这些设置在特定基准的性能和样本效率之间提供了不同的权衡。我们特别强调few-shot的结果,因为其中许多结果仅略低于最先进的微调模型。然而,最终,one-shot ,甚至有时是zore-shot,似乎是与人类表现最公平的比较,并且是未来研究的重要目标。
下面的 2.1 到 2.3 节详细介绍了我们的模型、训练数据和训练过程。2.4 节讨论了我们如何进行zero-shot 、one-shot 和few-shot的细节。
图 2.1:Zero-shot、one-shot 和 few-shot 与传统微调的对比。上面的面板展示了四种使用语言模型执行任务的方法——微调是传统方法,而 Zero-shot、one-shot 和 few-shot 是我们在这项工作中研究的方法,这些方法要求模型仅在测试时通过前向传播来完成任务。在few-shot设置中,我们通常会向模型提供几十个示例。所有任务描述、示例和提示的准确表述可以在附录 G 中找到。
下面的 2.1 到 2.3 节分别详细介绍了我们的模型、训练数据和训练过程。2.4 节讨论了我们如何进行 few-shot、one-shot 和 zero-shot 评估的细节。
2.1 Model and Architectures
我们使用与 GPT-2 [RWC+19] 相同的模型和架构,包括修改过的初始化、预归一化和可逆标记化,但在 transformer 的层中使用交替的密集和局部带状稀疏注意力模式,类似于 Sparse Transformer [CGRS19]。为了研究机器学习性能对模型大小的依赖性,我们训练了 8 种不同大小的模型,参数范围从 1.25 亿到 1750 亿,最后一个是我们称之为 GPT-3 的模型。之前的研究 [KMH+20] 表明,随着训练数据的增加,验证损失的缩放应当大致符合大小的平滑幂律;训练多种不同大小的模型使我们能够检验这一假设,包括对验证损失和下游语言任务的验证。
表 2.1 显示了我们 8 个模型的大小和架构。这里,nparams 是可训练参数的总数,nlayers 是层的总数,dmodel 是每个瓶颈层的单位数(我们总是将前馈层的大小设置为瓶颈层的四倍,即 dff = 4 ∗ dmodel),dhead 是每个注意力头的维度。所有模型使用的上下文窗口为 nctx = 2048 tokens。我们沿深度和宽度维度在 GPU 上划分模型,以最小化节点之间的数据传输。每个模型的具体架构参数是基于计算效率和 GPU 布局中的负载均衡来选择的。之前的研究 [KMH+20] 表明,验证损失对这些参数在合理范围内并不敏感。
2.2 Training Dataset
语言模型的数据集迅速扩展,最终形成了包含近万亿词的 Common Crawl 数据集 [RSR+19]Common Crawl - Overview。这样的数据集大小足以训练我们最大的模型,而无需在相同的序列上重复更新。然而,我们发现未过滤或轻微过滤的 Common Crawl 版本质量往往低于更为精心策划的数据集。因此,我们采取了 3 个步骤来提高数据集的平均质量:(1)我们下载并过滤了一个基于与一系列高质量参考语料库相似度的 Common Crawl 版本;(2)我们在文档级别进行了模糊去重,涵盖数据集内部及跨数据集,以防止冗余并保持持有的验证集的完整性,作为准确的过拟合度量;(3)我们还将已知的高质量参考语料库加入到训练混合中,以增强 Common Crawl 并提高其多样性。
前两点(Common Crawl 的处理细节)在附录 A 中描述。对于第三点,我们添加了几个精心策划的高质量数据集,包括扩展版的 WebText 数据集 [RWC+19],该数据集通过更长时间的链接抓取收集,首次在 [KMH+20] 中描述,还有两个基于互联网的图书语料库(Books1 和 Books2)以及英文维基百科。
表 2.2 显示了我们在训练中使用的最终数据集组合。CommonCrawl 数据来自 2016 年至 2019 年的 41 个分片,原始数据量为 45TB 的压缩明文,经过过滤后为 570GB,大致相当于 4000 亿个 byte-pair-encoded tokens。需要注意的是,在训练过程中,数据集并非按其大小的比例进行采样,而是我们认为质量较高的数据集会被更频繁地采样。因此,CommonCrawl 和 Books2 数据集在训练过程中采样次数少于一次,而其他数据集则被采样 2-3 次。这种做法本质上是在追求更高质量的训练数据的同时接受少量的过拟合。
图 2.2: 训练过程中使用的总计算量。根据《Scaling Laws For Neural Language Models》[KMH+20] 中的分析,我们在远少于典型的 token 数量上训练了更大的模型。因此,尽管 GPT-3 3B 的规模几乎是 RoBERTa-Large (355M params) 的 10 倍,但这两个模型在预训练过程中都大约消耗了 50 petaflop/s-days 的计算量。这些计算方法的详细信息可以在附录 D 中找到。
表 2.2: 用于训练 GPT-3 的数据集。 “Weight in training mix” 指的是在训练过程中从某个数据集中抽取的示例比例,我们故意不按数据集的大小进行比例分配。因此,当我们训练 3000 亿 tokens 时,一些数据集在训练过程中被看到最多可达 3.4 次,而其他数据集则被看到不到一次。
对于在大量互联网数据上预训练的语言模型,特别是那些具有记忆大量内容能力的大模型,主要的方法论问题是可能会有下游任务的测试或开发集在预训练过程中被无意中见过,从而导致潜在的污染。为了减少这种污染,我们搜索并尝试去除所有在本文研究的基准测试中的开发集和测试集的重叠。不幸的是,过滤中的一个错误导致我们忽略了一些重叠,且由于训练成本问题,无法重新训练模型。在第 4 节中,我们将描述剩余重叠的影响,未来的工作中我们会更加积极地去除数据污染。
2.3 Training Process
如 [KMH+20, MKAT18] 中所述,更大的模型通常可以使用更大的批量大小,但需要较小的学习率。我们在训练过程中测量梯度噪声规模,并用它来指导我们选择批量大小 [MKAT18]。表 2.1 显示了我们使用的参数设置。为了在不耗尽内存的情况下训练更大的模型,我们在每次矩阵乘法中使用了模型并行性,并在网络层之间使用了模型并行性。所有模型都在 Microsoft 提供的高带宽集群的 V100 GPU 上进行训练。训练过程和超参数设置的详细信息描述在附录 B 中。
2.4 Evaluation
对于 few-shot 学习,我们通过从该任务的训练集中随机抽取 K 个例子作为条件来评估评估集中的每个例子,条件例子之间用 1 或 2 个换行符分隔,具体取决于任务。对于 LAMBADA 和 Storycloze 这两个任务,没有可用的监督训练集,因此我们从开发集中抽取条件例子,并在测试集上进行评估。对于 Winograd(原始版本,而非 SuperGLUE 版本),只有一个数据集,因此我们直接从该数据集中抽取条件例子。
K 可以是从 0 到模型上下文窗口允许的最大值的任何值,对于所有模型,这个最大值是 nctx = 2048,通常可以容纳 10 到 100 个例子。较大的 K 值通常(但不总是)效果更好,因此当有单独的开发集和测试集时,我们会在开发集上尝试几个不同的 K 值,然后在测试集上运行最佳值。对于一些任务(见附录 G),我们还使用自然语言提示,除了(或对于 K = 0,代替)演示。在涉及从多个选项中选择一个正确完成的任务(选择题)中,我们提供 K 个上下文加正确完成的例子,然后提供一个只有上下文的例子,并比较每个完成的 LM 可能性。对于大多数任务,我们比较每个 token 的可能性(以标准化长度),然而在少数数据集上(ARC、OpenBookQA 和 RACE),我们通过计算 P(completion|context) / P(completion|answer context) 来进行标准化,其中 answer context 是字符串 "Answer: " 或 "A: ",用于提示完成应该是一个答案,但其他情况下是通用的。
在涉及二元分类的任务中,我们给选项更有语义意义的名称(例如,“True” 或 “False” 而不是 0 或 1),然后将任务视为选择题;我们有时也会以类似 [RSR+19](见附录 G)的方式来构建任务。对于自由形式完成的任务,我们使用与 [RSR+19] 相同参数的 beam search:beam 宽度为 4,长度惩罚为 α = 0.6。我们使用 F1 相似度评分、BLEU 或准确匹配来评分模型,具体取决于数据集的标准。最终结果在测试集上报告(如果公开可用),对于每个模型大小和学习设置(zero-shot、one-shot 和 few-shot)。当测试集是私有的,我们的模型通常太大而无法在测试服务器上运行,因此我们报告开发集上的结果。我们确实在少数数据集(SuperGLUE、TriviaQA、PiQa)上提交测试服务器,在这些数据集上我们能够进行提交,并且我们仅提交 200B 的 few-shot 结果,其他情况则报告开发集结果。
3 Results
。。。