深度之眼Paper带读笔记NLP.30:BERT

前言

BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding
BERT:语言理解中的预训练深度双向Transformer
作者:Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova
单位:Google AI Language
发表会议及时间:NAACL 2019
在线LaTeX公式编辑器
别人的讲解
语言模型是根据语言客观事实而进行的语言抽象数学建模,是一个单纯的、统一的、抽象的形式系统。语言客观事实经过语言模型的描述,比较适合于电子计算机进行自动处理。简单来说,语言模型就是出现一串单词序列的概率分布,是为一个长度为 n 的文本确定一个概率分布 p,来表示这段文本存在的可能性,更通俗一点,也就是在度量这个单词序列是不是人话。
从语言模型到Word Embedding:Word Embedding是语言模型的副产物
从Word Embedding到BERT:Bert其实和ELMo及GPT存在千丝万缕的关系:
如果我们把GPT的预训练阶段换成双向语言模型,那么就得到了Bert
如果我们把ELMo的特征抽取器换成Transformer,那么也得到了Bert
可以看出,Bert最关键有两点,第一点是特征抽取器采用Transformer,第二点是预训练的时候采用双向语言模型。

第一课 导读

语言模型与Word Embedding

语言模型 Language Model

Language Model语言模型是根据语言客观事实而进行的语言抽象数学建模,是一个单纯的、统一的、抽象的形式系统。语言客观事实经过语言模型的描述,比较适合于电子计算机进行自动处理。
简单来说,语言模型就是出现一串单词序列的概率分布,是为一个长度为n的文本(单词序列)确定一个概率分布P,来表示这段文本存在的可能性,更通俗一点,也就是在度量这个单词序列是不是人话。
为了能够量化地衡量哪个句子更像一句人话,我们可以设计一个度量函数:
P ( S ) = P ( w 1 , w 2 , . . . , w n ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) . . . P ( w n ∣ w 1 , w 2 , . . . . w n − 1 ) P(S)=P(w_1,w_2,...,w_n)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)...P(w_n|w_1,w_2,....w_{n-1}) P(S)=P(w1,w2,...,wn)=P(w1)P(w2w1)P(w3w1,w2)...P(wnw1,w2,....wn1)
L = ∑ w ∈ C l o g P ( w ∣ c o n t e x t ( w ) ) L=\sum_{w\in C}logP(w|context(w)) L=wClogP(wcontext(w))
函数P的核心思想是根据上文的单词预测后面单词的概率大小(理论上除了上文之外,也可以引入单词的下文联合起来预测单词出现概率)。句子里面每个单词都有个根据上文预测自己的过程,把所有这些单词的产生概率乘起来,数值越大代表这越像一句人话。

神经网络语言模型Neural Network Language Model

NNLM的学习过程就是给定上文的单词,使用神经网络来预测当前位置的单词,也就是最大化:
P ( w t ∣ w 1 , w 2 , . . . . w t − 1 ; θ ) P(w_t|w_1,w_2,....w_{t-1};\theta) P(wtw1,w2,....wt1;θ)
前面的单词 w i w_i wi,都用one-hot编码作为原始单词输入,之后乘以矩阵Q后获得向量 C ( w i ) C(w_i) C(wi),每个单词的 C ( w i ) C(w_i) C(wi)拼接,上接隐层,然后接softmax去预测后面应该后续接哪个单词。
在这里插入图片描述
这个 C ( w i ) C(w_i) C(wi)其实就是单词对应的wordembedding,矩阵Q包含V行(词典的大小,看上图右边那个东西),每一行对应单词的word embedding值。Q是网络参数,需要学习获得,训练刚开始用随机值初始化矩阵Q,当这个网络训练好之后,矩阵Q的内容被正确赋值。
通过NNLM学习语言模型任务,网络不仅自己能够根据上文预测后接单词是什么,同时获得副产品矩阵Q,这就是最早的word embedding了。

词嵌入 Word Embedding

Word2vec的网络结构和NNLM是基本类似的,有两种训练方法:
CBOW(从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词);
Skip-gram(输入某个单词,要求网络预测它的上下文单词)。
NNLM的主要任务是要学习一个解决语言模型任务的网络结构,语言模型就是要看到上文预测下文,word embedding只是一个副产品。但是word2vec的主要目的就是要训练得到word embedding,所以它完全可以随性地这么去训练网络。
在这里插入图片描述

