0%

深度学习——XLNet

​ 2019年6月,Google最新推出XLNet在20个任务中超越了BERT,并且在18个任务上都取得了当前最佳效果。本文主要来探究XLNet究竟在Bert的基础上做了哪些改进才完成这么大的进化呢?

Bert打开了NLP领域两阶段模式的大门

两阶段模式:

​ 1.预训练

​ 2.FineTuning

XLNet引入了自回归语言模型和自编码语言模型的提法,是一个很好的思维框架

自回归语言模型Autoregressive LM

​ 从左到右或从右到左的预测当前词,这种类型的LM被称为自回归语言模型。

典型模型GPT系列、EMLo(虽然表面上看起来做了两个方向,但是本质上是分别于两个方向的自回归语言模型,然后将隐节点状态拼接到一起,来实现双向语言模型,仍是自回归语言模型)

缺点:只能利用上文或者下文的信息(虽然ELMo利用了上文和瞎问的信息,但是因为只是简单地隐节点状态拼接,效果差强人意)

优点:对于下游任务是文本生成NLP类(机器翻译、文本摘要)等,在实际内容生成的时候,就是从左到右的,自回归语言模型天然匹配这个过程。

自编码语言模型Autoencoder LM

​ Bert通过随机Mask掉一部分单词,然后预训练过程根据上下文单词来预测这些被Mask掉的单词,这是经典的Denoising Autoencoder (DAE)思路,那些被Mask掉的单词就是在输入侧加入的所谓噪音,类似于Bert的这种训练预训练模式被称为DAE LM

典型模型:Bert

优点:能利用上下文的信息

缺点:1.对于文本生成类NLP任务效果不好(因为文本生成类任务本身就是单向的任务)。

​ 2.第一个预训练阶段因为采取引入 [Mask] 标记来 Mask 掉部分单词的训练模式,而 Fine-tuning 阶段是看不到这种被强行加入的 Mask 标记的,所以两个阶段存在使用模式不一致的情形,这可能会带来一定的性能损失

​ 3.在预训练截断,Bert假设句子中的多个单词被Mask掉的单词之间没有任何联系、条件独立,这显然是不一定成立的

XLNet

Bert的主要改进在下面的三个部分:

1.在自回归模型上引入了双向语言模型

2.引入了Transformer-XL的主要思路:相对位置编码以及分段RNN机制(长文档效果提升核心因素)

3.加大预训练使用的数据集

​ XLNet主要针对Bert中第二个缺陷,

在自回归语言模型中引入双向模型

​ 为解决Mask标记两阶段不一致的问题,XLNet打算采用在自回归语言模型中引入双向语言模型来进行解决。目标为看上去仍然是从左向右的输入和预测模式,但是其实内部已经引入了当前单词的下文信息

解决方式:

​ 首先仍然采用双阶段模式,第一阶段为语言模型预训练,第二阶段为任务数据Fine-tuning。它主要改动的是第一截断——语言模型预训练截断,希望不再采用Bert那种带Mask标记的DAE LM模式,而是采用自回归语言模型,看上去是个标准的从左向右过程,Fine-tuning 当然也是这个过程,于是两个环节就统一起来。

MLNet解决该问题的核心思路为:在预训练阶段,引入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 的基本思想

​ 具体实现:

XLNet 采取了 Attention 掩码的机制(一个掩码矩阵),你可以理解为,当前的输入句子是 X ,要预测的单词 Ti 是第 i 个单词,前面1到 i-1 个单词,在输入部分观察,并没发生变化,该是谁还是谁但是在 Transformer 内部,通过 Attention 掩码,从 X 的输入单词里面,也就是 Ti 的上文和下文单词中,随机选择 i-1 个,放到 Ti 的上文位置中,把其它单词的输入通过 Attention 掩码隐藏掉,于是就能够达成我们期望的目标(当然这个所谓放到 Ti 的上文位置,只是一种形象的说法,其实在内部,就是通过 Attention Mask ,把其它没有被选到的单词 Mask 掉,不让它们在预测单词 Ti 的时候发生作用,如此而已。看着就类似于把这些被选中的单词放到了上文 Context_before 的位置,论文中采用双流自注意力机制来进行具体实现

双流自注意力机制

​ 1.内容注意力 标准的transfomer计算过程

​ 2.Query流自注意力 这里并不是很懂

XLNet效果好的核心因素:

1.在自回归模式下引入和双向语言模型

2.引入了Transformer-XL的主要思路:相对位置编码以及分段RNN机制(长文档效果提升核心因素)

3.加大预训练使用的数据集

XLNet和Bert对比

1.预训练过程不同

尽管看上去,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过程不一致的问题

2.XLNet坚持了自编码LM的从左到右的方式,因此XLNet在文本生成类任务上效果要比Bert好

3.XLNet引入了Transfomer XL的机制,因此对于长文本效果比Bert更好

XLNet在NLP各个领域中效果情况

1.对于阅读理解任务,效果有极大幅度的提升

2.文档类任务,性能大幅度提升

3.综合型NLP任务,有所提升

4.文本分类和信息检索任务,有所提升,但幅度不大

总结:主要是长文档任务提升比较明显,其他类型的任务提升不大