高效训练语言模型以填补中间部分
https://arxiv.org/abs/2207.14255
Mohammad Bavarian ∗{}^{ * }∗ Heewoo Jun* Nikolas Tezak
John Schulman Christine McLeavey Jerry Tworek Mark Chen
OpenAI
摘要
我们展示了自回归语言模型在对数据集应用一种简单的变换之后,可以学习在文本中填补内容,这种变换只是将文档中间的一段文本移动到文档末尾。尽管这种数据增强在近年来引起了很多关注,但我们提供了大量证据表明,以这种方式转换的大量数据训练模型并不会损害原始的从左到右的生成能力,这一点通过在各种规模下的困惑度和采样评估得以衡量。考虑到填补中间部分(FIM)训练模型的有用性、简单性和高效性,我们建议未来的自回归语言模型默认采用FIM进行训练。为此,我们对关键超参数进行了系列消融实验,例如数据变换频率、变换结构和选择填补跨度的方法。我们利用这些消融实验来规定强大的默认设置和最佳实践,以训练FIM模型。我们已经在我们的API中发布了经过最佳实践训练的最佳填补模型,并发布了我们的填补基准,以帮助未来的研究。
目录
1 引言 3
1.1 我们的贡献 4
2 评估 5
2.1 自回归评估 5
2.2 填补评估 6
3 FIM训练和推理 6
3.1 SPM模式 7
3.2 上下文级FIM 7
4 预训练结果 8
4.1 在下游基准中评估从左到右的能力 9
4.2 FIM率 9
4.3 SPM与PSM与联合SPM+PSM训练 10
4.4 上下文级与文档级FIM 12
4.5 中间跨度选择 12
5 微调结果 13
6 讨论 14
7 相关工作 16
8 结论 17
8.1 推荐的FIM超参数 17
8.2 未来方向 17
A 架构和数据集 23
B FIM率消融的规模趋势 23
C FIM实现的细节 24
D SPM编码的细节 25
E 随机跨度填补基准 25
F 微调的动态和学习曲线 26
G 顶级模型比较 27H 定性评估 28
H. 1 成功的填充实例 28
H. 2 限制 28
H. 3 缓解措施 29
图1:可以免费学习FIM。我们在自然语言和代码两个领域上以 50%{50}\%50% 和 0%0\%0% 的FIM比率对语言模型进行预训练,并评估所有最终快照的测试损失。所有模型均在 100 B{100}\mathrm{\;B}100B 的训练数据上进行训练。我们观察到联合FIM训练不会产生额外成本,因为尽管FIM模型只在 50%{50}\%50% 的时间里看到原始数据,但原始自左到右的损失趋势仍然保持不变,并且模型正在学习一种新能力。请参见图3,获取有关FIM免费特性的更多证据。
1 引言
自Transformer [Vaswani et al., 2017] 引入以来,基于各种互联网规模数据集训练的大型语言模型(LLMs)已取得显著成功。这些模型能够在给定自然语言提示的情况下生成连贯且合理的补全,并在许多基准测试中实现了最新的性能,包括阅读理解、问答、逻辑推理和常识推理。
基于Transformer的语言模型有几种广泛的类别:仅编码器模型如BERT [Devlin et al., 2019] 通常使用掩蔽语言模型目标进行训练,而编码器-解码器模型如T5 [Raffel et al., 2019] 通常使用跨度预测目标进行训练 [Song et al., 2019]。最后,基于因果解码器的语言模型,如GPT模型系列 [Radford et al., 2018, 2019, Brown et al., 2020],是使用自左到右下一个标记预测目标进行训练的。如今最大的和最强大的生成语言模型,如GPT-3、Codex、LaMDA、GLaM、PaLM、Gopher、Jurassic-1 和 Chinchilla [Brown et al., 2020, Chen et al., 2021, Thoppilan et al., 2022, Du et al., 2021, Chowdhery et al., 2022, Rae et al., 2021, Lieber et al., 2021, Hoffmann et al., 2022],属于后者的模型类别。基于因果解码器的模型在最大规模上的压倒性受欢迎程度归因于它们在开放式文本生成、上下文学习(使用小样本启动)、预训练计算效率 [Wang et al., 2022]方面的优势,以及在成功扩展工作中的历史先例 [Brown et al., 2020]。这些模型的体系结构也更简单,通常在没有特定任务微调的情况下更有效,使其在推理和部署方面更具吸引力。
所有模型类在填充任务上都有所限制,该任务要求模型在提示的特定位置生成文本,同时对前缀和后缀进行条件设定。自左到右模型只能对前缀进行条件设定。虽然仅编码器和编码器-解码器模型能够对后缀进行条件设定,但在训练时看到的填充区域长度通常远短于实际使用中有效的长度。这是遗憾的,因为在生成点前后都有上下文的应用自然会产生填充的需求。例如,在创建编码助手时,填充可以用于文档字符串生成、导入语句生成或补全部分编写的函数。
我们在这项工作中的目标是通过向当前主导的大规模语言建模范式 [Brown et al., 2020, Hoffmann et al., 2022, Chowdhery et al., 2022] 添加“中间填充”(FIM)能力来解决这一限制。我们表明,通过对训练数据进行简单的修改,而不改变模型架构,基于因果解码器的自回归(AR)语言模型可以学习填充中间文本,而不会影响其正常的自左到右生成能力。
图2:使用FIM测试损失评估相同模型在图1中的填充能力。使用FIM进行训练的模型(黄色)获得的FIM测试损失低于基线(紫色)AR模型。这表明FIM模型确实正在学习在预测中间部分时对后缀进行条件设定,使其在FIM测试集上实现更低的测试损失。图1和图2共同表明,FIM模型可以被视为严格优于AR模型,因为它们在实现相同的自左到右自回归损失的同时,实现了更低的FIM损失。
我们方法的关键在于第3节所述的对我们数据集中一部分的变换,其中我们随机将文档分成三部分,并将中间部分移动到末尾: document→(前缀, 中间, 后缀)→(前缀, 后缀, 中间) \text{document} \rightarrow \text{(前缀, 中间, 后缀)} \rightarrow \text{(前缀, 后缀, 中间)} document→(前缀, 中间, 后缀)→(前缀, 后缀, 中间) 然后,我们使用哨兵标记将这三部分连接在一起。这与[Donahue et al., 2020, Aghajanyan et al., 2022, Fried et al., 2022]中使用的过程类似。
与之前的研究相比,我们的工作强调了训练FIM模型的计算效率。考虑到对训练非常大语言模型的兴趣增加,这一强调是重要的,因为训练这些模型的成本非常高,并且具有相当大的能量占用。通常,在向语言模型中添加新目标或能力时,我们认为最关键的问题是对现有能力的影响和计算效率之间的权衡。
与大多数情况下我们共同训练多个目标和数据集的情况不同,我们展示了在FIM变换数据和普通自左到右数据的混合上共同训练的模型实现相同的自左到右能力,同时学习如何进行中间填充。我们称之为FIM免费特性。
在接下来的内容中,我们使用FIM模型这一术语来指代任何在FIM变换及普通自左到右数据的混合上训练的模型。我们称那些在没有任何FIM数据的情况下训练的模型(即 0%0\%0% FIM比率)为AR模型。
1.1 我们的贡献
我们在本文中的主要贡献如下:
-
FIM免费特性:我们通过训练一组包含和不包含FIM的8个模型进行广泛的扩展研究,显示FIM可以在不妨碍预训练自左到右能力的情况下学习。我们使用困惑度和基于采样的基准来检验这一声明,涵盖代码和语言。
-
FIM预训练的最佳实践:我们通过全面的消融实验澄清了与训练FIM模型相关的许多超参数的影响。特别是,我们研究了FIM比率(应用FIM变换到数据的概率)、FIM变换的不同变体以及中间跨度的选择。
-
微调效率低下:与从零开始训练FIM模型相对的另一种选择是通过微调现有语言模型来学习这一能力。我们表明,使用FIM进行微调在计算上是低效的。虽然FIM可以在预训练期间免费学习,但在微调期间学习FIM需要大量额外计算,以达到与预训练相似的性能水平。
-
新的填充基准。为了研究我们模型的生成能力,我们需要评估自由形式生成样本的正确性。为此,我们专注于代码,其中我们可以使用单元测试来评估长FIM样本的正确性。特别是,我们使用[Fried et al., 2022]引入的单行和多行填充基准,去除HumanEval [Chen et al., 2021]的标准解决方案中的非空行。然而,由于基于行的评估未能捕捉到FIM的所有用例,我们创建了两个新的基准,称为随机跨度填充和随机跨度填充轻量级。我们将在第2节中更广泛地讨论这些基准及我们的评估方法。
-
需要采样评估。在第4.2节、第4.4节和附录B中,我们发现,在FIM训练中更改各种超参数通常导致FIM测试损失的微小差异,但在基于采样的基准中产生较大差异。采样基准不仅更接近实际用例,而且似乎能够揭示使用测试损失所忽略的增益。这是一个重要发现,因为通常扩展法则分析仅依赖于测试损失,我们发现如果没有其他评估作为补充,测试损失可能会产生误导。有趣的是,对比上述第一和第三个要点。第一点指出,在预训练中学习 FIM 是免费的,而在微调中则令人惊讶地昂贵。我们在第6节中讨论这一发现的潜在解释。为了建立 FIM 免费属性,我们在各种规模的代码和语言上进行了一项消融研究。我们训练了8个参数从50M到 6.9 B{6.9}\mathrm{\;B}6.9B 的模型,既有使用 FIM 的模型,也有不使用 FIM 的模型,并比较了各种自回归基准的性能。特别是,我们在代码上训练了16个模型,处理了 100 B{100}\mathrm{\;B}100B 的标记,在自然语言上又训练了16个模型,也处理了 100 B{100}\mathrm{\;B}100B 的标记。这些模型在正常自回归从左到右语言建模测试损失方面的比较在图1中呈现。在两个领域中,FIM 模型的自回归测试损失与非 FIM 模型相似。
我们通过在第4节中比较 FIM 和 AR 模型的非损失基础基准,提供了 FIM 免费属性的更多证据。此外,我们在第4.2节中看到 FIM 免费属性的一种更强形式。FIM 训练在最终检查点上并没有降低自回归能力,整个训练过程中也是如此。这一点在图4和图5中 AR 和 FIM 模型在从左到右的损失和 HumanEval 评估中的学习曲线相匹配得到证实。
除了研究 FIM 训练对从左到右能力的影响,展示模型实际上正在从 FIM 训练中学习进行填充也很重要。图2 在 FIM 测试损失的背景下提供了这方面的证据。我们在第4节和附录 H 中更广泛地研究了模型的填充能力。
2 评估
我们使用 AR 和 FIM 评估基准来分析模型的能力。普通的 AR 评估对于量化 FIM 训练对从左到右能力的影响很重要,并使我们能够展示第1.1节中的 FIM 免费属性。FIM 评估对于理解不同超参数对 FIM 训练的影响以及理解扩展趋势很重要。
在整篇论文中,我们将 AR 和从左到右这两个术语互换使用。AR 损失是指正常从左到右数据上的交叉熵损失,而 FIM 损失则是指在 100%{100}\%100% FIM 转换数据上的损失。所有测试损失均为每个标记的自然对数单位。在所有基于采样的基准中,我们使用了核采样 [Holtzman et al., 2020],其核参数为 0.95。
2.1 自回归评估
对于所有领域,我们以规范的自回归顺序评估测试损失,以表明即使在 FIM 增强的情况下,学习曲线和扩展趋势依然保持不变。除了测试损失外,我们还在标准基准上进行评估,以证明模型的能力不受 FIM 训练的影响。对于自然语言,我们使用 PIQA [Bisk et al., 2020],Winograd [Levesque et al., 2012],WinoGrande [Sakaguchi et al., 2021] 进行常识推理,DROP [Dua et al., 2019] 和 QuAC [Choi et al., 2018] 进行阅读理解,以及 HellaSwag [Zellers et al., 2019],LAMBADA [Paperno et al., 2016],StoryCloze [Mostafazadeh et al., 2016] 进行完成任务。所有基准除了 DROP 和 QuAC 外,均采用少量提示进行评估。对于代码,我们在 HumanEval [Chen et al., 2021] 上测量通过率。
2.2 填充评估
为了创建 FIM 测试,我们对 AR 测试集中的示例应用 FIM 转换,FIM 率为 100%{100}\%100% 。在 FIM 和 AR 测试集中使用相同的基础示例允许我们比较 FIM 和 AR 测试损失。此外,我们创建了这些测试集的一个掩码版本,在其中我们仅测量中间跨度标记的损失。这些测试集用于测量 FIM 模型的 PPP (中间前缀,后缀)和 AR 模型的 PPP (中间前缀),从而让我们研究 FIM 模型通过能够对后缀进行条件化而获得的信息量。
对于生成填充能力,我们将重点放在代码上,因为我们对自由形式的生成感兴趣,而不是常见于完形填空风格自然语言基准的单个或少量标记生成。处理代码的优势在于,我们可以使用测试套件评估任务中的样本正确性,即便是在评估来自开放式生成的长样本时。
我们使用的所有基于采样的填充基准都是通过从 HumanEval [Chen et al., 2021] 的规范解决方案中移除中间跨度而创建的部分函数补全任务。特别地,我们使用 [Fried et al., 2022] 提出的单行和多行填充基准,其中 HumanEval 的规范解决方案中非空行的不同跨度被转化为 FIM 任务。此外,我们创建了一个新的基准,称为随机跨度填充 2{}^{2}2 ,对于每个 HumanEval 问题,我们通过随机选择规范解决方案的中间跨度来创建填充任务。下面展示了这样一个任务的示例,其中模型必须预测高亮部分(或完成同一目标的替代补全)。关于更多细节,请参考附录 E。
def unique(l: list):
“”"返回列表中的已排序唯一元素 >>>> > >>>> unique ([5,3,5,2,3,3,9,0,123])\left( \left\lbrack {5,3,5,2,3,3,9,0,{123}}\right\rbrack \right)([5,3,5,2,3,3,