结合
XLNet结合了Bert、GPT 2.0和Transformer XL
- 它通过PLM预训练目标,吸收了Bert(AE)的双向语言模型;
- GPT2.0更多更高质量的预训练数据,这也被XLNet吸收进来;
- 引入Transformer XL来解决Transformer对于长文档应用不好的问题
XLNet 四个好处
- 结合AE优点,PLM获取双向语义信息(对token级别的任务如RC\QA很重要)
- 结合AR优点,输入不用masking,解决了pretrain-finetune不匹配
- 可以对序列的概率分布进行建模,避免了独立性假设
- 探索到更长距离
文章目录
0 XLNet 创新点
-
PLM
-
Two-Stream self-attention(与PLM相辅相成)
query stream , content stream
核心是target-aware Representations,引入了target position zt
-
引入transformer-xl模型(以下简称txl)
-
segment recurrence mechanism
-
relative positional encoding
-
1 三种语言模型
1.1 AR——自回归语言模型
对于一个给定的序列 x=[x1,⋯,xT],自回归语言模型致力于对该序列的概率分布进行估计。通俗来讲,就是根据上文内容预测下一个可能跟随的单词,就是常说的自左向右的语言模型任务,或者反过来也行。GPT 就是典型的自回归语言模型。
具体的,利用乘法公式对原始序列的似然函数进行分解
可以通过极大似然来进行预训练:
缺点:不是双向
1.2 AE——去噪自编码语言模型(DAE, denoising auto-encoding)
以BERT为首,核心:reconstruct the original data from corrupted input 。做法是将部分待预测词替换为 MASK
,通过建模双向语境的信息,来预测原来的词语:
优点:融入双向语言模型,同时看到被预测单词的上文和下文
缺点:
-
独立性假设(independence assumption)。上式使用了 ≈符号,因为 AE 语言模型不是对原始的序列分布进行建模,没有使用乘法公式。BERT 对 mask 掉的目标单词分别进行预测,使用了独立性假设,即待预测的所有
MASK
token 在未 mask 序列的条件下是独立的。(xlnet认为他们是有关系的) -
pretrain-finetune 不匹配(discrepancy)
1.3 PLM——乱序语言模型
乱序语言模型使用一个序列的所有可能排序方式来构建一个 AR 语言模型。
理论上,如果模型的参数在所有的顺序中共享,那么模型就能学到从所有位置收集上下文信息。乱序语言模型目标表示如下,其中g函数和zt后面会说,并且后面目标会进一步改进为局部预测:
乱序语言模型使用的是原始位置的位置编码,而不是调整了原来句子的顺序,这得益于 Transformer 的 mask 机制来实现。实现的话要配合后面说到的双通道自注意力流,query流就是代替Bert的[mask]
[2],只保留位置信息。为了记录位置信息,使用relative positional encoding
。
XLNet只是扔了表面的[Mask]
占位符号,内部还是引入Query流来忽略掉被Mask的这个单词。和Bert比,只是实现方式不同而已。
模型图例
优点:
- 捕获双向信息(AE优点)
- 自然的避免了独立性假设、pretrain-finetune 不匹配的问题。(AR优点,AE缺点)
- 模型的参数在所有的顺序中共享
2 Two-Stream Self-Attention 双通道自注意力
2.1 结合PLM
上面说的PLM思想,难点在于具体怎么实现上述思想。实际上不能去排列组合原始输入,因为Fine-tuning阶段也不可能也去排列组合原始输入,因此,可以在Transformer部分做些工作,来达成目标。
由此,XLNet采取了Attention掩码的机制 (把其它没有被选到的单词Mask掉,不让它们在预测单词Ti的时候发生作用,看着就类似于把这些被选中的单词放到了上文Context_before的位置了),即在输入侧维持表面的X句子单词顺序,但在Transformer内部,看到的已经是被重新排列组合后的顺序,关键就是那个掩码矩阵。
双流自注意力机制就是实现这个思想的具体方式。得益于 Transformer 的 mask
机制,XLNet只是扔了表面的[Mask]
占位符号,内部还是引入Query流
来忽略掉被Mask的这个单词[2]。和Bert比,只是实现方式不同而已。
想要实现乱序的语言模型,如果直接对每个排序方式构建普通的 Transformer,并不能达到效果。原因如下。
假设我们需要预测下一个 token,
hθ(xZ<t) 并没有依赖于要预测的内容的位置信息zt,乱序语言模型的分解顺序是随机的,因此无论预测目标的位置在哪里,因式分解后得到的所有情况都是一样的,并且transformer的权重对于不同的情况是一样的,因此无论目标位置怎么变都能得到相同的分布结果,这是不合理的。
因此需要修改预测next-token distribution的公式,也就是引入target position zt
。
2.2 双流Attention
需要建模的两种 token 为:
-
xzt ,此时只能使用位置信息
zt
而不能使用内容信息xzt ,否则就暴露标签了; -
xxj ,j>t。对于后面的 token,需要使用完全的上下文内容信息
因此,用到了两种hidden representation,一个包含了内容信息,一个只包含位置信息:
-
content representation
(与标准transformer是相同的) -
query representation
(就是用来代替Bert的那个[Mask]
标记的)
对于 self-attention 的后续层 m=1,…,M,两个表示分别按照下式进行更新:
在 fine-tuning 阶段,直接将 query stream 去掉。
2.3 局部预测
由于使用了乱序的语言模型,部分出现在排列前部分的 token 的上下文信息很弱,导致增加了模型优化的困难度、收敛慢。因此在一个排列中,我们选择只预测后部分的一些 token。对于一个排列,将对目标子序列进行预测,因为其有当前排列下的最长上下文信息。
使用超参数 K 来决定目标子序列的比例.由图看出,K越大,划分的子序列也越长。
xlnet认为哪怕是局部预测,也能获取到target tokens的之间的关系(因为没有bert的假设独立性),尽管张俊林认为这不重要。
3 引入Transformer-xl
我们可以将 XLNet 看成是不同排列下多个 Transformer-XL 的并行。
预训练的时候,对于输入的sequence,就已起作用了。fine-tune的时候当然也有。
segment循环机制
从而使该segment可以使用上一段segment的内容流hs,并且这个attention更新与乱序后的上个segmentZ无关。
因此该机制的引入,也无需知道上一段的乱序信息。query流注意力更新里的h同理。
相对位置编码
如上文里,一段序列中位置 zt的位置编码,相对位置编码在不同排列方式间保持一致,不随排列方式的变化而变化。
4 Multiple Segments与relative segment encodings
预训练的时候,把2个segment看作一个sequence 运行PLM,和BERT的输入格式一样:[CLS, A, SEP, B, SEP]
,但没使用NSP。
在 fine-tuning 阶段,有很多任务是需要输入多 segments 的,如双句分类、阅读理解、智能问答等。传统的 BERT 直接使用了绝对编码,即将 eA 与 eB 直接赋值给句子内的每个 token。
把txl的relative encodings也拓展到segments上,我们对于 segments 进行相对编码。只关心两个位置是不是属于同一个segment,sij等于S+或S-,而不是考虑他们来自哪个segment。这是核心。
从而得到一个attention weight,
与传统的transformer的weight相加从而得到最终的attention weight.RSE提供了finetune任务有多于2个输入segments上的可能性。
5 实验
部分实验方法:
Since the recurrence mechanism is introduced, they use use a bidirectional data input pipeline.
finetune时,span-based prediction,
XLNet vs BERT(使用同样数据集)
XLNet vs RoBERTa (XLNet用全部数据集)
6 其他补充
关于mask单词独立性问题
张俊林说:XLNet说的,Bert里面被Mask掉单词的相互独立问题,其实是不重要的。因为XLNet在内部Attention Mask的时候,也会Mask掉一定比例的上下文单词,只要有一部分被Mask掉的单词,其实就面临这个问题。而如果训练数据足够大,其实不靠当前这个例子,靠其它例子,也能弥补被Mask单词直接的相互关系问题,因为总有其它例子能够学会这些单词的相互依赖关系。
关于MASK
如图是单向语言模型的Mask方式,可见是一个下三角。Attention矩阵的每一行事实上代表着输出,而每一列代表着输入,而Attention矩阵就表示输出和输入的关联。
XLNet是乱序语言模型,它跟语言模型一样,都是做条件概率分解,但是乱序语言模型的分解顺序是随机的:
任意一种“出场顺序”都有可能。原则上来说,每一种顺序都对应着一个模型,所以原则上就有n!
个语言模型。基于Transformer的模型,则可以将这所有顺序都做到一个模型中去!
以“北京欢迎你”的生成为例,假设随机的一种生成顺序为**“< s > → 迎 → 京 → 你 → 欢 → 北 → < e >**”,那么我们只需要用下图中第二个子图的方式去Mask掉Attention矩阵,就可以达到目的了:
直观来看,这就像是把单向语言模型的下三角形式的Mask“打乱”了。
也就是说,实现一种顺序的语言模型,就相当于将原来的下三角形式的Mask以某种方式打乱。
训练方式,就是输入的不仅只有token本身,还包括token所在的位置id,即会有个词序的position embedding会加入到序列输入上来。