论文链接:https://arxiv.org/pdf/1906.08237.pdf
导读
自然语言处理中,无监督学习通常分为自回归任务和自编码任务,自回归任务是从左到右预测一个可能的单词,自编码任务是已知上下文,去预测被MASK掉的单词,例如Bert就是一个非常经典的自编码任务。但是自编码任务被人诟病的缺点就是预训练和Finetune阶段看到的信息是不一样的,忽视了原文本和上下文之间的互相影响的关系。基于以上分析,本文提出了XLNet, 平衡了自编码任务和自回归任务的优缺点的自回归任务并且在多个数据集上也超过了Bert。并且我们还有一个惊人的发现——NSP(Next Sentence Prediction)对于XLNet的效果提升并无太大影响。这是为什么呢?我们一起来康康吧~
背景
在自然语言处理中,无监督学习通常是在大规模数据集上进行预训练然后在下游任务中进行微调,这些任务通常分为两种类型自回归任务(Autoregressive)和自编码任务(AutoEncoding)。
自回归任务(AR) 是根据上下文内容预测下一个可能的单词,但是这个上下文仅限于一个方向,前向或者后向,不能同时利用上下文的信息。GPT就是典型的AR语言模型,AR语言模型的优点是擅长生成式的自然语言处理任务 ,比如机器翻译,文本摘要等,因为在生成文本的时候就是从左向右的。
自编码任务(AE) 是根据毁坏的数据重建原始数据,Bert就是非常典型的AE语言模型,AE模型可以看到上下文信息,所以AE模型的优点是可以比较好的融入上下文 ,但是由于在预训练中会引入[MASK]预训练和Finetune阶段看到的信息是不一样的。而且Bert是根据没有被MASK掉的角色去预测MASK的角色,这表示Bert认为Mask的角色和其他角色是互相独立的,那么这样也忽视了原文本和上下文之间的互相影响的关系。
分析了AR任务和AE任务的优缺点,本文提出了XLNet,这是一种平衡了自编码任务和自回归任务的优缺点的自回归任务。XLNet求了句子的所有可能的因式分解的最大似然函数,这样可以保证每一个位置的Token可以学习到上下文的信息。同时作为AR任务,XLNet天然具有AE任务不具有的优点:预训练的语料和Finetune语料一致。
XLNET
1. 排列语言模型
为了解决上述问题,作者提出排列语言模型拥有AR模型的优点同时可以捕捉到文本的上下文信息。具体是怎么做到呢?对于一个序列长度为T的文本序列x来说,有T!中排列方式,如果每种排列方式之间参数共享,那么我们只需要最大化所有可能的因式分解顺序的期望函数即可。 以下图为例,对于序列[1,2,3,4]有24种排列方式,那么下图中四种排列方式的,该序列的期望函数分别是:
其余排列以此类推,如果我们能够学习到T!中排列方式的话,那么假如我们需要预测p(x_3),通过排列我们可以学习到他的上下文的知识,同时是不需要[MASK]掉这个地址的。 不过需要注意的是我们这里所说的排列只是针对因式分解的排列,文本还是保持自然的语序。
2. 基于目标感知的双流注意力模型
- 位置信息的引入
排列语言模型具有我们上述的优点,但是传统的transformer可能会遇到问题。对于传统Transformer来说,对于位置为x的概率为:,其中表示文本序列中在之前的序列,例如"我爱北京天安门"要预测安的话,那么“我爱北京天”。
但是问题是,当我们对文本序列进行排列组合之后,模型无法知道当前文本在原始序列中的位置。 例如“我爱北京天安门”和“我爱北京天门安”第六个字的概率为:
从感官上这两个概率是不相等的,但是对比这两个公式会发现,这两个公式的概率是相等的。为什么会出现这样的情况呢?上面问题的关键是模型无法知道当前mask掉的文本在原始序列中的位置。在Transformer中输入的embedding会加入position embedding,输入已经带入了位置信息,但是我们重新排列之后模型无法预测当前位置在原始序列中的位置,因此我们需要让模型来预测当前文本的位置。 那么在模型中当前位置的文本的概率计算方式则如下所示,其中不仅需要输入当前位置之前的文本,还需要输入他们在原始文本中的位置。
- 双流self-attention
引入了原始文本中的位置信息之后,我们需要注意以下两点:
- 预测目标为时的输入只有位置信息没有内容信息
- 预测目标为且j>t时,的输入信息需要包含位置信息和内容信息以确保模型可以得到完整的上下文。
预测不同的位置,我们需要给模型有不同的感知野,因此,文中提出双流self-attention:
- 内容表征单元(Context Representation):内容表征单元和我们上文中说的Transformer一致,可以看到上下文的信息和当前的Token,例如文本序列[1,2,3,4],在第4个位置,内容表征单元可以看到[1,2,3,4],在第3个位置内容表征单元可以看到[1,2,3]。如下图所示QKV矩阵的计算都包含了当前位置。
- 查询表征单元(Query Representation):查询表征单元和我们上述需要注意的点相同,可以看到上下文的信息和当前位置,不可以看到当前的Token,例如[1,2,3,4]在第4个位置只能看到[1,2,3]。查询表征单元中矩阵Q由于计算了各个位置的信息,保留了当前位置,但是KV矩阵分别表示各个context的重要性,没有计算当前位置。
说到这里相信大家还是非常懵逼,能看到和不能看到有区别吗?这就要说说我们上文中排列语言模型的厉害之处了。上文中,通过排列语言模型,我们可以得到文本序列的所有排列方式。例如“天气晴朗”我们有24中排列方式。但是虽然排列方式不同,每种排列方式中,每个字他们在原始文本中的顺序保持不变。
例如“天气晴朗”的排列方式是[1,2,3,4],那么“晴气郎天”的排列方式就是[3,2,4,1]。那么通过后一种排列方式第一个位置“天”可以看到[3,2,4,1]的位置,那么他的感受野就是[3,2,4,1],第二个位置“气”可以看到[3,2]那么他的感受野就是[3,2]。以此类推,通过排列组合,这句话不同的位置可以感受的信息的矩阵如下所示,通过排列组合,我们可以获得上下文信息变多了,这也解决了传统AR任务中无法获取上下文的问题!
对查询表征单元来说,他不能看到自己,因此,他可以感受的信息矩阵如下所示:
最后模型的结构如下所示,我们将两种表征单元的信息矩阵输入Two-stream attention模型。输入是一句话“天气晴朗”,输出还是这句话。但是在训练的过程中,因为排列组合,模型可以得到文本的上下文信息,但是有保证了从右到左的预测顺序。XLNet巧妙地结合了AR和AE任务的特点。
- 部分预测
一般LM模型是从第一个Token预测到最后一个Token的,在排列语言模型中,没有上下文可能会对分布产生误导,从而降低模型的收敛速度。因此XLNet采用使用前面的Token预测后面的Token的方式。 如下图所示一串长度为L的文本,我们将它分成K段,使用前面的Token去预测最后一段Token,当K越大,模型获取的上下文越多,预测的结果也越准确。
3. 集成Transformer-XL
文中还结合了Transformer-XL中比较重要的两种思想相对位置编码和循环机制,有关Transformer-XL大家可以参考我们上一篇文章Transformer-XL论文导读-RNN+Transformer,NLP里最流行的都在这里辣。那么文中是如何引入Transformer-XL中的这些特点呢,下面我们分别为大家介绍:
- 循环机制
Transformer-XL中的循环机制如下图所示,第t+1个segment处计算Token之间的相关性也考虑到了上一个segment的信息,当前segment可以接收到上一个segment的信息。 本文在计算当前Segment的隐藏状态是,Attention中的KV矩阵也用到了上一个segment的隐藏状态:
- 建模多个segment
许多下游任务的输入会包含多个segment例如知识问答中的输入可能是问题和包含答案的段落,对于这类任务,文中采用和BERT相同的做法,对两个segment进行拼接,有50%的概率是不连续的语句。输入格式和Bert相同[CLA,A,SEP,B,SEP],SEP和CLS是特殊字符,AB是两个segment。但是需要注意的是文中并没有做NSP(Next Sentence Prediction)任务,而是将两个segment看成是一句话,预测后1/K个token,原因是通过实验分析这个Task加进去后并不是总有帮助。
- 相对位置编码
文中对位置编码的处理同样也采用了相对位置编码,但是这里和Transformer-XL不同之处在于XLNet只关注Token是否在同一个segment内,不关注他们的相对位置。 如果两个Token i,j在同一个Segment内那么否则,,需要注意这两个参数都是可以训练的。
3. 和Bert的区别
Bert和XLNet同样都是使用部分Token去预测其他Token,XLNet和Bert的区别就是通过排列语言模型XLNet可以知道文本的上下文,而Bert无法获取更多信息。例如对于文本[New York is a city],New York被mask掉,那么对于Bert来说,预测New York的概率为: 而如果XLNet采样到了[is a city New York]的排列的话,那么XLNet预测的概率为:
实验结果
文中的数据集和Bert相同,采用了BooksCorpus,部分English Wikipedia大小13G,Giga5,ClueWeb,Common Crawl对于ClueWeb和Common Crawl作者简单的过滤了太短的和质量比较低的文本,大小分别是19GB和110GB。对于XLNet-Large作者在512 TPU v3上训练了5.5天。
下面我们先看一下XLNet和Bert的对比。需要注意的是,XLNet-large采用和BERT-large相同的结构,因此,两者的规模应该是相同的。可以看到在各个数据集上XLNet都有1~2个点的胜出。
XLNet-large采用和BERT-large相同的结构,因此,两者的规模应该是相同的作者同样和RoBerta进行了对比,在RACE数据集上也超过了RoBerta的效果,其他数据集我们在此不在列举,大家可以去阅读论文~哈哈哈
1. 影响效果的因素分析
作者对XLNet做了很多改进,为了研究这些改进对效果的贡献,作者做了一下实验,主要是为了分析:
- 排序语言模型的影响
- Transformer-XL对模型效果的影响
- 其他的改进例如NSP(next-sentence prediction)任务,双向pipeline(bidirectional input pipeline)和span-based prediction的效果
实验结果如下,可以看出排列语言模型和transfomer-xl对效果的影响很大。而且NSP任务对效果的影响倒是几乎没有,这也是上文中我们没有用NSP任务的原因。
结论与思考
以上就是XLNet的论文阅读啦,真的和Transformer-XL一样难懂(捂脸)。艰难的看完之后,被排列语言模型深深地震撼到,而且文中也花了大把的篇幅去介绍这个设计的巧妙之处。在保留AR任务的序列性同时,又让模型学习到了更多地信息,看到这里的时候真的忍不住要叫出声来,真的太精巧了。但是排列的比较多,那么也意味着计算量的增多,BERT-Large 用 64 TPU chips 训了4天,XLNet-Large用512 v3 TPU训练了5.5天,感觉隐隐的变成了“拼爹”活动?不管怎么样作为Bert之后一个比较亮眼的创新,XLNet还是值得我们去仔细研究哒~
来源:oschina
链接:https://my.oschina.net/u/4373067/blog/4476706