ERNIE1.0
ERNIE1.0主要是改进了BERT的MLM任务。我们看图说话,
1、ERNIE1.0的掩码机制
从图中,我们很容易发现ERNIE1.0对于BERT的改进是在MLM任务(一共三种mask,新增了两种mask)。在论文,作者阐述了三种不同的mask技巧:
基础mask:任意mask一个单词 (BERT所采用的mask类型)
短语mask:不是将单词看成一个整体,而是将短语看成一个整体;(比如上图中,mask了a series of而不仅仅是of)
实体mask:mask一个实体名。(比如上图中,mask的是J.K.Rowling,而不是K.)
相比于BERT, ERNIE 1.0 改进了两种masking 策略,一种是基于phrase (在这里是短语比如a series of, written等)的masking策略,另外一种是基于entity(在这里是人名,位置, 组织,产品等名词比如Apple, J.K. Rowling)的masking 策略。在ERNIE 当中,将由多个字组成的phrase 或者entity 当成一个统一单元,相比于bert 基于字的mask, 这个单元当中的的所有字在训练的时候,统一被mask. 对比直接将知识类的query 映射成向量然后直接加起来,ERNIE 通过统一mask的方式可以潜在的学习到知识的依赖以及更长的语义依赖来让模型更具泛化性。
2、DLM(对话语言模型)
ERNIE1.0的另外一个核心点在于通过百度贴吧的海量数据,引入了一个对话语言模型(DLM)无监督任务,通过预测Query和Response的关系来完计算损失值。
得益于百度贴吧强大的数据量,ERNIE1.0使用了海量的对话内容,因此在ERNIE1.0中使用了对话语言模型(Dialogue Language Model,DLM)。作者认为一组对话可能有多种形式,例如QRQ,QRR,QQR等(Q:Query,R:Response)。为了处理这种多样性,ERNIE1.0给输入嵌入中加入了对话嵌入(Dialogue Embedding)特征。另外在ERNIE1.0中,DLM是可以和掩码语言模型的兼容的,如图所示。
小结:跟bert相比,改进点:(也是ERNIE1.0的两个核心点)
1、mask的区别(改进的两种mask策略:基于phrase和基于entity)
2、添加了更多的优质中文语料。加入了百度百科、百度新闻、百度贴吧等中文语料,使得在中文NLP任务上效果更好。
ERNIE1.0使用的网络结构就是BERT的多头Transformer,这里不再重复。
好了,这样子ERNIE1.0就没了。下面我们开始ERNIE2.0.
ERNIE2.0
ERNIE 2.0的核心点是引入了持续预训练学习,解决了灾难性遗忘的问题。其实个人认为更重要的一点是引入了大量的预训练任务,包括单词感知,结构感知,和语义感知三类。
1、2.0的动机
在一个句子乃至一篇文章中,语言模型是一个最常见的无监督学习任务,但是能够从中挖掘出的无监督任务远远不止语言模型一种,而更丰富的种类意味着模型能够学习到更丰富的知识。因此,ERNIE 2.0从中提取了3个感知级别,共8小类任务。这么做也非常好理解,就像我们在做一张语文试卷时,只会一种题型并不能拿高分,只有写对了试卷中的所有题型时我们才真正把语文学习好了。
在训练一个能处理多个任务的模型时,一个非常棘手的问题叫做灾难性遗忘,灾难性遗忘产生的原因是当我们顺序学习一系列任务时,在我们一个新任务的目标去优化模型的时候,模型的参数会以新任务为目标进行调整,进而导致之前老任务的效果下降。ERNIE2.0提出解决灾难性遗忘的策略是使用持续学习。持续学习的特点是能够在学习新任务的同时保证老任务的准确率不会变。
ERNIE2.0主要是在ERNIE1.0的基础上,使用了新的多任务训练的框架。BERT的预训练中,采用了MLM和NSP两种任务,目的是为了让模型能够学出更好的词表示向量,以及句子之间的关系。对于这样的多任务训练,ERNIE2.0系统化的提出了3大类任务,并让ERNIE基于这三大类任务进行学习。我们先看图:
2、三大类任务,8个小任务
我们首先介绍ERNIE2.0这三大类任务,然后再介绍任务训练的方式。
ERNIE 2.0有三个感知级别的预训练任务,他们分别是:
单词感知预训练任务(Word-aware Pre-training Tasks):学习单词级别的知识;
结构感知预训练任务(Structure-aware Pre-training Tasks):学习句子级别的知识;
语义感知预训练任务(Semantic-aware Pre-training Tasks):学习语义级别的知识。
1、预训练的三大任务:
-
单词层面预训练任务:
(1)知识mask:ERNIE1.0介绍的mask;
(2)单词-文章关系:预测一个单词是否会出现在一篇文章中,可以让模型抓住文章主旨;
(3)首字母大写预测:一般实体的首字母得大写,所以这个任务有助于NER任务 -
结构层面预训练任务:
(1)文章句子排序:将一组乱序的句子,重新排序成一个段落;
(2)句子距离预测:3分类任务,“0”表示是一个文章中紧挨着的句子,“1”表示是一(3)个文章中的句子,但不是紧挨着的,“2”表示不是一个文章中的句子 -
语义层面预训练任务:
(1)语义关系:预测两个句子之间的语义关系或者修辞关系
(2)信息检索相关性:预测query和title是否相关的3分类任务。“0”表示强相关,“1”表示若相关,“2”表示完全不相关。
2. 训练方式:持续多任务学习
ERNIE2.0采用的是持续多任务学习(Sequential Multi-task Learning)。这样学习是为了让模型巩固之前的任务所学到的知识。
ERNIE 2.0的持续多任务学习分成两个阶段:
(1)在大量的数据上进行无监督训练;
(2)使用持续多任务学习增进式的更新ERNIE 2.0。
为什么这里要引入持续多任务学习呢?试想一下,当我们训练一个有诸多任务组成的模型时,我们有两个问题需要解决。首先,如何能够保证早期学习的任务不会被灾难性遗忘;其次如何高效的训练这些任务。第一个问题的解决方案是在训练新任务时,加入老任务和它一起训练即可。第二个问题的解决方案是在每个训练阶段,我们自动的为每个任务分配N个训练步(iteration/step)。下图对ERNIE 2.0的持续多任务学习和多任务学习以及其他的持续学习做了对比。
下图的右侧是常见的持续学习框架,它的思想就是对于每次过来的数据,依次对齐进行训练,这个方法的问题就是有非常严重的灾难性遗忘的问题。下图的中间是多任务学习模型,它的学习方法是每次有新任务过来时,都重新训练所有任务,这个方法的缺点是效果过于差。
下图的左侧是百度提出的持续多任务学习的策略,即每次有新任务过来时,它就在原来训练结果的基础上同时训练老任务和新任务。但是这样等到后期任务比较多的时候,效率也并不高。这也就使用了我们刚刚介绍的每个任务训练 N轮的策略。
(左)ERNIE 2.0的持续多任务学习,(中)多任务学习,(右)持续学习
3、ERNIE2.0的网络结构
和ERNIE-B相同,ERNIE 2.0也是使用的由Transformer构成的网络结构。但是为了适应它的连续多任务学习,它对网络结构做了几点修改,如下图所示。首先在输入阶段,ERNIE 2.0添加了一个任务嵌入(Task Embedding),对于一个一直可能有任务进来的模型来说,任务嵌入的作用则是就是根据他们的任务任务编号对齐进行编码,然后在和三个BERT中采用的嵌入方式相加后送给编码器。
说到编码器,由于ERNIE 2.0是可以训练多个任务的,所以它需要多种不同的输入头。在ERNIE 2.0中,它采用的是编码器部分网络共享,在编码器之后不同任务使用独立的网络结构的方式。
最终,ERNIE2.0的持续学习以及预训练任务(图)整体框架为:
小结
从算法角度来看,百度的ERNIE系列并没有太大的创新,其起到提升准确率的主要模块在于百度本身拥有的强大的中文数据资源和工具。借助于这些中文的数据和工具,ERNIE-B和ERNIE 2.0中提出的几个无监督任务还是很有参考价值的。这也促使我们思考如何利用现有的资源来构造更丰富的任务。
百度的ERNIE系列和OpenAI的GPT系列把词向量训练任务推向了两个极端,一个是挖掘丰富的任务,另一个是堆积超大的模型和大量的数据,无论哪个极端都是需要巨大的财力支持的。但是我们从中也看出了词向量任务还有很高的上限,何时能推出一个泛化能力足以解决诸多场景的与训练模型,我等小白只能翘首以待了。