我的BERT!改改字典,让BERT安全提速不掉分(已开源)

文 | 苏剑林

编 | 小轶


背景

当前,大部分中文预训练模型都是以字为基本单位的,也就是说中文语句会被拆分为一个个字。中文也有一些多粒度的语言模型,比如创新工场的ZEN和字节跳动的AMBERT,但这类模型的基本单位还是字,只不过想办法融合了词信息。目前以词为单位的中文预训练模型很少,据笔者所了解到就只有腾讯UER开源了一个以词为颗粒度的BERT模型,但实测效果并不好。

那么,纯粹以词为单位的中文预训练模型效果究竟如何呢?有没有它的存在价值呢?最近,我们预训练并开源了以词为单位的中文BERT模型,称之为WoBERT(Word-based BERT,我的BERT!)。实验显示,基于词的WoBERT在不少任务上有它独特的优势,比如速度明显的提升,同时效果基本不降甚至也有提升。在此对我们的工作做一个总结。

开源地址
https://github.com/ZhuiyiTechnology/WoBERT

字还是词?

究竟是“字”好还是“词”好?这是中文NLP一个很让人抓狂的问题,也有一些工作去系统地研究这个问题。比较新的是香侬科技在ACL2019上发表的《Is Word Segmentation Necessary for Deep Learning of Chinese Representations?》,里边得到了字几乎总是优于词的结论。前面也说了,现在中文预训练模型确实也基本上都是以字为单位的。所以,看上去这个问题已经解决了?就是字更好?

事情远没有这么简单。就拿香侬科技的这篇论文来说,它的实验结果是没有错,但却是没有代表性的。为什么这样说呢?因为在该文的实验设置下,模型的embedding层皆从随机初始化状态开始训练。这样一来,对于同样的任务,以词为单位的模型Embedding层参数更多,自然就更容易过拟合,效果容易变差,这不用做实验都能猜个大概。问题是,我们用基于词的模型的时候,通常并不是随机初始化的,往往都是用预训练好的词向量的(下游任务看情况选择是否微调词向量),这才是分词的NLP模型的典型场景,但论文里边却没有比较这个场景,所以论文的结果并没有什么说服力。

事实上,“过拟合”现象具有两面性,我们要防止过拟合,但过拟合也正好说明了模型拥有比较强的拟合能力,而如果我们想办法抑制过拟合,那么就能够在同样复杂度下得到更强的模型,或者在同样效果下得到更低复杂度的模型。而缓解过拟合问题的一个重要手段就是更充分的预训练,所以不引入预训练的比较对以词为单位的模型来说是不公平的,而我们的WoBERT正是证实了以词为单位的预训练模型的可取性

词的好处

一般认为,以字为单位的好处是:

  1. 参数更少,不容易过拟合

  2. 不依赖于分词算法,避免边界切分错误

  3. 没那么严重的稀疏性,基本上不会出现未登录词

至于以词为单位的理由是:

  1. 序列变短,处理速度更快

  2. 在文本生成任务上,能缓解Exposure Bias问题;

  3. 词义的不确定性更低,降低建模复杂度

对于词的好处,大家可能会有些疑惑。比如第2点,词能缓解Exposure Bias,这是因为理论上来说,序列越短Exposure Bias问题就越不明显(词模型单步预测出一个n字词,相当于字的模型预测了n步,这n步都递归依赖,所以字的模型Exposure Bias问题更严重)。至于第3点,虽然有多义词的存在,但是多数词的含义还是比较确定的,至少比字义更加明确,这样一来可能只需要一个Embedding层就能把词义建模好,而不是像字模型那样,要通用多层模型才能把字组合成词。

看起来不相伯仲,但事实上以字为单位的好处,并非就是以词为单位的缺点了。只要多一些技巧,以词为单位也能一定程度上避免这几个问题。比如:

  1. 以词为单位的参数确实增多了,但是可以通过预训练来缓解过拟合,所以这个问题不会很严重;

  2. 依赖分词算法是个问题,如果我们只保留最常见的一部分词,那么不管哪个分词工具分出来的结果都是差不多的,差异性不大;

  3. 至于边界切分错误,这个难以避免,但是需要准确的边界的,只是序列标注类任务而已,文本分类、文本生成其实都不需要准确的边界,因此不能就此否定词模型;

  4. 如果我们把大部分字也加入到词表中,也不会出现未登录词。

所以,其实用词的好处是相当多的,除了需要非常精确边界的序列标注类型的任务外,多数NLP任务以词为单位都不会有什么问题。因此,我们就去做了以词为单位的BERT模型了。

Tokenizer

往BERT里边加入中文词,首先得让Tokenizer能分出词来。只需要把词加入到字典vocab.txt里边就行了吗?并不是。BERT自带的Tokenizer会强行把中文字符用空格隔开,因此就算你把词加入到字典中,也不会分出中文词来。此外,BERT做英文word piece的分词的时候,使用的是最大匹配法,这对中文分词来说精度也不够。

