TUPE :重新思考语言预训练中的位置编码

2020-08-26 14:38:11 浏览数 (1)

作者 | sliderSun

整理 | NewBeeNLP

一篇来自微软关于Transformer中位置编码的文章,关于位置编码,我们之前也有讨论过,参见:

  • Transformers Assemble(PART III)
  • 【ICLR2020】Transformer Complex-order:一种新的位置编码方式

论文:https://arxiv.org/abs/2006.15595 代码:https://github.com/guolinke/TUPE

介绍

文中首先质疑在输入层添加单词嵌入和绝对位置嵌入的合理性。由于这两种嵌入显然是异构的,所以这种“add”操作带来了位置信息和单词语义之间的混合关联。例如,通过扩展第一层的self-attention模块,我们(均指论文作者们)发现有特定项使用“word”作为查询“position”的key,或者使用“position”作为查询“word”的key。但是在语言学中,很少有证据表明,词的语义和位置有很强的相关性,或者在不知道具体语境的情况下,一个词的位置是可以预测的。

其次,注意到Transformer模型并不总是只处理自然语言单词。特别是在预训练模型中,如BERT,通常在句子后面附加一个特殊的符号[CLS]。大家普遍认为这个符号是用来从所有位置接收和总结有用信息的,[CLS]的上下文表示将被用作下游任务中句子的表示。由于[CLS]符号的作用不同于自然包含语义的规则词,我们认为,如果把它的位置当作词在句子中的位置来对待,它将是无效的。例如,如果对这个符号进行相对位置编码,注意力的分布很可能会偏向于前几个单词,从而影响对整个句子的理解

本文针对BERT提出了一种新的位置编码方法—Transformer with Untied Positional Encoding(TUPE),如上图所示。TUPE只使用单词嵌入作为输入。在self-attention模块中,分别计算不同类型的相关性,以反映不同方面的信息,包括单词上下文相关性和绝对位置相关性(以及相对位置相关性)。每一种相关性都有其自身的参数,并将其相加产生注意力分布。进一步,为[CLS]符号设置专门的位置关联,目的是正确地捕获句子的全局表示。

首先,如下(b)图我们可以看到在TUPE中,位置相关性和单词相关性分别在self-attention模块中计算,然后相加。该设计成功地消除了词语和位置之间的关联。

其次,TUPE使用一个不同的函数来计算[CLS]符号和其他位置之间的相关性。这种灵活性可以帮助模型学习整个句子的准确表示。下面具体介绍TUPE模型。

TUPE

解开位置与词语之间的关联

在绝对位置编码中,位置嵌入与单词嵌入相加,作为神经网络的输入。然而,这两种信息是异构的。另一方面,绝对位置嵌入以序列的方式编码索引,这与语义无关,与词义差别很大。对词嵌入和位置嵌入线性运算的合理性提出了质疑。为了验证清楚,我们看一下绝对位置编码的计算公式及其展开(这里以Transformer第一层self-attention为例),

alpha_{i j}^{A b s}=frac{1}{sqrt{d}}left(left(w_{i} p_{i}right) W^{Q, 1}right)left(left(w_{j} p_{j}right) W^{K, 1}right)^{T}
begin{aligned} alpha_{i j}^{A b s} &=frac{left(left(w_{i} p_{i}right) W^{Q, 1}right)left(left(w_{j} p_{j}right) W^{K, 1}right)^{T}}{sqrt{d}} \ &=frac{left(w_{i} W^{Q, 1}right)left(w_{j} W^{K, 1}right)^{T}}{sqrt{d}} frac{left(w_{i} W^{Q, 1}right)left(p_{j} W^{K, 1}right)^{T}}{sqrt{d}} \ & frac{left(p_{i} W^{Q, 1}right)left(w_{j} W^{K, 1}right)^{T}}{sqrt{d}} frac{left(p_{i} W^{Q, 1}right)left(p_{j} W^{K, 1}right)^{T}}{sqrt{d}} end{aligned}

其中,

alpha_{ij}

是 softmax 之前的 logits,

