NLP 预训练家族再思考

共 5224字,需浏览 11分钟

 ·

2022-01-17 08:15

本文约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

编辑:王菁

浏览 29
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报