当前位置: 首页 > article >正文

RoBERTa: A Robustly Optimized BERT Pretraining Approach—— 一种鲁棒优化的BERT预训练方法

这篇文章介绍了RoBERTaRobustly Optimized BERT Pretraining Approach),即一种对BERT预训练方法进行优化的模型。文章的主要内容和贡献如下:

  1. 背景与动机

    • BERT等预训练语言模型在自然语言处理任务中取得了显著进展,但不同方法之间的比较具有挑战性,主要由于训练成本高、数据集私有化以及超参数选择的影响。

    • 文章通过复制BERT的预训练过程,发现BERT训练不足,并提出了改进的预训练方法。

  2. 主要改进

    • 更长时间的训练:增加训练步数和数据量。

    • 移除下一句预测(NSP)目标:实验表明NSP对性能提升作用有限。

    • 动态掩码:在每次输入时动态生成掩码,而不是使用静态掩码。

    • 更大的批次训练:使用更大的批次进行训练,提高训练效率和性能。

    • 更长的序列训练:在更长的序列上进行训练,增强模型的长距离依赖能力。

    • 更大的数据集:引入新的数据集CC-News,并结合其他公开数据集进行训练。

  3. 实验结果

    • RoBERTa在多个基准测试(GLUE、SQuAD、RACE)上取得了最先进的结果,超越了BERT及其后续模型(如XLNet)。

    • 实验表明,RoBERTa在不使用多任务微调或额外数据的情况下,依然能够显著提升性能。

  4. 结论

    • 文章强调了预训练过程中一些被忽视的设计选择(如训练时间、批次大小、数据量等)的重要性。

    • RoBERTa的成功表明,BERT的掩码语言模型目标仍然具有竞争力,且通过优化训练过程可以进一步提升性能。

  5. 开源

    • 作者发布了RoBERTa的模型和代码,供研究社区使用和改进。

RoBERTa通过对BERT预训练过程的优化,显著提升了模型性能,并在多个自然语言处理任务中取得了最先进的结果。文章的核心贡献在于揭示了预训练过程中一些关键设计选择的重要性,并为未来的研究提供了新的方向。这里是自己的论文阅读记录,感兴趣的话可以参考一下,如果需要阅读原文的话可以看这里,如下所示:

机构: 华盛顿大学保罗·G·艾伦计算机科学与工程学院, Facebook AI

摘要:
语言模型预训练带来了显著的性能提升,但不同方法之间的仔细比较具有挑战性。训练计算成本高,通常在不同大小的私有数据集上进行,并且超参数选择对最终结果有显著影响。我们进行了BERT预训练的复制研究,仔细测量了许多关键超参数和训练数据大小的影响。我们发现BERT训练不足,通过优化训练,可以匹配或超过其后发布的每个模型的性能。我们的最佳模型在GLUE、RACE和SQuAD上取得了最先进的结果。这些结果突显了先前被忽视的设计选择的重要性,并对最近报告的改进来源提出了疑问。我们发布了我们的模型和代码。

1 引言

自训练方法如ELMo、GPT、BERT、XLM和XLNet带来了显著的性能提升,但确定这些方法的哪些方面贡献最大具有挑战性。训练计算成本高,限制了可以进行的调优量,并且通常使用不同大小的私有训练数据,限制了我们对建模进展效果的测量能力。

我们进行了BERT预训练的复制研究,包括对超参数调优和训练集大小影响的仔细评估。我们发现BERT训练不足,并提出了一种改进的BERT模型训练方法,称为RoBERTa,可以匹配或超过所有后BERT方法的性能。我们的修改包括:(1) 训练时间更长,使用更大的批次,更多的数据;(2) 移除下一句预测目标;(3) 在更长的序列上训练;(4) 动态改变应用于训练数据的掩码模式。我们还收集了一个新的数据集(CC-News),其大小与其他私有数据集相当,以更好地控制训练集大小的影响。

