XLNet : 运行机制及和 Bert 的异同比较
文章作者:张俊林 新浪微博 AI Lab 资深算法专家
内容来源:深度学习前沿笔记@知乎专栏
出品社区:DataFun
注:文末有惊喜,等你呦。
这两天,XLNet 貌似也引起了 NLP 圈的极大关注,从实验数据看,在某些场景下,确实 XLNet 相对 Bert 有很大幅度的提升。就像我们之前说的,感觉 Bert 打开两阶段模式的魔法盒开关后,在这条路上,会有越来越多的同行者,而 XLNet 就是其中比较引人注目的一位。当然,我估计很快我们会看到更多的这个模式下的新工作。未来两年,在两阶段新模式 ( 预训练 + Finetuning ) 下,应该会有更多的好工作涌现出来。根本原因在于:这个模式的潜力还没有被充分挖掘,貌似还有很大的提升空间。当然,这也意味着 NLP 在未来两年会有各种技术或者应用的突破,现在其实是进入 NLP 领域非常好的时机。原因有两个,一个是 NLP 正面临一个技术栈大的改朝换代的时刻,有很多空白等着你去填补,容易出成绩;另外一点,貌似 Bert+Transformer 有统一 NLP 各个应用领域的趋向,这意味着此时进入 NLP 领域,具备学习成本非常低的好处,和之前相比,投入产出比非常合算。这是两个原因。当然,即使如此,想要学好 NLP ,持续的精力投入是必不可少的。有句老话说得好:“永恒的爱大约持续三个月”,这句话其实对于很多对 NLP 感兴趣的同学也成立:“对 NLP 的永恒的热情大约能够持续3到5天”,希望真的有兴趣的同学能坚持一下,起码持续7到8天,凑够一个星期…..
那么 XLNet 和 Bert 比,有什么异同?有什么模型方面的改进?在哪些场景下特别有效?原因又是什么?本文通过论文思想解读及实验结果分析,试图回答上述问题。
首先,XLNet 引入了自回归语言模型以及自编码语言模型的提法,这个思维框架我觉得挺好的,可以先简单说明下。
自回归语言模型 ( Autoregressive LM )
在 ELMO / BERT 出来之前,大家通常讲的语言模型其实是根据上文内容预测下一个可能跟随的单词,就是常说的自左向右的语言模型任务,或者反过来也行,就是根据下文预测前面的单词,这种类型的 LM 被称为自回归语言模型。GPT 就是典型的自回归语言模型。ELMO 尽管看上去利用了上文,也利用了下文,但是本质上仍然是自回归 LM ,这个跟模型具体怎么实现有关系。ELMO 是做了两个方向 ( 从左到右以及从右到左两个方向的语言模型 ) ,但是是分别有两个方向的自回归 LM ,然后把 LSTM 的两个方向的隐节点状态拼接到一起,来体现双向语言模型这个事情的。所以其实是两个自回归语言模型的拼接,本质上仍然是自回归语言模型。
自回归语言模型有优点有缺点,缺点是只能利用上文或者下文的信息,不能同时利用上文和下文的信息,当然,貌似 ELMO 这种双向都做,然后拼接看上去能够解决这个问题,因为融合模式过于简单,所以效果其实并不是太好。它的优点,其实跟下游 NLP 任务有关,比如生成类 NLP 任务,比如文本摘要,机器翻译等,在实际生成内容的时候,就是从左向右的,自回归语言模型天然匹配这个过程。而 Bert 这种 DAE 模式,在生成类 NLP 任务中,就面临训练过程和应用过程不一致的问题,导致生成类的 NLP 任务到目前为止都做不太好。
自编码语言模型 ( Autoencoder LM )
自回归语言模型只能根据上文预测下一个单词,或者反过来,只能根据下文预测前面一个单词。相比而言,Bert 通过在输入 X 中随机 Mask 掉一部分单词,然后预训练过程的主要任务之一是根据上下文单词来预测这些被 Mask 掉的单词,如果你对 Denoising Autoencoder 比较熟悉的话,会看出,这确实是典型的 DAE 的思路。那些被 Mask 掉的单词就是在输入侧加入的所谓噪音。类似Bert这种预训练模式,被称为 DAE LM 。
这种 DAE LM 的优缺点正好和自回归 LM 反过来,它能比较自然地融入双向语言模型,同时看到被预测单词的上文和下文,这是好处。缺点是啥呢?主要在输入侧引入 [Mask] 标记,导致预训练阶段和 Fine-tuning 阶段不一致的问题,因为 Fine-tuning 阶段是看不到 [Mask] 标记的。DAE 吗,就要引入噪音,[Mask] 标记就是引入噪音的手段,这个正常。
XLNet 的出发点就是:能否融合自回归 LM 和 DAE LM 两者的优点。就是说如果站在自回归 LM 的角度,如何引入和双向语言模型等价的效果;如果站在 DAE LM 的角度看,它本身是融入双向语言模型的,如何抛掉表面的那个 [Mask] 标记,让预训练和 Fine-tuning 保持一致。当然,XLNet 还讲到了一个 Bert 被 Mask 单词之间相互独立的问题,我相信这个不太重要,原因后面会说。当然,我认为这点不重要的事情,纯粹是个人观点,出错难免,看看就完了,不用较真。
XLNet 做了些什么
上文说过,Bert 这种自编码语言模型的好处是:能够同时利用上文和下文,所以信息利用充分。对于很多 NLP 任务而言,典型的比如阅读理解,在解决问题的时候,是能够同时看到上文和下文的,所以当然应该把下文利用起来。在 Bert 原始论文中,与 GPT1.0 的实验对比分析也可以看出来,BERT 相对 GPT 1.0 的性能提升,主要来自于双向语言模型与单向语言模型的差异。这是 Bert 的好处,很明显,Bert 之后的改进模型,如果不能把双向语言模型用起来,那明显是很吃亏的。当然,GPT 2.0 的作者不信这个邪,坚持沿用 GPT 1.0 单向语言模型的旧瓶,装进去了更高质量更大规模预训练数据的新酒,而它的实验结果也说明了,如果想改善预训练语言模型,走这条扩充预序列模型训练数据的路子,是个多快好但是不省钱的方向。这也进一步说明了,预训练 LM 这条路,还远远没有走完,还有很大的提升空间,比如最简单的提升方法就是加大数据规模,提升数据质量。
但是 Bert 的自编码语言模型也有对应的缺点,就是 XLNet 在文中指出的,第一个预训练阶段因为采取引入 [Mask] 标记来 Mask 掉部分单词的训练模式,而 Fine-tuning 阶段是看不到这种被强行加入的 Mask 标记的,所以两个阶段存在使用模式不一致的情形,这可能会带来一定的性能损失;另外一个是,Bert 在第一个预训练阶段,假设句子中多个单词被 Mask 掉,这些被 Mask 掉的单词之间没有任何关系,是条件独立的,而有时候这些单词之间是有关系的,XLNet 则考虑了这种关系(关于这点原因是否可靠,后面会专门分析)。
上面两点是 XLNet 在第一个预训练阶段,相对 Bert 来说要解决的两个问题。
其实从另外一个角度更好理解 XLNet 的初衷和做法,我觉得这个估计是 XLNet 作者真正的思考出发点,是啥呢?就是说自回归语言模型有个缺点,要么从左到右,要么从右到左,尽管可以类似 ELMO 两个都做,然后再拼接的方式。但是跟 Bert 比,效果明显不足够好(这里面有 RNN 弱于 Transformer 的因素,也有双向语言模型怎么做的因素)。那么,能不能类似 Bert 那样,比较充分地在自回归语言模型中,引入双向语言模型呢?因为 Bert 已经证明了这是非常关键的一点。这一点,想法简单,但是看上去貌似不太好做,因为从左向右的语言模型,如果我们当前根据上文,要预测某个单词 Ti ,那么看上去它没法看到下文的内容。具体怎么做才能让这个模型:看上去仍然是从左向右的输入和预测模式,但是其实内部已经引入了当前单词的下文信息呢?XLNet 在模型方面的主要贡献其实是在这里。
那么 XLNet 是怎么做到这一点的呢?其实思路也比较简洁,可以这么思考:XLNet 仍然遵循两阶段的过程,第一个阶段是语言模型预训练阶段;第二阶段是任务数据 Fine-tuning 阶段。它主要希望改动第一个阶段,就是说不像 Bert 那种带 Mask 符号的 Denoising-autoencoder 的模式,而是采用自回归 LM 的模式。就是说,看上去输入句子 X 仍然是自左向右的输入,看到 Ti 单词的上文 Context_before ,来预测 Ti 这个单词。但是又希望在 Context_before 里,不仅仅看到上文单词,也能看到 Ti 单词后面的下文 Context_after 里的下文单词,这样的话,Bert 里面预训练阶段引入的 Mask 符号就不需要了,于是在预训练阶段,看上去是个标准的从左向右过程,Fine-tuning 当然也是这个过程,于是两个环节就统一起来。当然,这是目标。剩下是怎么做到这一点的问题。
那么,怎么能够在单词 Ti 的上文中 Contenxt_before 中揉入下文 Context_after 的内容呢?你可以想想。XLNet 是这么做的,在预训练阶段,引入 Permutation Language Model 的训练目标。什么意思呢?就是说,比如包含单词 Ti 的当前输入的句子 X ,由顺序的几个单词构成,比如 x1,x2,x3,x4 四个单词顺序构成。我们假设,其中,要预测的单词 Ti 是 x3 ,位置在 Position 3 ,要想让它能够在上文 Context_before 中,也就是 Position 1 或者 Position 2 的位置看到 Position 4 的单词 x4 。可以这么做:假设我们固定住 x3 所在位置,就是它仍然在 Position 3 ,之后随机排列组合句子中的4个单词,在随机排列组合后的各种可能里,再选择一部分作为模型预训练的输入 X 。比如随机排列组合后,抽取出 x4,x2,x3,x1 这一个排列组合作为模型的输入 X 。于是,x3 就能同时看到上文 x2 ,以及下文 x4 的内容了。这就是 XLNet 的基本思想,所以说,看了这个就可以理解上面讲的它的初衷了吧:看上去仍然是个自回归的从左到右的语言模型,但是其实通过对句子中单词排列组合,把一部分 Ti 下文的单词排到 Ti 的上文位置中,于是,就看到了上文和下文,但是形式上看上去仍然是从左到右在预测后一个单词。
当然,上面讲的仍然是基本思想。难点其实在于具体怎么做才能实现上述思想。首先,需要强调一点,尽管上面讲的是把句子 X 的单词排列组合后,再随机抽取例子作为输入,但是,实际上你是不能这么做的,因为 Fine-tuning 阶段你不可能也去排列组合原始输入。所以,就必须让预训练阶段的输入部分,看上去仍然是 x1,x2,x3,x4 这个输入顺序,但是可以在 Transformer 部分做些工作,来达成我们希望的目标。具体而言,XLNet 采取了 Attention 掩码的机制,你可以理解为,当前的输入句子是 X ,要预测的单词 Ti 是第 i 个单词,前面1到 i-1 个单词,在输入部分观察,并没发生变化,该是谁还是谁。但是在 Transformer 内部,通过 Attention 掩码,从 X 的输入单词里面,也就是 Ti 的上文和下文单词中,随机选择 i-1 个,放到 Ti 的上文位置中,把其它单词的输入通过 Attention 掩码隐藏掉,于是就能够达成我们期望的目标(当然这个所谓放到 Ti 的上文位置,只是一种形象的说法,其实在内部,就是通过 Attention Mask ,把其它没有被选到的单词 Mask 掉,不让它们在预测单词 Ti 的时候发生作用,如此而已。看着就类似于把这些被选中的单词放到了上文 Context_before 的位置了)。具体实现的时候,XLNet 是用“双流自注意力模型”实现的,细节可以参考论文,但是基本思想就如上所述,双流自注意力机制只是实现这个思想的具体方式,理论上,你可以想出其它具体实现方式来实现这个基本思想,也能达成让Ti看到下文单词的目标。
这里简单说下“双流自注意力机制”,一个是内容流自注意力,其实就是标准的 Transformer 的计算过程;主要是引入了 Query 流自注意力,这个是干嘛的呢?其实就是用来代替 Bert 的那个 [Mask] 标记的,因为 XLNet 希望抛掉 [Mask] 标记符号,但是比如知道上文单词 x1,x2 ,要预测单词 x3 ,此时在 x3 对应位置的 Transformer 最高层去预测这个单词,但是输入侧不能看到要预测的单词 x3 ,Bert 其实是直接引入 [Mask] 标记来覆盖掉单词 x3 的内容的,等于说 [Mask] 是个通用的占位符号。而 XLNet 因为要抛掉 [Mask] 标记,但是又不能看到 x3 的输入,于是 Query 流,就直接忽略掉 x3 输入了,只保留这个位置信息,用参数 w 来代表位置的 embedding 编码。其实 XLNet 只是扔了表面的 [Mask] 占位符号,内部还是引入 Query 流来忽略掉被 Mask 的这个单词。和 Bert 比,只是实现方式不同而已。
上面说的 Attention 掩码,我估计你还是没了解它的意思,我再用例子解释一下。Attention Mask 的机制,核心就是说,尽管当前输入看上去仍然是 x1->x2->x3->x4 ,但是我们已经改成随机排列组合的另外一个顺序 x3->x2->x4->x1 了,如果用这个例子用来从左到右训练 LM ,意味着当预测 x2 的时候,它只能看到上文 x3 ;当预测 x4 的时候,只能看到上文 x1 和 x2 ,以此类推……这样,比如对于 x2 来说,就看到了下文 x3 了。这种在输入侧维持表面的 X 句子单词顺序,但是其实在 Transformer 内部,看到的已经是被重新排列组合后的顺序,是通过 Attention 掩码来实现的。如上图所示,输入看上去仍然是 x1,x2,x3,x4 ,可以通过不同的掩码矩阵,让当前单词 Xi 只能看到被排列组合后的顺序 x3->x2->x4->x1 中自己前面的单词。这样就在内部改成了被预测单词同时看到上下文单词,但是输入侧看上去仍然维持原先的单词顺序了。关键要看明白上图右侧那个掩码矩阵,我相信很多人刚开始没看明白,因为我刚开始也没看明白,因为没有标出掩码矩阵的单词坐标,它的坐标是1-2-3-4,就是表面那个 X 的单词顺序,通过掩码矩阵,就能改成你想要的排列组合,并让当前单词看到它该看到的所谓上文,其实是掺杂了上文和下文的内容。这是 attention mask 来实现排列组合的背后的意思。
上面讲的 Permutation Language Model 是 XLNet 的主要理论创新,所以介绍的比较多,从模型角度讲,这个创新还是挺有意思的,因为它开启了自回归语言模型如何引入下文的一个思路,相信对于后续工作会有启发。当然,XLNet 不仅仅做了这些,它还引入了其它的因素,也算是一个当前有效技术的集成体。感觉 XLNet 就是 Bert、GPT 2.0 和 Transformer XL 的综合体变身,首先,它通过 PLM 预训练目标,吸收了 Bert 的双向语言模型;然后,GPT2.0 的核心其实是更多更高质量的预训练数据,这个明显也被 XLNet 吸收进来了;再然后,Transformer XL 的主要思想也被吸收进来,它的主要目标是解决 Transformer 对于长文档 NLP 应用不够友好的问题。
以上是 XLNet 的几个主要改进点,有模型创新方面的,有其它模型引入方面的,也有数据扩充方面的。那么,这些因素各自起到了什么作用呢?在后面我们会谈。在谈不同因素各自作用之前,我们先分析下 XLNet 和 Bert 的异同问题。
与 Bert 的预训练过程的异同问题
尽管看上去,XLNet 在预训练机制引入的 Permutation Language Model 这种新的预训练目标,和 Bert 采用 Mask 标记这种方式,有很大不同。其实你深入思考一下,会发现,两者本质是类似的。区别主要在于:Bert 是直接在输入端显示地通过引入 Mask 标记,在输入侧隐藏掉一部分单词,让这些单词在预测的时候不发挥作用,要求利用上下文中其它单词去预测某个被 Mask 掉的单词;而 XLNet 则抛弃掉输入侧的 Mask 标记,通过 Attention Mask 机制,在 Transformer 内部随机 Mask 掉一部分单词(这个被 Mask 掉的单词比例跟当前单词在句子中的位置有关系,位置越靠前,被 Mask 掉的比例越高,位置越靠后,被 Mask 掉的比例越低),让这些被 Mask 掉的单词在预测某个单词的时候不发生作用。所以,本质上两者并没什么太大的不同,只是 Mask 的位置,Bert 更表面化一些,XLNet 则把这个过程隐藏在了 Transformer 内部而已。这样,就可以抛掉表面的 [Mask] 标记,解决它所说的预训练里带有 [Mask] 标记导致的和 Fine-tuning 过程不一致的问题。至于说 XLNet 说的,Bert 里面被 Mask 掉单词的相互独立问题,也就是说,在预测某个被 Mask 单词的时候,其它被 Mask 单词不起作用,这个问题,你深入思考一下,其实是不重要的,因为 XLNet 在内部 Attention Mask 的时候,也会 Mask 掉一定比例的上下文单词,只要有一部分被 Mask 掉的单词,其实就面临这个问题。而如果训练数据足够大,其实不靠当前这个例子,靠其它例子,也能弥补被 Mask 单词直接的相互关系问题,因为总有其它例子能够学会这些单词的相互依赖关系。
我相信,通过改造 Bert 的预训练过程,其实是可以模拟 XLNet 的 Permutation Language Model 过程的:Bert 目前的做法是,给定输入句子 X ,随机 Mask 掉15%的单词,然后要求利用剩下的85%的单词去预测任意一个被 Mask 掉的单词,被 Mask 掉的单词在这个过程中相互之间没有发挥作用。如果我们把 Bert 的预训练过程改造成:对于输入句子,随机选择其中任意一个单词 Ti ,只把这个单词改成 Mask 标记,假设 Ti 在句子中是第 i 个单词,那么此时随机选择 X 中的任意 i 个单词,只用这 i 个单词去预测被 Mask 掉的单词。当然,这个过程理论上也可以在 Transformer 内采用 attention mask 来实现。如果是这样,其实 Bert 的预训练模式就和 XLNet 是基本等价的了。
或者换个角度思考,假设仍然利用 Bert 目前的 Mask 机制,但是把 Mask 掉15%这个条件极端化,改成,每次一个句子只 Mask 掉一个单词,利用剩下的单词来预测被 Mask 掉的单词。那么,这个过程其实跟 XLNet 的 PLM 也是比较相像的,区别主要在于每次预测被 Mask 掉的单词的时候,利用的上下文更多一些(XLNet 在实现的时候,为了提升效率,其实也是选择每个句子最后末尾的 1/K 单词被预测,假设 K=7 ,意味着一个句子 X ,只有末尾的 1/7 的单词会被预测,这意味着什么呢?意味着至少保留了 6/7 的 Context 单词去预测某个单词,对于最末尾的单词,意味着保留了所有的句子中 X 的其它单词,这其实和上面提到的 Bert 只保留一个被 Mask 单词是一样的)。或者我们站在 Bert 预训练的角度来考虑 XLNet ,如果 XLNet 改成对于句子 X ,只需要预测句子中最后一个单词,而不是最后的 1/K ( 就是假设 K 特别大的情况 ) ,那么其实和 Bert 每个输入句子只 Mask 掉一个单词,两者基本是等价的。
当然,XLNet 这种改造,维持了表面看上去的自回归语言模型的从左向右的模式,这个 Bert 做不到,这个有明显的好处,就是对于生成类的任务,能够在维持表面从左向右的生成过程前提下,模型里隐含了上下文的信息。所以看上去,XLNet 貌似应该对于生成类型的 NLP 任务,会比 Bert 有明显优势。另外,因为 XLNet 还引入了 Transformer XL 的机制,所以对于长文档输入类型的 NLP 任务,也会比 Bert 有明显优势。
哪些因素在起作用?
如上分析,XLNet 有个好处,但是感觉同时也是个问题,那就是:XLNet 其实同时引入了很多因素在模型里。说是好处,因为实验证明了这样效果确实好,即使是跟 Bert_Large 这种非常强的基准模型比也是,尤其是长文档任务,这个效果提升比较明显;说是问题,是因为其实应该在实验部分充分说明,如果模型起了作用,这些因素各自发挥了多大作用,尤其是在跟 Bert 进行对比的时候,感觉应该把数据规模这个变量磨平进行比较,因为这才是单纯的模型差异导致的性能差异,而不是训练数据量引发的差异。当然,XLNet 最后一组实验是把这个预训练数据规模差异磨平后,和 Bert 比较的,所以信息含量更大些。而前面的几组实验,因为天然存在预训练数据量的差异,所以模型导致的差异到底有多大,看得不太明显。引入了 Transformer-XL 的主要思路:相对位置编码以及分段 RNN 机制。实践已经证明这两点对于长文档任务是很有帮助的。
我们上文提到过,XLNet 起作用的,如果宏观归纳一下,共有三个因素;
1. 与 Bert 采取 De-noising Autoencoder 方式不同的新的预训练目标:Permutation Language Model ( 简称 PLM ) ;这个可以理解为在自回归 LM 模式下,如何采取具体手段,来融入双向语言模型。这个是 XLNet 在模型角度比较大的贡献,确实也打开了 NLP 中两阶段模式潮流的一个新思路。
2. 引入了 Transformer-XL 的主要思路:相对位置编码以及分段 RNN 机制。实践已经证明这两点对于长文档任务是很有帮助的;
加大增加了预训练阶段使用的数据规模;Bert 使用的预训练数据是 BooksCorpus 和英文 Wiki 数据,大小 13G 。XLNet 除了使用这些数据外,另外引入了 Giga5,ClueWeb 以及 Common Crawl 数据,并排掉了其中的一些低质量数据,大小分别是 16G,19G 和 78G 。可以看出,在预训练阶段极大扩充了数据规模,并对质量进行了筛选过滤。这个明显走的是 GPT2.0 的路线。
所以实验部分需要仔细分析,提升到底是上述哪个因素或者是哪几个因素导致的性能提升?
我们把实验分成几个部分来分析。
首先,给人最大的印象是:XLNet 对于阅读理解类任务,相对 Bert ,性能有极大幅度地提升。下面是论文报道的实验结果:
其中,RACE 和 SQuAD 2.0 是文档长度较长的阅读理解任务,任务难度也相对高。可以看出,在这两个任务中,XLNet 相对 Bert_Large ,确实有大幅性能提升 ( Race 提升13.5%,SQuAD 2.0 F1 指标提升8.6 ) 。在 Squad1.1 上提升尽管稍微小些,F1 提升3.9%,但是因为基准高,所以提升也比较明显。
说 XLNet 在阅读理解,尤其是长文档的阅读理解中,性能大幅超过 Bert ,这个是没疑问的。但是,因为 XLNet 融入了上文说的三个因素,所以不确定每个因素在其中起的作用有多大,而对于长文档,Transformer XL 的引入肯定起了比较大的作用,Bert 天然在这种类型任务中有缺点,其它两类因素的作用不清楚。感觉这里应该增加一个基准,就是 Bert 用与 XLNet 相同大小的预训练数据做,这样抹平数据量差异,更好比较模型差异带来的效果差异。当然,我觉得即使是这样,XLNet 应该仍然是比 Bert 效果好的,只是可能不会差距这么大,因为 XLNet 的长文档优势肯定会起作用。
下面我们看下其它类型的 NLP 任务。
GLUE 是个综合的 NLP 任务集合,包含各种类型的任务,因为 ensemble 模式里面包含了各种花式的 trick ,所以重点看上面一组实验,这里比较单纯。从实验数据看,XLNet 相对 Bert 也有性能提升,当然不像阅读理解提升那么大,而且性能提升比较大的集中在 RTE ,MNLI 和 COLA 数据集合,其它任务提升效果还好。而我一直觉得,RTE 在 GLUE 里,是个神奇的存在,如果没有它,很多论文的效果可能没法看,这个是闲话,先不讲了,后面我会单说。
当然,仍然不确定这种性能提升主要来自于 XLNet 的哪个因素,或者哪几个因素各自的贡献,尤其是如果 Bert 加大预训练数据规模后,两者性能差异有多大。感觉这里 Transformer XL 的因素可能发挥的作用不会太大,其它两个因素在起作用,但是作用未知,这里感觉应该补充其它实验。
上面是文本分类任务和信息检索任务,可以看出,相对 Bert,XLNet 效果有提升,但是幅度不算大。仍然是上面的考虑,起作用的三个因素,到底哪个发挥多大作用,从数据方面看不太出来。
下面一组实验可以仔细分析一下,这组实验是排除掉上述第三个数据规模因素的实验的对比,就是说 XLNet 用的是和 Bert 相同规模的预训练数据,所以与 Bert 对比更具备模型方面的可比较性,而没有数据规模的影响。实验结果如下:
如果仔细分析实验数据,实验结果说明:
因为和 Bert 比较,XLNet 使用相同的预训练数据。所以两者的性能差异来自于:Permutation Language Model 预训练目标以及 Transformer XL 的长文档因素。而从中可以看出,DAE+Transformer XL 体现的是长文档因素的差异,和 Bert 比,Race 提升1个点,SQuAD F1 提升3个点,MNLI 提升0.5个点,SST-2 性能稍微下降。这是 Transformer XL 因素解决长文档因素带来的收益,很明显,长文档阅读理解任务提升比较明显,其它任务提升不太明显。
而通过 XLNet 进一步和 DAE+Transformer XL 及 Bert 比,这一点应该拆解出 Permutation Language Model 和 Mask 的方式差异。可以看出:XLNet 相对 DAE+Transformer XL 来说,Race 进一步提升1个点左右;SQuAD 进一步提升1.8个点左右,NMLI 提升1个点左右,SST-B 提升不到1个点。虽然不精准,但是大致是能说明问题的,这个应该大致是 PLM 带来的模型收益。可以看出,PLM 还是普遍有效的,但是提升幅度并非特别巨大。
如果我们结合前面 Race 和 SQuAD 的实验结果看(上面两组实验是三个因素的作用,后面是排除掉数据量差异的结果,所以两者的差距,很可能就是第三个因素:数据规模导致的差异,当然,因为一个是 Bert_base ,一个是 Bert_Large ,所以不具备完全可比性,但是大致估计不会偏离真实结论太远),Race 数据集合三因素同时具备的 XLNet ,超过 Bert 绝对值大约9个多百分点,Transformer 因素 +PLM 因素估计贡献大约在2到4个点之间,那么意味着预训练数据量导致的差异大概在4到5个点左右;类似的,可以看出,SQuAD 2.0 中,预训练数据量导致的差异大约在2到3个点左右,也就是说,估计训练数据量带来的提升,在阅读理解任务中大约占比30%到40%左右。
如果从实验结果归纳一下的话,可以看出:XLNet 综合而言,效果是优于 Bert 的,尤其是在长文档类型任务,效果提升明显。如果进一步拆解的话,因为对比实验不足,只能做个粗略的结论:预训练数据量的提升,大概带来30%左右的性能提升,其它两个模型因素带来剩余的大约70%的性能提升。当然,这个主要指的是 XLNet 性能提升比较明显的阅读理解类任务而言。对于其它类型任务,感觉 Transformer XL 的因素贡献估计不会太大,主要应该是其它两个因素在起作用。
对 NLP 应用任务的影响
XLNet 其实本质上还是 ELMO/GPT/Bert 这一系列两阶段模型的进一步延伸。在将自回归 LM 方向引入双向语言模型方面,感觉打开了一个新思路,这点还是非常对人有启发的。当然,如果深入思考,其实和 Bert 并没有太大的不同。
如果让我推论下 XLNet 的出现,对后续 NLP 工作的影响,我觉得跟 Bert 比,最直接的影响应该有两个,一个是对于 Bert 长文档的应用,因为 Transformer 天然对长文档任务处理有弱点,所以 XLNet 对于长文档 NLP 任务相比 Bert 应该有直接且比较明显的性能提升作用,它在论文中也证明了这点。所以,以后长文档类型的 NLP 应用,XLNet 明显跟 Bert 比占优势。当然,你说我把 Transformer XL 的因素引入 Bert ,然后继续在 Bert 上做改进,明显这也是可以的。
第二点,对于生成类的 NLP 任务,到目前为止,尽管出了一些改进模型,但是从效果看,Bert 仍然不能很好地处理。而因为 XLNet 的预训练模式天然符合下游任务序列生成结果,所以按理说能够直接通过引入 XLNet 来改进生成类 NLP 任务的效果。所以,这点估计是 XLNet 会明显占优势的一个领域。
可以预计的是,很快我们就会看到 XLNet 在文本摘要,机器翻译,信息检索…..等符合上述 XLNet 应用领域特点和优势领域的应用结果,以及在这些任务上的进一步改进模型。当然,这个有点比手速的意思,有意者请尽快动手把结果扔出来。
又给你了一个拼手速的机会,加油吧,少年!
作者介绍:
张俊林,中国中文信息学会理事,中科院软件所博士。目前在新浪微博 AI Lab 担任资深算法专家。在此之前,张俊林曾经在阿里巴巴任资深技术专家并负责新技术团队,以及在百度和用友担任技术经理及技术总监等职务。同时他是技术书籍《这就是搜索引擎:核心技术详解》(该书荣获全国第十二届优秀图书奖)、《大数据日知录:架构与算法》的作者。
对作者感兴趣的小伙伴,欢迎点击文末阅读原文,与作者交流。
——END——
福利时间:
小编今天为大家准备了机械工业出版社的新书:《 Keras 深度学习实战 》,即日起截至6月27日(周四)中午12:00,欢迎大家在本文留言区留言,点赞人数最多的5名同学,将获得这本新书哦!我们将在6月28日公布获奖结果,大家快快来参与吧!
下面带大家来了解下这本新书:
书名:《 Keras 深度学习实战 》
作者:[印] 拉蒂普·杜瓦(Rajdeep Dua)曼普里特·辛格·古特(Manpreet Singh Ghotra)著
出版社:机械工业出版社
出版时间:2019年5月
内容介绍
第1章 介绍了 Keras 的安装和设置过程以及如何配置 Keras。
第2章 介绍了使用 CIFAR-10、CIFAR-100 或 MNIST 等数据集,以及用于图像分类的其他数据集和模型。
第3章 介绍了使用 Keras 的各种预处理和优化技术,优化技术包括 TFOptimizer、AdaDelta 等。
第4章详细描述了不同的 Keras 层,包括递归层和卷积层等。
第5章通过宫颈癌分类和数字识别数据集的实例,详细解释如何使用卷积神经网络算法。
第6章包括基本的生成式对抗网络(GAN)和边界搜索 GAN 。
第7章涵盖了递归神经网络的基础,以便实现基于历史数据集的 Keras 。
第8 章包括使用 Keras 进行单词分析和情感分析的 NLP 基础知识。
第9章展示了如何在 Amazon 评论数据集中使用 Keras 模型进行文本概述。
第10章侧重于使用 Keras 设计和开发强化学习模型。
详情大家可以上华章图书官网了解:
http://www.hzbook.com
关于 DataFun:
DataFun 定位于最实用的数据智能平台,主要形式为线下的深度沙龙、线上的内容整理。希望将工业界专家在各自场景下的实践经验,通过 DataFun 的平台传播和扩散,对即将或已经开始相关尝试的同学有启发和借鉴。
DataFun 的愿景是:为大数据、人工智能从业者和爱好者打造一个分享、交流、学习、成长的平台,让数据科学领域的知识和经验更好的传播和落地产生价值。
DataFun 成立至今,已经成功在全国范围内举办数十场线下技术沙龙,有超过三百位的业内专家参与分享,聚集了数万大数据、算法相关领域从业者。
您的「在看」,我的动力!👇