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

BERT是NLP领域的里程碑,通过预训练和微调的结构,展示了深度双向预训练语言模型在多任务上的优越性。它引入了Masked LM和Next Sentence Prediction任务,推动了预训练+微调的模式。尽管存在预训练和微调不匹配、模型规模和参数量大等问题,BERT仍刷新了多项NLP任务的性能记录,激发了后续如XLNet和ALBERT等模型的发展。

自然语言处理过去几年最重要的文章之一,NLP领域在BERT之前一直没有一个深的神经网络训练好之后应用在其他任务上面,很多时候都是每个人对自己的任务训练一个网络,BERT出现之后,NLP领域可以在一个比较大的数据集上,训练好一个比较深的神经网络,然后应用在很多NLP任务上面,既简化了训练过程,又提升了性能,使得NLP领域得到质的飞跃。
导读:大规模预训练语言模型的启示性工作.

  • (1) BERT最大的贡献是什么,说3点?扩展性的阅读后续工作,并从你的理解说一说它有哪些不足,3点?
  • 贡献
    • 证明深度双向预训练语言模型的重要性,
    • 采用pre-training fine-tuning的结构,预先训练的表示免去了许多工程任务需要针对特定任务修改体系架构的需求。 BERT是第一个基于微调的表示模型,它在大量的句子级和token级任务上实现了最先进的性能,强于许多面向特定任务体系架构的系统。直接带动了pretrain+finetune的预训练模型的时代
    • BERT刷新了许多NLP任务的性能记录。
  • 不足
    • 由于MLM,预训练数据中有[MASK],而微调时没有,导致预训练和微调之间的不匹配
  • 针对预训练和微调数据之间的不统一,XLNET采用AR(autoregressive)模型进行改进,AR模型的主要任务在于评估语料的概率分布
  - 针对中文任务,BERT按汉字分词,训练得到的是单个汉字的向量表示,但在现代汉语中,单个汉字远不足以表达像词语或短语那样丰富的含义,所以BERT在很多中文任务上表现并不好;
  •  针对中文任务改进,百度提出了ERNIE,通过对训练数据中的词法结构,语法结构,语义信息进行统一建模,极大地增强了通用语义表示能力,在多项任务中均取得了大幅度超越BERT的效果。
    
  - 在预训练NLP时,增加模型大小通常会提高下游任务的性能,但是由于GPU/TPU内存的限制和训练时长,这导致进一步增加模型大小变得很困难
  • ALBERT(A Little BERT),一个精简版的BERT模型,增加模型规模但是减少参数量,提出两种参数减少的方式(词向量因式分解和跨层参数共享),以降低内存消耗和提高BERT的速度。虽然ALBERT的参数量少,但由于模型规模变大了,训练时间和推理速度也变慢了,特别是xlarge和xxlarge模型。
    • 学习效率太慢,BERT从一个样本中只能学到15%的token信息
  • 提出ELECTRA
  • (2) Pretrain和Fine-tune的区别在哪里?
    • 预训练 就是指预先训练的一个模型或者指预先训练模型的过程;微调 就是指将预训练过的模型作用于下游任务,也就是用在自己的数据集上,并使参数适应自己数据集的过程。

摘要

:::info
本文提出了BERT,它是基于Transformer的双向编码表示。
:::
它与之前的语言表示模型不一样,主要列举了两篇文章进行对比:

  • ELMO(Embeddings from Language Models,2018)模型,使用双向编码的词向量表征模型,采用的是LSTM架构
  • GPT(Generative Pre-trained Transformer,2018年OPENAI基于transformer提出),是基于transformer的单向语言模型,用左侧的上下文信息预测未来

BERT通过联合调节所有层中的左右上下文信息来预训练未标记文本的深度双向表示。因此,预训练的 BERT 模型可以通过一个额外的输出层进行微调,从而适用于NLP领域中的很多任务,并取得较好的效果,例如问答和语言推理,同时无需对特定任务的架构进行大量修改。
在摘要的第二段,作者说明BERT的想法很简单,但效果很好,在11个NLP任务上获得了sota的效果。(列举了好几个任务,都是先讲bert的绝对精度是多少,然后讲和当时最好的模型相比提升了多少)

1 Introduction

语言预训练模型已经被证明可有效改善NLP任务,这些任务主要可分为两类:

  • sentence-level task,句子级别的任务,如自然语言推理、句子解释等,主要通过整体分析建模这些句子之间的关系;
  • token-level,词元层面的任务,如命名实体识别和问答,这样的任务需要输出一些细腻度的词元层面的输出。