在控制训练数据的情况下,我们的改进训练程序在GLUE和SQuAD上优于已发布的BERT结果。当在更多数据上训练更长时间时,我们的模型在公共GLUE排行榜上取得了88.5分,与Yang等人报告的88.4分相当。我们的模型在4/9的GLUE任务上建立了新的最先进水平:MNLI、QNLI、RTE和STS-B。我们还在SQuAD和RACE上匹配了最先进的结果。总体而言,我们重新确认了BERT的掩码语言模型训练目标与其他最近提出的训练目标(如扰动自回归语言建模)具有竞争力。

2 背景

在本节中,我们简要概述了BERT预训练方法以及我们将在实验中检验的一些训练选择。

设置

模型首先在大型未标记文本语料库上进行预训练,然后使用端任务标记数据进行微调。

架构

BERT使用现在普遍使用的Transformer架构,我们不会详细回顾。我们使用具有 L 层的Transformer架构。每个块使用 A 个自注意力头和隐藏维度 H。

训练目标

在预训练期间,BERT使用两个目标:掩码语言建模和下一句预测。

掩码语言模型 (MLM): 输入序列中的随机标记样本被选择并替换为特殊标记 [MASK]。MLM目标是对预测掩码标记的交叉熵损失。BERT均匀选择15%的输入标记进行可能的替换。在选定的标记中,80%被替换为 [MASK],10%保持不变,10%被随机选择的词汇标记替换。

在原始实现中,随机掩码和替换在开始时执行一次并保存用于整个训练期间,尽管在实践中数据被复制,因此每个训练句子的掩码并不总是相同。

下一句预测 (NSP): NSP是一个二元分类损失,用于预测两个段落是否在原始文本中彼此跟随。正例通过从文本语料库中获取连续句子创建。负例通过配对来自不同文档的段落创建。正例和负例以相等的概率采样。

NSP目标旨在提高下游任务的性能,例如自然语言推理,这些任务需要推理句子对之间的关系。

优化

数据

BERT在BookCorpus加英文维基百科的组合上进行训练,总计16GB的未压缩文本。

3 实验设置

在本节中,我们描述了BERT复制研究的实验设置。

实现

我们在fairseq中重新实现了BERT。我们主要遵循原始BERT优化超参数,除了峰值学习率和预热步数,这些参数为每个设置单独调优。我们还发现训练对Adam epsilon项非常敏感,在某些情况下,调优它可以获得更好的性能或提高稳定性。同样,我们发现设置 β2=0.98 可以提高大批次训练时的稳定性。

我们使用最多 T=512 标记的序列进行预训练。与Devlin等人不同,我们不随机注入短序列,也不在前90%的更新中使用减少的序列长度进行训练。我们只使用全长序列进行训练。

我们在DGX-1机器上使用混合精度浮点运算进行训练,每台机器有8个32GB Nvidia V100 GPU,通过Infiniband互连。

数据

BERT风格的预训练严重依赖大量文本。Baevski等人证明,增加数据大小可以提高端任务性能。一些工作已经在比原始BERT更大和更多样化的数据集上进行了训练。不幸的是,并非所有额外的数据集都可以公开发布。在我们的研究中,我们专注于收集尽可能多的数据进行实验,使我们能够匹配每个比较的总体数据质量和数量。

我们考虑了五个不同大小和领域的英文语料库,总计超过160GB的未压缩文本。我们使用以下文本语料库:

  • *BookCorpus加英文维基百科。这是用于训练BERT的原始数据。(16GB)。

  • *CC-News,我们从CommonCrawl新闻数据集的英文部分收集。数据包含2016年9月至2019年2月爬取的6300万篇英文新闻文章。(过滤后76GB)。

  • *OpenWebText,WebText语料库的开源重建,描述于Radford等人。文本是从Reddit上分享的URL中提取的,至少有三个赞。(38GB)。

  • *Stories,Trinh和Le引入的数据集,包含从CommonCrawl数据中过滤出的子集,以匹配Winograd模式的故事风格。(31GB)。

评估

根据之前的工作,我们使用以下三个基准评估我们的预训练模型在下游任务上的表现。

GLUE: 通用语言理解评估(GLUE)基准是用于评估自然语言理解系统的9个数据集的集合。任务被构建为单句分类或句子对分类任务。GLUE组织者提供训练和开发数据分割,以及一个提交服务器和排行榜,允许参与者在私有保留的测试数据上评估和比较他们的系统。

