如何将知识(knowledge)信息融入到模型训练中,一种方式是将知识信息作为输入,成本是其他人使用的时候也要构建知识库,并且fine-tune和pre-train的知识库分布不一致,fine-tune也会出现问题。
另一种方式是将知识信息融入到训练任务中,ERNIE提出一种知识掩盖策略取代bert的mask,包含实体层面和短语级别的掩盖,实验验证了这种策略的有效性,
和bert一样,随机选取token做mask。
会将语法中的短语做mask,例如:a series of|such as 等。
会将一些实体整个mask,主要实体包含人物、地点、组织、产品名等。
训练预料包括中文维基百科,百度百科,百度新闻(最新的实体信息),百度贴吧。
其中百度贴吧的Query-Response信息用于DLM训练,即对话语言模型,每个句子会有一个标记,Q表示query,R表示response。这个dialogue embedding,其实就是bert里面的sentence embedding(segment id)。
实验证明了其提出的两种mask策略都对下游人物有所提升,其二,证明了DLM人物,对于下游人物也有相应的提升。其三,通过完型填空人物,ernie能够更好地利用词语信息预测出正确的实体。
当前pre-training模型更多关注词语或者句子共现,没有很好地利用语料中词汇( lexical)、句法(syntactic)和语义(semantic)信息,例如实体、semantic closeness、discourse relations。为了更好的利用训练语料中的词汇、句法和语义信息,提出可持续学习(continual learning)的ERNIE2.0的多任务的预训练框架,并实验论证了在GLUE上效果超过BERT和XLNet。
XLNet看论文提出的方法很有意思,但是效果提升上来说,真的难讲是参数量带来的提升还是模型改进,甚至怀疑是调优上带来的提升(炼丹术)。
纵观BERT相关改进方法,无非模型和数据两方面,添加跟多语言建模任务其实是数据和模型上的改进,效果上肯定是数据优化带来的提升更为明显,例如roberta改进了数据预处理带来的某些任务提升就超过了XLNet。
作者基于上面假设,提出来ERNIE2.0的框架,支持添加定制的任务与原有多任务一起增量地预训练,使得模型能够更好地学习到语料中的词汇( lexical)、句法(syntactic)和语义(semantic)表示。
个人理解主要区别就在于添加了更多的语言任务,底层模型的话还是Transformer,或者你也可以换成RNN(换成RNN图个啥呢)
git: https://github.com/PaddlePaddle/ERNIE
持续预训练包含两步。首先,通过引入先验知识和大数据上持续地无监督任务训练模型,然后增量的添加多任务更新ERNIE模型。
对于第一步pre-training,会构造词语感知、结构感知、语义感知的任务,这些任务都是无监督或者弱监督的信号,能够方便的从大量语料中,无须人工标注。
对于第二步的多任务,使用持续学习的方式训练。首先使用一个简单的任务训练初始模型,然后持续增加新的预训练任务来升级模型。注意,在添加新任务的时候,会和之前任务一起训练,来保证模型不会忘记之前学到的知识。基于此,作者认为这种持续学习能够让ERNIE框架保持学习并且持续收集知识,同时积累的知识保证模型在新任务上能够学得更好。
讲道理,这不就是 积跬步而至千里 吗?
整体框架如下图,中间的Encoder为各个人物所共享,可以是Transformer、RNN、甚至CNN(as you like,但是也没必要开倒车),将其分类了两大类损失,一类是句子级别的损失,一类是字级别,后面会介绍。
Transformer Encoder:作为底层的共享编码层,细节参考:Attention Is All You Need
Task Embedding:底层引入了任务的编码特征来区分不同的任务,对于不同的任务使用唯一表示的ID来表示,每个id有一个唯一的向量表示(就想word embedding一样,只是这里id少而已)。其他的和BERT类似,就是Token embedding, sentence embedding, Position embedding. 见图三。
看到这里我有点好奇训练方式,难道七个任务是交替训练吗,继续看下文吧
在这里插入图片描述
Knowledge Masking Task:和ERNIE1.0类似,使用字、短语、实体级别的mask LM任务来训练,具体就是掩盖掉整个短语、实体,让模型通过上下文和全局信息预测这些被掩盖掉的词语。此任务是初始化训练模型。
Capitalization Prediction Task: 即大小写预测,在英文中大写字母一般有特殊含义,一般都是实体,所以这个任务对于识别实体会有一些帮助。
Token-Document Relation Prediction Task:这是啥意思,TF? no IDF? 预测一个词语是否在其他段落中。一般主题词不会在其他段落中出现,但是主题词也有可能在其他类似文档中出现,所以作者期望这个能够让模型具备捕获关键词能力。
Sentence Reordering Task: 即排序任务,咋建模呢,哈哈,将一段话随机切成[1,m]段,然后随机打乱顺序,那模型咋预测,简单,可能的序列有 k = ∑ n = 1 m n ! k=\sum_{n=1}^{m}n! k=∑n=1mn!种,那不就是一个k分类问题吗,好吧。然后模型就能学到段落中句子的关系。
说实话,我觉得能如果m比较小还行,比如m=2就很像BERT里面的NSP任务,但是m大的话,呵呵。但是,作者这种范式总结还是很赞。
Sentence Distance Task: 对于句子距离,怎么建模呢,仍然是分类来做,具体为3分类问题。
Discourse Relation Task:除了句子的位置距离,那么语义关系还没有呢,于是这里提出了句子间的语义(其实是修辞)关系任务。使用了Mining discourse markers for unsupervised sentence representation learning中的英文数据训练模型,同时使用期方法自动构建了中文数据来训练中文模型。
IR Relevance Task:那么真语义相似性任务呢,这就来了,利用百度搜索引擎的数据(要是能用google的估计能好不少),判断query(第一句)和url title(第二句)的关系,也是一个三类别。
那么具体是怎么训练的呢?
面临两个问题,一是使用持续学习的方式学习多个任务,并且模型不能遗忘之前的任务的知识。作者通过continual multi-task learning方法,每次训练新任务之前加载之前模型参数,并且新任务会和之前的任务一起同时训练。
另一个是怎么更高效地训练多个任务。通过对不同的任务,分配不同的迭代次数N,在不同的训练阶段框架需要自动对每个任务分配N的值,以此来保证高效并且模型不会遗忘之前任务。
那么问题来了,这个超参数N咋设置呢,炼丹吗?
最重要的,数据来源,英文数据集来自于wiki百科,book corpus,收集了Reddit和Discoery data[3]作为语义关系的数据。中文预料包含百科、新闻、对话、信息检索、语义关系、搜索引擎数据。见下表
英文自然是GLUE任务。中文任务包含9项:阅读理解、实体识别、NLI、语义相似度、情感分析、QA。
结果自然是超过了之前的一些BERT模型。英文数据集GLUE结果
中文数据集:
作者所谓的continual Multi-task Learning,分别和MTL、CL做了对比,如图
三种训练方式,continual Multi-task Learning最优,具体训练是stage1训练任务1 20k步,stage2训练任务1和任务2以3:1比例训练。以此类推,作者任务这样会