文本生成之预训练模型篇EBET易博真人平台

  新闻资讯     |      2023-10-01 22:17

  文本生成(NLG)任务自诞生以来,预训练模型为主要的解决方法之一。本文从预训练模型角度进行分析,需要注意预训练任务仅是文本生成任务的解决方案之一,不能将预训练任务和文本生成任务等同起来。文本生成任务的目标是:

  从公式上可以看到,NLG任务的目标是从所有可能的序列集合里找到最优序列,举个简单的例子,假如有一个摘要生成任务,如下所示:

  原文:10月20日,浙江嘉兴。刘女士反映,19日她从西安来乌镇旅游,住了一晚后,当地防疫办通知西安来的人员不让进。刘女士称,上周她就订了机票和酒店,来之前还咨询过当地,只要是绿码就可以来了,她质疑嘉兴和乌镇政策属于一刀切。20日,桐乡市防疫办工作人员表示,按照嘉兴政策确实不让住,政策是昨晚下发的,他们也没有办法。

  最优序列(optimal sequence)可以认为是人工识别出的摘要,所以NLG的目标就是让机器能够有总结摘要的能力。为了从所有可能的集合例找到最优序列,利用条件概率的乘法公式对P_{\theta}(y_{T+1}x)进行分解如下:

  两边同时除以P_{\theta}(x)就可以得到公式1。所以,当前token的概率依赖于前面所有已经生成的token。从摘要生成任务来看,预训练任务和NLG任务的区别:

  1.预训练的任务可以设计成自回归任务(类似NLG任务),还原无标签数据,比如:GPT;也可以设计为完形填空任务,比如:UniLM模型。

  2.预训练任务,通常提升预训练模型的效果,用于下游生成任务fine tune。

  文本生成预训练模型主流解决方案是自回归(Autoregressive,AR)模型。为提升文本生成效果,AR改进分为2个方向:(1)GPT系列模型,该类模型通过提升参数,增大语料,效果提升比较明显,但成本确实不低。(2)在AR基础上融合自编码(Autoencoder,AE)技术,自回归生成文字的时候,能够看到上下文。AE和AR融合分成了2部分,第一部分是基于BERT框架下的改进,第二部分是基于Seq2Seq框架下的改进。总之,AR和AE的融合更符合人类语言习惯,表面上表达是逐字的(从左到右,依赖上文),实际上是有了整体构思和组织后(从左到右,依赖上下文)才逐字表达。

  AR和AE融合的工作非常有意思,目前看来是最贴近人类语言建模,按照这个我思路梳理了近期重要工作,帮助理解这些工作后面的本质联系。

  问题1:为什么BERT不太适合做生成?为什么GPT适合做生成,存在的问题有哪些?生成本质是什么?

  BERT预训练任务(MLM)和序列生成任务的差别较大,BERT在预训练时随机mask掉15%的文本字符,模型通过还原被mask掉的字符,从而学习到语义信息。但用来做生成,抛开生成效果不谈,语义的连贯性应该很差(个人猜测,未实验验证),因为模型在预训练阶段并不知道应该如何说一句通顺的话。

  GPT适合做生成,因为GPT预训练任务是序列生成任务,目标就是还原文本,模型在学习语义信息的时候,也在学习如何通顺的说一句话。但是GPT仍然有缺陷,就是说当前字的时候,仅能看到当前字及之前的文本,从人类语言学的角度来看,虽然表面上是一个字一个字的表达,但实际已经构思好了上下文,不然说话又怎么能通顺了。

  之前的理解BERT的自编码机制能看到上下文,所以生成效果不好是有偏差的。本质原因还是BERT在预训练阶段没有学习到如何说一句连贯的话。为了充分结合BERT和GPT(AE和AR)的优势,提出了XLNet模型。

  AE和AR融合已经是大势所趋,融合的方式有很多种,XLNet应该是最开始探索这种融合的技术流派。区别于GPT这种更烧钱的方式,该方向工作似乎更偏技术流(仅个人观点)。

  XLNet融合了AR和AE,直观来看可以认为在GPT的模型架构中,加入了自注意力机制。从最后的结果上来看,依然是从左到右依次生成一句话,但是在模型内部其实是能看到当前字符的上下文。注意:这里改进的仍然是预训练过程。XLNet通过提出双流注意力机制实现了该方案,这也是该模型最重要的贡献点。

  问题2:自回归的本质是生成当前字时,仅利用当前字及之前的字符,mask其后的字符。GPT等模型是如何保持并行计算的前提下实现自回归?

  self-attention内部有一个上三角的attention-mask矩阵,这个矩阵的作用就保证了在并行计算的过程中,序列生成字符看不到后面的内容,具体如下图所示:

  现在来看什么是双流注意力机制,如果我有文本:x1 x2 x3 x4,随机生成一个attention mask 矩阵如下所示,其中红点表示0,白点为inf。

  问题3:现在能够在GPT预训练任务看到上下文,似乎目的已经达到了,为什么还要引入另一个注意力机制?

  因为模型虽然能够看到上下文,但是本质还是AR,学习如何说一句通顺的话仍然是这类模型的主要任务,如果想让模型在生成过程中,能够充分学习语义信息,目前学习语义信息常用的方式是BERT的MLM机制,所以,另一个机制本质就是引入MLM预训练任务。

  现在已经能够在GPT预训练任务下看到上下文了,但是对比MLM任务,似乎还差些什么?没错,就是差被【mask】掉的字符,但是XLNet这里并不打算引入【mask】标记,因为下游任务是不会有【mask】标记,引入【mask】标记会造成预训练和下游任务不一致。那XLNet是如何构建AE了,通过增加一个Query流注意力机制来解决这个问题,在 x1 附近增加一个位置信息,w表示当前位置的embedding编码,位置信息仍然使用attention方式编码,但是有2点不同,

  (2)attention-mask矩阵,比内容流多mask对角线的时候,从AE的角度来看,x1利用了上下文信息,还原x1字符,从而让模型学习到语义信息;从AR的角度来看,x1利用上下文信息,逐字输出x1字符,让模型学会了如何通顺的说一句话。

  整体构建的思想就是这么简单,xlnet的本质,不仅仅是从左到右的生成一个字符,也同时通过MLM任务让模型去学习到了语义信息,可谓是一举两得,后面的改进模型中能够看到这类改进思想的影子。

  (1)改进BERT预训练任务,让BERT可以做生成任务(不仅学习到语义信息,而且要学习到如何说一句线)通过self-attention-mask结构,让预训练任务更加简单。

  这是BERT经典的MLM任务,当我预测[Mask]的token时,能够看到当前token的前后字符。比如:x1 x2 [mask] x4,为了要预测mask字符,需要x1,x2,x4和它自身进行编码,所以下图中没有阴影部分,阴影表示-∞,非阴影表示0。细节1:双向语言模型中第一个文本开始之前使用【SOS】,在结束的时候使用【EOS】,所以这里做MLM任务的时候输入的是2段文本。

  这是单向语言模型,当我预测[mask]的时候,仅能使用自身和左侧的token编码。比如:x1x2[mask]x4,仅可以使用x1和x2和它自身进行编码,所以使用了一个上三角矩阵来作为掩码矩阵。注意:单向语言模型输入是一段文本,仍然使用【SOS】和【EOS】作为开始结束符。这里稍微注意一下,是完形填空似的生成任务。

  注意,这里既有bidirectional LM语言模型,也有left-to-right LM语言模型,模型不仅能够学习到语义信息,更能够学习如何说一句流畅的话。为什么还有seq-to-seq LM任务,这其实是和具体任务有关的,比如:摘要生成任务和翻译任务,这种天生适合seq2seq任务,如果在预训练阶段增加这个任务,下游fine-tune效果就能体现。

  有公司已经开源了UniLM模型的中文预训练模型,可以基于这个数据继续进行fine-tune。开源地址:

  logy/Unilm。我在该模型框架下做过摘要生成任务,作为baseline效果还不错。

  使用伪掩避语言模型为自编码和部分自回归语言模型任务预训练一个统一的语言模型。其中,使用传统的掩码通过自编码方式,去学习被掩token与上下文的关系;使用伪掩码通过部分自回归方式,去学习被掩token之间的关系。

  微软针对XLNet的改进提供了2种不同的方向,一种是改进预训练任务,一种是延续XLNet的老路子,改进模型架构,UniLM-V2就是第二种方式。UniLM-v2对模型的改造,比起XLNet更加简单,不存在2个注意力机制,用一个注意力mask矩阵就搞定了AE和AR融合问题。

  伪掩码指的就是不mask token,但是通过设计掩码机制看不到对应token。4.2 模型架构

  x4、x5和x2的原始token(想象一下MLM任务是否也是看不到被mask掉的token,仅知道当前token的位置)

  2 在进行AR任务的时候,预测[P]标记,从mask矩阵上来看(这里面是能够看到上下文)

  因为要预测x4、x5的[P]token和x4、x5的原始token分开的,在attention计算的时候,如果不mask掉x4、x5的原始token,那么会将这些信息加入到x4、x5的[P]token里,造成信息泄漏,降低生成的效果。我们生成的顺序是x4、x5 - x2,所以,在生成x4、x5的时EBET易博官方网站候自然不能看到和x2有关AR计算的信息,也就是x2和原始token和[P]。预测X2的时候既然都能看到x4、x5的原始token,也就没有必要去看[P]。

  AR和AE除了使用统一模型融合,也使用seq2seq架构。MASS模型框架是将AE放在encoder,AR放在decoder端。但是MASS并没有完全的将AR和AE独立开,因为encoder仅仅是用来特征表示,还原文本用的是decoder。

  基于seq2seq的生成模型,相比于xlnet这类模型,从架构上是比较简单的,几乎对AE和AR内部没有进行任何改进,改进的策略往往集中在预训练数据的构造上,从MASS开始也有很多有趣的工作。

  MASS对输入文本随机屏蔽一个长度为k的连续片段,然后通过seq2seq的decoder端生成该片段。但是这不是完整的AR和AE,因为在Encoder端并没有直接还原被mask掉的文本,而是在decoder端去自回归的预测被mask掉的文本,不过也给AR和AE的结合提供一种思路。

  注意:这里改进的是预训练任务,而非下游fine-tune任务或者是推理任务。

  继续理解模型:MASS有一个重要超参数k(屏蔽连续片段长度),通过调整k,可以让这个模型变成BERT的基于MLM预训练模型和GPT预训练模型。

  当k=1时,根据MASS的设定,编码器端屏蔽一个单词,解码器端预测一个单词,如上图所示。BERT只使用了Transformer的编码器模块,此时MASS解码器端没有任何输入信息,就相当于只用到了编码器模块,那么这时MASS和BERT中的MLM预训练方法等价。将decoder看作是一个分类器就好。

  当k=m(m为序列长度)时,根据MASS的设定,编码器屏蔽所有的单词,解码器预测所有单词,如上图所示。GPT只使用了Transformer的解码器模块, 此时由于MASS编码器端所有词都被屏蔽掉,解码器的注意力机制相当于没有获取到信息,在这种情况下MASS等价于GPT中的标准语言模型。

  将encoder端当作BERT结构就好了,decoder端没有任何有效输入,可以简单当个classifier就好。k=m的时候,encoder端没有有效输入,自然就退化成了一个类似GPT。六、PALM

  :以长度为L=500的连续文本片段作为输入,其中从文本开始的0.8*L的文本输入到encoder,同时mask掉token,让encoder能够学习到语义和文本书写的连贯性,剩下的0.2*L文本输入到decoder中,让decoder进行自回归生成。由于人类书写的连贯性,当encoder学习了80%的文档,decoder在理解encoder学习的基础上继续书写。

  模型的思想很简单,但是重要的是能够提炼出AE和AR融合方法论,后面在思考模型和方法的时候就有了参考。七、Pegasus(天马模型)

  从seq2seq来说,AR和AE的结合方式,通常在encoder端放入AE,decoder端放入AR。从我个人的角度理解,encoder端负责去学习语义,decoder端构思表达文本,2者互不干扰,也就是让模型不用在表达的同时,学习语义(XLNet模型改进的角度)。更符合人类思维模式的建模,往往能够获取更好的效果。