本文约3000字,建议阅读6分钟
本文为你介绍使用NLP预训练的新思考。

最近整理预训练模型,又复习看了几篇BERT变体的论文,无外乎都是从「模型架构、MASK方式、预训练目标」入手,实话实说,感觉没有太大的创新。而且这类模型大部分只发布了英文版本,市面上也没有可用的中文版本,在中文上的效果不得而知。

不过思考一下作者们基于BERT作各种优化背后的原因和动机,是件十分有趣的事情,也当开拓一下思路。所以这篇博客记录一下,主要包括SpanBERT、MPNet、MASS、BART这四个模型,其中SpanBERT、MPNet是进一步优化NLU任务,MASS、BART是为了优化NLG任务。

SpanBERT

论文全称及链接:《SpanBERT: Improving Pre-training by Representing and Predicting Spans》[1]

与BERT不同,SpanBERT主要是在MASK策略和预训练目标上,如下图所示

  • MASK策略:连续mask一个片段,而不像BERT一样,随机挑一些token进行mask。咦,谷歌在第二版BERT里就提出了whole word masking,同样是Span mask。那SpanBERT有什么不同呢?

  • SpanBERT不同在于,首先每轮利用一个几何分布确定Span的长度  ,然后再找一些作为单词开头的token作为mask的start,然后从start token开始连续mask掉  个token,可以看到,「被MASK的Span不一定是一个完整单词的」。经过多轮反复,直到输入的15%token被mask。

  • SBO训练目标:用被mask的span左右两边的token去把整个span预测出来,这就是SBO(Span Boundary Objective)目标,如图所示,就是用was、to两个token去预测an American football game。作者解释说SBO目标,有助于模型在boundary token存储到span-lvel的信息,或者换句话说,作者希望span的左右两边结尾能更好地总结span的内容。

  • 去掉NSP目标:作者认为两个原因,第一个原因去掉NSP目标让模型能学更长的依赖(如BERT,假如两个segment是从两个文档抽取的,可以认为512个token里面256个token是文档1的,另外256个token是文档2的,那其实能学到的最长文档依赖也就256,假如去掉它,512个token都是来自同一个文档,那模型能学到的最长依赖就是512),第二个原因,两个来自不同文档的片段会造成很大的噪声干扰。

消融实验

比较了Masking的策略,包括

  1. Subword Tokens:同原生BERT一样,随机选token进行mask

  2. Whole Words:同第二版BERT一样,采用whole word masking;

  3. Named Entities:一半是whole word masking,一半是实体词,直到15%的token被mask;

  4. Noun Phrases:一半是whole word masking,一半是名词短语,直到15%的token被mask;

  5. Geometric Spans:即SpanBERT。

从实验看到,SpanBERT的效果是最好的,带给我们的思考是「不要纠结于mask的是一个完成的词,还是完成的短语,还是完整的实体?只要mask的是一段连续的Span即可」。

  • 辅助函数

从实验结果可以看到,去到NSP任务,采样的时候从单个文档得到segment,增加SBO任务都能带来效果的提升。

MPNet

论文全称及链接:《MPNet: Masked and Permuted Pre-training for Language Understanding》[2]

论文的开头,就直接指出BERT的Output Dependency缺点和XLNet的Input Consistency缺点,

  • Output Dependency:BERT被mask掉的token之间是相互独立的,在预测的时候并没有利用到之间的关系。举个论文里的例子,【The, task, is, sentence, classification】,假如sentence、classification是两个被mask的token,在预测classification时,我们是不能利用上sentence的信息的,然而,假如给出前一个token为sentence的情况下,模型能更好地预测当前token为classifcation。

  • Input Consistency:解决Output Dependency的方法就是采用像XLNet这种PLM(permutation language model)。但PLM也有问题,当预测当前token时,PLM是没有其它待预测token的位置信息的,拿上面的例子举例,当模型开始预测sentence classification前,PLM是不知道有两个待预测词的,作者把PLM的这种缺陷称为Input Consistency问题,因为在实际下游任务中,输入时,是能知道所有token的内容和位置信息的。

这里吐槽一下,Input Consistency在大部分论文里不应该是BERT的问题吗?因为BERT的输入带有【MASK】 token,但在下游任务时,输入是没有【MASK】 token的,但在这篇论文里反正成为了PLM的问题,当然,PLM也有这种问题,但感觉没有BERT的那么严重。

进一步的,作者把BERT和PLM都放入到一个统一的架构中来,如下图所示,

然后,作者提出MPNet来改进Output Dependency和Input Consistency问题,具体的如下图所示,

