【NLP】 深入浅出解析BERT原理及其表征的内容
本篇介绍目前NLP领域里影响力最大的预训练模型BERT。首先,大致介绍了BERT里有什么;接着,介绍了BERT的结构和其预训练的方式;最后,再总结BERT的表征的内容和分布。
作者&编辑 | 小Dream哥
1 BERT是什么?
了解自然语言处理的同学,应该没有不知道BERT的;甚至连很多自然语言处理圈外的开发的同学,都知道这个模型的厉害。不得不佩服谷歌的影响力和营销水平,当然,也确实是它的效果有这么棒。
这里就不再说BERT当年是怎么样横扫各大NLP任务榜单的故事了。毕竟现在出了个XLnet,各方面都比他强了一点点;而且,也开始有一些论文开始接BERT的短了。
那我们言归正传,现在来看看BERT究竟是什么,有什么样的结构,如何进行预训练等。
BERT,全称是Pre-training of Deep Bidirectional Transformers for Language Understanding。注意其中的每一个词都说明了BERT的一个特征。
Pre-training说明BERT是一个预训练模型,通过前期的大量语料的无监督训练,为下游任务学习大量的先验的语言、句法、词义等信息。
Bidirectional说明BERT采用的是双向语言模型的方式,能够更好的融合前后文的知识。
Transformers说明BERT采用Transformers作为特征抽取器。
Deep说明模型很深,base版本有12层,large版本有24层。
总的来说,BERT是一个用Transformers作为特征抽取器的深度双向预训练语言理解模型。
2 BERT的结构
上图是BERT的模型结构,它由多层的双向Transformer连接而成,有12层和24层两个版本。BERT中Transformer的实现与上一期讲的Transformer实现别无二致。
要理解BERT,最主要在于它预训练时采取的方法,下面我们做一个详细的讲解。
3 BERT预训练模式
(1) Input Representation
我们先看看,BERT网络接受的输入是什么,如上图所示,BERT接受的输入包括三个部分:
1) 词嵌入后的Token Embedding,每次输入总以符号[CLS]的embedding开始,如果是两个句子,则句之间用[SEP]隔开。
2) 句子类别的符号
3) Position Embedding,这个与Transformer中的一致。
上述三个向量相加,组成BERT的输入。
(2) Masked Language Model
那么,BERT是通过什么样的任务进行训练呢?其中一个是Masked Language Model。BERT会在训练时遮住训练语料中15%的词(实际的MASK机制还有一些调整),用符号[MASK]代替,通过预测这部分被遮住的内容,来让网络学习通用的词义、句法和语义信息。
那么,该怎么理解Masked Language Model呢?我们不妨回想一下高中阶段都做过的英语完形填空,我们在做完形填空题目的时候,为了填上空格中的词,常常需要不断的看空格词的上下文,甚至要了解整个段落的信息。有时候,有些空甚至要通过一些英语常识才能得到答案。通过做完形填空,我们能够学习到英语中很多的词义、句法和语义信息。BERT的训练过程也类似,Masked Language Model通过预测[MASK]代替的词,不断的“对比”上下文的语义,句法和词义信息,从而学到了大量相关的知识。
哈哈,不知道BERT的提出者们是不是受中国英语试卷里完形填空题目的启发呢?
(3) Next Sentence Prediction
BERT的预训练过程,还有一个预测下一句的任务。就是输入两个句子,判断第二个句子是不是第一个句子的下一句的任务。这个任务是为像QA和NLI这样需要考虑句子间关系的下游任务准备的。
通过这个任务,BERT获得了句子级表征的能力。通常,BERT的第一个输出,即[CLS]对应的输出,就可以用来当作输入句子的句向量来使用。
4 BERT到底学到了什么?
(1) 在BERT在预训练过程中,学习到了丰富的语言学方面的信息。
短语句法的信息在低层网络结构中学习到;BERT的中层网络就学习到了丰富的语言学特征;BERT的高层网络则学习到了丰富的语义信息特征。
上述观点来自如下的论文,该团队用一系列的探针实验,佐证了上述的观点,对我们进一步了解BERT和更有效的使用BERT有一定的指导意义。
Ganesh Jawahar Benoˆıt Sagot Djam´e Seddah (2019). What does BERT learn about the structure of language?.
(2) BERT其实并没有学习到深层的语义信息,只是学习到了一些浅层语义和语言概率的线索?
最近有一篇论文"Probing Neural Network Comprehension of Natural Language Arguments",讨论BERT在Argument Reasoning Comprehension Task(ARCT)任务中是不是其实只是学习到了数据集中一些虚假的统计线索,并没有真正理解语言中的推理和常识。
事情大概是这样子,论文作者为了杀杀BERT的威风,挑了自然语言处理中比较难的任务ARCT,并且在测试数据中做了一些“手脚”,想试一试BERT的身手。所谓的ARCT,是一个推理理解的任务。如下图所示,展示了一个ARCT数据集中的例子。ARCT数据中有一个结论Claim,一个原因Reason,一个论据Warrant,还有一个错误论据Alternative。
如上图所示,是ARCT任务的通用模型结构,就是同时输入,Claim,Reason和两个Warrant,预测哪个Warrant是正确的。
论文作者首先在ARCT原始数据集上用BERT进行ARCT任务的预测,发现BERT的效果确实很好,达到71.6±0.04,跟没有接受过训练的人员成绩接近。
然后,研究人员研究测试数据集发现数据集里面其实隐藏了一些统计线索。简单的说就是,数据集里正确的Warrant里包含某些词的概率比错误的Warrant要高。例如,只要看到Warrant中包含not就预测其为正确的Warrant就能够达到60的正确率。
同时,研究人员还做了只把warrant和claim、warrant和reason作为输入来训练模型的实验。实验发现,BERT的效果也能达到70+。这就好像老师题目都还没有说完,学生就把答案写出来,这显然不太合理的,要么是学生作弊,要么是学生提前把答案背下来了。
最后,研究人员来了一招狠的,就是将数据集中的数据进行反转和一些词概率上的平均处理,如下所示:
实验结果令人惊讶,BERT最好的效果只有53%,只比瞎猜好一点点。
所以,BERT的预训练过程到底学到了什么呢?
要准确回答这个问题并不容易。但通过上述两篇论文在两个维度上对BERT的解析,我们心里应该能够给BERT一个清晰的定位。BERT是一个强大的预训练,因其超大的参数量和较强的特征提取能力,能够从海量的语料中学习到一些语言学和一定程度的语义信息。但是,笔者认为,跟此前的所有NLP模型一样,它还远没有学习到语言中蕴含的大量的常识和推理。例如,利用BERT或许能够从"天下雨了",推断出“要带伞”。但是更深层次的,“要带伞是因为怕淋湿,淋湿了会感冒”这些BERT是很难学到的。
NLP的难处就在于,语言是高度精炼和情境化的。一句简单的话,可能需要丰富的知识才能理解。现在来看,预训练模型是一条有希望但漫长的道路。
总结
BERT是目前最火爆的NLP预训练模型,其基于MLM和双向语言模型和以Transformer作为特征抽取器,是其成功最主要的两个原因。我们先想想,BERT还有哪些地方可以改进的,下周我们介绍XLnet的时候,就可以更好的理解了。