赞
踩
最近想增加一下自己的知识宽度,所以在了解各种模型的原理,想在了解之后,对他们进行总结归纳,加宽见识的同时可以让自己有更多灵感
XLnet是Auto-regressive model (自回归语言模型):
transformers有一段对它的常用范围的描述是这样的:
Note that this model is primarily aimed at being fine-tuned on tasks that use the whole sentence (potentially masked) to make decisions, such as sequence classification, token classification or question answering. For tasks such as text generation, you should look at models like GPT2.
他作为一个自回归模型,但是却有着自编码模型的特点,能很好的理解语义信息,在模型设计的原本意图里,是想让他作为一个全能模型的,但是实际上,它还是更多的起到一个改进型bert的作用。
In light of these pros and cons, we propose XLNet, a generalized autoregressive pretraining method that (1) enables learning bidirectional contexts by maximizing the expected likelihood over all permutations of the factorization order and (2) overcomes the limitations of BERT thanks to its autoregressive formulation. Furthermore, XLNet integrates ideas from Transformer-XL, the state-of-the-art autoregressive model, into pretraining.
Tips:
perm_mask
input.target_mapping
input.perm_mask
and target_mapping
inputs to control the attention span and outputs (see examples in examples/pytorch/text-generation/run_generation.py)以上是transformers里对XLnet的一些描述和提示
他的改进有一个PLM,目的是为了解决原来mask带来的问题,plm说白了就是把整个句子的词序打乱,然后预测最后两个句子,这样学到整个句子的信息。
他的那个双流注意力,就是在输入那里做了两个token相加,因为他是个自回归模型,还有PLM的训练模式,它本身就是像一个自回归一样,使用的是自身和自己前面的token信息。
原先我们熟悉的bert的那个token 是词本身的token加上位置信息,称之为内容信息流,这个也是双流注意力里面的一个,第二个叫位置信息流,简单理解一下就是,当前位置的token只要position embedding,后面就是正常的token,通过这种方式,可以解决PLM的问题,因为在PLM中,进行预测的时候,自己的token是不放进去的,而这种方法,可以在第一个流里面把自己的信息放进去,让信息不流失,又可以在第二个流严格按着PLM的掩码语言模型要求,让模型在预测的时候看不见自身的信息,只能看见位置。
transformer-XL解决的是bert不能兼容长文本问题,简单地说就是 之前是512截住,现在截住之后,是循环的一段段下去,把之前的信息放到后续的训练里,为了兼容,他就没有使用绝对位置编码 用了相对的。
因为这样没有解决MASK问题,所以还是在生成上不好用
以上是简单介绍,后续是一些更多的系列,首先,这网络叫XLnet 主要还是因为它使用了transformer-XL这个更新过的模型。他确实是一个自回归的模型,为什么叫他自回归呢,因为它使用了decoder,然后还是采用了生成式的任务去训练,就是通过前文去预测下文的方式(回归方式)去训练这个模型,所以它是一个自回归的模型。他那么做的初衷是认为用自编码方式去训练,类似于bert,会因为mask这个东西导致微调和训练出现偏差。所以它使用了自回归,但是使用自回归的问题在于,你没办法获得上下文的信息,因为你预测i位置的词的时候,你只能看到i前面的词信息,而不能去看到后面的,这就导致无法获得全局信息,而我们做完形填空这种任务的时候,很多时候是需要一个context信息的,那如何解决这个问题了,它的解决方式就是一个打乱的操作。
1,2,3,4模型去预测3的时候,正常的Auto-regressive模型是让1和2去预测3,如何得到4的信息呢?
将句子顺序进行重新的排列组合,例如可以得到3,2,4,1; 2,4,3,1; 1,4,2,3; 4,3,1,2。这样再去按照正常的Auto-regressive的思路进行预测就可以了。
思路很简单,但是实现的时候可不能打乱句子顺序去进行生成,因为在inference阶段,你喂入的都是正常顺序的语句,打乱训练正常顺序测试会导致训练和测试的不一致,会带来很大问题。所以,我们在训练的时候也是要喂入正常顺序的语句,但是要达到打乱(Permutation)的效果。
论文提出了Two-Stream Self-attention来达到这种效果。也就是双流注意力机制
这个双流机制我们暂且不谈,他是整个论文的重点,我们后面再说,除了双流注意力之外,还有其他的吗,有,一个是部分预测一个是段循环。
部分预测:也就是我做训练的时候,并不是从头把句子预测到位,因为优化过难难以收敛,他做的方式是只预测结尾的一部分,
这些预测位置如何选取呢,选当前排列的最后几个位置。举个例子,假如有 1234567,先随机挑一个排列,5427163,那么假设对最后两个位置预测,于是就需要依此对6和3进行预测。通过挑结尾的位置,在 AR 中,就能在预测时用到尽可能多的可知信息。
这里再谈一个有意思的点,挑选最后几个,那么到底该挑选几个呢,总得给个标准吧。于是作者这里设了一个超参数 K,K 等于总长度除以需要预测的个数。拿上面的例子,总长为 7 而需要预测为 2,于是 K = 7/2.
而论文中实验得出的最佳 K 值介于 6 和 7 (更好)之间,其实如果我们取 K 的倒数,然后转为百分比,就会发现最佳的比值介于 14.3% 到 16.7% 之间,还记得 BERT 论文的同学肯定就会开始觉得眼熟了。因为 BERT 里将 Token 遮掩成 “[MASK]” 的百分比就是 15%,正好介于它们之间,我想这并不只是偶然,肯定有更深层的联系。
段循环:一般的transformer会截断,例如截断512,这样导致了部分信息缺失,那咋办呢,段循环,在前一段计算完后,将它计算出的隐状态(hidden states)都保存下来,放入一个 Memory 中去,之后在当前分段计算时,将之前存下来的隐状态和当前段的隐状态拼起来作为 Attention 机制的 K 和 V,从而获得更长的上下文信息。
transformer-XL 双流注意力:
XLnet作者提出双流注意力就是为了解决前面说的那个问题,我做预训练的任务是自回归的,不停预测下文,但是自回归我没办法看见i前面的信息,我需要上下文信息,所以我把句子都打乱了,但是我其实并没有实际的把他的句子打乱,句子还是只有一条正常的输入,我只是通过一个矩阵,通过这个双流注意力,达到了打乱的效果。
论文中把Bert中的位置信息+内容信息的方式叫做 Content Stream, 论文自己提出了只有位置信息作为self-attention的query输入的流,被称作query stream。
其实就是使用Query来当做mask来使,让模型看不到预测词之后的词,只能根据这个词之前的词去进行预测这个词,这就是Query stream的用处。
和 BERT 一样,XLNet 同样是将目标词 "我 1" 替换成一个特殊字符 "MASK1"。和 BERT 不同,"MASK" 不会纳入表征的地址向量 k 以及内容向量 v 的计算,"MASK" 自始至终只充当了查询向量 q 的角色,因此所有词的表征中都不会拿到 "MASK" 的信息。这也杜绝了 "MASK" 的引入带来的预训练-微调差异 (Pretrain-Finetune Discrepancy)。
而且,它因为在训练的时候这样引入了位置信息,所以他不需要位置嵌入。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。