2.1 模型与架构
我们使用了与GPT-2相同的模型和架构,包括其中描述的改进初始化、预归一化和可逆分词技术,但有所不同的是,我们在Transformer的各层中使用了交替的密集和局部带状稀疏注意力模式,类似于Sparse Transformer 。为了研究ML性能对模型大小的依赖性,我们训练了8种不同大小的模型,其参数数量从1.25亿到1750亿不等,跨越了三个数量级,其中最大的模型我们称之为GPT-3。之前的工作表明,在拥有足够训练数据的情况下,验证损失的缩放应作为大小的函数,大致遵循平滑的幂律;训练多种不同大小的模型使我们能够验证这一假设,既适用于验证损失,也适用于下游语言任务。
表2.1展示了我们的8个模型的大小和架构。在这里,
nparams表示可训练参数的总数,
nlayers表示层的总数,
dmodel表示每个瓶颈层中的单元数(我们总是让前馈层的大小是瓶颈层的四倍,即dff = 4 * dmodel)
dhead表示每个注意力头的维度。所有模型都使用了一个上下文窗口,其中包含nctx = 2048个标记。
我们沿着深度和宽度的维度将模型划分到多个GPU上,以最小化节点间的数据传输。每个模型的精确架构参数是基于计算效率和GPU上模型布局的负载均衡来选择的。之前的工作表明,在合理宽泛的范围内,验证损失对这些参数并不十分敏感。
2.2 训练数据集
语言模型的数据集迅速扩展,最终形成了包含近万亿个单词的Common Crawl数据集2。这个规模的数据集足以训练我们最大的模型,且无需重复更新同一序列。然而,我们发现,未经过滤或仅经过轻度过滤的Common Crawl版本的质量往往低于经过更精心策划的数据集。因此,我们采取了三个步骤来提高数据集的平均质量:
(1)我们下载并过滤了基于与一系列高质量参考语料库相似性的Common Crawl版本;
(2)我们在文档级别内和跨数据集执行了模糊去重操作,以防止冗余,并确保我们所保留的验证集的完整性,作为过拟合准确度的衡量标准;
(3)我们还向训练混合数据集中添加了已知的高质量参考语料库,以扩充Common Crawl并增加其多样性。
关于前两点(Common Crawl的处理)的详细信息见附录A。对于第三点,我们添加了几个经过精心策划的高质量数据集,包括WebText数据集的扩展版本[RWC+19](通过在更长的时间段内抓取链接收集,并在[KMH+20]中首次描述),两个基于互联网的书籍语料库(Books1和Books2)以及英文版的维基百科。
表2.2展示了我们在训练中使用的最终数据集混合情况。Common Crawl数据是从覆盖2016年至2019年的41个每月Common Crawl分片中下载的,在过滤前包含45TB的压缩纯文本,过滤后包含570GB,大致相当于4000亿个字节对编码标记。请注意,在训练过程中,数据集并不是按其大小比例进行采样的,而是我们视为质量更高的数据集采样更频繁,因此Common Crawl和Books2数据集在训练期间的采样次数少于一次,而其他数据集采样2-3次。这本质上是以接受少量过拟合为代价,换取更高质量的训练数据。
使用从互联网上广泛收集的数据对语言模型进行预训练的一个主要方法论问题是,特别是那些具有记忆大量内容能力的大型模型,可能存在下游任务被污染的风险,因为它们在预训练期间可能无意中看到了其测试或开发集。为了减少这种污染,我们搜索并尝试移除与本文研究的所有基准测试的开发集和测试集之间的任何重叠。不幸的是,由于过滤中的一个错误,我们忽略了一些重叠部分,而且由于训练成本高昂,重新训练模型并不可行。在第4节中,我们描述了剩余重叠部分的影响,在未来的工作中,我们将更积极地消除数据污染。
2.3 训练过程
正如在[KMH+20, MKAT18]中所发现的,较大的模型通常可以使用较大的批次大小,但需要较小的学习率。我们在训练过程中测量梯度噪声规模,并用它来指导批次大小的选择[MKAT18]。表2.1展示了我们使用的参数设置。为了在不耗尽内存的情况下训练更大的模型,我们在每个矩阵乘法内部和网络的层之间采用了混合模型并行性。所有模型都是在微软提供的高带宽集群的一部分上的V100 GPU上进行训练的。训练过程和超参数设置的详细信息见附录B。
2.4 评估
对于少样本学习,我们通过从该任务的训练集中随机抽取K个示例作为条件来评估评估集中的每个示例,条件之间由1或2个换行符分隔,具体取决于任务。对于LAMBADA和Storycloze,没有可用的监督训练集,因此我们从开发集中抽取条件示例,并在测试集上进行评估。对于Winograd(原始版本,非SuperGLUE版本),只有一个数据集,因此我们直接从其中抽取条件示例。
K可以是0到模型上下文窗口允许的最大值之间的任何值,对于所有模型来说,nctx = 2048,通常可以容纳10到100个示例。K的较大值通常但不是总是更好,因此当存在单独的开发集和测试集时,我们会在开发集上试验几个K值,然后在测试集上运行最佳值。对于某些任务(见附录G),除了(或对于K = 0,代替)演示示例外,我们还使用自然语言提示。
在涉及从多个选项中选择一个正确补全的任务(多项选择)中,我们提供K个上下文加正确补全的示例,后面跟着一个仅包含上下文的示例,并比较每个补全的LM似然性。对于大多数任务,我们比较每个标记的似然性(以长度进行归一化),然而,在少数数据集(ARC、OpenBookQA和RACE)上,我们通过计算P(补全|上下文)/P(补全|答案上下文)来以无条件概率对每个补全进行归一化,从而获得额外的收益,其中“答案上下文”是字符串“Answer: ”或“A: ”,用于提示补全应是一个答案,但其他方面是通用的。
对于涉及二元分类的任务,我们给选项更具语义意义的名称(例如“True”或“False”,而不是0或1),然后将任务视为多项选择;有时我们也像[RSR+19]所做的那样设定任务框架(详见附录G)。
对于具有自由形式补全的任务,我们使用与[RSR+19]相同的参数进行集束搜索:集束宽度为4,长度惩罚为α=0.6。我们根据数据集的标准使用F1相似度得分、BLEU或精确匹配来评估模型。
当测试集公开可用时,我们报告每个模型大小和学习设置(零样本、单样本和少样本)在测试集上的最终结果。当测试集是私有的时,我们的模型通常太大而无法在测试服务器上运行,因此我们报告在开发集上的结果。我们在少数数据集(SuperGLUE、TriviaQA、PiQa)上向测试服务器提交结果,这些是我们能够成功提交的结果,并且我们只提交200B少样本结果,对于其他所有内容,我们报告开发集的结果。
Ankie的评论:
自GPT-3问世以来,OpenAI对于其技术实现的细节采取了相当谨慎的态度,仅仅以大致的框架进行了介绍。随着时间的推移,OpenAI似乎变得更为封闭而非开放,这也正是马斯克对OpenAI提出批评的核心所在。
现在,我们普遍认识到,虽然许多模型都基于Transformer架构,但各家在应用上的方法却大相径庭。在这场竞赛中,OpenAI已经取得了显著的领先地位,其他公司只能奋力追赶。面对这种压力,一些公司甚至选择开源他们的技术,希望借助群众的力量共同对抗OpenAI。
或许在未来的某一天,OpenAI会公开这些技术实现的细节,但显然,现在还不是时候。