从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记

图像领域的预训练

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第1张图片
image.png

图像领域的网络结构一般是CNN多层叠加网络结构,可以先用training set A或training set B对这个网络进行预先训练,在A任务和B任务上学会网络参数,保存备用。
当面临任务C时,采用相同网络结构,初始化时浅层CNN加载A、B任务学习好的参数,高层仍然随机初始化。之后用training set C训练网络,这里存在FROZEN和FINE-TUNING两种方式
FROZEN:浅层加载参数在训练C时保持不动
FINE-TUNING:浅层参数在C训练过程中仍然不断改变

预训练的好处:

1.任务C的training set数据量较少的时候,可以预先通过大的训练集合如ImageNet训练好大部分网络结构参数
2.任务C的training set数据量多的时候也能极大加快任务训练的收敛速度

为什么预训练是可行的?

对于层级的CNN结构来说不同层级的神经元学习到了不同类型的图像特征,由底向上特征形成层级结构。越是底层的特征越是普遍适用的特征,如边角线、弧线、线段等底层基础特征,与具体任务关联性弱。越往上抽取出的特征任务指向性越强。如人脸识别任务中最底层的神经元学到的是线段等特征,图示的第二个隐层学到的是人脸五官的轮廓,第三层学到的是人脸的轮廓。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第2张图片
image.png

Word Embedding

2003年出品,陈年技术,馥郁芳香。word embedding其实就是NLP里的早期预训练技术。当然也不能说word embedding不成功,一般加到下游任务里,都能有1到2个点的性能提升,只是没有那么耀眼的成功而已。

语言模型

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第3张图片
image.png

什么是语言模型?为了能够量化地衡量哪个句子更像一句人话,可以设计如上图所示函数,核心函数P的思想是根据句子里面前面的一系列前导单词预测后面跟哪个单词的概率大小(理论上除了上文之外,也可以引入单词的下文联合起来预测单词出现概率)。句子里面每个单词都有个根据上文预测自己的过程,把所有这些单词的产生概率乘起来,数值越大代表这越像一句人话。

NNLM

NNLM是一个神经网络结构能够实现上述语言模型的任务,训练好后输入一句话的前面几个单词,输出后面紧跟的单词。

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第4张图片
image.png

学习任务是输入某个句中单词()前面句子的t-1个单词,要求网络正确预测单词Bert,即最大化:
image.png

前面任意单词用Onehot编码作为原始单词输入,之后乘以矩阵Q后获得向量,每个单词的拼接,上接Hidden Layer,然后接softmax去预测后续接那个单词。

就是单词对应的Word Embedding值,矩阵Q包含V行,每一行代表对应单词的Word Embedding值。只不过Q的内容也是网络参数,需要学习获得,训练刚开始用随机值初始化矩阵Q,当这个网络训练好之后,矩阵Q的内容被正确赋值,每一行代表一个单词对应的Word embedding值。所以你看,通过这个网络学习语言模型任务,这个网络不仅自己能够根据上文预测后接单词是什么,同时获得一个副产品,就是那个矩阵Q,这就是单词的Word Embedding是被如何学会的。

Word2Vec

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第5张图片
image.png

Word2Vec有两种训练方法
CBOW:通过上下文预测中间的单词
SKIP-GRAM:通过某个单词预测他的上下文单词
NNLM是通过输入单词的上文去预测这个单词
Word Embedding是Word2Vec的主产品

Word Embedding Example

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第6张图片
image.png

学会了单词的Word Embedding 怎么用?

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第7张图片
image.png

假设如上图所示,我们有个NLP的下游任务,比如QA,就是问答问题,所谓问答问题,指的是给定一个问题X,给定另外一个句子Y,要判断句子Y是否是问题X的正确答案。问答问题假设设计的网络结构如上图所示。
它的使用方法其实和前面讲的NNLM是一样的,句子中每个单词以Onehot形式作为输入,然后乘以学好的Word Embedding矩阵Q,就直接取出单词对应的Word Embedding。
Word Embedding矩阵Q其实就是网络Onehot层到embedding层映射的网络参数矩阵。所以使用Word Embedding等价于把Onehot层到embedding层的网络用预训练好的参数矩阵Q初始化了。
下游NLP任务在使用word Embedding的时候也类似图像有两种做法:
FROZEN:保持word embedding层网络参数固定不动
FINE-TUNING:word-embedding层参数使用新的训练集合时也同时进行训练

Word Embedding存在什么问题

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第8张图片
image.png

这片在Word Embedding头上笼罩了好几年的乌云是什么?是多义词问题。
比如多义词Bank,Word Embedding在对Bank这个单词进行编码的时候是区分不开他的多个含义的。因为尽管他们上下文环境中出现的单词不同,但在使用语言模型训练时,都是预测单词Bank,只能占一行参数空间,导致两种不同的上下文信息都会编码到相同的Word Embedding空间里去。
ELMO提供了一种简洁优雅的解决方案。