词嵌入与预训练 Word Embedding&Pre-training

对于一个NLP下游任务。我们把句子中每个单词以one-hot形式作为输入,然后乘以预训练得到的word embedding矩阵Q(写代码时候的lookup函数就是干这个事的。),从而取出对应的词向量。所以,使用word embedding等价于把one-hot层到embedding层的网络用预训练好的参数矩阵Q初始化了。下游NLP任务在使用word embedding的时候也有两种做法
一种是Frozen(冻结),就是embedding层的网络参数固定不动;
另外一种是Fine-Tuning(微调),就是embedding层的参数也随着训练过程一起更新。

从Word Embedding到BERT

Word Embedding存在的问题

Word Embedding面临的最大问题就是多义词问题(歧义词问题),多义词是自然语言中经常出现的现象,也是语言灵活性和高效性的一种体现。比如说,Bank有两个常用含义(银行、河岸),但word2vec在对这个单词进行编码的时候,是区分不开这两个含义的,因为它们尽管上下文环境中出现的单词不同,但是在用语言模型训练的时候,同一个单词占的是同一行的参数空间,这导致两种不同的上下文信息都会编码到相同的向量空间里去,所以word embedding也就无法区分多义词的不同语义。
例如:bank有两个意思,银行和河岸
…very useful to protect banks or slopes from being washed away by river or rain…
… the location because it was high, about 100 feet above the bank of river…
…The bank has plan to branch throughout the country…
…They throttled the watchman and robbed the bank
为了解决这个问题,上篇文章ELMo也就出现了

从Word Embedding到ELMo

之前的问题也就在于,word embedding是个静态的方式,所以在使用的时候,不论新句子上下文是什么,这个单词的向量都不会跟着上下文的变化而改变。而ELMo的思想是:事先用语言模型学好一个单词的embedding,在使用word embedding的时候,根据上下文单词的语义去调整单词表示,这样经过调整后的embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。
在这里插入图片描述

ELMo存在的问题

优点:
1.ELMo完美地解决了多义词问题,不仅如此,最终的表示里还涵盖了很多的词性信息
2.在6个NLP任务上,相较于baseline都有5%~25%的提升
缺点(with GPT/BERT 用马后炮的观点来看):
1.LSTM的抽取能力远低于Transformer
2.拼接方式使用双向融合,这种特征融合能力相对较弱
除了以ELMo为代表的这种基于特征融合(因为ELMo是训练好3层[看上面图有3层]后,把3层拼接拿来做预测,所以叫基于特征融合的方法)的预训练方法外,NLP里还有一种典型做法,也就是基于Fine-tuning的模式,而GPT就是这一模式的典型开创者。

从Word Embedding到GPT From Word Embedding to GPT(Generative Pre-Training)

在这里插入图片描述
GPT也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过Fine-tuning的模式解决下游任务。其GPT预训练过程和ELMo是类似的,主要不同在于两点:
首先,特征抽取器用的Transformer,它的特征抽取能力要强于RNN,从现在来看,这个选择很显然是明智的;
其次,GPT采用的是单向的语言模型,从现在来看,这个选择确实漏掉了很多有用的信息。ELMo和BERT是用的双向。
GPT和BERT其实很像,就是少了一个双向语言模型。
如何使用GPT呢?首先,对于不同的下游任务,本来我们可以任意设计自己的网络结构现在,我们要把任务的网络结构改造成和GPT的网络结构是一样的。然后,在做下游任务的时候,利用第一步预训练好的参数初始化GPT的网络结构,这样通过预训练学到的语言学知识就被引入到下游任务中来了。再次,你可以用当前的这个任务去训练网络,对网络参数进行Fine-tuning,使得这个网络更适合解决特定的问题。
在这里插入图片描述
BERT的使用也和GPT差不多,都是先要改造自己的模型,使得模型和GPT一样,然后引入预训练参数,再用当前的这个任务去训练网络,对网络参数进行Fine-tuning。BERT只不过在具体下游任务改造上有所不同。
GPT论文给出了一种改造施工图:对于分类问题,加上一个起始和终结符号即可;对于句子关系判断问题,两个句子中间再加个分隔符即可;对文本相似性度量问题,把两个句子顺序颠倒一下做出两个输入即可,这是为了告诉模型句子顺序不重要;对于多项选择问题,即多路输入,每一路把文章和答案选项拼接作为输入即可。整体来看,这种做法和在下游任务中使用BERT是非常类似的。

