上个月,全球规模最大的语义评测比赛 SemEval 2020 结果出炉,百度基于飞桨平台自研的语义理解框架 ERNIE 一举斩获 5 项世界冠军,囊括视觉媒体的关键文本片段挖掘、多语攻击性语言检测和混合语种的情感分析。去年,ERNIE先后完成两版重大升级:ERNIE 1.0 提出知识增强的语义表示模型, ERNIE 2.0 则构建了持续学习语义理解框架,在中英文 16 个任务上超越业界最好模型。本文将为开发者详细解读ERNIE的进化史。
ERNIE 1.0
ERNIE: Enhanced Representation through Knowledge Integration[1] 是百度在2019年4月的时候,基于BERT模型,做的进一步优化,在中文的NLP任务上得到了state-of-the-art的结果。
它主要是在mask的机制上做了改进,它的mask不是基本的word piece的mask,而是在pretrainning阶段增加了外部的知识,由三种level的mask组成,分别是basic-level masking(word piece)+ phrase level masking(WWM style) + entity level masking。在这个基础上,借助百度在中文社区的强大能力,中文的ERNIE还使用了各种异质(Heterogeneous)的数据集。此外为了适应多轮的贴吧数据,所有ERNIE引入了DLM (Dialogue Language Model) task。
百度的论文看着写得不错,也很简单,而且改进的思路成为了后来各种改进模型的基础。例如说Masking方式的改进,让BERT出现了WWM的版本,对应的中文版本(Pre-Training with Whole Word Masking for Chinese BERT[2]),以及 facebook的SpanBERT[3]等都是主要基于ERNIE masking方式做的改进。
01
Knowledge Masking
例如:哈利波特是J.K.罗琳写的小说。单独预测 哈[MASK]波特 或者 J.K.[MASK]琳 对于模型都很简单,但是模型不能学到哈利波特和J.K. 罗琳的关系。如果把哈利波特直接MASK掉的话,那模型可以根据作者,就预测到小说这个实体,实现了知识的学习。
需要注意的是这些知识的学习是在训练中隐性地学习,而不是直接将外部知识的embedding加入到模型结构中(ERNIE-TsingHua[4]的做法),模型在训练中学习到了更长的语义联系,例如说实体类别,实体关系等,这些都使得模型可以学习到更好的语言表达。
首先我们先看看模型的MASK的策略和BERT的区别。
ERNIE的mask的策略是通过三个阶段学习的,在第一个阶段,采用的是BERT的模式,用的是basic-level masking,然后再加入词组的mask(phrase-level masking), 然后再加入实体级别entity-level的mask。如下图:
不同mask的效果:
02
Heterogeneous Corpus Pre-training
03
DLM (Dialogue Language Model) task
对话的数据对语义表示很重要,因为对于相同回答的提问一般都是具有类似语义的,不同于BERT的输入形式,ERNIE能够使用多轮对话的形式,采用的是三个句子的组合[CLS]S1[SEP]S2[SEP]S3[SEP] 的格式。这种组合可以表示多轮对话,例如QRQ,QRR,QQR。Q:提问,R:回答。为了表示dialog的属性,句子添加了dialog embedding组合,这个和segment embedding很类似。
DLM还增加了任务来判断这个多轮对话是真的还是假的:
04
NSP+MLM
最终模型效果对比BERT:
ERNIE 2.0
「Inituition」:就像是我们学习一个新语言的时候,我们需要很多之前的知识,在这些知识的基础上,我们可以更快地学习新语言,如此就有了迁移学习的效果。我们的语言模型如果增加多个任务的话,是不是可以获得更好的效果?事实上,经发现,ERNIE 1.0 加了DLM任务以及其他的模型。如Albert 加了sentence order prediction(SOP)任务之后或者SpanBERT: Improving Pre-training by Representing and Predicting Spans[6]在加上了SBO目标之后 ,模型效果得到了进一步的优化,同时MT-DNN[7]也证明了,在预训练的阶段中加入多个GLUE下游任务(有监督)进行多任务学习,可以得到state-of-the-art的效果。
于是科学家们就在想那一直加task岂不是更强?百度不满足于堆叠任务,而是提出了一个持续学习的框架,利用这个框架,模型可以持续添加任务但又不降低之前任务的精度,从而能够更好更有效地获得词法lexical,句法syntactic,语义semantic上的表达。
在ERNIE1.0的基础上,利用了大量的数据,以及先验知识,然后提出了多个任务,用来做预训练,最后根据特定任务finetune。框架的提出是针对life-long learning的,即终生学习,因为我们的任务叠加,不是一次性进行的(Multi-task learning),而是持续学习(Continual Pre-training),所以必须避免模型在学了新的任务之后,忘记旧的任务,即在旧的任务上loss变高,相反的,模型的表现应该是因为学习了之前的知识,所以能够更好更快的学习到现有的任务。为了实现这个目的,百度提出了一个包含pretraining 和fine-tuning的持续学习框架。
01
Continual Pre-training
02
Continual Fine-tuning
03
ERNIE 2.0 Model
为了验证框架的有效性,ERNIE 2.0 用了多种任务,训练了新的ERNIE2.0模型,然后成功刷榜NLU任务的benchmark,GLUE(截止2020.01.04),开源了ERNIE2.0英文版。
04
Model structure
但是对于fine-tuning阶段,ERNIE 使用任意值作为初始化都可以。
05
Pre-training Tasks
种组合,让模型去预测这篇文章是第几种,就是一个多分类的问题。这个问题就能够让模型学到句子之间的顺序关系。就有点类似于Albert的SOP任务的升级版。
性能不敏感的场景:直接使用
度小满的风控召回排序提升25%。
度小满的风控识别上:在ERNIE上直接进行微调预测有没有风险对应的结果。传统的缺点:需要海量的数据,而这些数据也很难抓取到的,抓取这些特征之后呢还要进行复杂的文本特征提取,比如说挖掘短信中银行的催收信息,对数据要求的量很高,对数据人工的特征的挖掘也很高。这两项呢造成了大量的成本,如今只需ERNIE微调一下,当时直接在召回的排序上得到25%的提升。这种场景的特点是什么?用户对于实时性的需求不是很强,不需要用户输入一个字段就返回结果。只要拿一天把所有数据跑完,得到结果就可以了,统一的分析就可以了,适合少数据的分析场景。
性能敏感场景优化
另外的一个场景是搜索问答query识别和qp匹配,该场景需要非常高的性能优势的,采用的解决方案就是模型蒸馏。输入一个问题,得到答案,本质是文本匹配,实际是输入问题,把数据库中大量的候选答案进行匹配计算得分,把得分最高的返回。但是百度每天很多用户,需要很快的响应速度,数据量大,要求响应速度还快,这时候要求不仅模型特别准,而且还要特别快,怎么解决就是模型蒸馏。
Phrase 1:
判断问题是否可能有答案(文本分类),过滤完是可能有答案的,再与数据库中进行匹配,因为大部分输入框的不一定是个问题,这样过滤掉一部分,排除掉一部分后,在做匹配就能得到很大的提升,提升还是不够。
第一部分其实是文本分类,通过小规模的标注特征数据进行微调,得到一个好的模型,同时日志上是有很多没有标注的数据,用ERNIE对这些数据进行很好的标注,用一个更好的模型去标注数据,用这些标注数据训练相对简单的模型,就实现了蒸馏,ERNIE处理速度慢,但是可以用题海战术的方式训练简单的模型。具体步骤:一个很优秀的老师,学一点东西就能够带学生了,但是学生模型不够聪明,海量的题海战术就可以学很好。
Fine-tune:使用少量的人工标注的数据用ERNIE训练
label propagation:使用ERNIE标注海量的挖掘数据,得到带标注的训练数据
train:使用这些数据下去训练一个简单的模型或者采用模型蒸馏的方式,参考TinyBERT
Phrase 2:
有答案与答案库进行各种各样的匹配(文本匹配)同理,下面问题匹配也是,右边也是query和答案,然后经过embedding,加权求和,全连接,最后计算他们之间的预选相似度,可以是余弦相似度,召回提升7%。
场景:百度视频离线推荐
这是一个推荐场景,目标是基于用户浏览的历史视频推荐新的视频。这里使用视频的标题文本作为特征推荐。视频的标题文本是保持不变的,所以可以提前把ERNIE的结果计算保存好。视频之间两两计算相似度的计算量是非常大的,那么怎么减少计算量呢?使用了一个技术叫离线向量化。把ERNIE作为一个特征向量的生成器,离线把每一个视频的ERNIE向量计算好,然后存入数据库中。实际计算时,用户看的视频经过ERNIE 得到一个向量,候选集通过另外一个ERNIE(共享权重),得到另外一个向量,最后通过cos函数计算相似度。这样整体的运算量就从O(N2)降低到O(N)。
代码使用
git clone https://github.com/PaddlePaddle/ERNIE
pip install -r requirements.txt
cd models
wget --no-check-certificate https://baidu-nlp.bj.bcebos.com/ERNIE_stable-1.0.1.tar.gz
cd ..
wget --no-check-certificate https://ernie.bj.bcebos.com/task_data_zh.tgz
run.sh
home=YOUR_ERNIE_PATH
export TASK_DATA_PATH=$home/glue_data_processed/
export MODEL_PATH=$home/model/
export TASK_DATA_PATH=YOUR_TASK_DATA_PATH
export MODEL_PATH=YOUR_MODEL_PATH
sh script/zh_task/ernie_base/run_ChnSentiCorp.sh
百度在自然语言处理领域已有二十年的积累与沉淀,具备了最前沿、最全面、最领先的技术布局,不仅专注于前瞻技术探索,更致力通过技术应用解决实际问题。而飞桨是目前国内自主研发、开源开放、功能最完备的产业级深度学习平台,集深度学习核心框架、基础模型库、端到端开发套件、工具组件和服务平台于一体,服务于150多万开发者,正与合作伙伴一起帮助越来越多的行业完成 AI 赋能。
本文参考资料
[1 ]ERNIE: Enhanced Representation through Knowledge Integration:
https://arxiv.org/pdf/1904.09223
[2] Pre-Training with Whole Word Masking for Chinese BERT:
https://arxiv.org/pdf/1906.08101
[3] facebook的SpanBERT:
https://arxiv.org/pdf/1907.10529
[4] ERNIE-TsingHua:
https://arxiv.org/pdf/1905.07129.pdf
[5] ERNIE 2.0: A Continual Pre-Training Framework for Language Understanding:
https://arxiv.org/pdf/1907.12412.pdf
[6] SpanBERT: Improving Pre-training by Representing and Predicting Spans:
https://arxiv.org/pdf/1907.10529.pdf
[7] MT-DNN:
https://arxiv.org/pdf/1901.11504.pdf
[8] baidu offical video:
http://abcxueyuan.cloud.baidu.com/#/play_video?id=15076&courseId=15076&mediaId=mda-jjegqih8ij5385z4&videoId=2866§ionId=15081&showCoursePurchaseStatus=false&type=免费课程
[9] Life long learning:
https://www.youtube.com/watch?v=8uo3kJ509hA
[10]【NLP】深度剖析知识增强语义表示模型:
ERNIE: https://mp.weixin.qq.com/s/Jt-ge-2aqHZSxWYKnfX_zg
本文分享自 PaddlePaddle 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!