图中, 、、 是permuted后待预测的token,假如现在要预测的是  ,按PLM来说,是看不到  的信息的,但这里经过巧妙的设计,让预测  时,  也作为输入,相当于模型在预测  时,也能看到  的位置信息,从而解决Input Consistency问题,作者把这称为position compensation。除此之外,在预测  时,也能利用到  作为输入,从而解决Output Dependency问题。

消融实验

  • 去掉position compensation,此时MPNet退化成PLM,效果下降了0.6-2.3个点,证明了position compensation的有效性以及MPNet优于PLM;

  • 去掉permutation操作,但采用双向流建模待预测token之间的依赖关系,效果下降了0.5-1.7个点,证明了permutation的有效性;

  • 去掉permutation和output dependency,此时MPNet退化成BERT,效果下降0.5-3.7个点,证明了MPNet优于BERT。

MASS

论文全称及链接:《MASS: Masked Sequence to Sequence Pre-training for Language Generation》[3]

MASS主要是弥补BERT对于NLG任务的不足,这一类对于NLG任务的优化,大部分采用的是encoder-doceder的架构,因为这种架构天然适合于作生成任务。

MASS也不例如,采用的同样是encoder-decoder架构。

任务是「给定一个句子,从里面抽取一个片段,encoder端输入被抽取片段后的句子,docoder输出预测该片段」。

具体的如下图所示,图中  为句子序列,从里面抽取出片段 (或者说把它们mask掉),encoder的输出端变成  ,decoder的输出目标就是被抽取的片段 ,注意哦,「decoder的输入端是不包括没被mask的token的哦」

作者对这任务作了很漂亮的解释

  • 只预测被mask的token,而不是预测出原序列,可以让encoder端更好地学习到unmasked的token,同时能让decoder端从encoder端提取更有用的信息;

我个人理解是,假如现在decoder要预测的是完整序列,那当预测  时,模型能看到decoder之前预测的token,即  ,但模型看不到  ,这样的好处是,鼓励模型从encoder端提取有用的信息,而不是过分关注于docoder端之前预测出的token对当前token的影响

  • 抽取一个片段而不是抽取离散的token,可以让模型学习到更好的语言模型建模能力,也即更适用于NLG任务。

作者还比较了当mask片段的长度不同的,MASS就变成我们所熟悉的模型。如当被mask的片段长度  时,MASS变成成BERT,当  (m为句子序列长度),MASS变成了GPT,如下图所示。

消融实验

  • Study of Dfferent k:就是被mask的fragment长度为原序列的百分之多少比较好,作者的实验证明,50%是最好的。就是假如一个句子有100个token,最好选择连续的50个token作为待预测的fragment。

  • Ablation Study of MASS:作了两个比较实验,证明MASS预训练任务的有效性

  1. Discrete:对离散的token进行mask,而不是连续的span;

  2. feed:decoder的输入端是原句子序列,而不只是fragment。

从下图的实验结果可以看出MASS效果是最好的。

BART

论文全称及链接:《BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension》[4]

同MASS一样,同样是为了优化NLG任务,所以采用的是encoder-decoder架构,整体思路分两步:

  • 用一个任意的noising function去破坏原句子序列;

  • decoder端目标是重构原句子序列。

如下图所示,(a)和(b)分别是BERT和GPT的预训练目标,(c)是BART的预训练目标,对原序列ABCDE进行噪声处理,这里采用了shuffle和token infilling。

实际上,作者在论文中比较过几种noising function,包括

  • Token Masking:同BERT一样,随机挑选一些token,然后用【MASK】代替;

  • Token Deletion:直接删掉某些token;

  • Text Infilling:对一段连续的span进行mask,与SpanBERT不同的是,这里采用泊松分布决定Span的长度,其次,「连续的Span只会用一个【MASK】进行代替,作者解释是这样有利于模型学会预测这个Span有多少个token」;

  • Sentence Permutation:打乱句子的顺序;

  • Document Rotation:反转整个文档。

作者经过实验,最后采用的是Text Infilling和Sentence Permutation相结合。

除此之外,虽然BART的提出是为了弥补BERT在NLG任务中的不足,但是作者也通过实验论证了,BART在NLU任务中也能取得不俗的表现。下图为BART应用于NLU任务和NLG任务的例子。

本文参考资料

[1]《SpanBERT: Improving Pre-training by Representing and Predicting Spans》: https://arxiv.org/abs/1907.10529

[2]《MPNet: Masked and Permuted Pre-training for Language Understanding》: https://arxiv.org/abs/2004.09297

[3]《MASS: Masked Sequence to Sequence Pre-training for Language Generation》: https://arxiv.org/abs/1905.02450

[4]《BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension》: https://arxiv.org/abs/1910.13461

编辑:王菁

