BERT的全称是Bidirectional Encoder Representation from Transformers,是Google2018年提出的预训练模型,即双向Transformer的Encoder,由于decoder是不能获要预测的信息的。模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。git
Bert最近很火,应该是最近最火爆的AI进展,网上的评价很高,那么Bert值得这么高的评价吗?我我的判断是值得。那为何会有这么高的评价呢?是由于它有重大的理论或者模型创新吗?其实并无,从模型创新角度看通常,创新不算大。可是架不住效果太好了,基本刷新了不少NLP的任务的最好性能,有些任务还被刷爆了,这个才是关键。另一点是Bert具有普遍的通用性,就是说绝大部分NLP任务均可以采用相似的两阶段模式直接去提高效果,这个第二关键。客观的说,把Bert当作最近两年NLP重大进展的集大成者更符合事实。github
自从深度学习火起来后,预训练过程就是作图像或者视频领域的一种比较常规的作法,有比较长的历史了,并且这种作法颇有效,能明显促进应用的效果。面试
那么图像领域怎么作预训练呢,上图展现了这个过程,网络
咱们设计好网络结构之后,对于图像来讲通常是CNN的多层叠加网络结构,能够先用某个训练集合好比训练集合A或者训练集合B对这个网络进行预先训练,在A任务上或者B任务上学会网络参数,而后存起来以备后用。app
假设咱们面临第三个任务C,网络结构采起相同的网络结构,在比较浅的几层CNN结构,网络参数初始化的时候能够加载A任务或者B任务学习好的参数,其它CNN高层参数仍然随机初始化。框架
以后咱们用C任务的训练数据来训练网络,此时有两种作法:机器学习
一种是浅层加载的参数在训练C任务过程当中不动,这种方法被称为“Frozen”;分布式
另外一种是底层网络参数尽管被初始化了,在C任务训练过程当中仍然随着训练的进程不断改变,这种通常叫“Fine-Tuning”,顾名思义,就是更好地把参数进行调整使得更适应当前的C任务。函数
通常图像或者视频领域要作预训练通常都这么作。这样作的优势是:若是手头任务C的训练集合数据量较少的话,利用预训练出来的参数来训练任务C,加个预训练过程也能极大加快任务训练的收敛速度,因此这种预训练方式是老小皆宜的解决方案,另外疗效又好,因此在作图像处理领域很快就流行开来。工具
为何预训练可行
对于层级的CNN结构来讲,不一样层级的神经元学习到了不一样类型的图像特征,由底向上特征造成层级结构,因此预训练好的网络参数,尤为是底层的网络参数抽取出特征跟具体任务越无关,越具有任务的通用性,因此这是为什么通常用底层预训练好的参数初始化新任务网络参数的缘由。而高层特征跟任务关联较大,实际能够不用使用,或者采用Fine-tuning用新数据集合清洗掉高层无关的特征抽取器。
神经网络语言模型(NNLM)的思路。先说训练过程。学习任务是输入某个句中单词
前面任意单词
2013年最火的用语言模型作Word Embedding的工具是Word2Vec,后来又出了Glove,Word2Vec。对于这两个模型不熟悉的能够参考我以前的文章,这里再也不赘述:
上面这种模型作法就是18年以前NLP领域里面采用预训练的典型作法,以前说过,Word Embedding其实对于不少下游NLP任务是有帮助的,只是帮助没有大到闪瞎忘记戴墨镜的围观群众的双眼而已。那么新问题来了,为何这样训练及使用Word Embedding的效果没有期待中那么好呢?答案很简单,由于Word Embedding有问题呗。这貌似是个比较弱智的答案,关键是Word Embedding存在什么问题?这实际上是个好问题。
**这片在Word Embedding头上笼罩了好几年的乌云是什么?是多义词问题。**咱们知道,多义词是天然语言中常常出现的现象,也是语言灵活性和高效性的一种体现。多义词对Word Embedding来讲有什么负面影响?如上图所示,好比多义词Bank,有两个经常使用含义,可是Word Embedding在对bank这个单词进行编码的时候,是区分不开这两个含义的,由于它们尽管上下文环境中出现的单词不一样,可是在用语言模型训练的时候,不论什么上下文的句子通过word2vec,都是预测相同的单词bank,而同一个单词占的是同一行的参数空间,这致使两种不一样的上下文信息都会编码到相同的word embedding空间里去。因此word embedding没法区分多义词的不一样语义,这就是它的一个比较严重的问题。
有没有简单优美的解决方案呢?ELMO提供了一种简洁优雅的解决方案。
ELMO是“Embedding from Language Models”的简称,其实这个名字并无反应它的本质思想,提出ELMO的论文题目:“Deep contextualized word representation”更能体现其精髓,而精髓在哪里?在deep contextualized这个短语,一个是deep,一个是context,其中context更关键。
在此以前的Word Embedding本质上是个静态的方式,所谓静态指的是训练好以后每一个单词的表达就固定住了,之后使用的时候,不论新句子上下文单词是什么,这个单词的Word Embedding不会跟着上下文场景的变化而改变,因此对于好比Bank这个词,它事先学好的Word Embedding中混合了几种语义 ,在应用中来了个新句子,即便从上下文中(好比句子包含money等词)明显能够看出它表明的是“银行”的含义,可是对应的Word Embedding内容也不会变,它仍是混合了多种语义。这是为什么说它是静态的,这也是问题所在。
ELMO的本质思想是:我事先用语言模型学好一个单词的Word Embedding,此时多义词没法区分,不过这不要紧。在我实际使用Word Embedding的时候,单词已经具有了特定的上下文了,这个时候我能够根据上下文单词的语义去调整单词的Word Embedding表示,这样通过调整后的Word Embedding更能表达在这个上下文中的具体含义,天然也就解决了多义词的问题了。因此ELMO自己是个根据当前上下文对Word Embedding动态调整的思路。
ELMO采用了典型的两阶段过程,第一个阶段是利用语言模型进行预训练;第二个阶段是在作下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding做为新特征补充到下游任务中。
上图展现的是其预训练过程,它的网络结构采用了双层双向LSTM,目前语言模型训练的任务目标是根据单词
图中左端的前向双层LSTM表明正方向编码器,输入的是从左到右顺序的除了预测单词外
这个网络结构其实在NLP中是很经常使用的。使用这个网络结构利用大量语料作语言模型任务就能预先训练好这个网络,若是训练好这个网络后,输入一个新句子
也就是说,ELMO的预训练过程不只仅学会单词的Word Embedding,还学会了一个双层双向的LSTM网络结构,而这二者后面都有用。
上面介绍的是ELMO的第一阶段:预训练阶段。那么预训练好网络结构后,如何给下游任务使用呢?上图展现了下游任务的使用过程,好比咱们的下游任务仍然是QA问题:
由于ELMO给下游提供的是每一个单词的特征形式,因此这一类预训练的方法被称为“Feature-based Pre-Training”。
前面咱们提到静态Word Embedding没法解决多义词的问题,那么ELMO引入上下文动态调整单词的embedding后多义词问题解决了吗?解决了,并且比咱们期待的解决得还要好。对于Glove训练出的Word Embedding来讲,多义词好比play,根据它的embedding找出的最接近的其它单词大多数集中在体育领域,这很明显是由于训练数据中包含play的句子中体育领域的数量明显占优致使;而使用ELMO,根据上下文动态调整后的embedding不只可以找出对应的“演出”的相同语义的句子,并且还能够保证找出的句子中的play对应的词性也是相同的,这是超出期待之处。之因此会这样,是由于咱们上面提到过,第一层LSTM编码了不少句法信息,这在这里起到了重要做用。
ELMO有什么值得改进的缺点呢?
GPT是“Generative Pre-Training”的简称,从名字看其含义是指的生成式的预训练。GPT也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段经过Fine-tuning的模式解决下游任务。
上图展现了GPT的预训练过程,其实和ELMO是相似的,主要不一样在于两点:
若是对Transformer模型不太了解的,能够参考我写的文章:Transformer
ELMO在作语言模型预训练的时候,预测单词
Bert采用和GPT彻底相同的两阶段模型,首先是语言模型预训练;其次是使用Fine-Tuning模式解决下游任务。和GPT的最主要不一样在于在预训练阶段采用了相似ELMO的双向语言模型,即双向的Transformer,固然另一点是语言模型的数据规模要比GPT大。因此这里Bert的预训练过程没必要多讲了。模型结构以下:
对比OpenAI GPT(Generative pre-trained transformer),BERT是双向的Transformer block链接;就像单向rnn和双向rnn的区别,直觉上来说效果会好一些。
对比ELMo,虽然都是“双向”,但目标函数实际上是不一样的。ELMo是分别以
BERT预训练模型分为如下三个步骤:Embedding、Masked LM、Next Sentence Prediction
这里的Embedding由三种Embedding求和而成:
MLM能够理解为完形填空,做者会随机mask每个句子中15%的词,用其上下文来作预测,例如:my dog is hairy → my dog is [MASK]
此处将hairy进行了mask处理,而后采用非监督学习的方法预测mask位置的词是什么,可是该方法有一个问题,由于是mask15%的词,其数量已经很高了,这样就会致使某些词在fine-tuning阶段从未见过,为了解决这个问题,做者作了以下的处理:
80%是采用[mask],my dog is hairy → my dog is [MASK]
10%是随机取一个词来代替mask的词,my dog is hairy -> my dog is apple
10%保持不变,my dog is hairy -> my dog is hairy
注意:这里的10%是15%须要mask中的10%
那么为啥要以必定的几率使用随机词呢?这是由于transformer要保持对每一个输入token分布式的表征,不然Transformer极可能会记住这个[MASK]就是"hairy"。至于使用随机词带来的负面影响,文章中解释说,全部其余的token(即非"hairy"的token)共享15%*10% = 1.5%的几率,其影响是能够忽略不计的。Transformer全局的可视,又增长了信息的获取,可是不让模型获取全量信息。
选择一些句子对A与B,其中50%的数据B是A的下一条句子,剩余50%的数据B是语料库中随机选择的,学习其中的相关性,添加这样的预训练的目的是目前不少NLP的任务好比QA和NLI都须要理解两个句子之间的关系,从而能让预训练的模型更好的适应这样的任务。 我的理解:
总结下BERT的主要贡献:
BERT优势
BERT缺点
评价
Bert是NLP里里程碑式的工做,对于后面NLP的研究和工业应用会产生长久的影响,这点毫无疑问。可是从上文介绍也能够看出,从模型或者方法角度看,Bert借鉴了ELMO,GPT及CBOW,主要提出了Masked 语言模型及Next Sentence Prediction,可是这里Next Sentence Prediction基本不影响大局,而Masked LM明显借鉴了CBOW的思想。因此说Bert的模型没什么大的创新,更像最近几年NLP重要进展的集大成者,这点若是你看懂了上文估计也没有太大异议,若是你有大的异议,杠精这个大帽子我随时准备戴给你。若是概括一下这些进展就是:
Bert最大的亮点在于效果好及普适性强,几乎全部NLP任务均可以套用Bert这种两阶段解决思路,并且效果应该会有明显提高。能够预见的是,将来一段时间在NLP应用领域,Transformer将占据主导地位,并且这种两阶段预训练方法也会主导各类应用。
做者:@mantchs
GitHub:github.com/NLP-LOVE/ML…