对于第4节中的复制研究,我们在微调预训练模型后报告开发集结果(即没有多任务训练或集成)。我们的微调程序遵循原始BERT论文。

在第5节中,我们还报告了从公共排行榜获得的测试集结果。这些结果依赖于几个任务特定的修改,我们在第5.1节中描述。

SQuAD: 斯坦福问答数据集(SQuAD)提供一段上下文和一个问题。任务是通过从上下文中提取相关跨度来回答问题。我们评估两个版本的SQuAD:V1.1和V2.0。在V1.1中,上下文总是包含一个答案,而在V2.0中,一些问题在提供的上下文中没有答案,使任务更具挑战性。

对于SQuAD V1.1,我们采用与BERT相同的跨度预测方法。对于SQuAD V2.0,我们添加了一个额外的二元分类器来预测问题是否可回答,我们通过将分类和跨度损失项相加来联合训练。在评估期间,我们只对分类为可回答的对预测跨度索引。

RACE: 来自考试的阅读理解(RACE)任务是一个大规模的阅读理解数据集,包含超过28,000篇文章和近100,000个问题。数据集从中国的中学和高中英语考试中收集。在RACE中,每篇文章与多个问题相关联。对于每个问题,任务是从四个选项中选择一个正确答案。RACE的上下文比其他流行的阅读理解数据集长得多,并且需要推理的问题比例非常大。

4 训练程序分析

本节探讨并量化了哪些选择对于成功预训练BERT模型是重要的。我们保持模型架构不变。具体来说,我们首先使用与BERT相同的配置训练BERT模型(L=12,H=768,A=12,110M参数)。

静态与动态掩码

如第2节所述,BERT依赖于随机掩码和预测标记。原始BERT实现在数据预处理期间执行一次掩码,生成单个静态掩码。为了避免在每个训练实例的每个时期使用相同的掩码,训练数据被复制10次,以便每个序列在40个训练时期中以10种不同的方式掩码。因此,每个训练序列在训练期间看到相同的掩码四次。

我们将此策略与动态掩码进行比较,其中每次将序列输入模型时生成掩码模式。这在预训练更多步骤或使用更大数据集时变得至关重要。

结果: 表1比较了Devlin等人发布的BERT结果与我们的重新实现,使用静态或动态掩码。我们发现使用静态掩码的重新实现与原始BERT模型表现相似,动态掩码与静态掩码相当或略好。

鉴于这些结果以及动态掩码的额外效率优势,我们在其余实验中使用动态掩码。

模型输入格式和下一句预测

在原始BERT预训练程序中,模型观察两个连接的文档段落,这些段落要么从同一文档中连续采样(p=0.5p=0.5),要么来自不同文档。除了掩码语言建模目标外,模型还通过辅助的下一句预测(NSP)损失训练,以预测观察到的文档段落是否来自同一文档或不同文档。

NSP损失被认为是训练原始BERT模型的重要因素。Devlin等人观察到,移除NSP会损害性能,特别是在QNLI、MNLI和SQuAD 1.1上。然而,最近的一些工作质疑了NSP损失的必要性。

为了更好地理解这种差异,我们比较了几种替代训练格式:

  • *segment-pair+nsp: 这遵循BERT Devlin等人使用的原始输入格式,带有NSP损失。每个输入有一对段落,每个段落可以包含多个自然句子,但总组合长度必须小于512个标记。

  • *sentence-pair+nsp: 每个输入包含一对自然句子,要么从一个文档的连续部分采样,要么来自不同的文档。由于这些输入明显短于512个标记,我们增加批次大小,以便总标记数保持与segment-pair+nsp相似。我们保留NSP损失。

  • *full-sentences: 每个输入打包从一个或多个文档中连续采样的完整句子,总长度最多为512个标记。输入可以跨越文档边界。当我们到达一个文档的末尾时,我们从下一个文档开始采样句子,并在文档之间添加一个额外的分隔符标记。我们移除了NSP损失。

  • *doc-sentences: 输入构造类似于full-sentences,但它们不能跨越文档边界。从文档末尾附近采样的输入可能短于512个标记,因此我们动态增加批次大小,以实现与full-sentences相似的总标记数。我们移除了NSP损失。

