ERNIE预训练模型

bert存在的问题

1、针对有两个及两个以上连续字组成的词,随机mask字割裂了连续字之间的相关性,使模型不太容易学习到词的语义信息。比如一句话:‘北京是中国的首都,是一座美丽的城市’,在bert的随机mask LM任务中,可能是把‘京’mask掉在再做预测,这样就把‘北京’两个字的语义割裂了。

2、NSP任务是否有必要?在bert的变体中,ROBERTA和ALBERT都更改或移除了NSP任务,他们认为bert中的NSP任务对下游任务并没有太大的帮助。虽然没有明确的证据可言,但实践出真知了。

ERNIE1.0

ERNIE的网络结构和bert_base相似,也是采用transformer的encoder单元,layers  = 12, hidden = 768, attention = 12,ERNIE分1.0和2.0版本。

(1)实体级别连续MASK

针对bert存在的第一个问题,ERNIE改变了mask的方式,不再是单个token的mask,而是加入了实体和短语的mask,这让模型具有了更强的语法学习能力。对比如下:

bert和ernie mask对比

在上图中,短语‘a series of’ 和人名‘J.K.Rowling’被连续mask了。

我们知道bert中是token级别的,而在ERNIE如何获得实体呢?这就需要先对语料进行分词,所以分词的精确度对mask的效果是有影响的。在分词之后,ERNIE为什么没有直接把实体作为输入呢,而是把实体分成多个token然后连续mask?原因在于词是无限的,token是有限的,也有效避免了oov问题。

ERNIE的不同级别的mask(单字、实体、短语)

不同级别的mask

每个样本由5个 字段输入: token_ids; sentence_type_ids; position_ids; seg_labels; next_sentence_label;其中 seg_labels 表示分词边界信息: 0表示词首、1表示非词首、-1为占位符。

在每个epoch会随机选择句子是mask_word(mask实体和短语) 还是 mask_char(mask单字) 模式,mask_char 模式就和bert的mask相似了。mask_word 模式后续会走 phrase-level masking 逻辑,会利用分词边界信息,代码地址https://www.jianshu.com/p/594188d27497。

(2)更多的语料

ERNIE除了mask的重大改变,同时在训练数据集上增加了很多。bert使用了中文维基百科,ERNIE也同样使用了,并且在此基础上加入百度自有的数据集:百度百科(实体、强描述性)、百度新闻(专业通顺语料)、百度贴吧(多轮对话)。这三个数据集的侧重点不同,对模型应该也有较好的提升。对语料的处理加入了中文繁体-->简体,英文大写-->小写,词表大小为17964。

(3)多轮对话

针对bert存在的第二个问题,ERNIE对NSP任务做了修改,输入层使用多轮对话来替代句子对分类任务。输入格式为[CLS]S1[SEP]S2[SEP]S3[SEP] ,这种组合可以表示多轮对话,例如QRQ、QRR、QQR,Q是提问,R是回答。随机替换R,然后让模型判断这个多轮对话是真的还是假的。

dialog embedding

ERNIE2.0

相比于1.0,ERNIE2.0又做了两件事情:构建多任务持续学习预训练框架;构建三种类型的无监督任务。来刷新效果。

(1)连续多任务学习

百度通过大数据和先验知识(比如实体、分词的结果)构建很多个任务,让这些任务持续的喂给muti-task learning结构,进行预训练学习。然后将学习得到的权重参数返回给下游任务specific tasks,进行微调。

多任务学习框架

连续多任务学习的目的是不遗忘之前的训练结果,因为任务太多了,模型容易忘记最早训练的任务得到的参数。所以,ERNIE2.0使用上一个任务的参数训练新任务时,旧任务也加进来一起训练,这样每一轮迭代都带上老任务,到最后一轮时,同时训练所有的任务。这是一个串行和并行同时进行的框架,多次迭代之间是串行的,每一次迭代的时候多个任务是并行计算的。为什么可以并行计算呢?因为每个任务都有独立的loss function,sentence task 可以和word task 一起训练。

ERNIE2.0包括token embedding、position embedding、sentence embedding、task embedding。与bert不同的是,sentence embedding不是11111100001111110000这种,而是AAAAAABBBBBCCCCCDDDD这种,task embedding是标记该样本输入是服务于哪个预训练任务。

(2)三种类型的无监督任务

1、词法级别预训练任务

Knowledge Masking Task:学习当前和全局依赖,保留ERNIE 1.0里面实体级别的mask。

Capitalization Prediction Task:大写用于专名识别等,小写也可用在其他任务

Token-Document Relation Prediction Task:token存在段落A中是否token会在文档的段落B中出现,目的是服务于找关键词的下游任务。

2、语言结构级别预训练任务

Sentence Reordering Task:文档中的句子打乱(分成1到m段,shuffle),识别正确顺序,就是句子排序题。

Sentence Distance Task:句子间的距离,3分类任务。0:相连的句子,1:同一文档中不相连的句子,2:两篇文档间的句子,相当于NSP任务的改造。

3、语法级别预训练任务

Discourse Relation Task:计算两句间的语义与修辞关系,对因果关系、并列关系...分类。

IR Relevance Task:短文本信息检索关系(百度的核心),Query-title  (搜索数据)0:搜索并点击,1:搜索并展现,2:无关,随机替换。

你可能感兴趣的:(ERNIE预训练模型)