作者 | Facebook AI
译者 | Lucy
编辑 | Jane
出品 | AI科技大本营(ID: rgznai100)
【导读】预训练方法设计有不同的训练目标,包括语言建模、机器翻译以及遮蔽语言建模等。最近发表的许多论文都使用了微调模型,并预先训练了一些遮蔽语言模型的变体。然而,还有一些较新的方法是通过对多任务微调提高性能,结合实体嵌入,跨度预测和自回归预训练的多种变体。它们通常在更大数据上训练更大的模型来提高性能。本文的目标是通过复制、简化和更好地微调训练BERT,以作为更好理解上述方法的相对性能的参考值。
论文地址:
https://arxiv.org/abs/1907.11692
语言模型预训练能获得显著的性能提升,但是不同方法之间很难进行详细的比较。训练模型计算成本高,通常在各自的数据集上完成,并且作者将展示超参数对最终结果的显著影响。作者提出了BERT 预训练的复制研究,该研究测量了关键超参数和训练数据量对结果的影响。发现BERT 可以超过其后发布的每个模型的性能。该模型在 GLUE,RACE 和SQuAD 上实现了目前最好的结果。这些结果强调了先前被忽视的设计选择的重要性,然后提出了有关最近报告的改进的来源的问题,并发布了模型和公开了程序代码。
1、 介绍
自训练方法,如ELMo、 GPT、 BERT、 XLM 和XLNet 得到了显著的性能提升,但很难确定每种方法的哪些方面贡献最大。训练计算成本很高,限制了微调的数据量,并且通常使用不同大小的私人训练数据来完成,这限制了测量模型效果的能力。
作者提出了BERT 预训练的复制研究,其中包括评估超参数和训练数据量对结果的影响。提出了一个改进的训练BERT模型的方法,称之为 RoBERTa,该方法可以超过所有 post-BERT 方法的性能。修改的部分包括:(1)训练模型时间更长,batch更大,数据更多;(2)删除下一句预测目标;(3)对较长序列进行训练;(4)动态改变应用于训练数据的遮蔽模式。为了更好地控制训练集大小对结果的影响,作者收集了与其他私人使用的数据集大小相当的大型新数据集(CC-NEWS)。
在控制训练数据时,改进的训练程序比在GLUE 和SQUAD 上公布的BERT 结果有所提高。经过长时间训练,该模型在公共GLUE 排行榜上得分为88.5,与 Yang 等人报道的88.4 相当。该模型建立了一个最新的4/9GLUE 任务:MNLI, QNLI, RTE 和STS-B。在 SQuAD 和RACE 上获得最好的实验结果。总的来说,重新确定BERT的遮蔽语言模型训练目标是与其他最近提出的训练目标竞争,例如扰动自回归语言模型。
总之,本文的贡献是:(1)提出了一套重要的 BERT 设计选择和培训策略,并介绍了可以带来更好的下游任务绩效的替代方案;(2)使用一种新的数据集 CCNEWS,确认使用更多数据进行预训练可以进一步提高下游任务的性能;(3)训练结果表明,在配置正确的情况下,预训练的遮蔽语言模型比其他最近发布的模型效果更好。作者发布了模型,上传了基于 PyTorch 的预训练和微调代码。
2、 背景
2.1 设置
BERT 将两个段(令牌序列),x1,..., xN 和y1,..., yM 的串联作为输入。该模型首先在大的未标记文本语料库上预先训练,然后使用最终任务标记数据进行网络化。
2.2 结构
本文使用具有L 层的变压器架构,每个块使用A 自注意头和H 层隐藏层.
2.3 训练目标
在预训练期间,BERT 的两个目标:遮蔽语言模型和下一句话预测。遮蔽语言模型(MLM)使用已标记的随机样本作为输入序列,并用特殊标记[MASK] 替换。MLM的目标是预测被遮蔽标记的交叉熵损失。下一句话预测(NSP) NSP 是一种二元分类损失,用于预测原始文本中两个段落是否相连。
2.4 优化
BERT使用以下参数对Adam 进行优化:β1= 0.9,β2= 0.999,ǫ= 1e-6,L2 权重衰减为0.01。 学习率在最初的10,000次迭代中峰值为1e-4,然后线性衰减。BERT 每层Dropout 为0.9,以及一个 GELU 激活函数。模型预训练在S = 1,000,000时更新,最小的batch 包含序列最大长度B = 256 和标记T = 512。
2.5 数据
BERT 的训练数据包含BOOKCORPUS 和英语WIKIPEDIA,压缩前共 16GB。
3、 实验设置
3.1 配置
作者在FAIRSEQ 中重新实现了BERT。主要遵循第2节中给出的初始 BERT 优化超参数,除了峰值学习速率和预热步数,这些步骤针对每个设置单独调整。Adam 在训练中非常敏感,在某些情况下,调整后能提高性能。并设置β2= 0.98 以提高大批量训练时的稳定性。作者预先训练了最多T = 512 标记序列。不会随机注入短序列,并且不会针对前90% 的更新以减少的序列长度进行训练,只训练全长序列。在 DGX-1 机器上进行混合精密浮点运算,每个机器都有8×32GB Nvidia V100 GPU,并由 Infiniband 互连。
3.2 数据
BERT 式预训练依赖于大量的文本。本文考虑了不同大小和域的五种英语语料库,总共超过160GB 的未压缩文本。使用的文本语料库如下:
- BOOKCORPUS 和英语WIKIPEDIA:这是用于训练 BERT 的原始数据(16 GB)。
- CC-NEWS:收集的 CommonCrawl 新闻数据集的英文部分。该数据包含2016 年9 月至2019 年2 月期间6300 万份英文新闻(过滤后为76GB)。
- OPENWEBTEXT:Radford 等人的WebText 语料库的开源数据。该文本是从Reddit 上共享的URL 中提取的网页内容,爬取的每个内容都至少有三个人点赞(38GB)。
- STORIES:是 Trinh 和Le 引入的数据集,其中包含一部分CommonCrawl 数据,用于匹配Winograd 模式的故事风格(31GB)。
3.3 评估
作者使用以下三个基准评估下游任务的预训练模型。
- GLUE 通用语言理解评估(GLUE)基准是用于评估自然语言理解系统的 9 个数据集的集合。
- SQuAD 斯坦福问题答疑数据集(SQuAD)提供了一段背景和一个问题。任务是通过从上下文中提取相关跨度来回答问题。
- RACE 考试的重新理解(RACE)任务是一个大型阅读理解数据集,有超过 28000 个段落和近100000 个问题。该数据集来自中国的英语考试,专为中学生和高中生设计。
4、 训练程序分析
本节探讨在保持模型架构不变的情况下,哪些量化指标对预训练BERT 模型有影响。首先训练BERT 模型,其配置与BERTBASE 相同(L = 12, H = 768, A = 12,110M 参数)。
4.1 静态与动态掩蔽
可以发现使用静态遮蔽重新实现的功能与原始BERT模型类似,动态遮蔽与静态遮蔽效果差距不大。
表1:BERTBASE 的静态遮蔽和动态遮蔽之间的比较。
4.2 模型输入格式和下一句预测
本文比较了几种可选择训练模式:
- SEGMENT-PAIR NSP:BERT 中使用带NSP 损失的原始输入格式。每个输入都有两个段落,每个段可以包含多句话,但总组合长度必须小于512 个tokens。
- SENTENCE-PAIR NSP:每个输入包含两句话,从一个文档的连续部分或从单独的文档中采样。由于这些输入明显少于512 个tokens,因此我们增加batch的大小,以使 tokens 总数保持与SEGMENT-PAIR NSP 相似,同时保留了NSP 损失。
- FULL-SENTENCES:每个输入都包含从一个或多个文档连续采样的完整句子,使得总长度最多为512 个tokens。输入可能跨越文档边界。当到达一个文档的末尾时,从下一个文档开始对句子进行抽样,并在文档之间添加一个额外的分隔符号,这里不使用 NSP 损失。
- DOC-SENTENCES:输入的构造类似于FULL-SENTENCES,除了它们可能不需要跨越文档边界。在文档末尾附近采样的输入可以短于 512 个tokens,因此在这些情况下动态增加batch大小以达到与 FULLSENTENCES 相同的tokens总数,这里不使用 NSP 损失。
表2:在 BOOKCORPUS 和WIKIPEDIA 上预训练的基础模型的开发集结果。
首先比较Devlin等人的原始SEGMENT-PAIR输入格式。采用SENTENCE-PAIR格式;两种格式都保留了NSP损失,但后者使用单句。发现单个句子会损害下游任务的性能,认为这是因为模型无法学习远程依赖。
4.3 大批量训练
在神经网络机器翻译模型中,当学习率适当增加时,使用非常大的mini-batch 训练可以提高优化速度和终端任务性能。研究结果表明,BERT 也适用于大批量训练。
表3:在不同 batchs(bsz)下, BOOKCORPUS 和WIKIPEDIA 作为训练数据,模型的持续训练数据(ppl)和开发集准确率。
比较了BERTBASE 的性能,因为增加了batch 的大小,控制了通过训练数据的次数。观察到大批量训练可以改善遮蔽语言模型目标的困惑度,以及最终任务的准确性。通过分布式数据并行训练,大批量也更容易并行化,后续的实验中,作者使用8K 序列进行训练。
4.4 文本编码
字节对编码(BPE)是字符和单词级表示之间的混合,允许处理自然语言语料库中常见的大词汇表。BPE 不依赖于完整的单词,而是依赖于子词单元,这些子单元是通过对训练语料库进行统计分析而提取的。
5、RoBERTa
表4:RoBERTa的开发集结果,因为预先训练了更多数据(16GB→160GB的文本)和预训练更长时间(100K→300K→500K步),每行累积上述行的改进。RoBERTa 符合BERTLARGE 的架构和训练目标。
当控制训练数据时,观察到RoBERTa 比最初报告的BERTLARGE 结果有了明显的改进。
5.1 GLUE结果
表5 :GLUE 的结果。所有结果均基于24 层架构。开发集上的RoBERTa 结果是五次运行的中位数。测试集上RoBERTa 的结果是单任务模型的集合。对于RTE, STS 和MRPC,从 MNLI 模型开始,而不是基线预训练模型。平均值可以从GLUE 排行榜获得。
5.2 SQuAD结果
表6 :SQuAD 的结果。†表示取决于其他外部训练数据的结果。RoBERTa 仅在开发和测试设置中使用提供的SQuAD 数据。
5.3 RACE结果
表7 :RACE 测试集的结果
RoBERT在中学和高中设置上都能获得最好的实验结果。
6、结论
在预训练BERT模型时,作者会仔细评估一些设计决策。通过更长时间地训练模型,处理更多数据,可以显著提高模型性能;删除下一句预测目标; 培训更长的序列; 并动态地改变应用于训练数据的遮蔽模式。改进的预训练程序,称之为RoBERTa,在GLUE,RACE和SQuAD上实现了目前最好的结果,没有GLUE的多任务网络化或SQuAD的附加数据。这些结果说明这些先前被忽视的设计决策的重要性,并表明BERT的预训练目标仍与最近提出的替代方案不相上下。
作者还使用了一个新的数据集CC-NEWS,并发布了用于预训练和网络训练的模型和代码。
Github地址:
https://github.com/pytorch/fairseq