w_i

是 token embedding,

p_i

是 positional embedding,

W^Q, W^K

是映射到 Q 和 K 所用的矩阵。在上面展开的式子里,展示了单词嵌入和位置嵌入是如何在注意模块中进行投影和查询的。我们可以看到,扩展后出现了四项: 词与词的相关性、词与位置的相关性、位置与词的相关性、位置与位置的相关性。

不难看出,第一项和最后一项描述了一对单词或位置之间的同类关系。但是,第二和第三项使用位置(单词)作为查询来获取由单词(位置)组成的键。很少有证据表明,某个位置和某个词一定有很强的关联。此外,尽管第一项和最后一项描述了同类信息之间的关系,但是投影矩阵

W^{Q,1}

W^{K,1}

在这两项中是共享的。作为一种常识,投影被用作一种将上下文向量映射到不同语义空间的方法,以增加模型的表现力。对位置信息应用语义投影是不合理的。

为此,对其进行改进:通过使用不同的投影矩阵直接对一对单词或位置之间的关系进行建模,并删除中间两项, 公式如下

alpha_{i j}=frac{1}{sqrt{2 d}}left(x_{i}^{l} W^{Q, l}right)left(x_{j}^{l} W^{K, l}right)^{T} frac{1}{sqrt{2 d}}left(p_{i} U^{Q}right)left(p_{j} U^{K}right)^{T}

其中,

U^Q, U^K

是把 positional embedding 映射到 Q 和 K 所用的矩阵,

frac{1}{sqrt{2d}}

用于维持

alpha_{ij}

的量纲。与相对位置编码相结合,只需将上式改变为

alpha_{i j}=frac{1}{sqrt{2 d}}left(x_{i}^{l} W^{Q, l}right)left(x_{j}^{l} W^{K, l}right)^{T} frac{1}{sqrt{2 d}}left(p_{i} U^{Q}right)left(p_{j} U^{K}right)^{T} b_{j-i}

可以看到得到的系数是同时考虑绝对位置编码和相对位置编码的。

从位置上解开[CLS]符号

尽管句子中的单词具有局部依赖关系,然而,Transformer模型的输入序列并不总是一个自然的句子。

Bert中,一个特殊的符号[CLS]通常附加在句子的开头。经过预处理后,[CLS]符号的上下文表征将用于下游分类任务的预测。最近的一些工作研究了[CLS]符号的功能,发现[CLS]位置上的注意分布熵值较高,说明[CLS]符号的表示包含了整个句子的全局信息,因此具有广泛的关注性,可以聚合所有信息。

由于[CLS]符号具有独特的作用,不同于其他自然包含语义意义的词语,因此,我们也可以在注意模块中对[CLS]符号给出不同的表述方式:如果仍然对[CLS]符号使用相对位置编码

b_{j−i}

,注意力模型很可能会使[CLS]符号侧重于前几个单词而不是整个句子,这将影响下游任务的执行。

为了将[CLS]符号从其他位置解开,建议重置与[CLS]相对应的位置相关性。为了更好地演示,将

v_{ij}

表示为位置i和j之间的无内容(仅位置)相关性。

当使用绝对位置编码时,公式为,

v_{i j}=frac{1}{sqrt{2 d}}left(p_{i} U^{Q}right)left(p_{j} U^{K}right)^{T}

当使用相对位置编码时,公式为,

v_{i j}=frac{1}{sqrt{2 d}}left(p_{i} U^{Q}right)left(p_{j} U^{K}right)^{T} b_{j-i}

v_{ij}

的值重置为:

