5.5 Transformer-XL与XLNet模型介绍
Transformer-XL模型¶
学习目标¶
- 掌握Transformer-XL模型的架构.
- 掌握Transformer-XL模型的优化点.
Transformer-XL模型架构¶
- Transformer-XL是Google和CMU于2019年共同推出的新一版模型. 主要针对BERT无法有效处理长序列的问题而做的针对性改进.
- << Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context >>
Vanilla Transformer¶
-
Transformer作为一种特征提取器, 自从2017年10月提出, 并在2018年10月BERT的加持下, 风靡整个NLP领域, 并于2020年底开始向CV领域蔓延.
-
但是Transformer需要对输入序列设置一个固定的sequence_length, 比如在BERT中是512. 如果文本序列的长度小于512, 可以方便的通过填充PAD的方式来解决. 但是如果文本序列的长度超过512, 处理起来就很麻烦了. 一种主流的方式是将超长文本划分为多个segments, 训练的时候对于每个segment单独处理, 段与段之间没有联系, 如下图所示:
- 上图的架构存在3个严重问题:
- 第一: 因为segments之间相互独立 所以不同的token之间, 最长的信息依赖就取决于segment本身的长度, 比如512就是上限.
- 第二: 出于效率的考虑, 在划分segments的时候, 不考虑句子的自然边界, 而是根据固定的长度来划分, 导致分割后的segments是断裂的, 不连续的, 语义上不完整的.
- 第三: 在预测的时候, 会对固定长度的segment做计算, 一般取最后一个位置的隐藏层向量作为输出. 为了充分利用上下文关系, 在每做完一次预测后, 就要对整个序列向右移动一个位置, 然后进行下一次计算, 如(b)所示, 导致计算效率非常低, 时间延迟很大.
Segment-Level Recurrence¶
- 为了解决上面的问题, Transformer-XL提出了一个重要的改进, 在对当前segment进行处理的时候, 缓存并利用上一个segment中所有layer的隐藏层向量, 而且上一个segment的所有隐藏层向量只参与前向计算, 不再进行反向传播, 这就是所谓的Segment-Level Recurrence.
- 模型的训练和预测如下图所示:
-
在当前segment中, 第n层的每个隐藏层向量的计算, 都是利用下一层中包括当前位置在内的, 连续前L个长度的隐向量. 每一个位置的隐向量, 除了自己的位置, 都跟下一层中的前L-1个位置的token存在依赖关系, 并且每往下走一层, 依赖关系长度会增加L-1. 即如上图中Evaluation phase所示, 因此最长的依赖关系长度是N*(L-1), N是layer的数量.
-
N通常要比L小很多 比如BERT中, N=12 or 24, L=512, 依赖关系长度近似为O(N * L). 在对长文本进行计算的时候, 可以缓存上一个segment的隐藏层向量的结果, 避免重复计算, 大幅提高计算效率!
-
原始论文中, 在训练阶段只缓存1个segment, 在预测的时候缓存多个segments. 至于到底可以设置缓存多少segments, 取决于内存和显存的大小. 只要硬件能扛得住, 缓存的越多, 对于训练和预测时的加速越明显!
Relative Position Encodings¶
- 我们先回顾一下经典Transformer中的绝对位置编码:
- 上图已经很明确的指出了经典Transformer的一大缺陷: 对于长文本来说, 划分后的segment, 无论token处于第几个片段, 它只要待在第i个位置, 那么该token的位置编码就是一样的, 与该token再原始长文本中的相对位置是没有关系的!
- 比如对于序列there are dinners and dinners:
- RNN: 对于RNN模型来说, 两个dinners接收到的信息是不同的, 第一个dinners接收到的是"there are"编码后的信息, 第二个dinners接收到的是"there are dinners and"编码后的信息.
- transformer: 对于transformer模型来说, 在没有位置编码的情况下, 两个dinners的输入信息完全一致.
- 最先介绍相对位置编码的是论文《 self-attention with relative positional representation 》(简称RPR), RPR提出的模型的原理是在计算第i个元素与第j个元素之间的attention的值和权值的时候加入i与j之间的距离编码, 因为加入的是i与j之间的相对位置关系, 因此叫做相对位置编码.
- 例如对于一个长度为5的序列, 它共有9个相对位置编码信息(当前位置, 前面4个, 后面4个), 如下表展示:
- 按照上表的计算规则, 我们可以知道对于序列"there are dinners and dinners"中, 第一个dinners所拥有的位置编码信息是[-2, -2, -2, -1, 0, 1, 2, 2, 2], 第二个dinners所拥有的位置编码信息是[-4, -3, -2, -1, 0, 0, 0, 0, 0].
Transformer-XL模型的优化点¶
-
Segment-Level Recurrence (片段递归)
-
解决超长文本信息碎片问题, 最直观的解决方案就是在训练期间, 为前一个segment计算的representation被修复并缓存, 以便在模型处理的下一个新的segment时作为扩展上下文重新利用. 这个连接方案将最大可能的依赖关系长度增加了N倍, N表示网络的深度, 因为上下文信息可以跨segment边界流动了!
-
Relative Position Encodings (相对位置编码)
-
Transformer-XL模型的出发点是为了解决长序列问题, 最直接的优化时对上一个segment做了缓存, 来供当前segment使用. 但由此又引入了绝对位置编码的弊端. 为了解决此弊端, 又相当于在模型上打了补丁, 进一步优化从而引入了相对位置编码.
- 模型架构汇总, Transformer-XL主要的优化提升有3点:
- 1: 捕获长期依赖的能力. (可以轻松超越BERT的512限制)
- 2: 解决了上下文碎片的问题. (context segmentation problem)
- 3: 提升了模型的预测速度和准确率.
- 实验结果汇总, Transformer-XL主要的优化提升有4点:
- 1: 在各种主要的语言建模(LM)基准测试中获得新的最优(SoTA)结果, 包括长序列和短序列上的字符级和单词级任务.
- 2: Transformer-XL学习的依赖关系比RNN长约80%, 比vanilla Transformers模型长450%, 尽管后者在性能上比RNN好, 但由于固定长度上下文的限制, 对于建模长期依赖关系并不是最好的.
- 3: 由于不需要重复计算, Transformer-XL在语言建模任务的评估期间比vanilla Transformer快1800+倍.
- 4: 由于建模长期依赖关系的能力, Transformer-XL在长序列上具有更好的困惑度(Perplexity, 预测样本方面更准确).
XLNet模型¶
学习目标¶
- 掌握XLNet模型的架构.
- 掌握XLNet模型的优化点.
-
XLNet相比于BERT, 在问答对话, 文本分类, 阅读理解等多项NLP任务上都得到了大幅提升, 再次刷新了AI研究者的认知边界.
-
关于语言模型的汇总:
- 1: AE模型(Auto Encoder LM), 经典代表为BERT.
- 2: AR模型(Auto Regression LM), 经典代表为GPT2.
- 3: 排列模型(Permutation LM), 经典代表为XLNet.
XLNet模型的架构¶
- 无论是AE模型还是AR模型, 都有自身难以克服的"硬伤".
- AE模型: 比如BERT采用随机MASK的方式舍掉一些单词, 利用模型的能力还原这些单词. 但是由于在预训练阶段接入了[MASK]标记, 导致了预训练和微调阶段的不一致, 也就是exposure bias问题. 另一方面, BERT模型有一个假设并不符合实际情况, 即假设所有的[MASK]之间是相互独立的. 例如, 对于"自然语言理解"这段文本, 假设BERT的输入是"自然语言[MASK][MASK]", 那么BERT模型的优化目标是P(处|自然语言) * P(理|自然语言), 反过来对于传统语言模型, 优化目标是P(处|自然语言) * P(理|自然语言处), 可以很清晰的看出BERT忽略的了[MASK]之间的相关性.
- AR模型: 比如GPT2模型, 最大的问题是只能看到前面的信息, 无法利用后面的信息.
- 出发点是既希望集合AE, AR模型的优点, 又能避免各自的缺点, 因而提出了XLNet模型! XLNet在实现双向Transformer编码的同时, 还能够避免BERT所产生的问题.
Permutation Language Modeling¶
- XLNet基于AR模型, 采用了一种全新的方法Permutation Language Model, 基本模式采用从左向右的输入, 也就是自回归的模式, 只能看到上文信息. XLNet将完整句子中的单词随机打乱顺序, 这样的话对于单词x_i, 它原先的上下文单词就都有可能出现在当前的上文中了.
- 如下图所示, 对于单词x3, 改变原始语句中x1, x2, x3, x4的排列组合, 那么x3的上文中就有机会出现x4. 等于通过"排列的技巧将下文信息强制搬迁到上文中". 在实际微调中我们不能直接去改变原始的输入, 输入的顺序还应该是x1, x2, x3, x4, 所以单词顺序的改变是通过人为的手段让它发生在模型内部, 这时候就要用到神奇的attention mask机制, 通过mask的方式来改变单词的顺序.
Two-Stream Self-Attention¶
-
通过PLM改变了文本单词的顺序后, 模型又产生了新的问题, 那就是不知道要预测句子中的哪一个单词?
- 传统的AR模型中, 预测的永远是序列的下一个位置的单词, 因此不存在这个问题.
- 在XLNet中, 因为单词顺序被打乱, 无法根据上文知道要预测的是哪一个位置的单词.
-
比如: 对于句子[x1, x2, x3, x4], 打乱顺序后对第三个位置的单词进行预测, 得到的上文信息是[x2, x4], 但是我们无法知道这个所谓的"第三个位置的单词", 到底是x1, 还是x3.
- 打乱后的序列如果是[x2, x4, x1, x3], 那么第三个位置就是x1.
- 打乱后的序列如果是[x2, x4, x3, x1], 那么第三个位置就是x3.
-
通过上面的分析, 我们清楚了一个事实: 在XLNet中, 只知道上文信息是[x2, x4], 无法准确预测出下一个单词到底应该是谁? 由此XLNet引入了非常有技巧性的方法Two-Stream Self-Attention机制, 完美的解决了这个问题.
-
预测时需要在输入上文信息[x2, x4]的基础上, 额外再输入预测目标的信息, 比如位置z3=1, 这样就可以确定预测的目标是x1了.
- Two-Stream Self-Attention的原理图如下所示:
-
Query Stream的目的是为了预测, 它用到的信息都是上下文信息, 没有涉及到任何关于预测单词内容本身的信息.
-
Content Stram的目的是为了Query提供完备的信息. 可以看做一个标准的Transformer特征提取器, 正好可以弥补Query Stream缺少单词xi的内容信息, 有助于Content Stream更好的提取出有关预测单词上下文的特征.
- 注意: XLNet对了排列在比较靠前位置的单词, 预测难度较大. 因此在构造训练阶段, XLNet只做部分预测, 只预测后1/K个单词, 可以加快模型的收敛速度!
-
Modeling Multiple Segments: 前面的两个最重要的优化都集中在token层面上, 但是NLP中还有一些下游任务是基于句子层面的, 比如BERT中的NSP, AlBERT中的SOP. XLNet论文作者也同意NSP任务没什么用, 因此提出了Relative Segment Encoding.
-
Relative Segment Encoding: 借鉴了Transformer-XL模型中的相对位置编码的思想, 只判断两个单词是否在同一个segment中, 而不去判断各自属于哪个segment.
XLNet模型的成绩¶
- 相比较于BERT模型, XLNet在阅读理解任务上有非常突出的表现.
- 相比较于BERT模型, XLNet在经典GLUE任务中的成绩也都有明显什么巨大的优势.
小节总结¶
-
本小节学习了XLNet模型的架构和模型细节.
- XLNet模型可以说是预训练模型中的一个集大成之作, 它通过Permutation Language Modeling巧妙地将LM与BERT模型, GPT2模型中各自的优点结合了起来, 再加上引入的Transformer-XL和relative segment encoding等先进技术, 使得XLNet在模型表现上更上一层楼.
- 特别是对于BERT表现欠佳的生成式任务, XLNet的表现会更加突出.
-
关于常见的预训练模型, 可以直接到https://huggingface.co/models网站下载, 非常方便.