从Word Embedding到ELMO

Word Embedding本质是个静态方式,训练好后每个单词对应的Word Embedding表达不变,混合了多种语义。
ELMO本质思想:事先用语言模型学好一个单词的Word Embedding,此时多义词无法区分,不过这没关系。在我实际使用Word Embedding的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。所以ELMO本身是个根据当前上下文对Word Embedding动态调整的思路。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第9张图片
image.png

ELMO采用了典型的两阶段过程,第一个阶段是利用语言模型进行预训练;第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding作为新特征补充到下游任务中。

第一阶段:

他的网络采用了双层双向LSTM,左端前向双层LSTM代表正方向encoder,输入的是从左到右顺序的上文Context-before;右端逆向双层LSTM代表反方向encoder,输入的是从右到左的逆序的句子下文Context-after。
使用这个网络结构利用大量语料做语言模型任务就能预先训练好这个网络,如果训练好这个网络后,输入一个新句子Snew
,句子中每个单词都能得到对应的三个Embedding:最底层是单词的Word Embedding,往上走是第一层双向LSTM中对应单词位置的Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些。
ELMO的预训练过程不仅仅学会单词的Word Embedding,还学会了一个双层双向的LSTM网络结构

第二阶段

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第10张图片
image.png

上图展示了下游任务的使用过程,比如我们的下游任务仍然是QA问题,此时对于问句X,我们可以先将句子X作为预训练好的ELMO网络的输入,这样句子X中每个单词在ELMO网络中都能获得对应的三个Embedding,之后给予这三个Embedding中的每一个Embedding一个权重a,这个权重可以学习得来,根据各自权重累加求和,将三个Embedding整合成一个。然后将整合后的这个Embedding作为X句在自己任务的那个网络结构中对应单词的输入,以此作为补充的新特征给下游任务使用。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第11张图片
image.png

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第12张图片
image.png

前面我们提到静态Word Embedding无法解决多义词的问题,那么ELMO引入上下文动态调整单词的embedding后多义词问题解决了吗?解决了,而且比我们期待的解决得还要好。上图给了个例子,对于Glove训练出的Word Embedding来说,多义词比如play,根据它的embedding找出的最接近的其它单词大多数集中在体育领域,这很明显是因为训练数据中包含play的句子中体育领域的数量明显占优导致;
而使用ELMO,根据上下文动态调整后的embedding不仅能够找出对应的“演出”的相同语义的句子,而且还可以保证找出的句子中的play对应的词性也是相同的,这是超出期待之处。之所以会这样,是因为第一层LSTM编码了很多句法信息,这在这里起到了重要作用


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第13张图片
image.png

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第14张图片
image.png

ELMO缺点:
1.特征抽取器选择方面,ELMO选择了LSTM而不是新贵Transformer,Transformer是谷歌在17年做机器翻译任务的“Attention is all you need”的论文中提出的,引起了相当大的反响,很多研究已经证明了Transformer提取特征的能力是要远强于LSTM的。

  1. ELMO采取双向拼接这种融合特征的能力可能比Bert一体化的融合特征方式弱
    除了以ELMO为代表的这种基于特征融合的预训练方法外,NLP里还有一种典型做法,这种做法和图像领域的方式就是看上去一致的了,一般将这种方法称为“基于Fine-tuning的模式”,而GPT就是这一模式的典型开创者。

从Word Embedding到GPT

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第15张图片
image.png

[图片上传中...(image.png-659628-1557388555906-0)]
GPT是“Generative Pre-Training”的简称,从名字看其含义是指的生成式的预训练。GPT也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过Fine-tuning的模式解决下游任务。

第一阶段

GPT特征抽取器使用Transformer,他的与训练仍是以语言模型作为目标任务,但是采用的是单向语言模型,ELMO在做语言模型训练时预测单词使用了上下文,而GPT只采用Context-before而抛开了下文。它没有把单词的下文融合进来,这限制了其在更多应用场景的效果,如果预训练时候不把单词的下文嵌入到Word Embedding中,是很吃亏的,白白丢掉了很多信息。

