在19年,CMU和google brain联合推出了bert的改进模型XLNet。Bert基于去噪自编码器建模双向语境信息,性能优于基于自回归语言模型的预训练方法。由于需要mask一部分输入,Bert忽略了被mask之间的依赖关系,因此导致预训练和微调效果的差异(pretrain-finetune discrepancy)。XLNet在三个方面上对于Bert进行了优化:
1.采用AR(autoregressive)模型替代AE(autoencoding)模型,解决mask带来的负面影响。
2.双流注意力机制。通过最大化所有可能的因式分解顺序的对数拟然,学习双向语境信息。
3.引入transformer-xl,对于生成类的任务,比Bert有明显的优势;XLNet更擅长处理长文本的输入。
最终XLNet在20个任务上超过Bert的表现,并在18个任务上取得当前最佳效果(state-of-the-art),包括机器问答,自然语言推断,情感分析和文档排序。
AR(自回归)与AE(自编码)
XLNet是一种通用的自回归预训练方法。AR语言模型是一种用上下文词来预测下一个词的模型。这里,上下文单词背限制在前后两个方向。

GPT和GPT-2都是AR语言模型。AR语言模型的优势是擅长处理生成性自然语言处理任务。AR语言模型有一个缺点,它只能前向上下文或者后向上下文,它不能同时使用前向和后向上下文。
与AR模型不同,Bert归类为AE(自动编码)语言模型。
AE语言模型从损坏的输入中重建原始数据。

损坏的输入以为着我们在预训练阶段用[mask]替换原始词。AE语言模型的优势是它可以从向前和向后的方向看到上下文。AE模型也有缺点,因为在预训练过程中使用[mask],但是在真实数据中并不存在,这会导致预训练-调优的差异。[mask]另一个缺点是它假设预测词在给定未屏蔽的情况下彼此独立。假设一句话:住房危机已经变成银行危机"。我们遮蔽“银行业”和“危机”。在AE模型不能正确学习到“银行业”与“危机”之间的关系。
XLNet集合了AR和AE方法的优点。XLNet不使用传统AR模型中固定的前向或者后向因式分解顺序,而是最大化所有可能因式分解顺序的期望对数似然。由于对因式分解顺序的排序,每个位置的语境包括来自左边和右边的token。因此,每个位置都能学习来自所有位置的语境信息,即捕捉双向语境。
作为一个泛化AR语言模型,XLNet不依赖残缺数据。因此,XLNet不会有Bert的预训练-微调差异。同时,自回归目标提供一种自然的方式,来利用乘法法则对预测token的联合概率执行因式分解(factorize),这消除了Bert中的独立性假说。
XLNet将Transformer-XL的分割循环机制(segment recurrence mechanism)和相对编码范式(relative encoding)整合到预训练中,提高了包含长文本序列的任务中的性能。
排列语言建模(Permutation Language Modeling)
自回归模型(AR)有一个缺点,要么从右到左,要么从左到右。XLNet想通过单词上下文信息并且克服Bert的带有Mask符号的Denoising-autoencoder的缺点。

排队语言建模,假设当前输入的句子X,有顺序几个单词构成,比如x1,x2,x3,x4四个单词顺序构成。我们想要预测的单词是x3,位置是Position3。我们固定好x3所在的位置,之后随机排列组合句子中的其余3个词,在所有可能各种可能中,再选择一部分作为模型的输入X(因为全部的话计算量非常大)。比如随机排序组合抽取出x4,x2,,x3,x1。这样,x3就可以同时看到上文x2,以及下文的x4的内容。
双流自注意力机制
内容流自注意力是Transformer的计算过程:主要引入Query流自注意力。XlNet主要想摆脱Bert使用[mask]标记。比如知道上文单词x1,x2,想要预测单词x3,此时使用x3对应的位置的Transformer最高层去预测这个单词。因为输入侧不能看到要预测的单词x3,Bert其实使用[mask]标记来覆盖单词x3的内容。XLNet使用Query流直接忽略x3的输入,只保留这个位置信息。

Transformer-XL机制
XLNet使用最先进的Transformer-XL机制。Transformer是根据历史的词预测下一个词,它不同于Bert的mask语言模型,也避免了Bert的mask机制带来的缺点。

为了在内存的限制下让Transformer学到更长的依赖,Transformer-XL借鉴了TBPTT(Truncated Back-Propagation Through Time)的思路,将上一个片段s{t-1}计算出来的表征缓存扎起内存里,加入到当前片段s{t}的表征计算中。
XLNet在Keras的实现
CyberZHG大神开源了keras-xlnet,让XLNet的使用平民化。
安装keras XLNet,并且下载xlnet预训练模型
pip install keras-xlnet
使用方法
import os
from keras_xlnet import Tokenizer, load_trained_model_from_checkpoint, ATTENTION_TYPE_BI
checkpoint_path='.../xlnet_cased_L-24_H-1024_A-16'
tokenizer=Tokenizer(os.path.join(checkpoint_path,'spiece.model'))
model=load_trained_model_from_checkpoint(
config_path=os.path.join(checkpoint_path,'xlnet_config.json'),
checkpoint_path=os.path.join(checkpoint_path,'xlnet_model.ckpt'),
batch_size=16,
memory_len=512,
target_len=128,
in_train_phase=False,
attention_type=ATTENTION_TYPE_BI,)
model.summary()
参数batch_size,memory_len,target_len用于初始化记忆单一,代表最大尺寸,实际属于可以小于对应数值。如果in_train_phase是True会返回一个用于训练语言模型的模型,否则返回一个用于fine-tuning的模型。
xlnet版情感分类任务:https://github.com/haoyijiang/Keras_xlnet_classification
网友评论