三、Transformer XL

  1. Transformer解决的核心问题是:如何将任意长度的文本序列编码成一个固定维度的隐向量。

    • 假设有无限的内存和算力,一个简单的方法是:取语料库中最长序列的长度,然后把所有较短的序列填充到最大长度作为输入。但是由于内存和算力的限制,这种方式不现实。

    • 一个可行的方案是:将整个语料库分割成固定大小的、较短的片段segment ,然后用每个片段来训练模型,而忽略之前所有片段的信息。

      这种模型称作 vanilla model,这也是 Transformer 的做法。

      三、Transformer XL - 图1

  2. vanilla model 没有任何跨 segment 的信息流,这会带来两个问题:

    • 模型能够捕获的最大依赖的长度不超过 segment 的大小。

      假设 segment 的长度为 三、Transformer XL - 图2 ,则模型无法捕获长度超过 三、Transformer XL - 图3 的依赖性。

    • 划分 segment 的时候未考虑句子边界或者短语的边界,这破坏了语义完整性。因此模型缺乏必要的上下文信息来预测 segment 的开头的前几个 token 和结束的尾部几个 token 。这会导致低效的优化效率和更差的泛化能力。

      这个问题称作上下文碎片化 context fragmentation 问题。

  3. vanilla model 不仅在训练期间遇到问题,在推断期间也会遇到问题。

    Transformer 在推断期间反复执行推断过程,每次推断都根据前几轮输入结果和输入来预测下一个输出结果。

    • 推断期间,模型也采取与训练期相同的segment 大小,因此也会遇到上下文碎片化问题。
    • 每个新的 segment 的计算需要从头开始重新计算,计算速度较慢。

    三、Transformer XL - 图4

  4. Transformer XL 通过引入递归机制和相对位置编码来解决上述问题。

    • 能够学到的最长依赖性的长度:Transformer XLRNN 长 80%,比Transformer 长 450%。
    • 推断速度:Transformer XLTransformer 快 1800 多倍。

3.1 Segment-level 递归

  1. 为解决固定长度上下文的局限性,Transformer XL 引入了 Segment-level 递归机制。

    • 训练期间:Transformer XL 缓存前一个 segment 计算得到的隐状态序列,然后在下一个 segment 中重用。

      这种额外的输入使得网络能够利用历史中的有效信息,从而能够对长期依赖建模,并且避免了上下文碎片化。

      • 在对语料库进行分割来生成样本之后, Transformer XL 要求对样本不能进行混洗。因为一旦混洗就会破坏 segment 的先后顺序。

      • 由于需要考虑 segment 之间的先后关系,因此训练期间要将连续的一组 segment 分别放置在连续的一组 batchment 中。

        这样可以在尽可能满足 segment 先后关系的条件下提高数据并行度。

      三、Transformer XL - 图5

    • 推断期间:Transformer XL 缓存前一个 segment 计算得到的隐状态序列,使得后续需要用到这些隐状态时直接使用而不必重新计算,加快了推断速度。

      实验表明,Transformer XL 的推断速度是传统 Transformer 的 1800 倍。

      三、Transformer XL - 图6

  2. segment 长度为 三、Transformer XL - 图7 ,第 三、Transformer XL - 图8segment 的输入为 token 序列:三、Transformer XL - 图9 ;第 三、Transformer XL - 图10segment 的输入为:三、Transformer XL - 图11

    假设网络有 三、Transformer XL - 图12 层,第 三、Transformer XL - 图13 层网络每个位置的输出隐状态分别为 (三、Transformer XL - 图14):

    三、Transformer XL - 图15

    其中 三、Transformer XL - 图16三、Transformer XL - 图17 维列向量。令:

    三、Transformer XL - 图18

    考虑 Segment-level 递归机制,则 三、Transformer XL - 图19 的第 三、Transformer XL - 图20 层各位置的隐向量为:

    • 拼接 三、Transformer XL - 图21 的第 三、Transformer XL - 图22 层的隐向量序列 和 三、Transformer XL - 图23 的第 三、Transformer XL - 图24 层的隐向量序列:

      三、Transformer XL - 图25

      其中 SG 表示冻结参数(不用计算梯度),concate 表示沿位置拼接:

      三、Transformer XL - 图26

    • 计算 query,key,value 向量:

      三、Transformer XL - 图27

      其中 三、Transformer XL - 图28 分别为 query,key,value 转换矩阵。

    • 计算 三、Transformer XL - 图29

      三、Transformer XL - 图30

      其中 Transformer-Layer 为常规的 Transformer 层。

  3. 与标准 Transformer 不同,这里计算 key 向量和 value 向量时使用了扩展上下文,其中 三、Transformer XL - 图31 缓存了前一个 segment 的状态。

    这种在前后两个 segment 之间共享状态的方式构成了 segment-level 的递归,因此上下文信息可以跨 segment 流动。

  4. 三、Transformer XL - 图32 是在 三、Transformer XL - 图33 中被使用的,这不仅跨了一个段,也垮了一层。这显著的区别于其它的 RNN 语言模型。

    正因为如此, Transformer XL 最大依赖长度扩展到了 三、Transformer XL - 图34

    下图中,每个位置的 context 都是它左下方的4个位置。

    三、Transformer XL - 图35

  5. Transformer XL 的训练方式类似于 BPTT,但是与 BPTT 不同的是:Transformer XL 缓存了上一个 segment 的多组隐向量。

    理论上不仅可以缓存前一个 segment ,也可以缓存前面 三、Transformer XL - 图36segment