从Word Embedding到BERT

Bert其实和ELMo及GPT存在干丝万缕的关系:
如果我们把GPT的预训练阶段换成双向语言模型,那么就得到了Bert
如果我们把ELMo的特征抽取器换成Transformer,那么也得到了Bert
可以看出,Bert最关键有两点:
第一点是特征抽取器采用Transformer;
第二点是预训练的时候采用双向语言模型。
在这里插入图片描述

前期知识储备

语言模型:了解语言模型的概念以及神经语言模型的训练目标,理解语言模型和词向量的关系;
Transformer:理解注意力机制的原理,了解Transformer相对于RNN和CNN的优缺点;
Word embedding:了解word embedding的产生过程和存在的问题,以及相应的解决方案(ELMo);
GPT:熟悉GPT的核心结构,了解其用在自然语言处理中对下游任务的改造方案。

第二课 论文精读

论文整体框架

0.摘要
1.引言
2.相关工作:主要介绍了ELMo和GPT
3.BERT:分为预训练和finetune两个部分介绍
4.5.实验&分析
6.结论

全面拥抱Transformer

NLP的四大类任务

序列标注:分词/POS Tagging/NER…
要求模型根据上下文对句子中每个单词(位置)给出一个分类类别
文本分类:文本分类/情感分类/关系分类.……
要求模型根据句子语义对句子整体做一个类别判断
句子关系判断:(非生成式)问答/自然语言推断.……
给定两个句子,模型判断出两个句子是否具备某种语义关系
生成式任务:机器翻译/(生成式)文本摘要/(生成式)问答……
输入文本内容后,需要自主生成另外一段文字
深度学习要求我们设计端到端的模型,那么特征抽取器(编码器)的选择也就显得至关重要。所以要来看看编码器:

RNN:廉颇老矣,尚能饭否

RNN的核心思想就是每个输入都对应隐层节点,隐层节点之间形成线性序列,信息由前向后在隐层之间逐步向后传递。在此基础上,为了缓解梯度爆炸与梯度消失问题,研究者们在RNN中引入门机制,产生了LSTM和GRU等等。以及通过引入注意力机制来完善编码-解码框架,使用双向RNN,叠加RNN等等操作,都使得其在自然语言处理领域长期占据稳定地位,是序列建模任务的标准配置。
RNN的致命缺点:
慢:RNN本身的序列依赖结构对于大规模并行计算来说相当不友好,所以后面也就延伸出了两个方向,一个是RNN的加速(RNN的并行化),另一个是寻求新模型,包括使用CNN或者Transformer等方法。
在这里插入图片描述

CNN:刺激战场,绝地求生

卷积操作运作机制的关键在于卷积核覆盖的那个滑动窗口,CNN能捕获到的特征就体现在这个滑动窗口里,其实它捕获到的是单词的k-gram片段信息,这些k-gram片段就是CNN捕获到的特征,k的大小决定了能捕获多远距离的特征,相对应的解决方案有两种,一种是层叠卷积,另一种是扩展卷积(空洞卷积,目的就是扩展感受野)(时间卷积网络是其集大成者,这个方法就是集成了两种方案)。与此同时,在CNN中加入位置特征也成了其在自然语言处理中的标配。
在这里插入图片描述
CNN的缺点:
无法捕获长距离依赖:CNN对信息的感知能力取决于卷积核的大小。
对位置信息不敏感:池化操作会削弱句子中的位置特征。

Transformer:盖世英雄

这里的Transformer特征抽取器并非原始论文所指的完整的Encoder-Decoder框架,从特征提取器角度来说的,我们可以简单理解为论文中的Encoder部分。Transformer原文中一直强调说self-attention,但是目前来看,能让Transformer效果好的,不仅仅是self-attention,而是这个Block里所有元素,包括multi-head self-attention(多头注意力机制),skip-connection(短接),layer-norm(层归一化),feed-forward network(前向神经网络)一起在发挥作用。
在这里插入图片描述
针对NLP任务的特点,来说Transformer的对应解决方案:
1.自然语言一般是个不定长的句子,针对这个问题,Transformer做法跟CNN是类似的,一般设定输入的最大长度,如果句子没那么长,则用padding填充。
2.句子中单词之间的相对位置包含很多有用信息,RNN因为结构就是线性序列的,天然会将位置信息编码进模型;而CNN的卷积层其实也是保留部分位置相对信息。
Transformer输入的第一层网络是multi-head self-attention层,这个过程中位置信息并没有被编码进去。所以,Transformer在输入端明确地将positon信息编码。
3.关于长距离依赖的问题,self-attention天然地就能解决这个问题,因为在集成信息的时候,当前单词和句子中任意单词都发生了联系。不像RNN需要通过隐层节点序列往后传,也不像CNN需要通过增加网络深度来捕获远距离特征。

