新智元报道
来源:arxiv
编辑:小芹,张佳
BERT王者归来了!
前不久,CMU和谷歌大脑提出的XLNet预训练模型在 20 项任务上全面碾压曾有“最强NLP预训练模型”之称的BERT,可谓风光无限,吸足了眼球。
不过,XLNet的王座没坐太久。就在今天,Facebook公布一个基于BERT开发的加强版预训练模型RoBERTa——在GLUE、SQuAD和RACE三个排行榜上全部实现了最先进的结果!
GLUE最新排行榜
RACE排行榜
RoBERTa的名称来"Robustly optimized BERT approach",强力优化的BERT方法,真是相当简单粗暴呢~
这项研究由Facebook AI和华盛顿大学的研究团队共同完成,而且第一作者是华人研究员Yinhan Liu,此外还有Jingfei Du和Danqi Chen。
作者之一的Veselin Stoyanov在推特上公布了该结果
Facebook AI负责人Yann LeCun推荐:
要说RoBERTa是如何制霸3个benchmark排行榜的,简言之,用更多的数据,采取更精妙的训练技巧,训练更久一些。
作者在论文中写道:“我们对BERT预训练(Devlin et al. , 2019)进行了一项复制研究,仔细衡量了许多关键超参数和训练数据大小对结果的影响。我们发现BERT的训练明显不足,并且可以匹配或超过之后发布的每个模型的性能。我们最好的模型在GLUE,RACE 和 SQuAD上都实现了最先进的结果。”
作者表示,超参数的选择对最终结果的影响很大。
他们发布了模型和代码:https://github.com/pytorch/fairseq
接下来,新智元带来对这篇论文的详细解读:
自我训练的方法,比如ELMo, GPT,BERT,XLM 以及XLNet等,带来了显著的性能提升,但要想确定这些方法的哪些方面对性能提升贡献最多是相当有挑战性的。由于训练在计算上成本很高,限制了可执行的调优量,而且常常使用不同大小的私有训练数据进行调优,限制了对建模进展效果的测量。
我们对BERT预训练模型(Devlin et al., 2019)进行了一项复制研究,包括仔细评估了超参数调优效果和训练集大小的影响。我们发现BERT明显训练不足,并提出了一个改进的训练BERT模型的方法,我们称之为RoBERTa,它可以达到或超过所有BERT后续方法(post-BERT)的性能。
我们做的修改很简单,包括:
(1)对模型进行更长时间、更大批量、更多数据的训练;
(2)删除下一句预测的目标;
(3)对较长序列进行训练;
(4)动态改变应用于训练数据的masking模式。
我们还收集了一个与其他私有数据集大小相当的新数据集(CC-NEWS),以便更好地控制训练集大小效果。
在对训练数据进行控制时,我们的升级版训练程序进一步提升了BERT在GLUE和SQuAD排行榜上公布的结果。
经过长时间的训练,我们的模型在公共 GLUE排行榜上的得分为88.5分,与Yang等人(2019)报告的88.4分相当。我们的模型在GLUE 9个任务的其中4个上达到了state-of-the-art的水平,分别是:MNLI, QNLI, RTE 和 STS-B。此外,我们还在SQuAD 和 RACE 排行榜上达到了最高分。
总结而言,本文的贡献有:
(1)我们提出了一套重要的BERT设计选择和训练策略,并引入了能够提高下游任务成绩的备选方案;
(2)我们使用一个新的数据集CCNEWS,并确认使用更多的数据进行预训练可以进一步提高下游任务的性能;
(3)我们的训练改进表明,在正确的设计选择下,预训练的masked language model与其他所有最近发表的方法相比都更具有竞争力。我们发布了在PyTorch中实现的模型、预训练和微调代码。
BERT使用了现在已经十分流行的transformer架构,这里我们不会详细讨论它。我们使用的是L层的transformer 架构,每个block 都使用一个self-attention head和隐藏维度H。
在训练前,BERT使用了两个目标:masked language modeling 和下一句预测。
Masked Language Mode(MLM)选择输入序列中的随机token样本,并用特殊的token[MASK]替换。MLM的目标是预测遮挡token时的交叉熵损失。BERT一致选择15%的输入token作为可能的替换。在所选的token中,80%替换为[MASK], 10%保持不变,10%替换为随机选择的词汇表token。
在最初的实现中,随机遮挡和替换在开始时执行一次,并保存到训练期间,但是在实际操作中,由于数据是重复的,所以每个训练语句的mask并不总是相同的。
下一句预测(NSP) 是一种二分类损失,用于预测两个片段在原文中是否相互跟随。通过从文本语料库中提取连续的句子来创建积极的例子。反例是通过对来自不同文档的段进行配对来创建的。正、负样本的抽样概率相等。
NSP的目标是为了提高下游任务的性能,比如自然语言推理,这需要对句子对之间的关系进行推理。
在本节中,我们描述了用于BERT复制研究的实验设置。
我们在FAIRSEQ中重新实现了BERT。我们主要遵循第2节中给出的原始BERT优化超参数,除了峰值学习率和warmup步骤的数量,这两个参数分别针对每个设置进行调优。
此外,我们还发现训练对Adam epsilon项非常敏感,在某些情况下,在对其进行调优后,我们获得了更好的性能或更好的稳定性。同样地,我们发现设置β2 = 0.98时可以提高大的batch size训练时的稳定性。
我们在DGX-1机器上进行混合精度浮点运算的训练,每台机器上有8个32GB Nvidia V100 GPU,通过Infiniband互连。
本节探讨和量化哪些选择对于成功地训练BERT模型至关重要。我们保持模型架构不变。具体地说,我们首先以与BERTBASE相同的配置(L = 12, H = 768, A = 12, 110M params)开始训练BERT模型。
静态masking vs. 动态masking
正如在前文讨论的,BERT依赖于随机遮挡和预测token。原始的BERT实现在数据预处理期间执行一次遮挡,从而产生一个静态遮挡(static mask)。为了避免在每个epoch中对每个训练实例使用相同的mask,我们将训练数据重复10次,以便在40个训练epoch中以10种不同的方式对每个序列进行遮挡。因此,在训练过程中,每个训练序列都使用相同的mask四次。
我们将此策略与动态遮挡(dynamic masking)进行比较,在dynamic masking)中,每次向模型提供序列时都会生成masking模式。当对更多步骤或更大的数据集进行预训练时,这一点变得至关重要。
表1:SEBERTBASE的静态和动态masking的比较。我们报告了SQuAD 的F1分数和MNLI-m 以及 SST-2的准确性结果。报告的结果是超过5个随机初始化的中值。参考结果来自Yang et al. (2019).
结果表1比较了Devlin等人(2019)发布的BERTBASE结果与我们使用静态或动态masking重新实现的结果。我们发现,使用静态masking的重新实现的性能与原始的BERT模型相似,而动态masking可以与静态masking的结果相当,甚至略好于静态masking。
考虑到这些结果和动态masking的额外效率优势,我们在其余的实验中使用动态masking。
模型输入格式和下一句预测
在原始的BERT预训练过程中,模型观察到两个连接的文档片段,它们要么是从相同的文档连续采样(p = 0.5),要么是从不同的文档采样。除了masked language modeling 目标外,该模型还通过辅助下一句预测(NSP)损失训练模型来预测观察到的文档片段是来自相同还是不同的文档。
NSP损失被认为是训练原始BERT模型的一个重要因素。Devlin等人(2019)观察到,去除NSP会损害性能,QNLI、MNLI和SQuAD的性能都显著下降。然而,最近的一些工作对NSP损失的必要性提出了质疑。
为了更好地理解这种差异,我们比较了几种替代训练格式:
表2:在BOOKCORPUS和WIKIPEDIA上预训练的基本模型的开发集结果。
表2显示了四种不同设置的结果。我们发现,使用单独的句子会影响下游任务的性能,我们假设这是因为该模型无法学习长期依赖关系。
接下来,我们将无NSP损失的训练与来自单个文档(doc - sentence)的文本块的训练进行比较。我们发现,与Devlin等人(2019)相比,该设置的性能优于最初发布的BERTBASE结果,消除NSP损失达到或略微提高了下游任务性能。
最后,我们发现将序列限制为来自单个文档(doc - sentence)的性能略好于打包来自多个文档(全句)的序列。但是,由于doc - sentence格式会导致不同的batch sizes,所以我们在其余的实验中使用完整的句子,以便与相关工作进行比较。
large batches训练
以往的神经机器翻译研究表明,当学习率适当提高时,非常大的mini-batches的训练既可以提高优化速度,又可以提高最终任务性能。最近的研究表明,BERT也可以接受 large batch训练。
Devlin等人(2019)最初训练BERTBASE只有100万步, batch size为256个序列。
在表3中,我们比较了BERTBASE在增大 batch size时的复杂性和最终任务性能,控制了通过训练数据的次数。我们观察到,large batches训练提高了masked language modeling 目标的困惑度,以及最终任务的准确性。通过分布式数据并行训练,large batches也更容易并行化,在后续实验中,我们使用8K序列的batches进行并行训练。
表3:不同批大小上训练的基本模型的未完成训练数据(ppl)和开发集准确性的困惑度。
在上一节中,我们建议修改BERT预训练程序,以改善最终任务的性能。我们现在汇总这些改进并评估它们的综合影响。我们将这种配置称为RoBERTa,即“Robustly optimized BERT approach”,强力优化的BERT方法。
具体来说,RoBERTa采用了dynamic masking、没有NSP损失的完整句子、large mini-batches和更大的字节级BPE的训练。
此外,我们还研究了以前工作中未被强调的另外两个重要因素:(1)用于预训练的数据,以及(2)通过数据的训练次数。例如,最近提出的XLNet架构使用的数据比原始BERT多近10倍。它还以8倍大的批量进行训练,以获得一半的优化步骤,因此在预训练中看到的序列数是BERT的4倍。
为了将这些因素与其他建模选择(例如,预训练目标)的重要性区分开来,我们首先按照BertLarge架构(L=24,H=1024,A=16355m)对Roberta进行训练。正如在Devlin et al. 中使用的一样,我们用BOOKCORPUS和WIKIPEDIA数据集进行了100K步预训练。我们使用1024V100GPU对我们的模型进行了大约一天的预训练。
结果如表4所示,当控制训练数据时,我们观察到RoBERTa比最初报告的BERTLARGE结果有了很大的改进,再次证实我们在第4节中探讨的设计选择的重要性。
表4:当我们预先训练了更多数据(16GB→160GB文本)和预训练更久(100K→300K→500K步),RoBERTa的开发集(Development set)结果。每行累积上述行的改进。RoBERTa匹配BERTLARGE的架构和训练目标。BERTLARGE和XLNetLARGE的结果分别来自Devlin et al.和Yang et al. 附录中有所有GLUE任务的完整结果。
接下来,我们将此数据与第3.2节中描述的三个附加数据集相结合。我们用与之前相同数量的训练步(100K)对RoBERTa进行综合数据训练。我们总共预处理了超过160GB的文本。我们观察到所有下游任务的性能进一步提高,验证了数据大小和多样性在预训练中的重要性。
最后,我们预先训练RoBERTa的时间要长得多,将预训练步数从100K增加到300K,再进一步增加到500K。我们再次观察到下游任务性能的显着提升,300K和500K步模型在大多数任务中的表现优于XLNetLARGE。我们注意到,即使是我们训练时间最长的模型似乎也不会超出我们的数据范围,而且可能会从额外的训练中受益。
在本文的其余部分,我们根据三个不同的基准评估我们最好的RoBERTa模型:GLUE,SQuaD和RACE。具体来说,我们认为RoBERTa在第3.2节中介绍的所有五个数据集上都进行了500K步的训练。
表5:GLUE的结果。 所有结果均基于24层架构。BERTLARGE和XLNetLARGE结果分别来自Devlin et al.和Yang et al. 开发集上的RoBERTa结果是五次运行的中间数。 测试集上的RoBERTa结果是单任务模型的集合。 对于RTE,STS和MRPC,我们从MNLI模型而不是基线预训练模型开始微调。平均值从GLUE leaderboard获得。
表6:SQuAD的结果。+表示依赖于额外外部训练数据的结果。RoBERTa在开发和测试中仅使用了提供的SQuAD数据。BERTLARGE和XLNetLARGE结果分别来自Devlin et al.和Yang et al.
表7:RACE测试集的结果。BERTLARGE和XLNetLARGE的结果来自Yang et al.
论文:
https://arxiv.org/pdf/1907.11692.pdf
GitHub:
https://github.com/pytorch/fairseq
更多阅读: