zoukankan      html  css  js  c++  java
  • BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    摘要

    我们引入了一个新的叫做bert的语言表示模型,它用transformer的双向编码器表示。与最近的语言表示模型不同,BERT通过在所有层的上下文联合调节来预训练深层双向表示。因此,预训练的bert可以添加一个额外的输出层进行微调,可以在广泛的任务上产生目前最好的效果。例如问答和语言推理,不需要大量特定任务的结构的修改。

    BERT在概念上简单且经验丰富。它在11项自然语言处理任务中获得了最新的最新成果,包括GLUE分数,MultiNLI精度,问答。

    1 简介

    语言模型预训练已被证明对改进许多自然语言处理任务是有效的。包括句子级任务,如自然语言推理和释义,旨在通过对整体的分析预测句子之间的关系。令牌级别任务,例如命名实体识别和问答,模型需要在令牌级别上产生细粒度的输出。

    在预训练的语言表示应用到下游任务上有两种策略:基于特征和微调。基于特征的方式,例如ELMO包括特定于任务的体系结构,包括预训练的表示作为一个附加特征。微调的方法,例如Generative Pre-trained Transformer (OpenAI GPT),引入了最小的特定任务参数,并通过简单地微调所有预训练参数来训练下游任务。在预训练期间两个方法共享相同的目标函数,它们使用了单向的语言模型来学习一般的语言表达。

    我们认为当前的技术限制了预训练表示的能力,特别是对于微调方法。主要限制是标准语言模型是单向的,在预训练期间限制了架构的选择。在OpenAI GPT中,作者使用 left-toright结构,在transformer的self-attention层中,每一个token仅仅能处理前一个token(翻译:符号)。这种限制对于句子级别的任务来说是次优的,在基于微调的方法上应用例如问答这样的符号级任务事是非常有害的。

    在这篇文章中我们通过提出BERT来提高基于微调的方法(Bidirectional Encoder Representations from Transformers),bert受到完形填空的启发,通过 “masked language model” (MLM)预训练目标来缓解前面提到的单向性约束。masked语言模型从输入中随机的遮盖一些符号,并且目标是仅仅基于上下文来预测遮盖词的原始词汇id。不同于left-toright模型的预训练,MLM目标使得表示能够融合上下文,这循序我们预训练一个深层的双向transformer。除了遮盖语言模型,我们还使用“下一句话预测”任务,联合预训练文本对表示。我们的论文的贡献如下:

    • 我们证明了双向预训练对语言表达的重要性。BERT使用掩蔽语言模型来实现预训练的深度双向表示。

    • 我们展示了预训练表示减少了对许多重型工程任务特定架构的需求。bert是第一个基于微调的表示模型,在大量的句子级和符号级任务上实现了最先进的性能,优于许多特定于任务的架构。

    • BERT推进了11项NLP任务的最新技术水平。代码和预先训练的模型可在https://github.com/google-search /bert 上获得。

    2 相关工作

    预训练一般的语言表示已经有很长的历史,我们简要的回顾一下本节中使用最广泛的方法。

    2.1 无监督的基于特征的方法

    几十年来,学习广泛适用的单词表示一直活跃在研究领域,包括非神经学和神经学方法。预训练词嵌入是现代NLP系统必不可少的部分,与从头开始学习的嵌入相比提供了显着的提高。为了预训练词的嵌入向量,使用上下文的语言建模目标,以及在上下文中区分正确和错误单词的目标。

    这些方法已被推广到更粗糙的粒度。例如句子嵌入和段落嵌入。为了训练句子表示,先前的工作已经使用目标来对下一个句子进行排名,给出了前一句子的表示,从左到右生成下一个句子的单词,或去噪自动编码器派生的目标。

    ELMo及其前身沿不同维度概括了传统单嵌入研究。它们从左到右和从右到左的语言模型中提取上下文相关的特征。每个符号的上下文表示是从左到右和从右到左表示的连接。当将上下文词嵌入与现有任务特定体系结构集成时,ELMo提出了几个主要NLP基准的最新技术,包括问题回答,情感分析和命名实体识别。提出通过任务学习上下文表示,以使用LSTM从上下文预测单个单词。与ELMo类似,他们的模型基于特征而非深度双向。Fedus等人。展示完形填空任务可用于提高文本生成模型的鲁棒性。

    2.2 无监督的微调方法

    与基于特征的方法一样,第一个在这个方向上工作的只是预先训练的来自未标记文本的字嵌入参数。

    最近,产生上下文token表示的句子或文档编码器已经从未标记的文本预训练,并对监督的下游任务进行了微调。这些方法的优点是需要从头开始学习很少的参数。至少部分由于这一优势,OpenAI GPT在GLUE基准测试许多句子级任务上取得先前最先进的结果。从左到右的语言模型和自动编码器目标已用于预训练此类模型。

    ------暂时不管下图

    img

    图1:BERT的整体预训练和微调程序。除了输出层之外,在预训练和微调中都使用相同的架构。相同的预训练模型参数用于初始化不同下游任务的模型。在微调期间,所有参数都经过微调。 [CLS]是在每个输入示例前面添加的特殊符号,[SEP]是一个特殊的分隔符号标记(例如,分隔问题 /答案)。

    2.3 从有监督数据迁移学习

    还有一些工作显示了具有大型数据集的监督任务的有效转移,例如自然语言推理(Conneau等,2017)和机器翻译(McCann等,2017)。计算机视觉研究也证明了从大型预训练模型中迁移学习的重要性,其中一个有效的方法是用ImageNet对预训练模型进行微调。

    3 bert

    本节详细记录bert的细节实现。我们的框架有两个步骤:预训练和微调。在预训练期间,模型在不同的预训练任务上训练未标记的数据。对于微调,首先用预训练的参数初始化BERT模型,并使用来自下游任务的标签数据对所有参数进行微调。每个下游任务都有单独的微调模型,即使他们使用了相同的预训练参数进行了初始化。图1中的问答系统示例将作为本节的运行示例。

    BERT的一个显着特点是它在不同任务中有着统一架构。预训练架构和最终下游架构之间存在微小差异。

    模型架构 bert模型架构是基于Vaswani 等人描述的原始实现的一个多层双向的transformer的encoder,并在发布在tensor2tensor库中。由于transformer的使用已经非常普遍并且我们的实现几乎与原始实现完全相同,我们将省略对模型架构详尽的背景描述,并向读者推荐Vaswani 等人和一些优秀的指南“The Annotated Transformer”。

    在这个工作中,我们用L表示层的数量,用H表示影藏层大小,用A表示self-attention的head数量。我们主要报告两个模型的大小:BERTBASE(L=12, H=768, A=12, Total Parameters=110M),BERTLARGE(L=24, H=1024, A=16, Total Parameters=340M)。

    为了进行比较,选择的BERTBASE与OpenAI GPT具有相同的模型大小。然而,重要的是,BERT Transformer使用双向的self-attention,而GPT Transformer使用有约束的self-attention,其中每个token只能处理其左侧的上下文.

    输入/输出表示 为了使bert处理一系列的下游任务,我们的输入表示能够在一个token序列中明确的表示单个句子和一对句子。在整个工作中,一个“句子”可是是任意一段连续的文本,而不是实际语言的句子。一个“句子”指的是输入BERT的token序列,这个序列可以是单个序列或者是两个序列连在一起。

    我们使用带有30000个token的词汇表做WordPiece嵌入,每个序列的第一个token都是一个特殊的分类符号([CLS])。与该token相对应的最终隐藏状态用作分类任务的合计序列表示(??)。句子对打包在一起成为单个序列,我们有两种方式区分句子。第一我们使用特殊的token([SEP])将句子分开,其次,我们在每个标记中加入一个学习嵌入,表明它是属于句子a还是句子B。如图1所示,我们用E表示输入嵌入,特殊token[CLS]的最终的影藏向量为C,和 ith 输入token最终隐藏向量为Ti

    对于给定的token,其输入表示通过对相应的token,段和位置嵌入求和来构造。这种结构的可视化可以在图2中看到。

    3.1 预训练BERT

    我们没有使用从左到右或者从右到左的语言模型来训练bert。相反,我们使用本节中描述的两个无人监督的任务来预训练BERT。该步骤在图1的左侧部分中给出。

    任务1:Masked LM直观的说,我们有理由相信深度的双向模型比一个从左到右模型或是一个浅层的左到右或右到左的模型更加强大。因为双向调节会允许每个单词间接地“看到自己”,并且模型可以在多层次的语境中对目标词进行简单的预测。

    前者通常被称为“transformer encoder”,然而仅仅用于上下文的版本被称为“transformer decoder”,因此它可以被用于文本生成。

    为了训练深度双向的表示,我们只是随机的屏蔽一定百分比的输入token,然后去预测那些遮盖掉的token。我们将这个过程称为是“masked LM”(MLM),尽管它在文献中通常被称为完形任务。在这种情况下,对应于mask token的最终的隐藏向量通过词汇表输出softmax,如标准的LM。在我们所有的实验中,我们随机屏蔽每个序列中所有的WordPiece token的15%。和去燥的auto-encoder相比,我们只预测掩蔽的单词而不是重建整个输入。

    虽然这允许我们获得双向预训练模型,但缺点是我们在预训练和微调之间产生不匹配,因为微调期间 [MASK] 不会出现。为了缓解这个问题,我们并不总是用实际的 [MASK] token替换“masked”词。训练数据生成器随机选择15%的token位置进行预测。如果选择了第i个token,我们将第i个token(1)80%的情况替换为[MASK] token(2)10%的情况替换为随机的token(3)10%的情况保持不变。然后Ti 将用于预测具有交叉熵损失的原始token。我们比较了附录C.2中该过程的变化。

    任务2: 下一句话预测(NSP)许多重要的下游任务,例如问答(QA)和自然语言推理(NLI),都是基于理解两个句子之间的关系,而不是由语言建模直接捕获的。为了训练理解句子关系的模型,我们预训练了二进制的下一句预测任务,该任务可以从任何单语语料库中轻松的生成。具体而言,当为每个预训练例子选择句子A和B时,50%的情况下,B是A后面的下一个句子(标记为IsNext),并且50%的情况,B是来自语料库的随机句子(标记为作为NotNext)。正如我们在图1中所示,C用于下一句话预测(NSP),尽管它很简单,但我们在5.1节中演示了对这项任务的预训练,对QA和NLI都是非常有益的。NSP任务与Jernite等人使用的表征学习目标密切相关。 然而在以前的工作中,只有句子嵌入被转移到下游任务,其中BERT传输所有参数以初始化最终任务模型参数。

    img

    图2:BERT输入表示。输入嵌入是令token嵌入,分段嵌入和位置嵌入的总和。

    训练前数据 预训练过程很大程度上遵循了有关语言模型预训练的现有文献。我们使用BooksCorpus(800M字)(Zhu等,2015)和英语维基百科(2,500M字)作为预训练语料库。对于维基百科,我们只提取文本段落并忽略列表,表格和标题。为了提取长连续序列,关键是要使用文档级的语料库,而不是像Billion Word Benchmark 这样打乱的句子级语料库。

    3.2微调BERT

    微调简单直接的,因为Transformer中的自注意机制允许BERT通过交换适当的输入和输出来模拟许多下游任务 - 无论它们是单文本还是文本对。对于涉及文本对的应用,常见的模式是在应用双向交叉注意之前独立编码文本对,例如Parikh等人;BERT使用self-attention机制来统一这两个阶段,因为编码具有自关注的连接文本对有效地包括两个句子之间的双向交叉关注。对于每个任务,我们只需将任务特定的输入和输出插入到BERT中,并将所有参数端到端地输入。在输入中,来自训练前的句子A和句子B类似于(1)对句子进行释义,(2)暗含的 hypothesis-premise 对(3)问答中的问答对,以及(4)在文本分类或序列标记,退化text-∅ 对。在输出中,token表示被馈送到用于符号级任务的输出层,例如序列标记或问题应答,并且[CLS]表示被馈送到输出层以用于分类,例如entailment 或是情感分析。

    与预训练相比,微调相对容易。从完全相同的预训练模型开始,本文中的所有结果可以在单个云TPU上最多1小时复现,或者在GPU上几小时复制。在第四节相应的小节中,我们描述了任务特定的细节。更多细节可以在附录A.5中找到。

    4 实验

    在本节中,我们将介绍11个NLP任务的BERT精细调整结果。

    4.1 GLUE

    一般语言理解评估(GLUE)基准是各种自然语言理解任务的集合。GLUE数据集的详细说明见附录B.1。

    为了在GLUE上微调,我们回忆第3节中描述的输入序列(单个句子或句子对),并使用与第一个输入符号([CLS])对应的最终隐藏向量img作为聚合表示。在微调期间引入的唯一新参数是分类层权重img img,其中K是标签的数量。我们用C和W计算标准分类损失,即 img

    img

    表1:评估服务器(https://gluebenchmark.com/leaderboard)评分的GLUE测试结果。每个任务下面的数字表示训练样例的数量。“Average“列与官方GLUE分数略有不同,因为我们排除了有问题的WNLI集合。BERT和OpenAI GPT是单模,单任务。报告QQP和MRPC的F1分数,报告STS-B的Spearman相关性,并报告其他任务的准确性分数。我们排除使用BERT作为其组件之一的项。

    对于所有GLUE任务,我们使用批量大小为32并对3个epochs的数据进行微调。对于每项任务,我们在开发集上选择了最佳的微调学习率(5e-5,4e-5,3e-5和2e-5)。此外,对于BERTLARGE,我们发现微调有时在小数据集上不稳定,因此我们进行了几次随机重启,并在开发集上选择了最佳模型。通过随机重启,我们使用相同的预训练的检查点,但执行不同的微调数据和分类层的初始化。结果如表1所示。BERTBASE和BERTLARGE在所有任务上都大大优于所有任务,与现有技术相比,平均准确度提高了4.5%和7.0%。请注意,除了注意力masking之外,BERTBASE和OpenAI GPT在模型架构方面几乎完全相同。对于最大和最广泛报告的GLUE任务,MNLI,BERT获得4.6%的绝对精度提高。在官方GLUE排行榜中,BERTLARGE得分为80.5,截至撰写之日,而OpenAI GPT获得72.8分。

    我们发现BERTLARGE在所有任务中都明显优于BERTBASE,特别是那些训练数据非常少的人。第5.2节将更详细地探讨模型尺寸的影响。

    4.2 SQuAD v1.1

    斯坦福问答数据集(SQuAD v1.1)是一个有100k问答对的集合。给定一个问题以及Wikipedia中包含答案的段落,任务是预测段落中的答案文本范围。

    如图1所示,在问题回答任务中,我们将输入问题和段落表示为一个单独压缩序列,问题使用A嵌入和段落使用B嵌入。在微调期间我们只引入了一个起始向量img和一个结束向量img。单词 i 作为答案开始的概率,计算img和S之间的点积,然后是段落中所有单词的softmax:img。类似的公式用于答案的末端。从位置i到位置j的候选跨度的得分被定义为img,以及img用作预测的最大得分跨度。训练目标是正确的开始和结束位置的概率的总和。我们进行3个epoch,学习率为5e-5,批处理大小为32。

    表2显示了顶级排行榜条目以及来顶级发布系统的结果。SQuAD排行榜的最高结果并没有最新的公共系统描述,并且在训练他们的系统时可以使用任何公共数据。因此,在SQUAD上进行微调之前,我们通过TriviaQA的第一次微调,在我们的系统中使用适度的数据增强。

    我们表现最佳的系统在整体排名中优于顶级排行榜系统+1.5 F1,在单一系统中优于顶级排行榜系统+1.3 F1。事实上,我们的单一BERT模型在F1得分方面优于顶级全体系统。如果没有TriviaQA微调数据,我们只会损失0.1-0.4 F1,仍然大幅超越所有现有系统.

    img

    表2:SQuAD 1.1结果。 BERT系列是7x系统,它使用不同的预训练检查点和微调种子。

    img

    表3:SQuAD 2.0结果。我们排除使用BERT作为其组件之一的项。

    4.3 SQuADv2.0

    SQuAD 2.0任务通过允许在所提供的段落中没有简短答案的可能性扩展了SQuAD 1.1问题的定义,从而使问题更加实际。

    对此任务我们使用一种简单的方法来扩展的SQuAD v1.1 BERT模型。我们将没有答案的问题视为具有从img符号处开始和结束的答案范围。开始和结束答案范围位置的概率空间被扩展为包括img符号的位置。对于预测,我们将无应答范围:img img的得分与最佳非零范围img = img的得分进行比较。我们在img中预测非空答案,其中在开发集上选择阈值τ以最大化F1。我们没有此模型上使用TriviaQA数据。我们微调了2个epoch,学习率为5e-5,batch size为48。

    img

    表4:SWAG开发和测试精度。 †如SWAG论文所述,人类表现用100个样本测量。

    结果与之前的排行榜条目和顶级出版作品相比较,如表3所示,不包括使用BERT作为其组件之一的系统。我们观察到比之前的最佳系统提高了+5.1 F1。

    4.4 SWAG

    具有对抗性生成的情况(SWAG)数据集包含113k个句子对完成示例,其评估基于常识的推论。给出一个句子,任务是在四个选择中选择最合理的继续。

    当对SWAG数据集进行微调时,我们构造了四个输入序列,每个输入序列包含给定句子(句子A)的连接和可能的继续(句子B)。引入的唯一任务特定参数是向量,其与imgtoken的表示C的点积,表示每个选择的得分,并使用softmax层对其进行归一化。

    我们微调模型,使用3个epoch,学习率为2e-5,batch size为16。结果如表4所示。BERTLARGE的比作者的基线ESIM + ELMo系统高+ 27.1%,比OpenAI GPT 高8.3 %。

    5 Ablation 研究

     

     

    6 结论

    由于使用语言模型进行转移学习,最近的经验改进表明,丰富的,无监督的预训练是许多语言理解系统的组成部分。特别是,这些结果使得即使是低资源任务也能从深度单向架构中受益。我们的主要贡献是进一步将这些发现推广到深度双向架构,允许相同的预训练模型成功解决一系列广泛的NLP任务。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    C#DataGridView的简单使用
    Python实现简单登陆验证(文件操作)
    【hive】centos7下apache-hive-3.1.2-bin的安装测试
    【mysql】centos7下mysql的安装以及基本操作
    【hadoop】细读MapReduce的工作原理
    【hadoop】看懂WordCount例子
    【hadoop】在eclipse上运行WordCount的操作过程
    纪念一下,时隔多年,继delphi上成功运行sql之后
    【Linux下Hadoop-eclipse-plus-3.2.0】编译Hadoop连接eclipse的插件遇见的一系列错误,崩溃的操作
    数据挖掘初次接触!学习代码
  • 原文地址:https://www.cnblogs.com/zhanghaiyan/p/12152664.html
Copyright © 2011-2022 走看看