华山论剑 RNN/CNN/Transformer

语义特征抽取能力:Transformer>CNN=RNN
在这里插入图片描述
长距离特征捕获能力:Transformer>RNN>>CNN
在这里插入图片描述
并行计算能力及运算效率:Transformer=CNN>>RNN
在这里插入图片描述

论文提出的模型

BERT最关键有两点:特征抽取器采用Transformer,预训练时采用双向语言模型
B E R T B A S E : L = 12 , H = 768 , A = 12 , T o t a l P a r a m e t e r s = 110 M BERT_{BASE}:L=12,H=768,A=12,TotalParameters=110M BERTBASE:L=12H=768A=12TotalParameters=110M
B E R T L A R G E : L = 24 , H = 1024 , A = 16 , T o t a l P a r a m e t e r s = 340 M BERT_{LARGE}:L=24,H=1024,A=16,TotalParameters=340M BERTLARGE:L=24H=1024A=16TotalParameters=340M
L是层数,即Transformer Blocks的个数,H是隐层向量大小,A是Multi-head Self-attention的“头数"
从参数量上看,BERT就是大力出奇迹的模型
BERT的使用包含预训练和使用两个阶段,下面分别讲解

BERT的预训练

在这里插入图片描述
首先是输入层,针对不同的任务,模型能够明确的表达一个句子,或者对句子对(比如说[问题,答案])。从上图可以看出,输入由三部分组成:
对于每一个token,它的输入特征由对应的token embedding,段表征(segment embedding)和位置表征(position embedding)相加产生。
注:每句话的第一个token总是[CLS]。对应它的最终隐藏状态,也就是transformer的输出,我们用它来表征整个句子,并且用于下游的分类任务,[SEP]是句子分割符号,从上图中可以看到,有这个东西说明输入是两个句子拼接而成的。另外,语料的选取很关键,要选用document-level的而不是sentence-level的,这样可以具备抽象连续长序列特征的能力。
接下来我们看看BERT(或者说GPT也一样)与其他预训练模型不一样的两个个地方:

Mask LM(掩码语言模型)

随机选择语料中15%的单词,把它抠掉,也就是用[MASK]掩码代替原始单词,然后要求模型去正确预测被抠掉的单词,这里遵循的也就是语言模型预测单词的思想,但是这里有个问题:训练过程大量看到[MASK]
标记,但是后面用的时候是不会有这个标记的,这会引导模型认为输出是针对[MASK]标记的。
为了避免这个问题,BERT对这个任务进行了进一步的改造:对于这15%的要执行[MASK]任务的单词中,只有80%真正被替换成[MASK]标记,10%的单词被随机替换成另外一个单词,剩余的10%的单词则不做变化。
原文:
在这里插入图片描述

Next Sentence Prediction(下个句子预测)

我们在做语言模型预训练的时候,分两种情况选择两个句子,一种是选择语料中真正顺序相连的两个句子,另外一种是从语料库中随机选择一个拼到第一个句子后面。
BERT要求模型除了做上述的Mask语言模型任务外,附带再做个句子关系预测,判断第二个句子是不是真的是第一个句子的后续句子。之所以这么做,是考虑到很多NLP任务是句子关系判断任务,单词预测粒度的训练到不了句子关系这个层级,增加这个任务有助于下游句子关系判断任务。所以可以看到,BERT的预训练是个多任务过程,这也是其创新之处。
下面是原文的例子,输入两个句子,给出一个二分类的结果。
在这里插入图片描述

BERT的使用(finetune)