结果: 表2显示了四种不同设置的结果。我们首先将Devlin等人使用的原始segment-pair输入格式与sentence-pair格式进行比较;两种格式都保留了NSP损失,但后者使用单个句子。我们发现使用单个句子会损害下游任务的性能,我们假设这是因为模型无法学习长距离依赖关系。

接下来,我们比较了在没有NSP损失的情况下训练和从单个文档中训练文本块(doc-sentences)。我们发现这种设置优于最初发布的BERT结果,并且移除NSP损失可以匹配或略微提高下游任务的性能,与Devlin等人的发现相反。可能是原始BERT实现仅移除了损失项,但仍然保留了segment-pair输入格式。

最后,我们发现将序列限制为来自单个文档(doc-sentences)比从多个文档打包序列(full-sentences)表现略好。然而,由于doc-sentences格式导致批次大小可变,我们在其余实验中使用full-sentences,以便与相关工作进行比较。

大批次训练

过去在神经机器翻译中的工作表明,当学习率适当增加时,使用非常大的小批次进行训练可以提高优化速度和端任务性能。最近的工作表明,BERT也适合大批次训练。

Devlin等人最初使用256个序列的批次大小训练BERT进行1M步。这相当于通过梯度累积以2K序列的批次大小训练125K步,或以8K序列的批次大小训练31K步。

在表3中,我们比较了随着批次大小的增加,BERT的困惑度和端任务性能,控制了通过训练数据的次数。我们观察到,大批次训练提高了掩码语言建模目标的困惑度,以及端任务的准确性。大批次训练也更容易通过分布式数据并行训练进行并行化,在后续实验中,我们使用8K序列的批次进行训练。

值得注意的是,You等人使用更大的批次大小(高达32K序列)训练BERT。我们将大批次训练的进一步探索留给未来的工作。

文本编码

字节对编码(BPE)是一种介于字符和词级表示之间的混合方法,允许处理自然语言语料库中的大词汇表。BPE不依赖于完整的单词,而是依赖于通过统计训练语料库分析提取的子词单元。

BPE词汇表大小通常在10K-100K子词单元之间。然而,当建模大型和多样化的语料库时,Unicode字符可能占词汇表的相当大一部分。Radford等人引入了一种巧妙的BPE实现,使用字节而不是Unicode字符作为基本子词单元。使用字节可以学习一个适度大小的子词词汇表(50K单元),仍然可以编码任何输入文本,而不会引入任何“未知”标记。

原始BERT实现使用大小为30K的字符级BPE词汇表,这是在用启发式标记化规则预处理输入后学习的。遵循Radford等人,我们考虑使用更大的字节级BPE词汇表(包含50K子词单元)训练BERT,而不进行任何额外的预处理或输入标记化。这为BERT和BERT分别增加了大约15M和20M的额外参数。

早期实验显示这些编码之间只有轻微差异,Radford等人的BPE在某些任务上表现略差。然而,我们相信通用编码方案的优势超过了性能的轻微下降,并在其余实验中使用此编码。这些编码的更详细比较留给未来的工作。

5 RoBERTa

在前一节中,我们提出了改进BERT预训练程序的修改,以提高端任务性能。我们现在将这些改进汇总并评估它们的综合影响。我们将此配置称为RoBERTa,即鲁棒优化的BERT方法。具体来说,RoBERTa使用动态掩码(第4.1节)、不带NSP损失的FULL-SENTENCES(第4.2节)、大批次(第4.3节)和更大的字节级BPE(第4.4节)进行训练。

此外,我们调查了先前工作中未充分强调的两个重要因素:(1) 用于预训练的数据,以及 (2) 通过数据的训练次数。例如,最近提出的XLNet架构使用了比原始BERT多近10倍的数据进行预训练。它还使用比BERT大八倍的批次大小进行训练,优化步骤减半,因此在预训练中看到的序列数量是BERT的四倍。

为了帮助将这些因素的重要性与其他建模选择(例如预训练目标)分开,我们首先按照BERT架构(L=24,H=1024,A=16,355M参数)训练RoBERTa。我们在与BERT使用的BookCorpus加维基百科数据集相当的数据集上进行100K步的预训练。

