此次写文原本想把从Transformer-XL到XLNet讲一下,可是本身还没看,先写一下XLNet的部分,Transformer-XL明天补上~网络
2018年10月的时候,谷歌放出了称霸GLUE榜单的BERT模型,当时BERT最大的创新就是提出了Masked Language Model做为预训练任务,解决了GPT不能双向编码、ELMo不能深度双向编码的问题。以后从那天起,不少任务都再也不须要复杂的网络结构,也不须要大量的标注数据,业界学术界都基于BERT作了不少事情。函数
昨天,也就是2019年6月19日,谷歌又放出了一个模型XLNet,找到并解决了BERT的缺点,刷爆了BERT以前的成绩(固然数据、算力相比去年都增长了不少)。惊醒你们不要总被牵着走,创新总会从某个缝里钻出来。学习
首先介绍两种无监督目标函数:优化
AR是之前经常使用的方法,但缺点是不能进行双向的编码。所以BERT采用了AE,获取到序列全局的信息。但本文做者指出了BERT采用AE方法带来的两个问题:编码
以上就是BERT采用AE方法存在的痛点,接下来请看XLNet如何解决这些问题。spa
与其说XLNet解决了BERT的问题,不如说它基于AR采用了一种新的方法实现双向编码,由于AR方法不存在上述两个痛点。3d
XLNet的创新点是Permutation Language Modeling,以下图:orm
对于长度为T的序列x,存在T!种排列方法,若是把 从新排列成
,再采用AR为目标函数,则优化的似然为
cdn
由于对于不一样的排列方式,模型参数是共享的,因此模型最终能够学习到如何汇集全部位置的信息。blog
因为计算复杂度的限制,不可能计算全部的序列排列,所以对于每一个序列输入只采样一个排列方式。并且在实际训练时,不会打乱序列,而是经过mask矩阵实现permutation。做者特地强调,这样能够保持与finetune输入顺序的一致,不会存在pretrain-finetune差别。
解决了核心问题,接下来就是实现的细节问题了。其实上面打乱顺序后有一个很大的问题,就是在预测第三个x的时候模型预测的是 ,若是把排列方式换成
,则应该预测
,但模型是不知道当前要预测的是哪个,所以输出的值是同样的,即
,这就不对了。因此说要加入位置信息,即
和
,让模型知道目前是预测哪一个位置的token。
那下一个问题又来了,传统的attention只带有token编码,位置信息都在编码里了,而AR目标是不容许模型看到当前token编码的,所以要把position embedding拆出来。怎么拆呢?做者就提出了Two-Stream Self-Attention。
Query stream:只能看到当前的位置信息,不能看到当前token的编码
Content stream:传统self-attention,像GPT同样对当前token进行编码
预训练阶段最终预测只使用query stream,由于content stream已经见过当前token了。在精调阶段使用content stream,又回到了传统的self-attention结构。
下面的图起码看3遍~看懂为止,图比我讲的明白。。
另外,由于不像MLM只用预测部分token,还须要计算permutation,XLNet的计算量更大了,所以做者提出了partial prediction进行简化,即只预测后面1/K个token。
为了学习到更长距离的信息,做者沿用了本身的Transformer-XL。
(太困了。。明天继续好很差)