这里强行插入一段简单提下Transformer。首先,Transformer是个叠加的“自注意力机制(Self Attention)”构成的深度网络,是目前NLP里最强的特征提取器,注意力这个机制在此被发扬光大,从任务的配角不断抢戏,直到Transformer一跃成为踢开RNN和CNN传统特征提取器,荣升头牌,大红大紫。你问了:什么是注意力机制?这里再插个广告,对注意力不了解的可以参考:“深度学习中的注意力模型”。而介绍Transformer比较好的文章可以参考以下两篇文章:一个是Jay Alammar可视化地介绍Transformer的博客文章The Illustrated Transformer ,非常容易理解整个机制,建议先从这篇看起;然后可以参考哈佛大学NLP研究组写的“The Annotated Transformer. ”。
RNN一直受困于其并行计算能力,这是因为它本身结构的序列性依赖导致的。
CNN的最大优点是易于做并行计算,所以速度快,但是在捕获NLP的序列关系尤其是长距离特征方面天然有缺陷,不是做不到而是做不好,目前也有很多改进模型,但是特别成功的不多。
Transformer同时具备并行性好,又适合捕获长距离特征。

第二阶段

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第16张图片
image.png

要向GPT的网络结构看齐,把任务的网络结构改造成和GPT的网络结构是一样的


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第17张图片
image.png

对于分类问题,不用怎么动,加上一个起始和终结符号即可;对于句子关系判断问题,比如Entailment,两个句子中间再加个分隔符即可;
对文本相似性判断问题,把两个句子顺序颠倒下做出两个输入即可,这是为了告诉模型句子顺序不重要;
对于多项选择问题,则多路输入,每一路把文章和答案选项拼接作为输入即可。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第18张图片
image.png

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第19张图片
image.png

Bert的诞生

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第20张图片
image.png

Bert采用和GPT完全相同的两阶段模型,首先是语言模型预训练;其次是使用Fine-Tuning模式解决下游任务。和GPT的最主要不同在于在预训练阶段采用了类似ELMO的双向语言模型,当然另外一点是语言模型的数据规模要比GPT大。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第21张图片
image.png

第二阶段,Fine-Tuning阶段,这个阶段的做法和GPT是一样的。当然,它也面临着下游任务网络结构改造的问题,在改造任务方面Bert和GPT有些不同。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第22张图片
image.png

Bert的普适性

绝大部分NLP问题可以归入上图所示四类任务中:
1.序列标注,这是最典型的NLP任务,比如中文分词,词性标注,命名实体识别,语义角色标注等都可以归入这一类问题,它的特点是句子中每个单词要求模型根据上下文都要给出一个分类类别。
2.第二类是分类任务,比如我们常见的文本分类,情感计算等都可以归入这一类。它的特点是不管文章有多长,总体给出一个分类类别即可。
3.第三类任务是句子关系判断,比如Entailment,QA,语义改写,自然语言推理等任务都是这个模式,它的特点是给定两个句子,模型判断出两个句子是否具备某种语义关系。
4.第四类是生成式任务,比如机器翻译,文本摘要,写诗造句,看图说话等都属于这一类。它的特点是输入文本内容后,需要自主生成另外一段文字。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第23张图片
image.png

对于种类如此繁多而且各具特点的下游NLP任务,Bert如何改造输入输出部分使得大部分NLP任务都可以使用Bert预训练好的模型参数呢?上图给出示例:
1.对于序列标注问题,输入部分和单句分类是一样的,只需要输出部分Transformer最后一层每个单词对应位置都进行分类即可。
2.对于分类问题,与GPT一样,只需要增加起始和终结符号,输出部分和句子关系判断任务类似改造;
3.对于句子关系类任务,很简单,和GPT类似,加上一个起始和终结符号,句子之间加个分隔符即可。对于输出来说,把第一个起始符号对应的Transformer最后一层位置上面串接一个softmax分类层即可。
4.生成式任务尽管Bert论文没有提,但是稍微动动脑子就可以想到,其实对于机器翻译或者文本摘要,聊天机器人这种生成式任务,同样可以稍作改造即可引入Bert的预训练成果。只需要附着在S2S结构上,encoder部分是个深度Transformer结构,decoder部分也是个深度Transformer结构。根据任务选择不同的预训练数据初始化encoder和decoder即可。这是相当直观的一种改造方法。
也可以更简单一点,比如直接在单个Transformer结构上加装隐层产生输出也是可以的。

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第24张图片
image.png

总结

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第25张图片
image.png

到这里我们可以再梳理下几个模型之间的演进关系。从上图可见,Bert其实和ELMO及GPT存在千丝万缕的关系,比如如果我们把GPT预训练阶段换成双向语言模型,那么就得到了Bert;而如果我们把ELMO的特征抽取器换成Transformer,那么我们也会得到Bert。所以你可以看出:Bert最关键两点,一点是特征抽取器采用Transformer;第二点是预训练的时候采用双向语言模型
那么新问题来了:对于Transformer来说,怎么才能在这个结构上做双向语言模型任务呢?
那么Bert是怎么做的呢?我们前面不是提过Word2Vec吗?前面提到了CBOW方法,它的核心思想是:在做语言模型任务的时候,我把要预测的单词抠掉,然后根据它的上文Context-Before和下文Context-after去预测单词。Bert就是这么做的。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第26张图片
image.png