3.2 相对位置编码

  1. 采用 segment-level 递归机制之后存在一个问题:如何保持位置信息的一致性。

    令:

    • segment 长度为 三、Transformer XL - 图37
    • 三、Transformer XL - 图38segment 的输入为 token 序列:三、Transformer XL - 图39 ,对应的 token embedding 矩阵为 三、Transformer XL - 图40
    • 三、Transformer XL - 图41segment 的输入为:三、Transformer XL - 图42 , 对应的 token embedding 矩阵为 三、Transformer XL - 图43
    • position embedding矩阵为 三、Transformer XL - 图44

    则有:

    三、Transformer XL - 图45

    可见 三、Transformer XL - 图46三、Transformer XL - 图47 都采用了同样的位置编码,因此模型没有任何信息来区分一个token 是位于 segment 三、Transformer XL - 图48 还是 segment 三、Transformer XL - 图49

  2. 令:

    • 三、Transformer XL - 图50 为第 三、Transformer XL - 图51 个位置的 tokenembedding (对应于 token embedding 矩阵 三、Transformer XL - 图52 的第 三、Transformer XL - 图53 行 )
    • 三、Transformer XL - 图54 为第 三、Transformer XL - 图55 个位置的 position embedding (对应于 position embedding 矩阵 三、Transformer XL - 图56 的第 三、Transformer XL - 图57 行 )
    • 三、Transformer XL - 图58 为第 三、Transformer XL - 图59 个位置的 token + position embedding
    • 三、Transformer XL - 图60 分别为 query, key, value 向量

    Transformerattention score (不考虑 softmax 归一化,以及除以 三、Transformer XL - 图61)为:

    三、Transformer XL - 图62

    它表示 query ikey j 的相关性。

    • 第一项刻画了位置 三、Transformer XL - 图63token 和位置 三、Transformer XL - 图64token 的相关性。
    • 第二项刻画了位置 三、Transformer XL - 图65token 和位置 三、Transformer XL - 图66position 的相关性。
    • 第三项刻画了位置 三、Transformer XL - 图67position 和位置 三、Transformer XL - 图68token 的相关性。
    • 第四项刻画了位置 三、Transformer XL - 图69position 和位置 三、Transformer XL - 图70position 的相关性。
  3. Transformer XL 引入相对位置编码。位置 三、Transformer XL - 图71 相对于位置 三、Transformer XL - 图72 的距离为 三、Transformer XL - 图73,则位置 三、Transformer XL - 图74 相对于位置 三、Transformer XL - 图75relative position embedding 为:

    三、Transformer XL - 图76

    三、Transformer XL - 图77Transformer XL 中使用的最大相对距离,令相对位置编码矩阵为:

    三、Transformer XL - 图78

    Transformer XL 修改 attention score 为:

    三、Transformer XL - 图79

    • 将第二、四项中的绝对位置编码 三、Transformer XL - 图80 修改为相对位置编码 三、Transformer XL - 图81 。其中的相对位置是: key 相对于 query 的位置。
    • 通过参数 三、Transformer XL - 图82 来代替 三、Transformer XL - 图83 。这表示对于位置 三、Transformer XL - 图84key token,同一个 query 在不同位置上无影响。因为这种影响被剥离到第二项中。
    • 通过参数 三、Transformer XL - 图85 来代替 三、Transformer XL - 图86 。这表示对 key 相对于 value 的相对位置 三、Transformer XL - 图87 ,同一个 query 在不同位置上无影响。因为这种影响被剥离到第二项中。
    • 通过 三、Transformer XL - 图88三、Transformer XL - 图89 来生成不同的 key 向量。

    修改后的attention score 各项的意义为:

    • 第一项刻画了基于内容的 attention
    • 第二项刻画了内容相对于每个相对位置的 bias
    • 第三项刻画了内容的全局的 bias
    • 第四项刻画了位置的全局 bias