NLP 预训练家族再思考相关推荐

  1. NLP预训练家族 | Text-To-Text范式统一NLP任务

    作者 | 周俊贤 整理 | NewBeeNLP 前情提要: 万字梳理!BERT之后,NLP预训练模型发展史 NLP预训练家族 | Transformer-XL及其进化XLNet YYDS!一个针对中文 ...

  2. NLP预训练家族 | 自成一派的GPT!

    作者 | 周俊贤 整理 | NewBeeNLP 之前我们梳理了NLP预训练家族系列文章,今天继续来看看另外一个分支,GPT系列! GPT2论文全称及链接:<Language Models are ...

  3. NLP预训练家族 | Transformer-XL及其进化XLNet

    作者 | 周俊贤 整理 | NewBeeNLP 最近又重新读了Transformer-XL和XLNet的论文和代码,又有很多新的感悟.其中,要想搞懂XLNet的同学一定要首先明白Transofrmer ...

  4. 应用在生物医学领域中的NLP预训练语言模型(PubMedBERT)

    文章目录 1. 背景 2. 在生物医学和专业领域建立神经语言模型的新范式 3. 创建一个全面的基准和排行榜,以加快生物医学NLP的进度 4. PubMedBert:优于之前所有的语言模型,并获得最新生 ...

  5. 《预训练周刊》第5期:智源等研究力证:GPT语言理解能力不输BERT、盘点NLP预训练「兵器谱」...

    No.05 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 超大规模预训练模型是当前人工智能领域研究的热点,为了帮助研究与工程人员了解这一领域的进展和资讯,智源社区整理了第5期< ...

  6. 革命性提升-宇宙最强的NLP预训练BERT模型(附官方代码)

    编辑 忆臻 公众号 | 机器学习算法与自然语言处理 yizhennotes 1.  Bert官方源码公开 终于是千呼万唤始出来,Google AI 发表于10月中旬的论文: <BERT: Pre ...

  7. NLP预训练之路——从word2vec, ELMo到BERT

    前言 还记得不久之前的机器阅读理解领域,微软和阿里在SQuAD上分别以R-Net+和SLQA超过人类,百度在MS MARCO上凭借V-Net霸榜并在BLEU上超过人类.这些网络可以说一个比一个复杂,似 ...

  8. NLP判断语言情绪_网易严选nlp预训练语言模型的应用

    随着2018年底bert的发布,预训练(pre-train)成为nlp领域最为热门的方向之一,大规模的无监督语料加上少量有标注的语料成为了nlp模型的标配.本文将介绍几种常见的语言模型的基本原理和使用 ...

  9. 最强 NLP 预训练模型库 PyTorch-Transformers 正式开源:支持 6 个预训练框架,27 个预训练模型...

    先上开源地址: https://github.com/huggingface/pytorch-transformers#quick-tour 官网: https://huggingface.co/py ...

最新文章

  1. Materials Studio 做分子动力学MD(CO2为例)
  2. transition过渡规定慢速开始,然后变快,然后慢速结束的过渡效果(cubic-bezier(0.25,0.1,0.25,1))。...
  3. 财务大数据比赛有python吗-【教改实验班简介】财务大数据分析班
  4. 在 Windows 10 中开启移动 WLAN 热点
  5. 一种Java Spring框架里将配置文件里定义的值注入到Java变量的简单办法
  6. A new start!
  7. Class.forName()用法详解
  8. Maven手工管理项目
  9. struts2从form取值的三种方式
  10. (自动重命名论文)PaperDownloader (Chrome插件) + EndNote (附下载链接) + Zotero
  11. 异步是javascript的精髓
  12. FEC(前向纠错码)
  13. nginx小技巧-动态域名(微信,小程序80端口)
  14. 通过 Docker 化一个博客网站来开启我们的 Docker 之旅
  15. Kubernetes - CPU 单位
  16. html 转图片 wekit实现,HTML5和Webkit实现树叶飘落动画
  17. 到底Redis是什么?
  18. 高斯消元法的python实现
  19. OC中栈区与堆区的内存概念解析
  20. 在线互动课堂Web版初体验(视频连麦互动)

热门文章

  1. 如何快速学习Java?
  2. typeScripy-番外篇之命名空间和模块
  3. 互联网Scratch编程趣味课:不插电编程和计算机对话[图]
  4. 关于Datastage资料库的一点小发现
  5. nginx日志通过rsyslog传入到日志服务器指定目录
  6. 利用Nagios + CloudWatch API 监控 Amazon 实例
  7. 基于X的GNOME、GTK、GDK、XLib、GLib等之间的关系
  8. 博客摘录:网络管理员的两天
  9. matlab欧拉迭代,matlab机械臂正逆运动学求解问题,使用牛顿-欧拉迭代算法
  10. linux下的hive命令大全,Hive shell 常用命令