GPT(Generative Pre-trained Transformer)是一系列基于Transformer架构的预训练语言模型,由OpenAI开发。以下是GPT系列的主要模型:
GPT:GPT-1是于2018年发布的第一个版本,它使用了12个Transformer编码器层和1.5亿个参数。GPT-1的训练数据包括了互联网上的大量文本。
GPT-2:GPT-2于2019年发布,是GPT系列的第二个版本。它比GPT-1更大更强大,使用了24个Transformer编码器层和1.5亿到15亿个参数之间的不同配置。GPT-2在生成文本方面表现出色,但由于担心滥用风险,OpenAI最初选择限制了其训练模型的发布。
GPT-3:GPT-3于2020年发布,是GPT系列的第三个版本,也是目前最先进和最强大的版本。它采用了1750亿个参数,拥有1750亿个可调节的权重。GPT-3在自然语言处理(NLP)任务中表现出色,可以生成连贯的文本、回答问题、进行对话等。
GPT-3.5:GPT-3.5是在GPT-3基础上进行微调和改进的一个变种,它是对GPT-3的进一步优化和性能改进。
GPT系列的模型在自然语言处理领域取得了巨大的成功,并在多个任务上展示出了强大的生成和理解能力。它们被广泛用于文本生成、对话系统、机器翻译、摘要生成等各种应用中,对自然语言处理和人工智能领域的发展有着重要的影响。
GPT系列是当前自然语言处理领域下最流行,也是商业化效果最好的自然语言大模型,并且他的论文也对NLP的领域产生巨大影响,GPT首次将预训练-微调模型真正带入NLP领域,同时提出了多种具有前瞻性的训练方法,被后来的BERT等有重大影响的NLP论文所借鉴。
在GPT-2论文中,谷歌团队致力于将GPT应用于Zero-shot领域,当然取得了不错的结果,但是这种结果离真正能在市场上应用还差得远,所以在GPT-3这篇论文中,谷歌团队又将目光转回Few-shot领域中来,论文标题“Language Models are Few-Shot Learners”也写明了GPT-3不再追求极致的零样本,即在一个子任务上完全不给语言模型任何样例,转而将样本数量控制在较小范围。
近年来,NLP系统中出现了一种趋势,即以越来越灵活和任务无关的方式在下游传输中使用预先训练好的语言表示。首先,使用词向量学习单层表示,并将其反馈给任务特定的体系结构,然后使用具有多层表示和上下文状态的RNN形成更强的表示(尽管仍适用于任务特定的体系结构),最近,经过预训练的递归或Transformer语言模型已经过直接微调,完全消除了对任务特定架构的需求。
这最后一种范式在许多具有挑战性的NLP任务上取得了实质性进展,如阅读理解、问答、文本蕴涵和其他许多任务,并在新的架构和算法基础上不断进步。然而,这种方法的一个主要限制是,虽然体系结构与任务无关,但仍然需要特定于任务的数据集和特定于任务的微调:要在所需任务上实现强大的性能,通常需要对特定于该任务的数千到几十万个示例的数据集进行微调。出于几个原因,消除这一限制是可取的。
首先,从实践的角度来看,每项新任务都需要一个大型的标记示例数据集,这限制了语言模型的适用性。存在着非常广泛的可能有用的语言任务,包括从纠正语法到生成抽象概念的示例,再到评论短篇小说的任何内容。对于许多此类任务,很难收集大型有监督的训练数据集,尤其是在每个新任务都必须重复该过程的情况下。
其次,随着模型的表达能力和训练分布的狭窄,利用训练数据中虚假相关性的潜力从根本上增加。这可能会给预训练+微调范式带来问题,在这种范式中,模型设计得很大,以便在预训练期间吸收信息,但随后会在非常狭窄的任务分布上进行微调。有证据表明,在这种范式下实现的泛化可能很差,因为该模型对训练分布过于具体,并且在其之外没有很好的泛化。因此,微调模型在特定基准上的性能,即使名义上处于人的水平,也可能夸大基本任务的实际性能。
第三,人类学习大多数语言任务不需要大型有监督的数据集——自然语言中的简短指令(例如,“请告诉我这句话描述的是快乐还是悲伤”)或至多少量的演示(例如,“这里有两个勇敢的人的例子;请给出第三个勇敢的例子”)通常足以让人类执行新任务至少达到合理的能力水平。除了指出我们当前NLP技术的概念局限性外,这种适应性还具有实际优势——它允许人类无缝地混合在一起或在许多任务和技能之间切换,例如在长时间的对话中执行加法。为了广泛使用,希望有一天我们的NLP系统具有相同的流动性和通用性。
近年来,transformer语言模型的容量大幅增加,从1亿个参数,增加到3亿个参数,增加到15亿个参数,增加到80亿个参数,110亿个参数,最后增加到170亿个参数。每一次增加都带来了文本合成和/或下游NLP任务的改善,有证据表明,log损失与许多下游任务密切相关,随着规模的增加,呈现平稳的改善趋势。由于情境上下文学习涉及在模型参数范围内吸收许多技能和任务,因此,情境学习能力可能会随着规模的扩大而表现出类似的强劲增长。
在本文中,论文通过训练一个1750亿参数的自回归语言模型(Transformer Decoder)(称之为GPT-3)并测量其上下文学习能力来检验这一假设。具体而言,论文评估了二十多个NLP数据集上的GPT-3,以及一些旨在测试对训练集中不可能直接包含的任务的快速适应的新任务。对于每项任务,论文在3种条件下评估GPT-3:
(a)“few-shot learning”,或在上下文学习中,允许尽可能多的演示,以适应模型的上下文窗口(通常为10到100)
(b)“one-shot learning”,只允许一次演示,
(c)“zero-shot learning”,不允许演示,仅向模型提供自然语言说明。
GPT-3原则上也可以在传统的微调设置中进行评估,但论文将此留给未来的工作。
上图说明了论文研究的条件,并显示了需要模型从单词中删除无关符号的简单任务的few-shot学习。通过添加自然语言任务描述和模型上下文中的示例数量,模型性能得到了提高。few-shot学习也随着模型大小的增加而显著提高。虽然这种情况下的结果特别引人注目,但在论文研究的大多数任务中,模型大小和上下文中的示例数量的总体趋势都适用。论文强调,这些“学习”曲线不涉及梯度更新或微调,只是增加了作为条件作用的演示次数。
论文的基本预训练方法,包括模型、数据和训练,与GPT-2中描述的过程类似,相对简单地扩大了模型大小、数据集大小和多样性以及训练长度。我们对情境学习的使用也与 GPT-2类似,但在这项工作中,我们系统地探索了情境中学习的不同设置。因此,我们首先明确定义和对比我们将评估 GPT-3 或原则上评估 GPT-3 的不同设置。这些设置可以被视为取决于它们倾向于依赖多少特定于任务的数据。
图中我们可以看出在微调时GPT-3不需要进行梯度的更新,这也是GPT-3的卖点之一
论文使用与 GPT-2相同的模型和架构,包括其中描述的修改后的初始化、预归一化和可逆标记化,不同之处在于我们在Transformer,类似于Sparse Transformer。为了研究 ML 性能对模型大小的依赖性,我们训练了 8 种不同大小的模型,范围从 1.25 亿个参数到 1750 亿个参数三个数量级,最后一个是我们称为 GPT-3 的模型。之前的工作表明,如果有足够的训练数据,损失函数的缩放应该近似为大小函数的平滑幂律;许多不同大小的训练模型使我们能够测试这个假设的验证损失和下游语言任务。上图显示了论文 8 个模型的尺寸和架构。这里 n p a r a m s n_{params} nparams 是可训练参数的总数, n l a y e r s n_{layers} nlayers 是总层数, d m o d e l d_{model} dmodel 是每个瓶颈层中的单元数(我们的前馈层始终是瓶颈层大小的四倍, d f f = 4 ∗ d m o d e l d_{ff} = 4 * d_{model} dff=4∗dmodel) , d h e a d d_{head} dhead 是每个注意力头的维度。所有模型都使用 n c t x = 2048 n_{ctx} = 2048 nctx=2048 个token的上下文窗口。我们沿着深度和宽度维度跨 GPU 划分模型,以最大程度地减少节点之间的数据传输。每个模型的精确架构参数是根据计算效率和跨 GPU 模型布局的负载平衡来选择的。之前的工作 表明验证损失在相当宽的范围内对这些参数并不强烈敏感。
原论文就写了这么少的内容,并没有说清楚具体的模型细节
语言模型的数据集迅速扩展,最终形成了包含近万亿个单词的 Common Crawl 数据集。这种大小的数据集足以训练我们最大的模型,而无需对同一序列进行两次更新。然而,我们发现未经过滤或轻度过滤的 Common Crawl 版本往往比经过精心策划的数据集质量较低。因此,我们采取了 3 个步骤来提高数据集的平均质量:
(1)我们根据与一系列高质量参考语料库的相似性下载并过滤 CommonCrawl 的版本,(2)我们在文档级别执行模糊重复数据删除,在数据集内部和数据集之间,以防止冗余并保持我们保留的验证集的完整性,作为过度拟合的准确度量,
(3)我们还在训练组合中添加了已知的高质量参考语料库,以增强 CommonCrawl 并提高其多样性。
最终的数据集如下:
我们可以看出,虽然Common Crawl数据集的大小是其他数据集之和的数倍,但是每个Batch只采样百分之60,这种做法既能保证数据集足够大来训练这个175B的大模型,又能保证高质量数据在总数据集比重较大,保证模型的准确性。
较大的模型通常可以使用较大的批量大小,但需要较小的学习率。我们在训练期间测量梯度噪声尺度,并用它来指导我们选择批量大小。为了在不耗尽内存的情况下训练更大的模型,我们在每个矩阵乘法中混合使用模型并行性,并在网络各层之间使用模型并行性。所有模型均在 Microsoft 提供的高带宽集群的 V100 GPU 上进行训练。
对于少样本学习,我们通过从该任务的训练集中随机抽取 K 个示例作为条件来评估评估集中的每个示例,根据任务以 1 或 2 个换行符分隔。对于 LAMBADA 和 Storycloze,没有可用的监督训练集,因此我们从验证集中抽取条件示例并在测试集上进行评估。对于 Winograd(原始版本,不是 SuperGLUE 版本),只有一个数据集,因此我们直接从中绘制条件示例。
K 可以是从 0 到模型上下文窗口允许的最大数量的任何值,对于所有模型来说, n c t x n_{ctx} nctx = 2048,通常适合 10 到 100 个示例。 K 值越大越好,但并不总是越好,因此当有单独的验证集和测试集可用时,我们会在验证集上尝试几个 K 值,然后在测试集上运行最佳值。对于某些任务,除了(或对于 K = 0,而不是)演示之外,我们还使用自然语言提示。
对于涉及从多个选项(多项选择)中选择一个正确完成的任务,论文提供了 K 个上下文示例加上正确完成,然后仅提供一个上下文示例,并比较每个完成的 LM 可能性。对于大多数任务,我们比较每个标记的可能性(对长度进行标准化),但是,在少数数据集(ARC、OpenBookQA 和 RACE)上,我们通过对每个标记的无条件概率进行标准化,在开发集上衡量,获得了额外的好处完成,通过计算 P ( c o m p l e t i o n ∣ c o n t e x t ) P ( c o m p l e t i o n ∣ a n s w e r c o n t e x t ) \frac{P (completion|context)}{ P (completion|answer context) } P(completion∣answercontext)P(completion∣context),其中答案上下文是字符串“Answer:”或“A:”,用于提示完成应该是答案,但在其他方面是通用的。
在涉及二元分类的任务中,我们为选项赋予更具语义意义的名称(例如“True”或“False”而不是 0 或 1),然后将任务视为多项选择。
论文提出了一个 1750 亿个参数的语言模型,该模型在零样本、单样本和少样本设置中的许多 NLP 任务和基准测试中显示出强大的性能,在某些情况下几乎与 4 个最先进的性能相匹配微调系统,以及在动态定义的任务中生成高质量的样本和强大的定性性能。我们在不使用微调的情况下记录了大致可预测的性能扩展趋势。论文还讨论了此类模型的社会影响。尽管存在许多限制和弱点,但这些结果表明,非常大的语言模型可能是开发适应性强的通用语言系统的重要组成部分。
谷歌团队似乎不愿透露GPT系列模型的细节内容,GPT系列论文花了大量的时间来展示GPT模型在不同任务上的实验结果,在模型方法和训练方法上一带而过,是一篇带有“炫技性”的论文,并不是一篇适合读者去学习自然语言大模型的论文。