对于句子对关系判断任务:和GPT类似,加上一个起始和终结符号,并且在句子之间加个分隔符即可。对于输出来说,把第一个起始符号对应的Transformer最后一层位置上面接一个softmax分类即可。对于单句子分类问题:与GPT一样,只需要增加起始和终结符号,输出部分和句子关系判断任务类似改造;对于序列标注问题,输入部分和单句分类是一样的,只需要输出部分Transformer最后一层每个单词对应位置都进行分类即可。
在这里插入图片描述
在这里插入图片描述
NLP四大任务里,除了生成类任务外,BERT都覆盖到了,而且改造起来很简单直观。其实对于机器翻译或者文本摘要这种生成式任务,同样可以稍作改造即可引入BERT,比如直接在单个Transformer结构上加装隐层产生输出。
无论如何,从这里可以看出,NLP四大类任务都可以比较方便地改造成BERT能够接受的方式,这其实是BERT的非常大的优点,这意味着它几乎可以做任何NLP的下游任务,具备很强的普适性。

实验和结果

原文实验分了三个小节
GLUE(通用语言理解评估:包括情感分类、自然语言推断、问答对匹配、文本分类、语义相似度匹配、复述检测等一系列任务,共计8个数据集)
SQuAD v1.1&v2.0(斯坦福机器阅读理解数据集:给出一段文本和一个问题,从文本中标出答案的开始位置和结束位置)
SWAG(给出一个陈述句子和四个候选句子,判断前者与后者中的哪一个最有逻辑的连续性,相当于是一个阅读理解问题,用于评估基于常识的推理)

结果

BERT在GLUE上的结果:八个数据集全面领先,少则一两个点,多则七八个点。
在这里插入图片描述
BERT在SQuAD和SWAG上的结果:BERT的高光时刻,接近或超越人类水平。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

影响因子分析

我们说BERT效果特别好,那么到底是什么因素起作用呢?对比试验可以证明,跟GPT相比,双向语言模型起到了最主要的作用,对于那些需要看到下文的任务来说尤其如此。而预测下个句子来说对整体性能来说影响不算太大,跟具体任务关联度比较高。例如QNLI,句子的推断预测任务上,使用单向BERT准确率下降较多,其他任务还好。
在这里插入图片描述

训练时间的探讨

问:BERT真的需要这么多的预训练步数来实现高精度吗?
答:是的。BERTBASE在MNLI上进行100万步预训练时的准确率比50万步提高1.0%。
问:因为每次只预测15%的单词,掩码语言模型(MLM)的预训练是否比标准的语言模型(LTR)预训练训收敛得慢?
答:MLM的收敛速度确实比LTR模型稍慢,然而,在绝对准确性方面,MLM几乎在训练一开始就超越LTR模型。
在这里插入图片描述

讨论和总结

A.文章展示了双向预训练语言模型的重要性,同时也使用了掩码语言模型来预训练深层的双向模型,而不是两个单向模型的简单拼接。
B.文章表明,预训练表示消除了许多对特定任务的高度工程化的模型结构的需求BERT是第一个基于微调的表示模型,并优于许多特定于任务的模型。
C.BERT在11项NLP任务上都达到了当前的SOTA,消融研究还证明了双向语言模型最至关重要的。

总结

整体:文章不仅是对已有神经网络的融合,其中还有掩码语言模型和句子预测等新思想。
引言&相关工作:作者在引言部分介绍了当前所面临的问题,以及大家对这方面的尝试,一个“大力出奇迹”贯穿全文。
实验:充分考虑各种可能性,探讨在不同任务下模型的性能,证明了所提出的模型结构在各个方面都全面领先。

参考文献

1.Yoshua Bengio.A Neural Probabilistic Language Model.JMLR.2003.神经语言模型
2.Ashish Vaswani.Attention is All You Need.In NeurlPS.2017.
3.Matthew E.Peters.Deep Contextualized Word Representations.In NAACL.2018.上一篇ELMo的文章
4.Alec Radford.Improving Language Understanding by Generative Pre-Training.2018.GPT1.0的文章,现在出了2.0
5.张俊林.从Word Embedding到Bert模型一自然语言处理中的预训练技术发展史.
https://zhuanlan.zhihu.com/p/49271699
6.张俊林.放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器比较.
https://zhuanlan.zhihu.com/p/54743941
7.Zhilin Zhang.XLNet:Generalized Autoregressive Pretraining for Language Understanding.In NeurlPS.2019. XLNet相当于BERT的最新一代的变种。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oldmao_2000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值