3.3 实验结果

  1. Transformer XL 验证了 word-level 语言模型(以困惑度 PPL 为指标),以及 char-level 语言模型(以 bpc:Bit per Character 为指标) 。其中包含以下数据集:

    • WikiText-103 数据集:最大的word-level 语言模型 benchmark,包含 2.8万篇文章总计103M 训练 token ,平均每篇文章 3.6K token 。

      • 由于文章的平均 token 数量较大,因此这会考验模型的长期依赖建模能力。

      • 训练期间 attention length = 384,推断期间 attention length = 1600

        attention length 也等于 segment 长度

      三、Transformer XL - 图90

    • enwik8 数据集:包含 100M 字节的未经处理的 wiki 文本。

      结果表明:12层的 Transformer XL 的表现超过了 12层的 Transformer

      三、Transformer XL - 图91

    • text8 数据集:包含 100M 字节的、经过处理的 wiki 文本。处理方式为:大写字母改小写、移除 a~z 之外的所有字符。

      三、Transformer XL - 图92

    • One Billion Word 数据集:数据集的句子已经被混洗过,因此该数据集无法验证序列的长期依赖。因而该数据集用于测试模型的短期依赖。

      结果表明: Transformer XL 对短期依赖的建模效果也非常好。

      三、Transformer XL - 图93

    • Penn Treebank 数据集:包含 1M token,用于验证模型在小数据集上的表现。

      结果表明: transformer XL 在小数据集上效果也非常好。

      三、Transformer XL - 图94

  2. WikiText-103 数据集上验证 segment-level 递归、相对位置编码的作用,验证结果如下。其中:

    • 结果划分为三个部分,分别为 128M 参数的 Transformer-XL128M 参数的 Transformer151M 参数的 Transformer-XL

    • 最后四列的意义:

      • PPL init 表示推断期间使用与训练时相同的 attention length
      • PPL best 表示推断期间使用最佳长度的attention length (通过超参数搜索得到)
      • Attn Len 给出了推断期间使用的最佳attention length
      • Full Loss/ Half Loss 表示计算当前 segment 中所有位置的损失,还是计算后一半位置的损失

    结果表明:

    • 相对位置编码非常重要对于 Transformer XL 非常重要,而绝对位置编码只有在 Half Loss 中工作良好。

      因为 Half Loss 只考虑当前 segment 后一半位置的损失,因此受到前一个 segment 的绝对位置编码的影响比较小。

    • 随着 attention length 的增加,模型的困惑度下降。

    • 尽管每个 segment 训练期间的长度是 128,但推断期间可以推广到 640 。

    三、Transformer XL - 图95

    此外,由于 Transformer XL 采取了缓存前一个 segment 的状态的策略,因此会消耗更多的内存。下图给出在相同 GPU 内存的约束条件下的比较结果。

    结果表明:即使 Transformer XL 由于内存约束而不得不使用一个较小的 backprop len ,其最终效果仍然超越 Transformer

    三、Transformer XL - 图96

  3. 为了证明 Transformer XL 能够解决上下文碎片问题,作者在 One Billion Word 数据集上做了实验。

    因为该数据集的句子经过混洗,导致不需要对长期依赖建模。因此效果的提升一定是由于模型能够解决上下文碎片,而不是由于模型捕捉到更长的上下文。

    三、Transformer XL - 图97