最近的工作证明了使用大量文本进行预训练,然后对特定任务进行微调(fine tuning),可以在许多NLP任务和基准方面的得到巨大的提升。虽然在预训练过程中通常与任务无关,但该方法仍然需要针对特定任务的微调数据集。这样的微调数据集包含成千上万个示例。相比之下,人类通常只要通过几个示例或简单的指令来执行新的语言任务-当前的NLP系统在很大程度上仍难以做到这一点。
在这里,我们证明了规模更大的语言模型可以极大地提高无关任务和小样本(few-shot)的性能,有时甚至优于最新的基于微调的SOTA方法。具体来说,我们训练了GPT-3(一种具有1750亿个参数的自回归语言模型,参数量是以前的任何非稀疏语言模型的10倍),并在小样本(few-shot)设置下的测试中评估了它的性能。
对于所有任务,应用GPT-3无需进行任何梯度更新或微调,仅需要与模型文本交互为其指定任务和展示少量演示即可使其完成任务。 GPT-3在许多NLP数据集上均具有出色的性能,包括翻译,问答和完形填空,以及一些需要即时推理或适应特定领域的任务,例如单词解密(unscrambling words),在句子中使用新单词或执行3位数的算术运算。
同时,我们还识别了一些GPT-3的小样本学习仍然困难重重的数据数据集,以及一些数据集,GPT-3面临大型Web语料库中训练的方法论问题。
最后,我们发现GPT-3可以生成新闻文章的样本,人类评估员很难将其与人类撰写的文章区分开。我们将讨论这一发现以及GPT-3对社会的广泛影响。
近年来,预训练语言表示模型成为了NLP系统中的新趋势,并以越来越灵活且与任务无关的方式迁移并应用于下游任务。 最早是,使用词向量[MCCD13,PSM14]学习单层表示并将其送到特定任务的架构中;之后,具有多层表示和上下文状态的RNN被用来构建更好的语言表示[DL15, MBXS17, PNZtY18] (尽管仍然局限于任务特定的架构)。近期的一些工作,对预训练的递归或transformer语言模型[VSP+17]直接微调,从而完全不需要任务特定的架构。
如上所述的最后一类工作已在许多具有挑战性的NLP任务(例如阅读理解,问答,文本蕴含等)上取得了实质性进展,并且在新架构和算法的基础上继续发展[RSR+19,LOG+19,YDY+19,LCG+19]。 但是,此方法的主要局限性在于,尽管架构与任务无关,但仍需要特定任务的数据集并针对特定任务进行微调:要在目标任务上得到很好的性能,通常需要在一个有着成千上万个样本的特定数据集上微调。如此种种原因,我们希望消除此限制。
首先,从现实的角度出发,每项新任务都需要大量带标签的数据集,这限制了语言模型的适用场景。 许多有用的语言任务,包括纠正语法,生成抽象概念的示例到撰写短篇小说,很难收集大量的有监督的训练数据,尤其是当我们遇到每个新任务时,必须再重新收集数据。
其次,随着模型的表达能力和训练分布范围的缩小,模型利用训练数据中的虚假相关性的能力大大增长。 这会给预训练加微调模式的模型带来问题,在这种情况下,模型被设计得很大,可以在预训练期间吸收信息,但随后在非常狭窄的任务分布上进行微调。 例如,[HLW+20]观察到,较大的模型并不一定能概括出更好的分布外分布。 有证据表明,在该模式下实现的泛化效果可能很差,因为该模型过于针对训练分布,并且无法很好地泛化[YdC+19,MPL19]。 因此,微调模型在特定基准中的性能会夸大底层任务的实际性能,尽管名义上达到了人类的水平[GSL+18,NK19]。
第三,人类不需要大量的有监督数据即可学习大多数语言任务-简短的自然语言指令(例如“请告诉我这句话是描述快乐还是悲伤”)或屈指可数的几个例子(例如“这里有两个举止勇敢的人的例子;请举第三个举止勇敢的例子”)通常足以使一个人在能力范围内执行一项新任务。 除了指出我们当前的NLP技术的概念局限性之外,这种适应性还具有实际优势–它使得人类可以无缝地把不同任务和技能混合在一起或者在许多任务和技能之间切换,例如在长对话中完成加法。 为了使模型应用广泛,我们希望有一天我们的NLP系统也具有相同的灵活性和通用性。
图1.1:语言模型元学习。 在无人监督的预训练期间,语言模型会学到广泛的技能和模式识别能力。 然后,它在推断时使用这些能力来快速适应或识别所需的任务。 我们使用术语“语境学习”来描述此过程的内部循环,该循环发生在每个序列的前向传递内。 该图中的序列并非旨在表示模型在预训练期间将看到的数据,而是为了表示有时在单个序列中嵌入了重复的子任务。
解决这些问题的一种可能的途径是元学习-对语言模型来说,这意味着该模型在训练时会学到广泛的技能和模式识别能力,然后在推理时使用这些能力快速适应或识别所需的任务(如图1.1所示)。 最近的工作[RWC+19]试图通过我们所谓的“语境学习”(in-context learning)来完成此任务,将文本输入预训练语言模型用于说明任务:该模型仅得到自然语言指令或任务的一些演示,就可以完成该任务。
尽管它给了我们一丝希望,但这种方法取得的效果仍然远不及微调-例如[RWC+19]在自然问题上仅达到4%,甚至其55 F1 CoQa结果现在也比SOTA落后35个点以上。 元学习显然需要实质性的改进,以便能够作为解决语言任务的实用方法。
图1.2语言建模的另一种最新趋势可能提供了前进的方向。 近年来,Transformer语言模型的容量已从1亿个参数[RNSS18]增至3亿个参数[DCLT18],又增至15亿个参数[RWC+19],双增至80亿个参数[SPP+19],叒增加到11十亿个参数[RSR + 19],最后叕是170亿个参数[Tur20]。 每次增加都带来了文本生成或下游NLP任务的改进(也可能都有改进),并且有证据表明,与许多下游任务密切相关的对数损失(log loss)会随规模[KMH + 20]增加逐步改善。 由于语境学习(in-context learning)将许多技能和任务学习并吸收入模型的参数内,因此语境学习(in-context learning)能力可能会随着规模的增长而表现出类似的强劲增长。
在本文中,我们通过训练1750亿个参数自回归语言模型(称为GPT-3)并评估其在上下文中的学习能力来检验该假设。 具体来说,我们用超过十二个NLP数据集评估了GPT-3,以及旨在测试模型快速适应不太可能直接包含在训练集中的任务的几个新任务。 对于每项任务,我们在3种情况下评估GPT-3:(a) “小样本学习”(few-shot learning)或语境学习(in-context learning),其中我们允许尽可能多的示例放入模型的上下文窗口(通常为10到100),(b) “单样本学习”(one-shot learning),在这种情况下,我们仅允许展示一个示例,(c)“零样本学习”(zero-shot learning),其中不允许进行示例的展示,并且仅向模型提供自然语言的任务指示。 GPT-3原则上也可以在传统的微调环境中进行评估,但我们将其留作以后的工作。
图1.2说明了我们研究的条件,并显示了对简单任务的小样本学习,该简单任务要求模型从单词中删除多余的符号。通过添加自然语言任务描述以及模型上下文中的示例数量,K的模型性能得以提高。与模型大小。尽管在这种情况下的结果特别引人注目,但对于我们研究的大多数任务,模型大小和上下文中示例数量的总体趋势仍然存在。我们强调,这些“学习”曲线不涉及梯度更新或微调,而只是增加了作为条件的示例次数。
广义上讲,在NLP任务上,GPT-3在零样本和单样本设置中取得了可喜的结果,且在小样本设置中,有时甚至可以与基于微调的SOTA模型一较高下(甚至超越)。例如,GPT-3在零样本设置下在CoQA上达到81.5 F1,在单样本设置下在CoQA上达到84.0 F1,在单样本设置下达到85.0 F1。同样,GPT-3在零样本设置下的TriviaQA上达到64.3%的准确度,在单样本设置下达到68.0%,在单样本设置下达到71.2%,最后一个是基于微调的SOTA模型在相同的设置下运行的结果。
GPT-3在测试快速适应性或即时推理的任务上也能显示出优秀的单样本和小样本学习的能力,其中包括解密单词,算术运算以及在仅定义一次单词后在句子中使用全新单词。我们还表明,在小样本学习的情况下,GPT-3有能力生成新闻文章,人类评估员很难将其与人类编写的文章区分开。
同时,即使在GPT-3的规模上,我们也发现了一些性能难以达到的任务。这包括自然语言推理任务,例如ANLI数据集,以及一些阅读理解数据集,例如RACE或QuAC。通过展示GPT-3方方面面的优缺点,包括其局限性,我们希望能推动对语言模型的小样本学习的研究,并希望这些最需要进步的地方得到关注。
图1.3可以从图1.3中看出有启发性的整体结果,它汇总了各种任务(尽管不应将其看作严格或有意义的基准)。
我们还对“数据污染”进行了系统的研究,这是在诸如Common Crawl之类的数据集上训练高容量模型时出现的一个日益严重的问题,该数据可能正包含着测试数据集中的内容,因为此类内容经常存在于网络中。在本文中,我们开发了工具来测量数据污染并量化其影响。尽管我们发现数据污染对GPT-3的性能在大部分数据集中的影响不大,但我们确实确定了一些可能夸大结果的数据集。我们要么不展示这些数据集的结果,要么用星号标记它们,这取决于污染的严重程度。
除了上述之外,我们还训练了一系列较小的模型(参数范围从1.25亿到130亿),以便将其在零样本,单样本和小样本设置下的性能与GPT-3进行比较。概括地说,对于大多数任务,我们发现在所有三个设置中,模型性能相对平滑的随着模型容量增加。但一个值得注意的特征是,零样本、单样本和小样本性能之间的差距通常随模型容量增大而增大,这可能表明较大的模型是更优秀的元学习者。
最后,考虑到本文所展示GPT-3数不胜数的功能,我们讨论了有关偏见,公平和更广泛的社会影响的担忧,并尝试就此方面对GPT-3进行初步分析。
本文的其余部分安排如下。在第2节中,我们描述了GPT-3的训练方法和评估方法。第3节介绍了零样本、单样本和小样本设置下所有任务的结果。第4节解决了数据污染(训练测试重叠)的问题。第5节讨论了GPT-3的局限性。第6节讨论了更广泛的影响。第7节回顾了相关工作,第8节总结。
我们的基本预训练方法,包括模型,数据和训练,与[RWC+19]中描述的过程相似,模型大小,数据集大小和多样性以及训练时间的扩展相对简单。 我们在语境学习中的使用也类似于[RWC+19],但是在这项工作中,我们系统地探索了在语境中进行学习的不同设置。 因此,我们从明确定义和对比将要评估GPT-3或原则上可以评估GPT-3的不同设置开始本节。 这些设置可以看作是他们倾向于依赖多少特定于任务的数据的范围。 具体来说,我们可以识别出该范围上的至少四个点(请参见图2.1):
图2.1以英语翻译为法语为例展示了四种学习方法。 在本文中,我们将重点放在零样本、单样本和小样本学习上,其目的不是将它们作为竞争替代品进行比较,而是作为不同的问题设置进行比较,这些问题提供了特定基准性能与采样效率之间的不同权衡。 我们特别强调一下小样本学习的结果,其中许多仅略微落后于最新的微调模型。 然而,最终,单样本学习甚至有时是零样本学习可能是和人类能力最公平的比较,并且是未来工作的重要目标。
我们使用与GPT-2 [RWC+19]相同的模型和架构,包括修改的初始化(modified initialization),预规范化(pre-normalization)和可逆记号化(reversible tokenization),不同之处在于,我们在transformer各层中使用了交替稠密(alternating dense)且局部带状稀疏注意力(locally banded sparse attention)模式,类似于Spare Transformer[CGRS19]。为了研究ML性能对模型大小的依赖性,我们训练了8种不同大小的模型,范围从1.25亿个参数到1,750亿个参数,超过三个数量级,最后一个模型称为GPT-3。先前的工作[KMH + 20]建议,在有足够的训练数据的情况下,验证损失的缩放比例应近似随着模型大小幂次增长;许多不同规模的训练模型使我们能够针对验证损失和下游语言任务测试该假设。
表2.1表2.1展示了我们的8个模型的大小和架构。这里nparams是可训练参数的总数,nlayers是层的总数,dmodel是每个瓶颈层(bottleneck layer)的大小(我们总是将前馈层(feedforward layer)设为瓶颈层大小的四倍,dff = 4 * dmodel) ,dhead是每个attention head的维度。所有模型都使用nctx = 2048个token的上下文窗口。我们沿着深度和宽度维度跨GPU划分模型,以最大程度地减少节点之间的数据传输。根据计算效率和跨GPU模型布局的负载平衡来选择每个模型的精确架构参数。先前的工作[KMH + 20]表明验证损失对这些参数在合理范围内不是很敏感。
语言模型的数据集飞速扩展,最终达到了构成近一万亿个单词的Common Crawl数据集[RSR + 19]。 如此大的数据集足以训练我们最大的模型,而无需在同一序列上进行两次更新。 但是,我们发现,与经过精心挑选的数据集相比,未经过滤或经过轻微过滤的Common Crawl版本的质量往往较低。 因此,我们采取了3个步骤来提高数据集的质量:(1) 我们根据与一系列高质量参考语料库的相似性下载并过滤了CommonCrawl,(2) 我们在文档级执行了重复数据删除(数据集内和跨数据集)以防止冗余,并保留验证集的完整性,作为过拟合的准确度量(3) 我们还向训练集中添加了已知的高质量参考语料库,以增强CommonCrawl并增加其多样性。
关于前两点(Common Crawl的处理)的细节在附录A中描述。对于第三点,我们添加了几个经过筛选的高质量数据集,包括一个扩展版的WebText数据集[RWC+19],一个通过在较长的时间段内爬取链接收集的WebText数据集(其在[KMH+20]中首次描述),两个基于互联网的图书语料集(Books1和Books2)和英语维基百科。
图2.2 表2.2表2.2显示了我们在训练中使用的最终混合数据集。CommonCrawl的数据每月下载自CommonCrawl的41个片段,覆盖了2016年到2019年,构成了过滤前45TB的压缩文本数据,过滤后570GB,大致相当于4000亿个byte-pair-encoded token。需要注意的是,在训练过程中,数据集并不是按大小等比例采样,而是我们认为质量较高的数据集会被更频繁地采样,比如CommonCrawl和Books2数据集在训练过程中被采样的次数不超过一次,但其他数据集被采样2-3次。这本质上是接受少量的过拟合,以换取更高质量的训练数据。
对于在大量互联网数据上预训练的语言模型,特别是具有着记忆大量内容能力的大型模型,一个主要的问题是在预训练过程中,可能无意看到了它们的测试集或开发集的内容,这可能会对下游任务造成污染。为了减少这种污染,我们搜索并试图删除与本文所用的开发集和测试集的任何重叠。不幸的是,过滤中的一个bug导致我们忽略了一些重叠,由于训练成本的原因,我们无法对模型进行重新训练。在第4节中,我们对剩余重叠的影响进行了表征,在今后的工作中,我们将更加积极地去除数据污染。
如[KMH + 20,MKAT18]中所发现的,较大的模型通常可以使用较大的batch size,但需要的学习率较小。 我们在训练期间测量梯度噪声标度,并用它来指导我们对batch size的选择[MKAT18]。 表2.1显示了我们使用的参数设置。 为了在不耗尽内存的情况下训练较大的模型,我们在每个矩阵乘法中使用模型并行性,并在网络各层使用模型并行性。 所有模型都在Microsoft提供的高带宽群集中的V100 GPU上进行了培训。 训练过程和超参数设置的详细信息在附录B中进行了描述。
对于小样本学习,我们通过从任务训练集中随机抽取K个示例作为条件来评估评估集中的每个示例,根据任务以1或2个换行符分隔。对于LAMBADA和Storycloze,没有可用的监督训练集,因此我们从开发集中提取条件示例,并在测试集上进行评估。对于Winograd(原始版本,不是SuperGLUE版本),只有一个数据集,因此我们直接从中获取条件示例。
K可以是0到模型上下文窗口允许的最大值之间的任何值,所有模型的nctx = 2048,通常适合10到100个示例。通常,较大的K值通常但并非总是更好,因此,当有单独的开发和测试集可用时,我们在开发集上尝试几个K值,然后在测试集上运行最佳值。对于某些任务(请参阅附录G),除了演示(或对于K = 0,而不是演示),我们还使用自然语言提示。
对于涉及从多个选项中选择一个正确完成(多项选择)的任务,我们提供了K个上下文加上正确完成的示例,后面仅提供了一个上下文示例,并比较每个完成的LM可能性。对于大多数任务,我们会比较每个令牌的可能性(以对长度进行归一化),但是在少数数据集(ARC,OpenBookQA和RACE)上,我们可以从开发集上获得额外的收益,通过对每个完成的无条件概率进行归一化,通过计算
在涉及二分类的任务上,我们为选项提供更多语义上有意义的名称(例如“ True”或” False”而不是0或1),然后将任务视为多项选择;我们有时也会将任务的框架设计为类似于[RSR + 19](请参见附录G)的操作,以了解详细信息。
对于具有自由形式完成的任务,我们使用与[RSR + 19]相同的参数进行波束搜索:波束宽度为4,长度损失为α= 0.6。我们使用F1相似性评分,BLEU或完全匹配对模型评分,具体取决于现有数据集的标准是什么。
对于每种模型大小和学习设置(零样本,单样本和小样本),最终结果将在公开发布的测试集上报告。当测试集是私有的时候,我们的模型通常太大而无法上传到测试服务器上,因此我们只能在开发集上报告结果。不过我们确实向少数几个能提交的数据集(SuperGLUE,TriviaQA,PiQa)提交了我们的工作,并且仅提交了200B的少量结果,并报告了开发集上的结果。
在图3.1中,我们显示了第2节中描述的8个模型的训练曲线。对于此图,我们还包括6个额外的超小模型,其参数少至100,000。正如在[KMH + 20]中观察到的那样,在有效利用训练计算时,语言模型的性能遵循幂律。将这一趋势再扩大两个数量级后,我们发现与幂律的偏离很小(如果有的话)。有人可能会担心,交叉熵损失的这些改善仅来自对我们训练语料的虚假细节建模。但是,我们将在以下各节中看到,交叉熵损失的改善可在各种自然语言任务中实现一致的性能提升。
下面,我们在广泛的数据集上评估了第2节中描述的8个模型(1750亿个参数参数GPT-3和7个较小的模型)。我们将数据集分为9类,分别代表大致相似的任务。
在第3.1节中,我们评估了传统语言建模任
务和与语言建模相似的任务,例如Cloze任务和句子/段落完成任务。在第3.2节中,我们评估了“已关闭的书”中的问题解答任务:需要使用模型参数中存储的信息来回答常识性问题的任务。在第3.3节中,我们评估模型在语言之间进行翻译的能力(尤其是单样本和小样本)。在第3.4节中,我们评估模型在类似Winograd Schema的任务上的性能。在第3.5节中,我们对涉及常识推理或问答的数据集进行评估。在3.6节中,我们评估了阅读理解任务,在3.7节中,我们评估了SuperGLUE基准,在3.8节中,我们简要地探讨了NLI。最后,在第3.9节中,我们创造了一些其他任务,这些任务是专门为探究上下文学习能力而设计的-这些任务着重于即时推理,适应能力或开放性文本合成。我们以小样本,单样本和零样本设置评估所有任务。
如2.2节所述,我们采用了两种方法来提高Common Crawl数据集的质量:(1)过滤Common Crawl(2)模糊重复数据删除:
在过滤了重复项和低质量内容之后,我们还部分删除了基准测试数据集中出现的文本,如附录C所述。