当前位置: 首页 > 编程日记 > 正文

超详细中文预训练模型ERNIE使用指南

640?wx_fmt=jpeg


作者 | 高开远,上海交通大学,自然语言处理研究方向


最近在工作上处理的都是中文语料,也尝试了一些最近放出来的预训练模型(ERNIE,BERT-CHINESE,WWM-BERT-CHINESE),比对之后还是觉得百度的ERNIE效果会比较好,而且使用十分方便,所以今天就详细地记录一下。希望大家也都能在自己的项目上取得进展~


1、A Glance at ERNIE


640?wx_fmt=png


关于ERNIE模型本身的话这篇不会做过多介绍,网上的介绍文档也很多了,相信从事NLP的同学们肯定都非常熟悉啦。

 

2、ERNIE源码浅尝


Okay,当我们了解了ERNIE模型的大体框架及原理之后,接下来就可以深入理解一下具体的实现啦。ERNIE是基于百度自己的深度学习框架飞桨(PaddlePaddle)搭建的,(百度推这个飞桨的力度还是蛮大的,还开放了免费算力),大家平时炼丹用的更多的可能是TensorFlow和Pytorch,这里关于运行ERNIE的飞桨环境安装可以参考快速安装指南:

https://www.paddlepaddle.org.cn/#quick-start


2.1 关于输入


模型预训练的输入是基于百科类、资讯类、论坛对话类数据构造具有上下文关系的句子对数据,利用百度内部词法分析工具对句对数据进行字、词、实体等不同粒度的切分,然后基于 tokenization.py 中的 CharTokenizer 对切分后的数据进行 token 化处理,得到明文的 token 序列及切分边界,然后将明文数据根据词典config/vocab.txt 映射为 id 数据,在训练过程中,根据切分边界对连续的 token 进行随机 mask 操作。经过上述预处理之后的输入样例为:

 

11048 492 1333 1361 1051 326 2508 5 1803 1827 98 164 133 2777 2696 983 121 4 199 634 551 844 85 14 2476 1895 33 13 983 121 23 7 1093 24 46 660 12043 2 1263 6328 33 121 126 398 276 315 5 63 44 35 25 12043 2;0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11;0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2829 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 5455;-1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 00 -1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 -1;0

 

一共有五个部分组成,每个部分之间用分号;隔开:

  • token_ids:输入句子对的表示;

  • sentence_type_ids:0或者1表示token属于哪一个句子;

  • position_ids:绝对位置编码

  • seg_labels:表示分词边界信息,0表示词首、1表示非词首、-1为占位符

  • next_sentence_label:表示该句子对是否存在上下句的关系(0为无1为有)

reader.pretraining.py中的parse_line函数.

       640?wx_fmt=png


2.2 关于mask策略 batching.py


我们知道,相较于BERT,ERNIE最大的改进就是中文 + 短语/实体掩码(这个短语掩码的操作后来也被BERT采用训练出了WWM-BERT),所以我们首先来看看ERNIE的掩码机制是怎么样实现的。

  640?wx_fmt=png

   640?wx_fmt=png

  640?wx_fmt=png

   640?wx_fmt=png


2.3 关于infer过程代码改写


ERNIE代码很方便使用,但是有一个不足的地方就是目前官方还没有给出infer.py文件,也就是模型训练之后给出快速推理结果的文件。Github上简直万人血书求接口呀。

 

所以我们的目的就是需要改写源码,完成这样一个接口:输入为我们需要预测的文件predict.tsv,调用接口后输出为相应任务的结果pred_result。下面我们以分类任务为例,改写一个infer接口。


Step 1. finetune下的classifier.py

在文件中完成predict函数

       640?wx_fmt=png


Step 2. run_classifier.py

修改predict_only=True时的逻辑


640?wx_fmt=png


Step 3. finetune_args.py

在该文件中添加一个参数do_predict

       640?wx_fmt=png


OK, 篇幅有限后面还要介绍具体ERNIE实战,源码阅读部分就先这样,其实剩下的很多都跟BERT代码比较相似,感兴趣的同学也可以参考之前的 BERT源码分析系:https://blog.csdn.net/Kaiyuan_sjtu/article/details/90265473


3、ERNIE实战指南