结果: 我们在表4中展示了结果。在控制训练数据的情况下,我们观察到RoBERTa比最初报告的BERT结果有显著改进,重申了我们在第4节中探讨的设计选择的重要性。

接下来,我们将此数据与第3.2节中描述的三个额外数据集结合。我们使用相同的训练步数(100K)在组合数据上训练RoBERTa。总共,我们在160GB的文本上进行预训练。我们观察到在所有下游任务上的进一步性能改进,验证了数据大小和多样性在预训练中的重要性。

最后,我们显著延长了RoBERTa的预训练时间,将预训练步数从100K增加到300K,然后进一步增加到500K。我们再次观察到下游任务性能的显著提升,300K和500K步的模型在大多数任务上优于XLNet。我们注意到,即使是我们训练时间最长的模型也没有出现过拟合,可能会从额外的训练中受益。

在本文的其余部分,我们在三个不同的基准上评估我们最好的RoBERTa模型:GLUE、SQuAD和RACE。具体来说,我们考虑在第3.2节中引入的所有五个数据集上进行500K步训练的RoBERTa。

GLUE结果

对于GLUE,我们考虑两种微调设置。在第一种设置(单任务,开发集)中,我们为每个GLUE任务单独微调RoBERTa,仅使用相应任务的训练数据。我们为每个任务进行有限的超参数搜索,批次大小∈{16,32},学习率∈{1e−5,2e−5,3e−5},在前6%的步骤中进行线性预热,然后线性衰减到0。我们微调10个epoch,并根据每个任务的开发集评估指标进行早停。其余超参数与预训练期间保持一致。在此设置中,我们报告每个任务在五次随机初始化中的开发集中位数结果,不使用模型集成。

在第二种设置(集成,测试集)中,我们通过GLUE排行榜将RoBERTa与其他方法进行比较。虽然许多提交到GLUE排行榜的方法依赖于多任务微调,我们的提交仅依赖于单任务微调。对于RTE、STS和MRPC,我们发现从MNLI单任务模型开始微调比从基线预训练的RoBERTa开始更有帮助。我们探索了稍宽的超参数空间,并在附录中描述,每个任务集成5到7个模型。

任务特定修改: 两个GLUE任务需要任务特定的微调方法以实现有竞争力的排行榜结果。

QNLI: 最近在GLUE排行榜上的提交采用了成对排序公式来处理QNLI任务,其中从训练集中挖掘候选答案并相互比较,并将单个(问题,候选)对分类为正例。这种公式显著简化了任务,但与BERT Devlin等人不直接可比。遵循最近的工作,我们在测试提交中采用排序方法,但为了与BERT直接比较,我们基于纯分类方法报告开发集结果。

WNLI: 我们发现提供的NLI格式数据难以处理。相反,我们使用来自SuperGLUE的重新格式化的WNLI数据,该数据指示查询代词和指代词的跨度。我们使用Kocijan等人的边际排序损失微调RoBERTa。对于给定的输入句子,我们使用spaCy提取句子中的其他候选名词短语,并微调我们的模型,使其为正指代短语分配比任何生成的负候选短语更高的分数。这种公式的一个不幸后果是我们只能使用正训练示例,这排除了超过一半的提供的训练示例。

结果: 我们在表5中展示了结果。在第一种设置(单任务,开发集)中,RoBERTa在所有9个GLUE任务的开发集上取得了最先进的结果。重要的是,RoBERTa使用与BERT相同的掩码语言建模预训练目标和架构,但始终优于BERT和XLNet。这引发了关于模型架构和预训练目标的相对重要性,与我们在这项工作中探讨的数据集大小和训练时间等更平凡细节的疑问。

在第二种设置(集成,测试集)中,我们将RoBERTa提交到GLUE排行榜,并在4/9的任务上取得了最先进的结果,以及迄今为止最高的平均分数。这尤其令人兴奋,因为RoBERTa不依赖于多任务微调,与大多数其他顶级提交不同。我们预计未来的工作可能会通过结合更复杂的多任务微调程序进一步改进这些结果。

SQuAD结果