为了分出词来,我们修改了一下BERT的Tokenizer,加入了一个“前分词(pre_tokenize)”操作。这样我们就可以分出中文词来,具体操作如下:

  1. 把中文词加入到vocab.txt;

  2. 输入一个句子s,用pre_tokenize先分一次词,得到

  3. 遍历各个,如果在词表中则保留,否则将用BERT自带的tokenize函数再分一次;

  4. 将每个的tokenize结果有序拼接起来,作为最后的tokenize结果。

在bert4keras>=0.8.8版本中,实现上述改动只需要在构建Tokenizer的时候传入一行参数,例如:

tokenizer = Tokenizer(dict_path,do_lower_case=True,pre_tokenize=lambda s: jieba.cut(s, HMM=False)
)

其中pre_tokenize为外部传入的分词函数,如果不传入则默认为None。简单起见,WoBERT使用了结巴分词,删除了BERT自带词表的冗余部分(比如带##的中文词),然后加入了20000个额外的中文词(结巴分词自带的词表词频最高的两万个),最终WoBERT的vocab.txt规模是33586。

模型细节

目前开源的WoBERT是Base版本,在哈工大开源的RoBERTa-wwm-ext基础上进行继续预训练,预训练任务为MLM。初始化阶段,将每个词用BERT自带的Tokenizer切分为字,然后用字embedding的平均作为词embedding的初始化。

到这里,WoBERT的技术要点基本上都说清楚了,剩下的就是开始训练了。我们用单张24G的RTX训练了100万步(大概训练了10天),序列长度为512,学习率为5e-6,batch_size为16,累积梯度16步,相当于batch_size=256训练了6万步左右。训练语料大概是30多G的通用型语料。训练代码已经在文章开头的链接中开源了。

此外,我们还提供了WoNEZHA,这是基于华为开源的NEZHA进行再预训练的,训练细节跟WoBERT基本一样。NEZHA的模型结构跟BERT相似,不同的是它使用了相对位置编码,而BERT用的是绝对位置编码,因此理论上NEZHA能处理的文本长度是无上限的。这里提供以词为单位的WoNEZHA,就是让大家多一个选择。

模型效果

最后,说一下WoBERT的效果。简单来说,在我们的评测里边,WoBERT相比于BERT,在不需要精确边界的NLP任务上基本都没有变差的,有些还会有一定的提升,而速度上则有明显提升,所以一句话就是“提速不掉点”。

比如中文榜单上的两个分类任务:

我们内部还测了不少任务,结果都是类似的,表明这些NLU任务上WoBERT和BERT基本上都差不多的。但是速度上,WoBERT就比BERT有明显优势了,下表是两个模型在处理不同字数的文本时的速度比较:

我们还测了WoBERT+UniLM的方式Seq2Seq任务(CSL/LCSTS标题生成),结果是比以字为单位的模型有明显提升:

这说明以词为单位来做文本生成其实是更有优势的。要是生成更长的文本,这个优势还能进一步放大。

当然,我们也不否认,用WoBERT去做NER等序列标注任务时,可能会有明显的掉点,比如做人民日报的NER,掉了3%左右,可能让人意外的是,经过bad case分析,我们发现掉点的原因并不是因为切分错误,而是因为稀疏性(平均来说每个词的样本更少,所以训练得没那么充分)。

不管怎么说,我们把我们的工作开源出来,给大家在使用预训练模型的时候,多一个尝试的选择吧。

文章小结

在这篇文章里,我们开源了以词为单位的中文BERT模型(WoBERT),并讨论了以词为单位的优缺点,最后通过实验表明,以词为单位的预训练模型在不少NLP任务(尤其是文本生成)上有它独特的价值,一方面它有速度上的优势,一方面效果上能媲美以字为单位的BERT,欢迎大家测试。


文末福利
后台回复关键词【入群
加入卖萌屋NLP/IR/Rec与求职讨论群
有顶会审稿人、大厂研究员、知乎大V和妹纸
等你来撩哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020年考证时间表汇总!这些证书值得拥有!

原文地址: https://zhuanlan.zhihu.com/p/100824416 2020年考证时间表汇总!这些证书值得拥有!已认证的官方帐号154 人赞同了该文章昨日之日不可留,2019年已然过去,2020年的我们不能再一成不变!快根据自身情…

征稿 | 2019年全国知识图谱与语义计算大会(CCKS2019)第二轮征稿启事

2019年全国知识图谱与语义计算大会China Conference on Knowledge Graph and Semantic Computing (CCKS 2019)2019年8月24日-27日,杭州征稿截止: 2019年5月18日全国知识图谱与语义计算大会(CCKS: China Conference on Knowledge Graph and Semantic Comp…

直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结

BAT必考JVM系列专题 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置 垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。 在标记阶段首先通过根节点(GC Roots),标记所…

遗传算法及其应用实现

使用遗传算法求解函数具有最大值的点X """ Visualize Genetic Algorithm to find a maximum point in a function. """ import numpy as np import matplotlib.pyplot as pltDNA_SIZE 10 # DNA length POP_SIZE 100 # population size CROSS…

论文浅尝 | 一种嵌入效率极高的 node embedding 方式

论文笔记整理:叶群,浙江大学计算机学院,知识图谱、NLP方向。会议:WSDM 2019链接:https://dl.acm.org/citation.cfm?id3290961Motivation基于spring-electrical的模型在网络可视化中取得了非常成功的应用,一…

重要的,是那些训练中被多次遗忘的样本

文 | kid丶源 | 知乎编 | 兔子酱今天跟大家分享一篇很有意思的文章,是一篇探讨深度学习模型记忆&遗忘机制的文章,是一篇角度很新颖的题材,同时又有一定启发作用。这篇文章发表在深度学习顶会ICLR19,标题是《An empirical stud…

直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景

直通BAT之JVM系列 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置 今天继续JVM的垃圾回收器详解,如果说垃圾收集算法是JVM内存回收的方法论,那么垃圾收集…

模拟嫁接技术

模拟嫁接技术:定义嫁接算子及策略剪接算子及策略GPOGA算法总结定义 收益和代价 对一棵生成树 T1,若将某结点的一条分枝移至另一结点作为其一条分枝后产生的生成树为 T2,考察分枝移动前后生成树的边长和的变化,则定义收益(gain)和…

HuggingFace又出炼丹神器!稀疏矩阵运算进入平民化时代!

文 | rumor酱编 | YY一提到模型加速,大家首先想到的就是蒸馏、(结构性)剪枝、量化(FP16),然而稀疏矩阵(sparse matrix)运算一直不被大家青睐。原因也很简单,一是手边没有…

章乐焱 | 用“科技”监管“科技”,知识图谱能做什么?

本文转载自公众号:恒生技术之眼。人工智能、大数据等前沿科技的爆发,推动金融科技进入了一个崭新的时代,也成为监管科技发展的重要推动力。在这个Fintech的黄金时代,前沿科技正在如何赋能监管?这方面,恒生公…

LeetCode 23. 合并K个排序链表(优先队列)

文章目录1. 题目信息2. 思路3. 代码1. 题目信息 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例:输入: [1->4->5,1->3->4,2->6 ] 输出: 1->1->2->3->4->4->5->6来源:力扣(…

直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解

JVM系列 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置 JVM内存调优 对JVM内存的系统级…

论文浅尝 | 知识图谱三元组置信度的度量

论文笔记整理:叶橄强,浙江大学计算机学院,知识图谱和知识推理方向。https://arxiv.org/pdf/1809.09414.pdf动机在构建知识图谱的过程中,不可避免地会产生噪声和冲突。基于知识图谱的任务或应用一般默认假定知识图谱中的知识是完全…

跟小伙伴们做了个高效刷论文的小站

好久木有在知乎冒泡了,不知道还能不能出现在大家的timeline上哇QAQ正文开始之前还是先习惯性的碎碎念一下。前段时间换了研究方向,重新pick了问答和检索,为了追上相关问题的最新进展,就顾不上写文的刷了一堆paper,加上…

模拟进化与遗传算法

遗传算法是目前研究得最为广泛的一类模拟进化算法。 假定考虑全局优化问题(P)。遗传算法基于以下两条基本策略求解问题: 对于给定的目标函数F,它使用F的任一适应性函数(换言之,一个值域非负、…

消息中间件系列(六):什么是流量削峰?如何解决秒杀业务的削峰场景

流量削峰的由来 主要是还是来自于互联网的业务场景,例如,马上即将开始的春节火车票抢购,大量的用户需要同一时间去抢购;以及大家熟知的阿里双11秒杀, 短时间上亿的用户涌入,瞬间流量巨大(高并发…

论文浅尝 | 基于深度序列模型的知识图谱补全

本文转载自公众号:DI数据智能。 Learning to Complete Knowledge Graphs with Deep Sequential Models作者:郭凌冰、张清恒、胡伟、孙泽群、瞿裕忠单位:南京大学供稿:胡伟引用L. Guo, Q. Zhang, W. Hu, Z. Sun, & Y. Qu. …

拨开算力的迷雾:聊聊不同 GPU 计算能力的上限

文 | 卜居知乎编 | 兔子酱通过深入了解自己手头 GPU 的计算能力上限,能够在买新卡时做出更理性判断。本文深入GPU架构,重点介绍了其中的ampere架构。另外,作者还对比了不同GPU之间的峰值计算能力,增加读者对硬件资源的了解。前言2…

LeetCode 20. 有效的括号(栈)

文章目录1. 题目信息2. 解题1. 题目信息 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括…

消息中间件系列(八):Kafka、RocketMQ、RabbitMQ等的优劣势比较

在高并发业务场景下,典型的阿里双11秒杀等业务,消息队列中间件在流量削峰、解耦上有不可替代的作用。 之前介绍了MQ消息队列的12点核心原理总结,以及如何从0到1设计一个MQ消息队列,以及RPC远程调用和消息队列MQ的区别 今天我们一…