将预训练语言表示应用于下游任务有两种现有策略:

  • 基于特征(feature-based),如ELMO,对每一个任务使用特定的架构,把预训练好的表示作为附加特征,和原有的输入一起输入到模型里面(这些预训练好的特征已经有比较好的表示,所以使得模型训练起来比较容易,这是NLP使用预训练模型常用的做法)
  • 基于微调(fine-tuning),如GPT,把预训练好的模型应用到下游任务时,只需要简单地微调所有预训练参数即可对下游任务进行训练。

作者认为当时的技术限制了预训练表征的能力,尤其是微调方法。主要限制是标准语言模型是单向的,这限制了可以在预训练期间使用的体系结构的选择。例如,在 OpenAI GPT 中,作者使用从左到右的架构,其中每个标记只能关注 Transformer 的自我注意层中的先前标记。这样的限制对于sentence-level任务来说是次优的,并且在将基于微调的方法应用于token-level任务(例如问答)时可能非常有害,因为在这些任务中,从两个方向结合上下文是至关重要的。
本文中,作者提出BERT解决了语言模型是单向的这一限制,使用了带掩码的语言模型(Masked-language model,MLM)。masked language model做的事就是 从输入中随机选一些token遮住,目标是仅基于遮住的词汇的上下文预测原始词汇(类似于完形填空)。跟标准的语言模型不同的是,MLM能够融合左右上下文的信息,这使得能够预训练深度双向transformer,在带掩码的语言模型之外,作者还训练了另一个任务,叫“next sentence task”(就是给出两个句子,判断这两个句子是相邻的 还是随机采集得到的两个句子,这使得BERT可以学习到句子层面的一些信息)。

2 Related Work

2.1 无监督的feature-based方法

学习广泛适用的单词表示几十年来一直是一个活跃的研究领域,包括non-neural和neural方法。预训练词嵌入是NLP系统不可或缺的一部分。词嵌入方法已被推广到更粗粒度,如句子嵌入和段落嵌入。
ELMo 及其前身 从不同的维度概括了传统的词嵌入研究。他们从从左到右和从右到左的语言模型中提取上下文相关的特征。每个标记的上下文表示是从左到右和从右到左表示的串联。当将上下文词嵌入与现有的特定于任务的架构相结合时,ELMo 提高了几个主要 NLP 基准的技术水平:包括问答、情感分析、命名实体识别等。

2.2 无监督的Fine-tuning方法

与基于特征的方法一样,在fine-tuning领域的第一个方法只使用来自未标记文本的预训练词嵌入参数。
随后的方法中,生成上下文标记表示的句子或文档编码器已经从未标记的文本中进行了预训练,并针对受监督的下游任务进行了微调。这些方法的优点是需要从头开始学习的参数很少。至少部分由于这一优势,GPT在GLUE基准测试的许多句子级任务上取得了先前SOTA的结果。

2.3 从监督数据迁移学习

有一些工作表明,从具有大型数据集的监督任务中可以有效迁移,如自然语言推理、机器翻译等。计算机视觉研究还证明了从大型预训练模型进行迁移学习的重要性,其中一个有效的方法是微调使用 ImageNet 预训练的模型

3 BERT

BERT的框架由两个步骤组成:1)pre-training;2)fine-tuning。
在预训练期间,模型在不同的预训练任务上使用未标记的数据进行训练。对于微调,BERT 模型首先使用预训练参数进行初始化,然后使用来自下游任务的标记数据对所有参数进行微调。每个下游任务都有单独的微调模型,即使它们是使用相同的预训练参数初始化的。
BERT 的一个显着特点是其跨不同任务的统一架构。预训练架构和最终下游架构之间的差异很小。

Model Architecture

BERT 的模型架构是基于 “Attention is all you need”中描述的transformer的原始实现以及在 tensor2tensor 库中发布的多层双向 Transformer 编码器。
符号说明:层数(transformer块)LLL;隐藏层大小(hidden size)HHH;自注意力头的数量AAA
本文设计了两种模型:

  • BERTBASEBERT_{BASE}BERTBASE(L=12,H=768,A=12,总参数=110M),模型参数和GPT差不多,可以做个对比
  • BERTLARGEBERT_{LARGE}BERTLARGE(L=24,H=1024,A=16,总参数=340M),用来刷榜

image.png

Input/Output Representations

之前的下游任务有些是处理一个句子,有些是处理两个句子,网络使BERT能够处理各种下游任务,BERT的输入既可以是一个句子,也可以是一个句子对。具体来说,一个“句子”是任意一段连续的文本,而不一定是一个实际的语言句子。 “序列”是指输入给 BERT 的 token 序列,它可以是单个句子,也可以是两个句子打包在一起。

:::info
这个和transformer是不一样的,transformer的输入是一个序列对,即在编码器和解码器都会有一个输入,BERT只有一个编码器,为了能处理两个句子,必须把两个句子变成一个序列。
:::

序列构成
本文使用具有 30,000 个标记词汇表的 WordPiece 嵌入

如果按照空格切词,一个词作为一个token,由于数据量相对较大,会导致字典较大,可能会到百万级别,这样的话会导致整个学习参数大部分都在嵌入层里面,WordPiece的想法是:如果一个词出现的概率低的话,那么应该把这个词切开,看它的一个子序列,如果它的子序列(可能是词根)出现概率较高的话,那么只需要保存子序列即可,可以做到把很长的词切成一个一个的片段,这样的话就可以用一个较小的字典来表示一个较大的文本了)

每个序列的第一个标记总是一个特殊的分类标记([CLS])。该标记对应的最终隐藏状态用作分类任务的聚合序列表示。句子对被打包成一个序列。我们以两种方式区分句子。首先,我们用特殊标记 ([SEP]) 将它们分开。其次,我们为每个标记添加一个学习嵌入,指示它是属于句子 A 还是句子 B。如图 1 所示,我们将输入嵌入表示为 E,特殊 [CLS] 标记的最终隐藏向量为C∈RHC ∈ R^HCRH,第 i 个输入标记的最终隐藏向量为Ti∈RHT_i ∈ R ^HTiRH

在这里插入图片描述

对于每一个token,其输入BERT的向量表示是通过对token本身的embedding、segment embedding(在哪一个句子)和position embedding求和来构建的。这种结构的可视化如下图所示:
image.png

3.1 Pre-training BERT

做预训练有两个部分比较重要,1)目标函数2)数据

与ELMO和GPT都不同,本文不使用传统的从左到右或从右到左的语言模型来预训练 BERT。
相反,使用**Masked LM **和 **Next Sentence Prediction(NSP)**这两个无监督任务对 BERT 进行预训练。

Task1 #1:Masked LM

深度双向模型比从左到右模型或从左到右和从右到左模型的浅层级联更强大。但标准的条件语言模型只能从左到右或从右到左进行训练,因为双向条件会让每个词间接地“看到自己”,并且模型可以简单地预测多层中的目标词语境。
具体操作,对于从WordPiece得到的token,以一定的比例随机遮住其中的一些token(把token换成[MASK]),然后预测遮住的这些token的真实值,这个过程就是Masked LM(MLM)。在本文的实验中,这个比例为15%,然而,作者也提到,虽然这个操作使得可以获得双向预训练模型,但由于在fine-tuning过程中,是没有这个MLM任务的,这就会导致预训练的数据和微调的数据不一致。
为了解决这个问题,作者对随机选中的15%的token采用以下做法:

  • 以80%的概率替换成[MASK]
  • 以10%的概率随机替换成其他的词
  • 以10%的概率使其保持原样

这个80%,10%,10%是作者根据实验的效果确定的比例

image.png

Task1 #2:Next Sentence Prediction(NSP)

问答 (QA) 和自然语言推理 (NLI) 等许多重要的下游任务都是基于理解两个句子之间的关系,而语言建模并不能直接捕捉到这种关系。为了训练一个理解句子关系的模型,本文预训练了一个二值化的NSP任务,具体来说,就是输入序列中有两个句子A和B,有50% 的可能B是A的下一个句子,标记为IsNext,50%的可能是语料库中的随机句子,标记为NotNext(也就是50%的正例,50%的负例)
image.png
NSP任务和之前部分工作中使用的表征学习目标十分相关,但在之前的工作中,只有句子的embedding被转移到下游任务,BERT把所有的的参数都以初始化的方式转移到下游任务。

Pre-training data

两个数据集:

  1. BooksCorpus(800M words)
  2. English Wikipedia(2,500M words)

3.2 Fine-tuning BERT

transformer是编码器解码器架构,但是编码器是看不到解码器的东西的,BERT把两个句子打包成句子对都放进去了,所以self-attention机制可以两端都能看到,这样的话BERT针对不同的下游任务只需要设计适当的输入输出,不需要怎么改动模型结构。

和transformer相比,BERT没法做seq2seq的机器翻译任务。

对于每项任务,只需设计任务特定的输入和输出做预训练,然后端到端地微调所有参数。在输入端,来自预训练的句子 A 和句子 B 类似于

  • (1) 释义中的句子对,
  • (2) 蕴涵中的假设-前提对,
  • (3) 问答中的问题-段落对,
  • (4)文本分类或序列标注中的 degenerate text-∅对

和预训练相比,微调消耗的资源较少,从完全相同的预训练模型开始,单个 cloud tpu在1个小时以内,gpu需要几个小时

4 实验

实验部分介绍了BERT在11个下游任务的微调结果。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值