<code>XLNet是google和cmu联合发表的一篇论文,是预训练模型的一种。
预训练模型越来越大,越来越多,这篇博客详细讲述一下xlnet到底是什么/<code>
二、XLNET的建模思想
xlnet是19年6月份google和cmu联合发表的一篇论文,这篇论文的主要贡献是提出一种新的预训练方法,在多个公开数据集中取得SOAT。
首先我们可以简单的理解XLnet = ELMO + BERT。这个公式的意思是xlnet综合了ELMO和BERT的训练思想。ELMO的优点主要是没有像bert一样随机mask一些单词,丢失了信息。BERT相比了ELMO考虑了全局信息,因为它是根据所有没有mask掉的单词进行预测。
XLNET的思想: 首先我们假设一个句子有四个单词,标为1、2、3、4。XLNET做的事情是第一步,先求所有的全排列,有4!种。然后训练的过程中随机抽出一个全排列比如3 2 4 1。第二步对这个全排列用语言模型的思想(ELMO思路)进行预测,也就是用 3 预测2,用3 2 预测4,用3 2 4 预测1。
但是第二步为什么这么做呢?对所有的全排列都这么做,相当于求解了一个期望,比如同样一个单词2。在不同的排列中预测方法不一样,但是平均起来,相当于考虑了2的上下文。
这种思想用图解如下:
三、XLNET的实现
第二小节讲的只是xlnet的设计思想,但是这种思想具体怎么实现的呢?
一种直观的实现:
对于全排列的一个采样比如:3 2 4 1,对于单词4 可以用transformer 采用固定长度,比如10,然后对3 2 进行编码,其他位置用mask。预测目标为4
但是这样有一个问题,就是当序列为3 2 1 4的时候,3 2 预测却又是1。这就有问题了,问题的本质是没有模型预测的时候没有预测单词的位置信息。如果加入位置信息,不就唯一确定了吗?
xlnet的实现:
xlnet使用双流注意力机制来解决这个问题,说白了就是两个self-attention。一个注意力包含位置信息,文中称为Query Stream。另一个注意力包含文本的信息称为context stream。
如图用w表示词的位置信息,每个位置都初始化一个这样的可训练的变量(相当于position embedding),然后当做输入输入到transformer-xl中。用g表示,上标表示层,下标表示第i个单词。
对于每个位置展开:
对于context stream。使用包含当前词的上下文,用h表示,比如下面图中的位置3,它就只包含3的信息。位置4会包含3 2 4的信息。
当看完这些,可以回头再看看Query stream是怎么计算的,可以看看图的连线,每个gi只包含一个位置w(图中虚线)和小于t时刻的上下文。
上面图中表示的例子可以用下面公式表示:
然后g的最后一层可以用来计算下面的式子,也就是用query stream的最后输出表示
然后套用自回归的计算公式(语言模型),公式如下:
我从事算法工程师多年,目前主要研究和兴趣点在机器学习、深度学习、自然语言处理。我会持续分享自然语言处理工程师必备的相关技术,感兴趣的朋友可以关注我,相信一定会有所收获。
如果有计算机学习、自然语言处理相关的问题或者考研、学习方法等方面的问题,可以在评论区留言,或者私信我,谢谢大家!
閱讀更多 代碼人老周 的文章