与过去的工作相比,我们对SQuAD采用了更简单的方法。特别是,虽然BERT Devlin等人和XLNet Yang等人使用额外的QA数据集增强他们的训练数据,我们仅使用提供的SQuAD训练数据微调RoBERTa。Yang等人还采用了自定义的逐层学习率计划来微调XLNet,而我们为所有层使用相同的学习率。

对于SQuAD v1.1,我们遵循与Devlin等人相同的微调程序。对于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等人或XLNet Yang等人,两者都依赖于额外的外部训练数据。相比之下,我们的提交不使用任何额外数据。

我们的单一RoBERTa模型优于除一个单一模型提交外的所有提交,并且是不依赖数据增强的系统中得分最高的。

RACE结果

在RACE中,系统提供一段文本、一个相关问题和四个候选答案。系统需要分类四个候选答案中哪个是正确的。

我们通过将每个候选答案与相应的问题和段落连接来修改RoBERTa以完成此任务。然后我们编码这四个序列中的每一个,并将生成的_[CLS]_表示通过一个全连接层,用于预测正确答案。我们截断超过128个标记的问题-答案对,并在需要时截断段落,以便总长度最多为512个标记。

RACE测试集的结果如表7所示。RoBERTa在初中和高中设置中都取得了最先进的结果。

6 相关工作

预训练方法设计了不同的训练目标,包括语言建模、机器翻译和掩码语言建模。许多最近的论文使用了一种基本的方法,即为每个端任务微调模型,并使用某种变体的掩码语言模型目标进行预训练。然而,新方法通过多任务微调、结合实体嵌入、跨度预测和多种自回归预训练变体提高了性能。性能通常也通过训练更大的模型和更多的数据来提高。我们的目标是复制、简化和更好地调整BERT的训练,作为更好地理解所有这些方法的相对性能的参考点。

7 结论

我们仔细评估了预训练BERT模型时的一些设计决策。我们发现,通过训练模型更长时间、使用更大的批次和更多的数据;移除下一句预测目标;在更长的序列上训练;以及动态改变应用于训练数据的掩码模式,可以显著提高性能。我们改进的预训练程序,称为RoBERTa,在GLUE、RACE和SQuAD上取得了最先进的结果,而无需为GLUE进行多任务微调或为SQuAD使用额外数据。这些结果说明了这些先前被忽视的设计决策的重要性,并表明BERT的预训练目标仍然与最近提出的替代方案具有竞争力。

我们还使用了一个新的数据集CC-News,并发布了我们的模型和代码用于预训练和微调,地址为:https://github.com/pytorch/fairseq


http://www.kler.cn/a/474254.html

相关文章:

  • 案例解读 | 香港某多元化综合金融企业基础监控+网管平台建设实践
  • Linux系统自动化sh脚本
  • JavaEE初阶——计算机工作原理
  • 【微服务】7、分布式事务
  • 30天开发操作系统 第 12 天 -- 定时器
  • EyeSoothe: Your Ultimate Eye Health Companion
  • C语言——结构体,位段,枚举和联合
  • failed to resolve sdk 的解决方法
  • 华为设备的监控和管理
  • 基于Spring Boot的车辆违章信息管理系统(LW+源码+讲解)
  • 开源AI智能名片商城小程序在个人品牌建设中的应用与“展温度”策略融合深度探索
  • 【线性代数】通俗理解特征向量与特征值
  • 【Logstash03】企业级日志分析系统ELK之Logstash 过滤 Filter 插件
  • 9 异常
  • PyTorch快速入门教程【小土堆】之完整模型验证套路
  • 网络安全系列 之 协议安全
  • ros2-4.2 用python实现人脸识别
  • 服务器证书不受信任是什么问题?
  • 有关Redis的相关概述
  • Linux(CentOS7)安装JDK和Maven
  • Unity导入特效,混合模式无效问题
  • 使用XMLHttpRequest进行AJAX请求的详解
  • 使用 uniapp 开发微信小程序遇到的坑
  • 毕业项目推荐:基于yolov8/yolov5/yolo11的动物检测识别系统(python+卷积神经网络)
  • Mac M2基于MySQL 8.4.3搭建(伪)主从集群
  • 【Go】:全面掌握 Sentinel — 构建高可用微服务的流量控制、熔断、降级与系统防护体系