上面扯的都是务虚的,接下来我们务实地来看看ERNIE这个预训练模型的具体应用。和BERT相比,ERNIE的使用更加简单,在之前介绍过的BERT模型实战之多文本分类(https://blog.csdn.net/Kaiyuan_sjtu/article/details/88709580)中,我们需要手动改写一个适应自己任务的Processor,而对于ERNIE来说,简单到只需要三步:


  • 把数据准备成要求的格式(源码中使用tsv格式,不过在bert中我们也说过了,可以修改成各种格式的)

  • 写一下训练脚本 run_script.sh

  • 跑脚本得到结果 bashrun_script.sh


3.1 准备工作


对于最近大火的预训练模型来说,绝大多数我们是不太可能自己从头开始训练的,最多使用的是官方开源的模型进行特定任务的Finetune。所以第一步就是下载模型代码(https://github.com/PaddlePaddle/ERNIE/tree/develop/ERNIE

)以及相应的参数(https://baidu-nlp.bj.bcebos.com/ERNIE_stable-1.0.1.tar.gz)。


接下去就是准备我们任务的数据,使其符合ERNIE模型输入要求。一般来说字段之间都是label和text_a用制表符分割,对于句对任务还需要额外的text_b字段。在后面我们会具体介绍每种任务的示例输入。


ok,前面我们一直强调ERNIE是超友好上手超快的模型,下面我们结合实际任务来看一看到底有多简单~


3.2 情感分类


情感分类是属于非常典型的NLP基础任务之一,因为之前BERT写过文本分类,所以这里我们就稍微换一换口味~这里我们只考虑最简单情况的情感分类任务,即给定一个输入句子,要求模型给出一个情感标签,可以是只有正负的二分类,也可以是包括中性情感的三分类。ok,我们来看看数据,网上随便找了一个财经新闻数据集,数据来源于雪球网上万得资讯发布的正负面新闻标题,数据集中包含17149条新闻数据,包括日期、公司、代码、正/负面、标题、正文6个字段,其中正面新闻12514条,负面新闻4635条。大概长这样:

       640?wx_fmt=png

  

处理成ERNIE分类任务所需要的输入,大概长这样: 

     640?wx_fmt=png


将处理完成的数据和前面下载好的预训练模型参数放置到合适的位置,就可以开始写我们跑模型的脚本文件了:

     640?wx_fmt=png


嗯,这样一个任务就结束了…运行脚本后等待输出结果即可,是不是很简单~

当然如果你还想玩点花样的话,就可以多看看论文。比如复旦之前有一篇文章是在BERT的基础上,将ABSA情感分类的单句分类任务转变成了句子对的相似度匹配任务。简单来说就是通过构建辅助句子,把输入这家餐馆的锅包肉超好吃变成了这家餐馆的锅包肉超好吃 + 菜品口感的情感是正的,论文表明这一trick是会比单句分类的效果更好。更具体的细节可以参考论文:《UtilizingBERT for Aspect-Based Sentiment Analysis via Constructing Auxiliary Sentence》(https://www.aclweb.org/anthology/N19-1035)。


3.3 命名实体识别


命名实体识别也是NLP的一个基础任务,之前在博客中也有过介绍:【论文笔记】命名实体识别论文(https://blog.csdn.net/Kaiyuan_sjtu/article/details/89143573)关于NER的处理思路也是跟上面情感分类的大同小异,只不过NER是属于序列标注任务,在运行脚本的时候注意使用源码中的run_senquence_labeling.py。

     640?wx_fmt=png


4、有趣的ISSUE


Github上比源码更有价值的是对应的issue,一个好的开源项目会吸引很多人的关注,issue区里会有很多有趣的思考,所以大家千万不要错过噢~下面就列几个我觉得比较有意思的issue供大家参考。


4.1 关于batch_size


https://github.com/PaddlePaddle/LARK/issues/4


刚打开ERNIE脚本打算跑的同学可能会发现,它的batch_size竟然是8192,我的天哪(小岳岳脸),这不得炸!于是乎你非常机智地把batch_size改为了32,美滋滋地输入bash script/pretrain.py,然后自信地敲下Enter键。嗯???报错???


报的什么错大家感兴趣的自己去复现吧~


对,在pretrain的时候这里的batch_size指的是所有输入token的总数,所以才会那么大~


4.2 关于Mask机制的逻辑


https://github.com/PaddlePaddle/LARK/issues/33


正如我开篇说的,ERNIE的最大创新就是它的mask机制,这一点的代码实现也在issue区被热烈讨论


4.3 关于获取输入的中间向量表示


https://github.com/PaddlePaddle/LARK/issues/41


有时候我们会需要获取句子Embedding 和 tokenEmbeddings,可参照下面的方案。

       640?wx_fmt=png

 

4.4 预测被masked的词


https://github.com/PaddlePaddle/LARK/issues/135


将一个句子的某个词语mask后,然后使用模型去预测这个词语,得到候选词和词语的概率


4.5. ERNIE模型部署


飞桨(PaddlePaddle)模型的部署可以在官方说明文档中找到


https://www.paddlepaddle.org.cn/documentation/docs/zh/1.4/advanced_usage/deploy/inference/index_cn.html

 

5、Some Tips


最后一部分打算说一下关于使用预训练模型的一些小tips:


  • 学习率是第一种重要的参数,当你开始着手调参时优先从学习率开始。

  • 根据你的任务来选择预训练模型。每个模型的训练大规模语料是不一样的,这就说明了有些模型天生就是更加适用于某个领域。

  • 所有的预训练模型为了在尽可能多的下游任务上取得较好的效果,所使用的训练语料的覆盖范围都是非常大的,但这也带来了一个问题----过于general。也就是说如果你的任务所属domain与训练语料的相差较大,比如关于医学材料学之类的领域,反而不容易取得好的效果。所以我们可以在特定领域下尝试post-train预训练模型。

  • 目前来说,对于中文领域的NLP任务,可以优先选择ERNIE。听小道消息说,ERNIE 2.0快出来了,据说效果很猛。

  • 不要过分迷信预训练模型!!!


关于ERNIE的更多信息,可点击文末阅读原文或查看以下链接:

https://github.com/PaddlePaddle/ERNIE/tree/develop/ERNIE


Reference:

 

  • 《Enhanced Representation through kNowledge IntEgration》:

    https://arxiv.org/abs/1904.09223

  • 《如何评价百度新发布的NLP预训练模型ERNIE?》:

    https://www.zhihu.com/question/316140575

  • 《中文任务全面超越 BERT:百度正式发布NLP预训练模型ERNIE》

    https://www.jiqizhixin.com/articles/2019-03-16-3

  • 官方源码:

    https://www.jiqizhixin.com/articles/2019-03-16-3


最后给大家推荐一个GPU福利Tesla V100免费算力!配合PaddleHub能让模型原地起飞~扫码下方二维码申请~


640?wx_fmt=png

相关文章:

linux内核SMP负载均衡浅析

需求 在《linux进程调度浅析》一文中提到,在SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列)。如果一个进程处于TASK_RUNNING状态(可执行状态),则它…

结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势:(1)、不需要初始化,数组名直接就是所在的偏移;(2)、不占任何空间,指针需…

超全!深度学习在计算机视觉领域的应用一览

作者 | 黄浴,奇点汽车美研中心首席科学家兼总裁转载自知乎简单回顾的话,2006年Geoffrey Hinton的论文点燃了“这把火”,现在已经有不少人开始泼“冷水”了,主要是AI泡沫太大,而且深度学习不是包治百病的药方。计算机视…

SHAREPOINT2010数据库升级2013

在作TEST-SPCONTENT命令时,会提示认证方式不一样。 The [SharePoint - 80] web application is configured with claims authentication mode however the content database you are trying to attach is intended to be used against a windows classic authentic…

设计模式之简单工厂模式(Simply Factory)摘录

从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的…

别得意,你只是假装收藏了而已

今天分享我在看罗振宇的《2018 时间的朋友》演讲视频记下的一些思考。跨年演讲中有过这样的一个来自印象笔记的片段,列举了几组对比来说明: 『你在朋友圈里又佛又丧,你在收藏夹里偷偷地积极向上。』 扎心了,这不就是说我吗&#x…

Exchange2003-2010迁移系列之四,配置第一台Exchange CAS/HUB服务器

配置第一台CAS/HUB关于Cas/hub的配置请大家详见前面关于Ex2010的部署(两个配置基本相同在这里就不做详细的解说了)下面关于Cas的配置在前面已经提到了但是下面是另一种新的方法大家就看看吧生产环境中部署Exchange2010服务器时,是需要按照一定…

设计模式之适配器模式(Adapter)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

JAVA方法中的参数用final来修饰的效果

很多人都说在JAVA中用final来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,我们需要注意的是,在final修饰的方法参数中,如果修饰的是基本类型,那么在这个方…

2019世界机器人大赛圆满落幕,荆州中学等15支队伍获「全能奖」

7月28日,2019世界机器人大赛总决赛在河北保定圆满落下帷幕。保定市市委常委罗德强、中国电子学会副秘书长梁靓、保定市政府秘书长王保辉、保定市政府副秘书长安利文、保定市徐水区区长李志永、保定市莲池区政府党组副书记赵建军、世界机器人大赛组委会秘书长李洋、长…

在任何设备上都完美呈现的30个华丽的响应式网站

如今,一个网站只在桌面屏幕上好看是远远不够的,同时也要在平板电脑和智能手机中能够良好呈现。响应式的网站是指它能够适应客户端的屏幕尺寸,自动响应客户端尺寸变化。在这篇文章中,我将向您展示在任何设备上都完美的30个华丽的响…

设计模式之装饰模式(Decorator)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

解决流程自动化“最后一公里问题”,达观数据发布智能 RPA

2019 年7月 26 日,业界领先的人工智能企业达观数据在北京召开“达道至简”为主题的产品发布会,正式推出国内首款自主研发集OCR(光学字符识别)与 NLP(自然语言处理)于一体的达观智能RPA。达观数据创始人兼CEO陈运文、副总裁金克、贾学锋和联合创始人高翔携…

利用脚本生成GUID

实际上,可以使用一种非常简单的方法来生成 GUID,但这种方法近乎像是作弊。(您可听清楚了,我们说的可是“近乎”。)“Scriptlet.TypeLib”对象的设计用途是帮助您创建“Windows 脚本组件”(实质上&#xff0…

设计模式之组合模式(Composite)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

快速开发生命周期支持工具

去年有幸研究公司管理产品的软件平台,当时考虑的产品是基于业务模型之上的一个系统平台,从建模到运行、部署、维护全生命周期管理.当时就提出两个希望先实践解决的就是可复用原型的设计和使用工作流和规则引擎的协作处理询标产品.前一阵子在公司研究成本产品的成本分析和算法,一…

华人学者解开计算机领域30年难题:布尔函数敏感度猜想

整理 | 郭芮来源 | CSDN(ID:CSDNnews)1992年,布尔函数敏感度猜想(Boolean Sensitivity)被提出,这成为了理论计算机科学近三十年来最重要、最令人困惑的开放性问题之一。而近日,来自E…

从1.5K到18K 一个程序员的5年成长之路(二)

这一切都来自于心态CSDN:从开始学习,到学有所成和找工作,再到工作中遇到各种困难,然后获得突破,在整个过程中,能总结下你心态都有哪些变化?是用运用什么方法或方式进行调整?雷果国&a…

设计模式之享元模式(Flyweight)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

你想见的大神都来AI ProCon 2019了,优惠票限时抢购开启!

如今 AI 的发展真实地面临着诸多瓶颈、尽管很多智能助手已经可以执行很多任务,但距离真正的人机自然交互还需要很长时间;强人工智能也迟迟未出现,不知何时才能出现;现有的 AI 只能做好一件事,Alpha Go 只会下棋&#x…

qt练习11 鼠标,按键,滚轮事件学习

源代码: http://files.cnblogs.com/hnrainll/event.zip

windows server 2008 R2上安装MRTG指南

一、实验环境 参考教程:http://www.netmon.org/dummies.htm http://www.docin.com/p-158415185.html MRTG中文手册:http://bbs.chinaunix.net/thread-1344687-1-1.html http://www.enterastream.com/whitepapers/mrtg/mrtg-manual-cap9.html 1.硬件平台 …

设计模式之外观模式(Facade)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

知识图谱公开课 | 详解事件抽取与事件图谱构建

现有知识图谱大多关注于以实体为核心的静态知识,缺乏对于以事件为核心的动态知识的刻画和构建。如何从非结构化文本中抽取结构化的事件知识已成为眼下热门研究课题。本次公开课中,我们邀请到了中科院自动化所模式识别国家重点实验室助理研究员陈玉博&…

实时显示系统时间

CTime time;CString m_time;void CtimeDlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码 SetTimer(1,1000,NULL);}void CtimeDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值 timeCTime::GetCurrentTime(); …

安卓手机文件管理器:360°LES文件浏览器

360度LES文件浏览器功能可谓是非常强大,可以对文件或文件夹进行新建、复制、剪切、删除、移动、搜索等操作。支持多标签页,能设置成root级别的管理器, 关联文件打开,列表或图标的形式显示,拖曳文件,多标签页下文件拖曳(下面有详细的讲解)&…

XML DTD 语言学习笔记

-XML DTD 全称:Document Type Definition简介:用于定义文档的合法性。它定义了文档应该有哪些元素及其属性,还有其他一些约束性规则。 注意:DTD语言定义的文档类型是SGML家族的标记性语言。包括SGML,XML,HTML)&#xf…

Python快速入门,你想要的就在这里了!

学习Python您是否会面临以下问题?“网上充斥着大量的学习资源、书籍、视频教程和博客,但是大部分都是讲解基础知识,不够深入;也有的比较晦涩,难以理解”CSDN Python学习社群将帮助您过滤网上的垃圾教程资源的技能&…

设计模式之代理模式(Proxy)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

Symfony学习笔记

Symfony学习笔记Symfony本来已经接触过了,可发现好久 不用好多东西都已经遗忘了,决定再次拾起,看能不能发现之前没有注意到的新的东西。果然在不断学习的过程中,又发现了许多自认为很细节但又很重要的地方,下面就列举如…