operatorname{reset}_{theta}(v, i, j)=left{begin{array}{ll} v_{i j} & i neq 1, j neq 1,(mathrm{no}[mathrm{CLS}]) \ theta_{1} & i=1,(mathrm{from}[mathrm{CLS}] text { to others }) \ theta_{2} & i neq 1, j=1,(text { from others to }[mathrm{CLS}]) end{array}right.

其中,

θ=(θ_{1}, θ_{2})

参数是可学习的,注意,此修改可广泛应用于任何仅位置关联,包括本文提出的位置编码和之前的相对位置编码,下图提供了可视化。

实现细节及讨论

TUPE有两个版本:

  • 第一种版本是使用带有未绑定[CLS]符号的未绑定绝对位置编码,称为「TUPE-A」
  • 第二个版本是在第一版本的基础上额外的相对位置编码,「TUPE-R」

数学公式如下:

alpha_{i j}^{mathrm{TUPE}-mathrm{A}}=quad frac{1}{sqrt{2 d}}left(x_{i}^{l} W^{Q, l}right)left(x_{j}^{l} W^{K, l}right)^{T} operatorname{reset}_{theta}left(frac{1}{sqrt{2 d}}left(p_{i} U^{Q}right)left(p_{j} U^{K}right)^{T}, i, jright)
alpha_{i j}^{mathrm{TUPE}-mathrm{A}}=quad frac{1}{sqrt{2 d}}left(x_{i}^{l} W^{Q, l}right)left(x_{j}^{l} W^{K, l}right)^{T} operatorname{reset}_{theta}left(frac{1}{sqrt{2 d}}left(p_{i} U^{Q}right)left(p_{j} U^{K}right)^{T} b_{j-i}, i, jright)

「多头版本 & 参数共享」

TUPE可以轻松扩展到多头版本。在我们的实现中,位置i的绝对位置嵌入

p_i

在不同的头之间共享,而对于每个头,投影矩阵

U^Q

U^K

不同。对于相对位置编码,

b_{j-i}

对于不同的头是不同的。参数θ也不会在头之间共享。

为了提高效率,在不同的层级共享(多头)投影矩阵

U^Q

U^K

。因此,在TUPE中,总参数的数量变化不大。以BERT-Base为例,引入了约1.18M的新参数,仅占总参数的1%左右。

「Normalization & Rescaling」

在TUPE中,每当使用

p_i

时,我们也会对其进行层归一化。

frac{1}{sqrt{d}}

一项用于Transformer中将点积的输出重新调整到一个标准范围。本文中

frac{1}{sqrt{2d}}

对两项求和后保持量纲。为了直接得到每一项的相似尺度,参数化

θ_1

θ_2
theta_{1}=frac{1}{sqrt{2 bar{d}}}left(p_{theta_{1}} U^{Q}right)left(p_{theta_{1}} U^{K}right)^{T}
theta_{2}=frac{1}{sqrt{2 bar{d}}}left(p_{theta_{2}} U^{Q}right)left(p_{theta_{2}} U^{K}right)^{T}

「绝对位置编码 相对位置编码中的冗余」

大家可能认为中的后两个项都是描述无关内容的联系,因此其中一个是多余的。但是,我们将显示它们确实有联系,但是捕获了位置信息的不同方面。

实验

我们对展开后的四项做了可视化。如下图所示,可以看到中间两项看起来很均匀,说明position 和 token 之间确实没有太强的关联;token 和 position 用了相同的矩阵做 QKV 的变换。但 position 和 token 所包含的信息不一样,共享矩阵也不合理。

实验结果表明,按上面的式子把 positional embedding 从 input 拆开后,不仅 pre-training loss 收敛得更快,下游任务的表现也更好。另外,我们还特殊处理了 [CLS] token 的 position,使其不会因 positional locality 而忽略了整个句子的信息。这个也能带来不小的提升。整体的实验结果如下,可以看到,我们的方法不仅最后比 baseline 要好很多,并且可以在 30% (300k-step) 的时候,就达到 baseline 在 1000k-step 时的效果。

结论

本文提出了TUPE(具有不受约束的位置编码的Transformer),它通过两种方法改进了现有的方法:解开单词和位置之间的相关性,以及解开序列位置上的[CLS]。具体来说,首先从Transformer的输入中去除绝对位置编码,在自注意模块中分别使用不同的投影矩阵计算位置相关性和单词相关性。然后,通过重置与[CLS]相关的位置相关性来解除[CLS]。大量实验表明,TUPE具有较好的性能。

0 人点赞