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

1. 简介

大名鼎鼎的BERT,基于目前流行的transformer结构,一经推出就刷新了11个NLP任务的SOTA。并且模型可以直接接入到下游任务,从而受到广大机器学习从业者的追捧。那么bert到底是什么呢?
bert的作者声称,预训练的下游任务有两种:
A. 整句级别的,关注句子之间关系的自然语言推断和句子释义。
B. 单词级别的,比如命名实体识别和问答。

预训练模型如何使用也有两种流派:基于特征和基于精调。其中:
A. 基于特征的就是以elmo为代表,把预训练结果的单词表示当做下游任务的一个额外特征。
B. 基于精调就类似GPT,直接把GPT作为底层模型,外加一个softmax或者其他什么直接做分类任务,让整个模型重新训练。

作者比较看好基于精调的模型,并且他们声称,当时的精调流派大都采用单向语言模型,这在单词级别的下游任务中非常不利。因此作者以transformer的结构为基础,利用mask技术[1]来达到双向语言模型的效果。并且在目标函数中整合单词级别的预测和整句级别的上下文承接的损失函数,同时兼顾两种下游任务。作者将该模型命名为bert(Bidirectional Encoder Representations from Transformers)。该项目已经开源,链接在这里.
下面就来看一下,作者是如何设计模型结构的吧。

2. 背景研究介绍

bert模型综合了三个基准点:双向语言模型、预训练模型+精调方法用于下游任务、单词级别与整句级别的下游任务。这些idea都不是bert首创的,回顾这几个方向的研究,有助于我们更好的理解bert模型。

2.1 无监督+基于特征

很久以来,大家都在研究,如何才能让模型学习到一种非常的表示。大家尝试过非神经网络的模型[2],神经网络模型[3]。现代NLP方法中,从不需要标记的文本中进行无监督的预训练,得到单词的嵌入表示,这是一种常见的方法了。这种方法极大的提升了各种NLP任务的表现。为了得到进行无监督训练,常用来构造损失函数的手法就是应用从左到右的单向语言模型。
嵌入表示的方法不仅用于单词,还应用到了更粗力度的句子甚至段落上。为了得到表示句子的嵌入向量,之前用到过的目标函数有:pair-wise的句子排序的方法、给出左边的句子向量,生成右边的句子、降噪自编码偏导[4](这个是啥完全看不懂)。
ELMO则开创了双向语言模型,把两个方向的向量concate起来,并且把每一层的隐变量拿出来做线性变换得到下游任务中的单词表示。这种方法适用于上下文敏感的单词表示场景,不管是单词级别的下游任务还是整句级别的下游任务。
还有研究表明,完形填空这种任务可以有效的提高文本生成模型的鲁棒性[5]。

2.2 无监督+精调

用无标签的文本数据来构造训练集进行无监督的预训练,并且把预训练的结果套一层有监督训练进行精调。这种上游模型用于下游的任务的方法也很流行,该方法的优势在于只有很少的参数需要学习。正是由于这个原因,GPT可以在整句级别的下游任务中取得新的SOTA。这些模型的预训练部分大都采用从左到右的单向语言模型+自编码的方式来构造目标函数。

2.3 迁移学习

这种预训练模型用于下游任务+精调的方法也叫做迁移学习。这种做法不应用在NLP领域,在CV领域也有应用,比如Image-Net[6]。

3. BERT模型

bert模型分两步:预训练和精调。本节的fine tuning 使用的是问答任务。bert模型的重要特点就是它的预训练是多任务的,这就使得bert可以广泛用于不同的下游任务。

3.1 bert模型结构图

image.png

bert所用的transformer结构就是经典transformer,这个结构的论文可以看[7],代码可以直接用tensorflow中的实现。
L表示使用了多少个transformer,H表示隐层大小, A表示多头自注意力的个数,前馈层大小统一为4H。
作者做了两个规模的模型:BERTBASE (L=12, H=768, A=12, Total Parameters=110M) 和BERTLARGE (L=24, H=1024,A=16, Total Parameters=340M)。

3.2 输入/输出的表示

