RoBERTa:一种鲁棒优化的 BERT 预训练方法
Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov
保罗·G·艾伦计算机科学与工程学院,华盛顿大学,西雅图,WA {mandar90, lsz}@cs.washington.edu
Facebook AI {yinhanliu, myleott, naman, jingfeidu, danqi, omerlevy, mikelewis, lsz, ves}@fb.com
摘要
语言模型预训练带来了显著的性能提升,但不同方法之间的仔细比较极具挑战性。训练过程计算成本高昂,通常在不同规模的私有数据集上进行;正如我们将要展示的那样,超参数的选择对最终结果有重大影响。我们对 BERT 预训练(Devlin 等人,2019)进行了复现研究,仔细衡量了许多关键超参数和训练数据规模的影响。我们发现 BERT 的训练严重不足,其性能可以达到或超过其后发表的每一个模型。我们的最佳模型在 GLUE、RACE 和 SQuAD 上取得了最先进(state-of-the-art)的结果。这些结果突显了先前被忽视的设计选择的重要性,并对最近报道的改进来源提出了质疑。我们发布了我们的模型和代码。
1 引言
自训练方法,如 ELMo(Peters 等人,2018)、GPT(Radford 等人,2018)、BERT(Devlin 等人,2019)、XLM(Lample 和 Conneau,2019)以及 XLNet(Yang 等人,2019),带来了显著的性能提升,但要确定哪些方法贡献最大可能具有挑战性。训练在计算上是昂贵的,限制了可以进行的调优量,并且通常使用不同规模的私有训练数据进行,这限制了我们衡量建模进展效果的能力。
我们提出了对 BERT 预训练(Devlin 等人,2019)的复现研究,其中包括对超参数调优和训练集规模影响的仔细评估。我们发现 BERT 的训练严重不足,并提出了一种改进的 BERT 模型训练方案,我们称之为 RoBERTa,它能够达到或超过所有后 BERT 方法的性能。我们的修改很简单,包括:(1)用更大的批次、更多的数据,训练模型更长时间;(2)移除下一句预测(next sentence prediction)目标;(3)在更长的序列上进行训练;以及(4)动态改变应用于训练数据的掩码模式。我们还收集了一个与其它私有数据集规模相当的大型新数据集(CC-NEWS),以更好地控制训练集规模的影响。
在控制训练数据的情况下,我们改进的训练过程在 GLUE 和 SQuAD 上均优于已发表的 BERT 结果。当在更多数据上训练更长时间后,我们的模型在公开的 GLUE 排行榜上达到了 88.5 的分数,与 Yang 等人(2019)报道的 88.4 持平。我们的模型在 9 个 GLUE 任务中的 4 个上建立了新的最先进水平:MNLI、QNLI、RTE 和 STS-B。我们还在 SQuAD 和 RACE 上达到了最先进的结果。总的来说,我们重新确立了 BERT 的掩码语言模型训练目标与最近提出的其它训练目标(如扰动自回归语言建模,Yang 等人,2019)相比具有竞争力。
总之,本文的贡献在于:(1)我们提出了一套重要的 BERT 设计选择和训练策略,并引入了导致更好下游任务性能的替代方案;(2)我们使用了一个新颖的数据集 CC-NEWS,并确认使用更多数据进行预训练可以进一步提高下游任务的性能;(3)我们的训练改进表明,在正确的设计选择下,掩码语言模型预训练与所有其它最近发表的方法相比具有竞争力。我们发布了我们的模型,以及用 PyTorch(Paszke 等人,2017)实现的预训练和微调代码。
2 背景
在本节中,我们将简要概述 BERT(Devlin 等人,2019)的预训练方法,以及我们将在下一节中通过实验检验的一些训练选择。
2.1 设置
BERT 将两个片段(标记序列)的拼接作为输入, 和 。片段通常由不止一个自然句子组成。这两个片段作为单个输入序列呈现给 BERT,并用特殊标记分隔:。 和 的约束条件为 ,其中 是控制训练期间最大序列长度的参数。
该模型首先在大型未标记文本语料库上进行预训练,随后使用端到端任务标记数据进行微调。
2.2 架构
BERT 使用了现在无处不在的 Transformer 架构(Vaswani 等人,2017),我们在此不再详细回顾。我们使用具有 层的 Transformer 架构。每个块使用 个自注意力头和隐藏维度 。
2.3 训练目标
在预训练期间,BERT 使用两个目标:掩码语言建模和下一句预测。
掩码语言模型(MLM):从输入序列中随机选择一部分标记,并用特殊标记 替换。MLM 目标是预测被掩码标记的交叉熵损失。BERT 均匀地选择 15% 的输入标记进行可能的替换。在选定的标记中,80% 被替换为 ,10% 保持不变,10% 被替换为随机选择的词汇表标记。
在原始实现中,随机掩码和替换在开始时执行一次,并保存以供整个训练期间使用,尽管在实践中,数据是重复的,因此掩码并不总是对每个训练句子都相同(参见第 4.1 节)。
下一句预测(NSP):NSP 是一种二元分类损失,用于预测两个片段在原始文本中是否前后相连。正例是通过从文本语料库中获取连续句子创建的。负例是通过配对来自不同文档的片段创建的。正例和负例以相等的概率进行采样。
NSP 目标旨在提高下游任务的性能,例如自然语言推理(Bowman 等人,2015),这需要对句子对之间的关系进行推理。
2.4 优化
BERT 使用 Adam(Kingma 和 Ba,2015)进行优化,参数如下: 以及 权重衰减为 。学习率在前 10,000 步预热到 的峰值,然后线性衰减。BERT 在所有层和注意力权重上使用 的 dropout,并使用 GELU 激活函数(Hendrycks 和 Gimpel,2016)。模型预训练 次更新,小批量包含 个序列,最大长度 个标记。
2.5 数据
BERT 在 BOOKCORPUS(Zhu 等人,2015)加上英语 WIKIPEDIA 的组合上进行训练,总计 16GB 的未压缩文本。
3 实验设置
在本节中,我们描述我们 BERT 复现研究的实验设置。
3.1 实现
我们在 FAIRSEQ(Ott 等人,2019)中重新实现了 BERT。我们主要遵循第 2 节中给出的原始 BERT 优化超参数,除了峰值学习率和预热步数,它们针对每个设置单独调优。我们还发现训练对 Adam epsilon 项非常敏感,在某些情况下,我们在调优后获得了更好的性能或提高了稳定性。同样,我们发现设置 在使用大批量训练时可以提高稳定性。
我们使用最多 个标记的序列进行预训练。与 Devlin 等人(2019)不同,我们不随机注入短序列,也不在更新的前 90% 期间使用缩短的序列长度进行训练。我们仅使用全长序列进行训练。
我们在 DGX-1 机器上使用混合精度浮点算术进行训练,每台机器有 的 Nvidia V100 GPU,通过 Infiniband 互连(Micikevicius 等人,2018)。
3.2 数据
BERT 风格的预训练关键依赖于大量的文本。Baevski 等人(2019)证明,增加数据规模可以提高端到端任务的性能。一些工作已经在比原始 BERT 更大、更多样化的数据集上进行了训练(Radford 等人,2019;Yang 等人,2019;Zellers 等人,2019)。不幸的是,并非所有额外的数据集都能公开。对于我们的研究,我们专注于收集尽可能多的数据进行实验,从而使我们能够根据每次比较的需要匹配数据的整体质量和数量。
我们考虑了五个不同规模和领域的英语语料库,总计超过 160GB 的未压缩文本。我们使用以下文本语料库:
- BOOKCORPUS(Zhu 等人,2015)加上英语 WIKIPEDIA。这是用于训练 BERT 的原始数据。(16GB)。
- CC-NEWS,我们从 CommonCrawl News 数据集的英语部分收集(Nagel,2016)。该数据包含 2016 年 9 月至 2019 年 2 月期间抓取的 6300 万篇英语新闻文章。(过滤后 76GB)。
- OPENWEBTEXT(Gokaslan 和 Cohen,2019),Radford 等人(2019)描述的 WebText 语料库的开源复现。文本是从 Reddit 上共享的至少有三个点赞的 URL 中提取的 Web 内容。(38GB)。
- STORIES,Trinh 和 Le(2018)引入的数据集,包含过滤后的 CommonCrawl 数据子集,以匹配 Winograd 模式的故事风格。(31GB)。
3.3 评估
遵循之前的工作,我们使用以下三个基准测试在下游任务上评估我们的预训练模型。
GLUE:通用语言理解评估(GLUE)基准(Wang 等人,2019b)是用于评估自然语言理解系统的 9 个数据集的集合。任务被框架为单句分类或句对分类任务。GLUE 组织者提供训练和开发数据拆分,以及一个提交服务器和排行榜,允许参与者在私有的留出测试数据上评估和比较他们的系统。
对于第 4 节中的复现研究,我们在相应的单任务训练数据上对预训练模型进行微调后,报告开发集上的结果(即,没有多任务训练或集成)。我们的微调过程遵循原始 BERT 论文(Devlin 等人,2019)。
在第 5 节中,我们额外报告了从公共排行榜获得的测试集结果。这些结果取决于几个特定于任务的修改,我们在第 5.1 节中进行了描述。
SQuAD:斯坦福问答数据集(SQuAD)提供了一段上下文和一个问题。任务是通过从上下文中提取相关跨度来回答问题。我们在两个版本的 SQuAD 上进行评估:V1.1 和 V2.0(Rajpurkar 等人,2016,2018)。在 V1.1 中,上下文总是包含一个答案,而在 V2.0 中,有些问题在提供的上下文中没有答案,这使得任务更具挑战性。
对于 SQuAD V1.1,我们采用与 BERT(Devlin 等人,2019)相同的跨度预测方法。对于 SQuAD V2.0,我们添加了一个额外的二元分类器来预测问题是否可回答,我们通过将分类和跨度损失项相加来联合训练它。在评估期间,我们仅对分类为可回答的对预测跨度索引。
RACE:来自考试的阅读理解(RACE)(Lai 等人,2017)任务是一个大规模阅读理解数据集,包含超过 28,000 篇文章和近 100,000 个问题。该数据集收集自中国的英语考试,专为初中和高中学生设计。在 RACE 中,每篇文章都关联多个问题。对于每个问题,任务是从四个选项中选择一个正确答案。RACE 的上下文比其它流行的阅读理解数据集长得多,并且需要推理的问题比例非常大。
4 训练过程分析
本节探讨并量化了哪些选择对于成功预训练 BERT 模型很重要。我们保持模型架构固定。具体来说,我们首先使用与 BERT 相同的配置训练 BERT 模型( 参数)。
4.1 静态与动态掩码
如第 2 节所述,BERT 依赖于随机掩码和预测标记。原始 BERT 实现是在数据预处理期间执行一次掩码,从而产生单个静态掩码。为了避免在每个 epoch 的每个训练实例中使用相同的掩码,训练数据被复制了 10 次,以便每个序列在 40 个训练 epoch 中以 10 种不同的方式被掩码。因此,每个训练序列在训练期间被相同的掩码看到了四次。
我们将此策略与动态掩码进行了比较,在动态掩码中,我们每次向模型提供序列时都会生成掩码模式。当进行更多步数的预训练或使用更大的数据集时,这一点变得至关重要。
| 掩码 | SQuAD 2.0 | MNLI-m | SST-2 |
|---|---|---|---|
| 参考 | 76.3 | 84.3 | 92.8 |
| 我们的复现: | |||
| 静态 | 78.3 | 84.3 | 92.5 |
| 动态 | 78.7 | 84.0 | 92.9 |
表 1:BERT 静态和动态掩码的比较。我们报告 SQuAD 的 F1 和 MNLI-m 及 SST-2 的准确率。报告的结果是 5 次随机初始化(种子)的中位数。参考结果来自 Yang 等人(2019)。
结果:表 1 比较了 Devlin 等人(2019)发表的 BERT 结果与我们使用静态或动态掩码的复现结果。我们发现我们使用静态掩码的复现与原始 BERT 模型表现相似,而动态掩码与静态掩码相比相当或略好。鉴于这些结果以及动态掩码的额外效率优势,我们在后续实验中使用了动态掩码。
4.2 模型输入格式和下一句预测
在原始 BERT 预训练过程中,模型观察两个拼接的文档片段,它们要么是从同一文档中连续采样的(),要么是从不同文档中采样的。除了掩码语言建模目标外,模型还通过辅助的下一句预测(NSP)损失来训练预测观察到的文档片段是来自同一文档还是不同文档。
NSP 损失被假设为训练原始 BERT 模型的一个重要因素。Devlin 等人(2019)观察到移除 NSP 会损害性能,导致 QNLI、MNLI 和 SQuAD 1.1 的性能显著下降。然而,一些最近的工作质疑了 NSP 损失的必要性(Lample 和 Conneau,2019;Yang 等人,2019;Joshi 等人,2019)。
为了更好地理解这种差异,我们比较了几种替代的训练格式:
- SEGMENT-PAIR+NSP:这遵循 BERT(Devlin 等人,2019)中使用的原始输入格式,带有 NSP 损失。每个输入都有一个片段对,每个片段可以包含多个自然句子,但总组合长度必须小于 512 个标记。
- SENTENCE-PAIR+NSP:每个输入包含一对自然句子,要么从一个文档的连续部分采样,要么从单独的文档中采样。由于这些输入明显短于 512 个标记,我们增加了批次大小,以便标记总数与 SEGMENT-PAIR+NSP 保持相似。我们保留了 NSP 损失。
- FULL-SENTENCES:每个输入都填充了从一个或多个文档中连续采样的完整句子,使得总长度最多为 512 个标记。输入可能会跨越文档边界。当我们到达一个文档的末尾时,我们开始从下一个文档采样句子,并在文档之间添加一个额外的分隔符标记。我们移除了 NSP 损失。
- DOC-SENTENCES:输入的构建方式与 FULL-SENTENCES 类似,只是它们不能跨越文档边界。在文档末尾附近采样的输入可能短于 512 个标记,因此我们在这些情况下动态增加批次大小,以实现与 FULL-SENTENCES 相似的标记总数。我们移除了 NSP 损失。
| 模型 | SQuAD 1.1/2.0 | MNLI-m | SST-2 | RACE |
|---|---|---|---|---|
| 我们的复现(带 NSP 损失): | ||||
| SEGMENT-PAIR | 90.4/78.7 | 84.0 | 92.9 | 64.2 |
| SENTENCE-PAIR | 88.7/76.2 | 82.9 | 92.1 | 63.0 |
| 我们的复现(无 NSP 损失): | ||||
| FULL-SENTENCES | 90.4/79.1 | 84.7 | 92.5 | 64.8 |
| DOC-SENTENCES | 90.6/79.7 | 84.7 | 92.7 | 65.6 |
| BERT | 88.5/76.3 | 84.3 | 92.8 | 64.3 |
| XLNet (K = 7) | –/81.3 | 85.8 | 92.7 | 66.1 |
| XLNet (K = 6) | –/81.0 | 85.6 | 93.4 | 66.7 |
表 2:在 BOOKCORPUS 和 WIKIPEDIA 上预训练的基础模型的开发集结果。所有模型都训练了 1M 步,批次大小为 256 个序列。我们报告 SQuAD 的 F1 和 MNLI-m、SST-2 及 RACE 的准确率。报告的结果是 5 次随机初始化(种子)的中位数。BERT 和 XLNet 的结果来自 Yang 等人(2019)。
结果:表 2 显示了四种不同设置的结果。我们首先比较了 Devlin 等人(2019)的原始 SEGMENT-PAIR 输入格式与 SENTENCE-PAIR 格式;两种格式都保留了 NSP 损失,但后者使用单个句子。我们发现使用单个句子会损害下游任务的性能,我们推测这是因为模型无法学习长距离依赖。
接下来,我们比较了没有 NSP 损失的训练和使用来自单个文档的文本块(DOC-SENTENCES)的训练。我们发现这种设置优于最初发表的 BERT 结果,并且移除 NSP 损失与下游任务性能相当或略有提高,这与 Devlin 等人(2019)相反。原始 BERT 实现可能只是移除了损失项,但仍然保留了 SEGMENT-PAIR 输入格式。
最后,我们发现将序列限制为来自单个文档(DOC-SENTENCES)的表现略好于从多个文档打包序列(FULL-SENTENCES)。然而,由于 DOC-SENTENCES 格式导致批次大小可变,我们在后续实验中使用 FULL-SENTENCES,以便与相关工作进行更容易的比较。
4.3 大批量训练
神经机器翻译的过去工作表明,当适当增加学习率时,使用非常大的小批量进行训练可以提高优化速度和端到端任务性能(Ott 等人,2018)。最近的工作表明,BERT 也适用于大批量训练(You 等人,2019)。
Devlin 等人(2019)最初训练 BERT 1M 步,批次大小为 256 个序列。通过梯度累积,这在计算成本上等同于以 2K 序列的批次大小训练 125K 步,或以 8K 序列的批次大小训练 31K 步。
在表 3 中,我们比较了困惑度和端到端任务性能。
| bsz | steps | lr | ppl | MNLI-m | SST-2 |
|---|---|---|---|---|---|
| 256 | 1M | 1e-4 | 3.99 | 84.7 | 92.7 |
| 2K | 125K | 7e-4 | 3.68 | 85.2 | 92.9 |
| 8K | 31K | 1e-3 | 3.77 | 84.6 | 92.8 |
表 3:在 BOOKCORPUS 和 WIKIPEDIA 上训练的基础模型在留出训练数据上的困惑度(ppl)和开发集准确率,批次大小(bsz)不同。我们为每个设置调优学习率(lr)。模型对数据进行了相同次数的遍历(epoch),并且具有相同的计算成本。
随着我们增加批次大小,控制对训练数据的遍历次数,BERT 的端到端任务性能也随之提高。我们观察到,使用大批量训练可以提高掩码语言建模目标的困惑度,以及端到端任务的准确率。大批量也更容易通过分布式数据并行训练进行并行化,在后期的实验中,我们使用 8K 序列的批次进行训练。
值得注意的是,You 等人(2019)使用更大的批次大小训练 BERT,高达 32K 序列。我们将大批量训练极限的进一步探索留给未来的工作。
4.4 文本编码
字节对编码(BPE)(Sennrich 等人,2016)是字符级和词级表示之间的混合,允许处理自然语言语料库中常见的巨大词汇表。BPE 不依赖于完整的单词,而是依赖于子词单元,这些单元是通过对训练语料库进行统计分析提取的。
BPE 词汇表大小通常在 10K-100K 子词单元之间。然而,当建模像本工作中考虑的那样的大型和多样化语料库时,Unicode 字符可能占该词汇表的相当大一部分。Radford 等人(2019)引入了一种巧妙的 BPE 实现,它使用字节而不是 Unicode 字符作为基础子词单元。使用字节使得学习一个适度大小(50K 单元)的子词词汇表成为可能,该词汇表仍然可以编码任何输入文本,而不会引入任何“未知”标记。
原始 BERT 实现(Devlin 等人,2019)使用大小为 30K 的字符级 BPE 词汇表,这是在用启发式分词规则预处理输入后学习的。遵循 Radford 等人(2019),我们改为考虑使用包含 50K 子词单元的更大字节级 BPE 词汇表训练 BERT,而无需对输入进行任何额外的预处理或分词。这为 BERT 和 BERT 分别增加了大约 15M 和 20M 的额外参数。
早期实验显示这些编码之间只有细微的差异,Radford 等人(2019)的 BPE 在某些任务上的端到端任务性能略差。尽管如此,我们认为通用编码方案的优势超过了性能上的微小下降,并在我们实验的其余部分使用了这种编码。对这些编码的更详细比较留给未来的工作。
5 RoBERTa
在上一节中,我们提出了对 BERT 预训练过程的修改,这些修改提高了端到端任务的性能。我们现在汇总这些改进并评估它们的综合影响。我们将此配置称为 RoBERTa,即 Robustly optimized BERT approach。具体来说,RoBERTa 使用动态掩码(第 4.1 节)、无 NSP 损失的 FULL-SENTENCES(第 4.2 节)、大批量(第 4.3 节)和更大的字节级 BPE(第 4.4 节)进行训练。
此外,我们调查了先前工作中未被充分强调的另外两个重要因素:(1)用于预训练的数据,以及(2)对数据进行的训练遍历次数。例如,最近提出的 XLNet 架构(Yang 等人,2019)使用的预训练数据量是原始 BERT(Devlin 等人,2019)的近 10 倍。它还使用大八倍的批次大小训练了一半的优化步数,因此在预训练中看到的序列是 BERT 的四倍。
为了帮助将这些因素的重要性与其它建模选择(例如,预训练目标)区分开来,我们首先按照 BERT 架构( 参数)训练 RoBERTa。我们在与 Devlin 等人(2019)使用的相当的 BOOKCORPUS 加上 WIKIPEDIA 数据集上预训练 100K 步。我们使用 1024 个 V100 GPU 预训练我们的模型大约一天。
结果:我们在表 4 中展示了我们的结果。在控制训练数据时,我们观察到 RoBERTa 比最初报道的 BERT 结果有很大的改进,重申了我们在第 4 节中探讨的设计选择的重要性。
接下来,我们将此数据与第 3.2 节中描述的三个额外数据集相结合。我们在组合数据上训练 RoBERTa,训练步数与之前相同(100K)。总共,我们在 160GB 的文本上进行预训练。我们观察到所有下游任务的性能都有进一步提高,验证了数据规模和多样性在预训练中的重要性。
最后,我们对 RoBERTa 进行了更长时间的预训练,将预训练步数从 100K 增加到 300K,然后再增加到 500K。我们再次观察到下游任务性能的显著提升,并且 300K 和 500K 步的模型在大多数任务上都优于 XLNet。我们注意到,即使是我们训练时间最长的模型似乎也没有对我们的数据过拟合,并且可能会从额外的训练中受益。
在本文的其余部分,我们评估了我们最好的 RoBERTa 模型在三个不同基准测试上的表现:GLUE、SQuAD 和 RACE。具体来说,我们考虑了在第 3.2 节引入的所有五个数据集上训练了 500K 步的 RoBERTa。
| 模型 | 数据 | bsz | steps | SQuAD (v1.1/2.0) | MNLI-m | SST-2 |
|---|---|---|---|---|---|---|
| RoBERTa | ||||||
| with BOOKS + WIKI | 16GB | 8K | 100K | 93.6/87.3 | 89.0 | 95.3 |
| + additional data (§3.2) | 160GB | 8K | 100K | 94.0/87.7 | 89.3 | 95.6 |
| + pretrain longer | 160GB | 8K | 300K | 94.4/88.7 | 90.0 | 96.1 |
| + pretrain even longer | 160GB | 8K | 500K | 94.6/89.4 | 90.2 | 96.4 |
| BERT | ||||||
| with BOOKS + WIKI | 13GB | 256 | 1M | 90.9/81.8 | 86.6 | 93.7 |
| XLNet | ||||||
| with BOOKS + WIKI | 13GB | 256 | 1M | 94.0/87.8 | 88.4 | 94.4 |
| + additional data | 126GB | 2K | 500K | 94.5/88.8 | 89.8 | 95.6 |
表 4:RoBERTa 在我们预训练更多数据(16GB 160GB 文本)和预训练更长时间(100K 300K 500K 步)时的开发集结果。每一行都累积了来自上面各行的改进。RoBERTa 匹配了 BERT 的架构和训练目标。BERT 和 XLNet 的结果分别来自 Devlin 等人(2019)和 Yang 等人(2019)。所有 GLUE 任务的完整结果可以在附录中找到。
5.1 GLUE 结果
对于 GLUE,我们考虑两种微调设置。在第一种设置(单任务,开发集)中,我们仅使用相应任务的训练数据,分别为每个 GLUE 任务微调 RoBERTa。我们考虑了每个任务的有限超参数扫描,批次大小 ,学习率 ,前 6% 的步数进行线性预热,然后线性衰减到 0。我们微调 10 个 epoch,并根据每个任务在开发集上的评估指标执行提前停止。其余超参数与预训练期间相同。在这种设置下,我们报告每个任务在 5 次随机初始化上的中位数开发集结果,无需模型集成。
在第二种设置(集成,测试集)中,我们通过 GLUE 排行榜将 RoBERTa 与其它方法进行比较。虽然许多对 GLUE 排行榜的提交依赖于多任务微调,但我们的提交仅依赖于单任务微调。对于 RTE、STS 和 MRPC,我们发现从 MNLI 单任务模型开始微调比从基准预训练的 RoBERTa 开始微调更有帮助。我们探索了一个稍微宽泛的超参数空间(在附录中描述),并对每个任务集成了 5 到 7 个模型。
| MNLI | QNLI | QQP | RTE | SST | MRPC | CoLA | STS | WNLI | Avg | |
|---|---|---|---|---|---|---|---|---|---|---|
| 单任务单模型(开发集) | ||||||||||
| BERT | 86.6/- | 92.3 | 91.3 | 70.4 | 93.2 | 88.0 | 60.6 | 90.0 | - | - |
| XLNet | 89.8/- | 93.9 | 91.8 | 83.8 | 95.6 | 89.2 | 63.6 | 91.8 | - | - |
| RoBERTa | 90.2/90.2 | 94.7 | 92.2 | 86.6 | 96.4 | 90.9 | 68.0 | 92.4 | 91.3 | - |
| 集成(测试集,截至 2019 年 7 月 25 日) | ||||||||||
| ALICE | 88.2/87.9 | 95.7 | 90.7 | 83.5 | 95.2 | 92.6 | 68.6 | 91.1 | 80.8 | 86.3 |
| MT-DNN | 87.9/87.4 | 96.0 | 89.9 | 86.3 | 96.5 | 92.7 | 68.4 | 91.1 | 89.0 | 87.6 |
| XLNet | 90.2/89.8 | 98.6 | 90.3 | 86.3 | 96.8 | 93.0 | 67.8 | 91.6 | 90.4 | 88.4 |
| RoBERTa | 90.8/90.2 | 98.9 | 90.2 | 88.2 | 96.7 | 92.3 | 67.8 | 92.2 | 89.0 | 88.5 |
表 5:GLUE 结果。所有结果均基于 24 层架构。BERT 和 XLNet 的结果分别来自 Devlin 等人(2019)和 Yang 等人(2019)。RoBERTa 在开发集上的结果是 5 次运行的中位数。RoBERTa 在测试集上的结果是单任务模型的集成。对于 RTE、STS 和 MRPC,我们从 MNLI 模型开始微调,而不是基准预训练模型。平均值从 GLUE 排行榜获得。
任务特定修改:两个 GLUE 任务需要任务特定的微调方法才能获得有竞争力的排行榜结果。
- QNLI:GLUE 排行榜上的最近提交采用了 QNLI 任务的成对排序公式,其中候选答案从训练集中挖掘并相互比较,单个(问题,候选)对被分类为正例(Liu 等人,2019b,a;Yang 等人,2019)。这种公式大大简化了任务,但与 BERT(Devlin 等人,2019)不可直接比较。遵循最近的工作,我们对我们的测试提交采用了排序方法,但为了与 BERT 进行直接比较,我们报告了基于纯分类方法的开发集结果。
- WNLI:我们发现提供的 NLI 格式数据很难处理。相反,我们使用了来自 SuperGLUE(Wang 等人,2019a)的重新格式化的 WNLI 数据,它指出了查询代词和指代对象的跨度。我们使用 Kocijan 等人(2019)的边际排序损失来微调 RoBERTa。对于给定的输入句子,我们使用 spaCy(Honnibal 和 Montani,2017)从句子中提取额外的候选名词短语,并微调我们的模型,使其对正例指代短语分配的分数高于任何生成的负例候选短语。这种公式的一个不幸后果是,我们只能利用正例训练样本,这排除了超过一半的提供的训练样本。
结果:我们在表 5 中展示了我们的结果。在第一种设置(单任务,开发集)中,RoBERTa 在所有 9 个 GLUE 任务开发集上均取得了最先进的结果。至关重要的是,RoBERTa 使用了与 BERT 相同的掩码语言建模预训练目标和架构,但始终优于 BERT 和 XLNet。这引发了关于模型架构和预训练目标相对重要性的问题,相比于我们在本工作中探索的数据集规模和训练时间等更平凡的细节。
在第二种设置(集成,测试集)中,我们将 RoBERTa 提交给 GLUE 排行榜,并在 9 个任务中的 4 个上取得了最先进的结果,以及迄今为止最高的平均分。这尤其令人兴奋,因为与大多数其它顶级提交不同,RoBERTa 不依赖于多任务微调。我们预计未来的工作可能会通过结合更复杂的多任务微调程序来进一步改善这些结果。
5.2 SQuAD 结果
与过去的工作相比,我们对 SQuAD 采用了更简单的方法。特别是,虽然 BERT(Devlin 等人,2019)和 XLNet(Yang 等人,2019)都使用额外的 QA 数据集来增强其训练数据,但我们仅使用提供的 SQuAD 训练数据来微调 RoBERTa。Yang 等人(2019)还采用了自定义的逐层学习率调度来微调 XLNet,而我们对所有层使用相同的学习率。
对于 SQuAD v1.1,我们遵循与 Devlin 等人(2019)相同的微调过程。对于 SQuAD v2.0,我们额外分类给定的问题是否可回答;我们通过将分类和跨度损失项相加,将此分类器与跨度预测器联合训练。
结果:我们在表 6 中展示了我们的结果。在 SQuAD v1.1 开发集上,RoBERTa 匹配了 XLNet 设置的最先进水平。在 SQuAD v2.0 开发集上,RoBERTa 设定了新的最先进水平,比 XLNet 提高了 0.4 个点(EM)和 0.6 个点(F1)。
我们还将 RoBERTa 提交给公共 SQuAD 2.0 排行榜,并评估其相对于其它系统的性能。大多数顶级系统都建立在 BERT(Devlin 等人,2019)或 XLNet(Yang 等人,2019)的基础上,两者都依赖于额外的外部训练数据。相比之下,我们的提交不使用任何额外数据。
我们的单个 RoBERTa 模型优于除一个单模型提交之外的所有模型,并且是在不依赖数据增强的系统中得分最高的系统。
| 模型 | SQuAD 1.1 (EM/F1) | SQuAD 2.0 (EM/F1) |
|---|---|---|
| 单模型(开发集,无数据增强) | ||
| BERT | 84.1 / 90.9 | 79.0 / 81.8 |
| XLNet | 89.0 / 94.5 | 86.1 / 88.8 |
| RoBERTa | 88.9 / 94.6 | 86.5 / 89.4 |
| 单模型(测试集,截至 2019 年 7 月 25 日) | ||
| XLNet | 86.3 / 89.1 | |
| RoBERTa | 86.8 / 89.8 | |
| XLNet + SG-Net Verifier | 87.0 / 89.9 |
表 6:SQuAD 结果。 表示依赖于额外外部训练数据的结果。RoBERTa 在开发集和测试设置中仅使用提供的 SQuAD 数据。BERT 和 XLNet 的结果分别来自 Devlin 等人(2019)和 Yang 等人(2019)。
5.3 RACE 结果
在 RACE 中,系统会获得一段文本、一个相关问题和四个候选答案。系统需要分类四个候选答案中哪一个是正确的。
我们通过将每个候选答案与相应的问题和段落拼接来修改 RoBERTa 以完成此任务。然后,我们对这四个序列中的每一个进行编码,并将产生的 表示通过一个全连接层,该层用于预测正确答案。我们截断长于 128 个标记的问题-答案对,如果需要,截断段落,使得总长度最多为 512 个标记。
RACE 测试集的结果如表 7 所示。RoBERTa 在初中和高中设置上均取得了最先进的结果。
| 模型 | 准确率 | 中学 | 高中 |
|---|---|---|---|
| 单模型(测试集,截至 2019 年 7 月 25 日) | |||
| BERT | 72.0 | 76.6 | 70.1 |
| XLNet | 81.7 | 85.4 | 80.2 |
| RoBERTa | 83.2 | 86.5 | 81.3 |
表 7:RACE 测试集结果。BERT 和 XLNet 的结果来自 Yang 等人(2019)。
6 相关工作
预训练方法已经设计了不同的训练目标,包括语言建模(Dai 和 Le,2015;Peters 等人,2018;Howard 和 Ruder,2018)、机器翻译(McCann 等人,2017)和掩码语言建模(Devlin 等人,2019;Lample 和 Conneau,2019)。许多最近的论文使用了一种基本的微调模型配方来完成每个最终任务(Howard 和 Ruder,2018;Radford 等人,2018),并使用某种掩码语言模型目标的变体进行预训练。然而,更新的方法通过多任务微调(Dong 等人,2019)、结合实体嵌入(Sun 等人,2019)、跨度预测(Joshi 等人,2019)以及自回归预训练的多种变体(Song 等人,2019;Chan 等人,2019;Yang 等人,2019)提高了性能。性能通常也通过在更多数据上训练更大的模型来提高(Devlin 等人,2019;Baevski 等人,2019;Yang 等人,2019;Radford 等人,2019)。我们的目标是复现、简化并更好地调优 BERT 的训练,作为更好地理解所有这些方法相对性能的参考点。
7 结论
我们在预训练 BERT 模型时仔细评估了许多设计决策。我们发现,通过在更多数据上用更大的批次训练模型更长时间;移除下一句预测目标;在更长的序列上训练;以及动态改变应用于训练数据的掩码模式,性能可以得到显著提高。我们改进的预训练过程,我们称之为 RoBERTa,在 GLUE、RACE 和 SQuAD 上取得了最先进的结果,而无需对 GLUE 进行多任务微调或为 SQuAD 提供额外数据。这些结果说明了这些先前被忽视的设计决策的重要性,并表明 BERT 的预训练目标与最近提出的替代方案相比仍然具有竞争力。
我们额外使用了一个新颖的数据集 CC-NEWS,并发布了我们的模型和代码,用于预训练和微调,地址为:https://github.com/pytorch/fairseq。
参考文献
(此处省略参考文献列表,内容与原 PDF 保持一致)
附录:“RoBERTa:一种鲁棒优化的 BERT 预训练方法”
A GLUE 上的完整结果
在表 8 中,我们展示了 RoBERTa 的全套开发集结果。我们展示了遵循 BERT 的 LARGE 配置,以及遵循 BERT 的 BASE 配置的结果。
B 预训练超参数
表 9 描述了 RoBERTa 和 RoBERTa 预训练的超参数。
C 微调超参数
RACE、SQuAD 和 GLUE 的微调超参数在表 10 中给出。我们根据每个任务 5 个随机种子的中位数选择最佳超参数值。
| MNLI | QNLI | QQP | RTE | SST | MRPC | CoLA | STS | |
|---|---|---|---|---|---|---|---|---|
| RoBERTa | ||||||||
| + all data + 500k steps | 87.6 | 92.8 | 91.9 | 78.7 | 94.8 | 90.2 | 63.6 | 91.2 |
| RoBERTa | ||||||||
| with BOOKS + WIKI | 89.0 | 93.9 | 91.9 | 84.5 | 95.3 | 90.2 | 66.3 | 91.6 |
| + additional data (§3.2) | 89.3 | 94.0 | 92.0 | 82.7 | 95.6 | 91.4 | 66.1 | 92.2 |
| + pretrain longer 300k | 90.0 | 94.5 | 92.2 | 83.3 | 96.1 | 91.1 | 67.4 | 92.3 |
| + pretrain longer 500k | 90.2 | 94.7 | 92.2 | 86.6 | 96.4 | 90.9 | 68.0 | 92.4 |
表 8:RoBERTa 各配置在 GLUE 任务上的开发集结果。
| 超参数 | RoBERTa | RoBERTa |
|---|---|---|
| 层数 | 24 | 12 |
| 隐藏层大小 | 1024 | 768 |
| FFN 内部隐藏层大小 | 4096 | 3072 |
| 注意力头数 | 16 | 12 |
| 注意力头大小 | 64 | 64 |
| Dropout | 0.1 | 0.1 |
| 注意力 Dropout | 0.1 | 0.1 |
| 预热步数 | 30k | 24k |
| 峰值学习率 | 4e-4 | 6e-4 |
| 批次大小 | 8k | 8k |
| 权重衰减 | 0.01 | 0.01 |
| 最大步数 | 500k | 500k |
| 学习率衰减 | 线性 | 线性 |
| Adam | 1e-6 | 1e-6 |
| Adam | 0.9 | 0.9 |
| Adam | 0.98 | 0.98 |
| 梯度裁剪 | 0.0 | 0.0 |
表 9:RoBERTa 和 RoBERTa 预训练的超参数。
| 超参数 | RACE | SQuAD | GLUE |
|---|---|---|---|
| 学习率 | 1e-5 | 1.5e-5 | {1e-5, 2e-5, 3e-5} |
| 批次大小 | 16 | 48 | {16, 32} |
| 权重衰减 | 0.1 | 0.01 | 0.1 |
| 最大 Epoch 数 | 4 | 2 | 10 |
| 学习率衰减 | 线性 | 线性 | 线性 |
| 预热比例 | 0.06 | 0.06 | 0.06 |
表 10:RoBERTa 在 RACE、SQuAD 和 GLUE 上微调的超参数。