BERT

2018年,对于NLP领域来说是最让人激动的一年。先后诞生的ELMo、GPT、BERT在预训练语言模型方面的成功给NLP领域的研究带来了新的姿势。特别是BERT(Bidirectional Encoder Representations from Transformers),在11项自然语言任务上刷新了最好成绩,同时BERT论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》获得NLP领域顶会NAACL 2019的最佳论文奖。

BERT抛弃了传统的RNN和CNN,主要结构是多层Transformer,其中Self Attention机制将任意位置的两个词之间距离转换成1,有效解决了长期依赖问题。

原论文中提到两种不同规模的BERT:BERTbase 和BERT large。其中,base版本有12个隐藏层,768个隐层单元,每个Attention有12个头,参数量达到110M;large版本有24个隐藏层,1024个隐藏层,每个Attention有16个头,参数量更是达到了340M。其网络结构如下图所示:

1.png

与之前的预训练模型一样,BERT也分两个阶段: pre-training和fine-tuning。

2.png

pre-training

BERT采用两种无监督任务来做预训练,一个是token-level的Masked Language Model,另一个是sentence-level的Next sentence Prediction。两个任务同时进行,因此BERT的损失函数是两者损失函数叠加。

1、Masked Language Model

在说MLM之前,我们需要意识到一个问题。语言模型如果使用双向的,会出现数据泄露问题。也就是说,模型可以间接知道要预测的词。这也是ELMo使用两个独立的双向模型的原因。

MLM的提出正是为了解决这个问题,具体做法是随机遮蔽输入序列中15%的单词作为训练样本:

  • 80%用[MASK]代替;
  • 10%用随机词代替;
  • 10%保持不变;

这里只有15%的词被遮蔽原因是性能开销,双向编码器比单向编码器训练要慢。只选其中的80%做mask,是因为mask标记只存在于预训练阶段,在下游任务中输入并没有mask。10%用随机词,10%保持不变,原因是让编码器不知道哪些词需要预测,哪些词是错误的,因此被迫需要学习每一个词的表示向量。

2、Next Sentence Prediction

预训练一个二分类模型来学习句子之间的关系,预测下一个句子的方法对学习句子间关系很有帮助。具体做法:正样本,给定句子A和B,其中B是A在实际语境中的下一句; 负样本,句子B是语料库中随机选择的。通过两个特定的token [CLS]和[SEP]来串接两个句子。 正负样本各占一半。

3.png

输入

BERT的输入编码向量(长度512)是由三个特征向量叠加的。

4.png
1、Input Embeddings

每个输入序列的第一个token [CLS]专门用来分类,利用此位置的最后输出作为分类任务的输入embedding。在预训练时,[CLS]不参与mask,因而该位置面向整个序列的所有position做attention,[CLS]位置的输出足够表达整个句子的信息,类似一个global feature。单词token对应的embedding更关注该token的语义语法及上下文信息表达,类似一个local feature。

2、Position Embeddings

由于transformer无法获得字的位置信息,BERT也加入了绝对位置编码,但和transformer不同的是:transformer的位置编码是通过sin和cos构造出来的,这里Position Embeddings直接采用类似word embedding的方式直接获得位置编码。

3、Segment Embeddings

在预训练的句子对预测任务及问答、相似匹配等任务中,需要对前后句子做区分。将句对输入同一序列,以特殊标记 [SEP] 分割,同时对第一个句子的每个token添加Sentence A Embedding;第二个句子添加Sentence B Embedding,实验中让EA=1,EB=0。

Fine-tune

5.png

针对不同任务,BERT采用不同部分的输出做预测。由上图可以知道,BERT有两种输出:Pooler output(对应[CLS]位置的输出)和 Sequence output(对应的是序列中所有词的最后一层hidden输出)。

1、分类/回归任务(利用Pooler output)
  • Single sentence Classification tasks,例如:文本分类,我想听音乐,分到音乐这个domain);
  • Sentence Pair Classification tasks,例如:自然语言推断任务(NLI),给定前提,推断假设是否成立;
  • 回归任务,回归其实是分类的一种特殊形式,最后输出的是一个数值而不是具体的某个类别概率;例如:文本相似度,可以判断两个句子是不是类似,得到的具体分数。
2、序列任务(利用Sequence output)
  • 命名实体识别(NER);
  • 完形填空(Cloze task),其实这就是BERT预训练的一种任务;
  • SQuAD(Standford Question Answering Dataset)task,SQuAD任务输入是D、Q,其实D是该篇文章,Q是问题,返回的结果是答案开始词的位置s和结束词的位置e;

Experiments

说了这么多,我们来看看当初霸榜的BERT与先前的模型对比成绩到底如何:

6.png

最后

BERT采用Pre-training和Fine-tuning两阶段训练任务,在Pre-training阶段使用多层双向transformer,并采用Masked LM 和 Next Sentence Prediction两种训练任务解决token-level和sentence-level问题,为下游任务提供了一个通用模型框架。

在NLP领域,BERT具有里程碑意义,对后续的研究产生了深远影响。

但是我们站在当前时间点回头看,BERT自身也存在一些缺点,后续文章中会介绍到BER的缺点和优化。

参考:

https://arxiv.org/abs/1810.04805

https://zhuanlan.zhihu.com/p/48612853

你可能感兴趣的:(BERT)