因为要用两个句子作为输入,所以序列可以指代一句,也可以指代两个句子。用了wordpiece,所以可以不是完整的单词。用两种方式来标记一个序列中的两个句子,一是用分隔符< Sep > ,二是每个wordpiece都有标记它到底属于A还是B。E代表输入向量,C代表最后一层的句子开始符,第i个token记为Ti。
最终的输入是token、segment和position embedding的加和,如图2所示:


image.png

3.3 预训练

预训练有两个目标:语言模型目标和下文预测目标
语言模型目标
双向语言模型在预测当前词的时候,会用到其上下文信息(类似 word2vec 里的 CBOW 模式),而 transformer 自带了全局的 self-attention,会将上下文的词编码到当前模型里,所以在预测其他词的时候,该词的信息已经包含在了前一层的网络参数里,导致间接地『自己预测自己』


image.png

不严谨地解释下:(左图)在预测 T1 的时候,transformer 模块(红框所示)已经将 T2 的信息编码进去了,所以(右图)在预测 T2 的时候,transformer 模块里,已经包含了 T2 的信息,也就是 Jacob 说的 『see themselves』。
为了解决双向语言模型中可以间接看到自己的问题,干脆把目标词永远替换成mask符号,然后反过来预测这些mask原来的词。作者将这个称之为mask lm(这不就是完形填空吗)。正常的auto-encoder的损失函数为所有单词自预测的损失,而我们的目标函数仅包含预测mask的损失。mask的比例为15%。
不过这样做有个坏处,就是会导致训练和预测时样本结构不一致(训练时如果一句话中恰好有两个词被替换了,那该样本的输入可能会有mask符号,而预测时则永远不会有mask)。因此作者又做了一下妥协,把已经选中要替换为mask的单词(也就是会进入目标函数的部分)有10%的概率替换成其他单词,又有10%的概率保持不变。
不严谨的说,在一段长度为200的语料中,作者会选30个单词作为自编码的目标函数,而这30个单词中,3个单词是保持原样不变的(也就是可能会出现自己看到自己的问题,如果某个句子中恰好包含了这3个单词中的2个,其中一个是目标,另一个会作为输入的一部分,那就see-themselves了,但是当做输入或目标的话就没问题),3个单词是替换成其他单词的(也就是说如果某个句子的输入恰好包含了这3个单词中的1个,那其实就是拿异常的样本去训练模型了,但是如果当做输出的话就没什么影响)。剩下的24个全都换成mask符号(一旦被当做输入,就会出现前面说的跟预测时不一致的问题)。这样可以稍微缓解一下训练样本中出现mask的问题。
下一句子预测(next sentence prediction,NSP)
许多NLP任务是需要判断两个句子的关系的,比如问答和自然语言推断。但是语言模型并不能很好的捕捉这样的信息。所以从语料中抽取样本时,作者抽取50%的样本的两个句子是连在一起,50%的概率是不连着的。然后把C(最后一层的句子开始符)作为输出层的输入。本文中nsp目标函数的构建跟[8][9]是一样的。区别是之前的研究下游任务仅仅利用句子的向量,bert模型需要把整个模型结构和参数都接入到下游任务中(因为要fine-tune嘛)。
预训练数据
BooksCorpus、English Wikipedia

3.4 fine-tune

作者说bert的fine-tune是非常简单的,只需要end to end的跑数据,调参就行了。(也许这也解释了它为什么被大家追捧)。根据下游任务的不同,输入为:
(1) sentence pairs in paraphrasing
(2) hypothesis-premise pairs in entailment
(3)question-passage pairs in question answering
(4) a degenerate text-? pair in text classification or sequence tagging
如果是序列标注或者问答任务,就拿token级别的输出再套一层输出层。
如果是上下文承接判断或者情感分析,就把[CLS]的token拿出来放到输出层。
在TPU上,1小时就可以完成精调,用GPU也只需数小时。

4. 数据实验

4.1 GLUE数据集(General Language Understanding Evaluation benchmark)

image.png

作者用了3个epoch就能完成训练。可以看到,bertbase和bertlarge都明显好于SOTA,分别取得了4.5%和7%的提升。注意bertbase并不会比GPT的模型更复杂,这充分说明了bert模型结构中attention mask的合理性。对于MNLI,bert取得了4.6%的绝对提升。而bertlarge模型在所有任务中表现都比bertbase更好,5.2中探究了bert模型复杂程度的影响。

