写在前头:ernie有点长也有点复杂,分为百度,清华,1和2两个版本,加上2的中文至今没有开源,效果嘛也就那样,所以其实不如bert系列,本人看了半天,也没有理解特别深刻,故随手写一些,权当一点小小的总结,并不完整。ernie个人感觉一个比较不方便的地方在于,清华版本效果不佳,百度版本是基于百度自己的飞浆框架的,和主流的tf或者pt有所出入,使用来说相对没有那么方便,不知道有没有人基于tf或者pt实现了百度ernie,我还暂时没有去了解。

首先 ernie也是堆叠的encoder结构组成的模型,这点和bert十分相似。

ERNIE Base: 12 encoder layers, 768 hidden units, 12 attention heads

ERNIE Large: 24 encoder layers,1024 hidden units, 16 attention heads

从输入上来看第一个输入是一个特殊的CLS, CLS 表示分类任务

就像transformer的一般的encoder, ERINE将一序列的words输入到encoder中.每层使用self-attention, feed-word network,然后把结果传入到下一个encoder。

相比于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的方式可以潜在的学习到知识的依赖以及更长的语义依赖来让模型更具泛化性。

如下图,ernie1的主要改进其实就是这mask策略

对话的数据对语义表示很重要,因为对于相同回答的提问一般都是具有类似语义的,ERNIE修改了BERT的输入形式,使之能够使用多轮对话的形式,采用的是三个句子的组合[CLS]S1[SEP]S2[SEP]S3[SEP] 的格式。这种组合可以表示多轮对话,例如QRQ,QRR,QQR。Q:提问,R:回答。为了表示dialog的属性,句子添加了dialog embedding组合,这个和segment embedding很类似。 - DLM还增加了任务来判断这个多轮对话是真的还是假的

预训练任务用的还是NSP+MLM的组合。

 ernie2

2主要提出了一个所谓的连续学习的框架,ERNIE 2.0 中有一个很重要的概念便是连续学习(Continual Learning),连续学习的目的是在一个模型中顺序训练多个不同的任务以便在学习下个任务当中可以记住前一个学习任务学习到的结果。通过使用连续学习,可以不断积累新的知识,模型在新任务当中可以用历史任务学习到参数进行初始化,一般来说比直接开始新任务的学习会获得更好的效果。

ERNIE 2.0 和1.0结构基本一致,但是权重并不共享。

模型的结构和BERT一致,但是在预训练的阶段,除了正常的position embedding,segment embdding,token embedding还增加了task embedding。用来区别训练的任务, 对于N个任务,task的id就是从0~N-1,每个id都会被映射到不同的embedding上。

但是对于fine-tuning阶段,ernie 使用任意值作为初始化都可以。

  • 初始化 optimized initialization 每次有新任务过来,持续学习的框架使用的之前学习到的模型参数作为初始化,然后将新的任务和旧的任务一起训练。
  • 训练任务安排 task allocating 对于多个任务,框架将自动的为每个任务在模型训练的不同阶段安排N个训练轮次,这样保证了有效率地学习到多任务。如何高效的训练,每个task 都分配有N个训练iteration。

他把预训练任务分成了三类,分别是词法级别的预训练任务,来获取训练数据中的词法信息;语法层级的任务(structure-aware pretraining task) :获取句法的知识;语义层级的任务(semantic-aware pretraining task) :获取语义关系的知识;

a: 构建词法级别的预训练任务,来获取训练数据中的词法信息

1: knowledge masking task, 即ERNIE 1.0 中的entity mask 以及phrase entity mask 来获取phrase 以及entity的先验知识,相较于sub-word masking, 该策略可以更好的捕捉输入样本局部和全局的语义信息。

2: Capitalization Prediction Task, 大写的词比如Apple 相比于其他词通常在句子当中有特定的含义,所以在Erine 2.0 加入一个任务来判断一个词是否大写

3: Token-Document Relation Prediction Task,类似于tf-idf, 预测一个词在文中的A 段落出现,是否会在文中的B 段落出现。如果一个词在文章当中的许多部分出现一般就说明这个词经常被用到或者和这个文章的主题相关。通过识别这个文中关键的的词, 这个任务可以增强模型去获取文章的关键词语的能力

b: 构建语法级别的预训练任务,来获取训练数据中的语法信息

1: Sentence Reordering Task, 在训练当中,将paragraph 随机分成1 到m 段,将所有的组合随机shuffle. 我们让pre-trained 的模型来识别所有的这些segments正确的顺序. 这便是一个k 分类任务,通常来说,这些sentence 重排序任务能够让pre-trained 模型学习到document 中不同sentence 的关系,这个任务类似于albert里面的sop任务。

2: Sentence Distance Task, 构建一个三分类任务来判别句子的距离,0表示两个句子是同一个文章中相邻的句子,1表示两个句子是在同一个文章,但是不相邻,2表示两个句子是不同的文章。通过构建这样一个三分类任务去判断句对(sentence pairs) 位置关系(包含邻近句子、文档内非邻近句子、非同文档内句子3 种类别),更好的建模语义相关性。

c:构建语义级别的预训练任务,来获取训练数据中的语义任务

1: Discourse Relation Task,除了上面的distance task, ERNIE通过判断句对(sentence pairs) 间的修辞关系(semantic & rhetorical relation),更好的学习句间语义。

2: IR Relevance Task, 在这里主要是利用baidu 的日志来获取这个关系,将query 作为第一个sentence, title 作为第二个second sentence. 0 表示强关系, 1 表示弱关系,2表示无关系,通过类似google-distance 的关系来衡量两个query之间的语义相关性,更好的建模句对相关性。

对了,他自然还增大了数据集,使用了比bert更大的数据集去训练,这些数据集很大一部分都是百度自己做的,例如贴吧里的问答数据之类的。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