那么Bert本身在模型和方法角度有什么创新呢?就是论文中指出的Masked 语言模型和Next Sentence Prediction。而Masked语言模型上面讲了,本质思想其实是CBOW,但是细节方面有改进


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第27张图片
image.png

Masked双向语言模型向上图展示这么做:随机选择语料中15%的单词,把它抠掉,也就是用[Mask]掩码代替原始单词,然后要求模型去正确预测被抠掉的单词。但是这里有个问题:训练过程大量看到[mask]标记,但是真正后面用的时候是不会有这个标记的,这会引导模型认为输出是针对[mask]这个标记的,但是实际使用又见不到这个标记,这自然会有问题。为了避免这个问题,Bert改造了一下,15%的被上天选中要执行[mask]替身这项光荣任务的单词中,只有80%真正被替换成[mask]标记,10%被狸猫换太子随机替换成另外一个单词,10%情况这个单词还待在原地不做改动。这就是Masked双向语音模型的具体做法。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第28张图片
image.png

至于说“Next Sentence Prediction”,指的是做语言模型预训练的时候,分两种情况选择两个句子,一种是选择语料中真正顺序相连的两个句子;另外一种是第二个句子从语料库中抛色子,随机选择一个拼到第一个句子后面。我们要求模型除了做上述的Masked语言模型任务外,附带再做个句子关系预测,判断第二个句子是不是真的是第一个句子的后续句子。之所以这么做,是考虑到很多NLP任务是句子关系判断任务,单词预测粒度的训练到不了句子关系这个层级,增加这个任务有助于下游句子关系判断任务。所以可以看到,它的预训练是个多任务过程。这也是Bert的一个创新。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第29张图片
image.png

上面这个图给出了一个利用微博数据和开源的Bert做预训练时随机抽出的一个中文训练实例,从中可以体会下上面讲的masked语言模型和下句预测任务。训练数据就长这种样子。
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第30张图片
image.png

Bert的输入部分:它的输入部分是个线性序列,两个句子通过分隔符分割,最前面和最后增加两个标识符号。每个单词有三个embedding:位置信息embedding,这是因为NLP中单词顺序是很重要的特征,需要在这里对位置信息进行编码;单词embedding,这个就是我们之前一直提到的单词embedding;第三个是句子embedding,因为前面提到训练数据都是由两个句子构成的,那么每个句子有个句子整体的embedding项对应给每个单词。把单词对应的三个embedding叠加,就形成了Bert的输入。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第31张图片
image.png
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第32张图片
image.png

我们说过Bert效果特别好,那么到底是什么因素起作用呢?如上图所示,对比试验可以证明,跟GPT相比,双向语言模型起到了最主要的作用,对于那些需要看到下文的任务来说尤其如此。而预测下个句子来说对整体性能来说影响不算太大,跟具体任务关联度比较高。


从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记_第33张图片
image.png

但是从上文介绍也可以看出,从模型或者方法角度看,Bert借鉴了ELMO,GPT及CBOW,主要提出了Masked 语言模型及Next Sentence Prediction,但是这里Next Sentence Prediction基本不影响大局,而Masked LM明显借鉴了CBOW的思想。
如果归纳一下这些进展就是:首先是两阶段模型,第一阶段双向语言模型预训练,这里注意要用双向而不是单向,第二阶段采用具体任务Fine-tuning或者做特征集成;第二是特征抽取要用Transformer作为特征提取器而不是RNN或者CNN;第三,双向语言模型可以采取CBOW的方法去做(当然我觉得这个是个细节问题,不算太关键,前两个因素比较关键)。Bert最大的亮点在于效果好及普适性强,几乎所有NLP任务都可以套用Bert这种两阶段解决思路,而且效果应该会有明显提升。可以预见的是,未来一段时间在NLP应用领域,Transformer将占据主导地位,而且这种两阶段预训练方法也会主导各种应用。

另外,我们应该弄清楚预训练这个过程本质上是在做什么事情,本质上预训练是通过设计好一个网络结构来做语言模型任务,然后把大量甚至是无穷尽的无标注的自然语言文本利用起来,预训练任务把大量语言学知识抽取出来编码到网络结构中,当手头任务带有标注信息的数据有限时,这些先验的语言学特征当然会对手头任务有极大的特征补充作用,因为当数据有限的时候,很多语言学现象是覆盖不到的,泛化能力就弱,集成尽量通用的语言学知识自然会加强模型的泛化能力。如何引入先验的语言学知识其实一直是NLP尤其是深度学习场景下的NLP的主要目标之一,不过一直没有太好的解决办法,而ELMO/GPT/Bert的这种两阶段模式看起来无疑是解决这个问题自然又简洁的方法,这也是这些方法的主要价值所在。

你可能感兴趣的:(从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史——读书笔记)