4.2 squad

对于问答任务,作者把问题和段落的序列作为A和B输入到模型中,使用开始符S和结束符E作为下游任务的输入。对段落中每个单词Ti都乘以S,然后套一个softmax,就是该单词为答案span的start的概率,end同理(这种用start和end来标记段落中答案的方法非常常见)。公式如下所示:


image.png

作者经过5个epoch就能完成精调。

image.png

image.png

可以看到,bert在问答任务中也可以取得新的SOTA。

4.3 SWAG(Situations With Adversarial Generations)

给出一个陈述句子和4个备选句子, 判断前者与后者中的哪一个最有逻辑的连续性, 相当于上下文承接问题。
作者构建的样本是4个序列,每个序列包含一个陈述句和一个备选句,然后最终每个序列的的token最终和一个向量进行相乘得到一个分数,再过一个softmax得到最终的概率。
同样经过3个epoch,作者就得到了新的SOTA。如下所示:


image.png

5. 销蚀分析

5.1 模型结构分析

作者以bertbase为原型,逐渐去掉作者加入的设计:NSP、双向语言模型、transformer结构(换成双向lstm)。可以看到,模型的表现逐渐下降。


image.png

结果表明:没有上下句子判断的设计,会损害模型在MNLI(Multi-Genre Natural Language Inference)和QNLI(Question Natural Language Inference)上的表现。而去掉双向语言模型换成单向,则会进一步损害在所有任务上的表现,尤其是token级别的任务。换成双向LSTM的话模型跟单向语言模型相差不大。
这些结果充分表明了作者设计的合理性。

5.2 模型大小分析

image.png

从结果可以看到,随着模型参数量的增加,模型效果逐渐提升。对大数据集来说,这个规律在之前的研究中已经证明了。本研究表明,只要有充分的预训练,增加模型的参数量,对于小数据集也能持续的带来效果提升。

5.3 基于特征的手法用于下游任务

虽然bert推荐使用fine-tune,但是实际上也可以跟elmo一样当做feature用。作者把单词的第一个sub-token当做标注问题分类器的输入(不是用CRF当输出层来做标注问题)。为了保证不进行任何精调,作者把bert的隐层固定住,然后跟elmo的论文一样,探讨了应用不同层级的hidden state做特征,后面接一个双层768维的双向LSTM,再后面接一个分类器(论文没说是什么分类器)。
下图是CoNLL-2003数据集上的实体识别任务,bert基于特征的用法带来的效果:


image.png

可以看到,bert作为feature也可以用,只是效果略逊于fine-tune。

6. 结论

作者非常谦虚的说,预训练来加强模型效果已经是非常流行,非常常见的手段了。作者:很惭愧,就做了一点微小的工作。

参考文献

[1] Wilson L Taylor. 1953. Cloze procedure: A new tool for measuring readability. Journalism Bulletin, 30(4):415–433.
[2] Peter F Brown, Peter V Desouza, Robert L Mercer, Vincent J Della Pietra, and Jenifer C Lai. 1992. Class-based n-gram models of natural language. Computational linguistics, 8(4):467–479.
[3] Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg S Corrado, and Jeff Dean. 2013. Distributed representations of words and phrases and their compositionality. In Advances in Neural Information Processing Systems 26, pages 3111–3119. Curran Associates, Inc.
[4] Felix Hill, Kyunghyun Cho, and Anna Korhonen. 2016. Learning distributed representations of sentences from unlabelled data. In Proceedings of the 2016 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies. Association for Computational Linguistics.
[5] William Fedus, Ian Goodfellow, and Andrew M Dai. 2018. Maskgan: Better text generation via filling in the . arXiv preprint arXiv:1801.07736
[6] J. Deng, W. Dong, R. Socher, L.-J. Li, K. Li, and L. FeiFei. 2009. ImageNet: A Large-Scale Hierarchical Image Database. In CVPR09.
[7] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Lukasz Kaiser, and Illia Polosukhin. 2017. Attention is all you need. In Advances in Neural Information Processing Systems, pages 6000–6010

你可能感兴趣的:(BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding)