©PaperWeekly 原创 · 作者|李明晓
学校|鲁汶大学博士生
研究方向|自然语言处理
自 2017 年 Google 提出 Transformer 后,其在各项 NLP 任务中都取得了 SOTA 的表现。然而其自身的结构缺陷导致了两个问题:
1)由于自注意力机制每次都要计算所有词之间的注意力,其所需计算复杂度为输入长度的平方;2)Transformer 需要事先设定输入长度,这导致了其对于长程关系的捕捉有了一定限制,并且由于需要对输入文档进行分割会导致语意上的碎片化。
近年来许多工作通过对 Transformer 结构的调整优化来缓解以上两个问题。
本文分为两部分,第一部分介绍和比较的三个模型(Star-Transformer 和 BP-Transformer)试图在时间复杂度和空间复杂度上优化 Transformer。第二部分介绍和比较的两个模型(Transformer-XL 和 Compressivetransformer)试图解决上面提出的第二个问题。
对 Transformer 不了解的可先阅读该博客:
https://jalammar.github.io/illustrated-transformer/
更高效的Transformer
1. Star-Transformer
论文标题:Star-Transformer
论文来源:NAACL 2019
论文链接:https://arxiv.org/abs/1902.09113
代码链接:https://github.com/fastnlp/fastNLP
原始的 Transformer 在计算注意力的时候,序列中每个元素要和所有元素进行计算,也是这样的计算方式导致了其复杂度为序列长度的平方。
同时 Transformer 这样所有元素直接相互作用的计算方式没能够很好地使用我们所知道的一些语言序列上的特性,比如语言序列中相邻的词往往本身就会有较强的相关性。
对于这个问题,Star-Transformer 在注意力机制的计算上进行了优化,构建了一个星状的结构,所有序列中直接相邻的元素可以直接相互作用,而非直接相邻的元素则通过中心元素实现间接得信息传递。
具体结构比较如下图所示,左边为正常的 Transformer,右边为 Star-Transformer。
下图为 Star-Transformer 的参数更新算法。在初始化阶段,卫星节点 的初始值为相应的词向量,而中心节点 的初始值为所有卫星节点词向量的平均值。
算法中参数更新分为两步:第一步为卫星节点的更新,第二步为中心节点的更新。两步的更新都是基于多头注意力机制。
对于卫星节点,计算多头注意力机制时只需考虑该节点状态与直接相邻节点,中心节点,该节点词向量和本节点上一时刻状态的信息交互(如下图中 )。
因为中心节点担负着所有卫星节点之间的信息交互,因此中心节点在更新时须与自己上一时刻的信息和所有卫星节点进行信息交互。同时为了表示位置信息,在卫星节点中还必须拼接上表示位置信息的可学习的向量。
该模型在使用中,针对序列的下游任务使用卫星节点的输出,而针对语言推理文本分类这种需要整个句子的任务则可以使用中心节点的输出。
作者的实验中表明,该非直接的联系方式同样能够学习到长程联系,同时在一些任务上的也取得了比 Transformer 更好的表现。
2. BP-Transformer
论文标题:BP-Transformer: Modelling Long-Range Context via Binary Partitioning
论文来源:NAACL 2019
论文链接:https://arxiv.org/abs/1911.04070
代码链接:https://github.com/yzh119/BPT
BP-Transformer 采用一个层级(从细粒度到粗粒度)的注意力计算机制来改进原始的 Transformer。其能够将 Transformer 在计算注意力时的时间复杂度从 降低到