Transformer模型所依赖的Attention本身不具备像RNN一样的天生的对序列位置编码能力,需要借助所谓的Position Embedding来解决位置信息问题。本文总结常见的Position Embedding方案。

印象中,位置编码这个话题,影响中好像是在Google的论文以及Facebook的论文开始关注这个话题。下面我们先来回顾Google最先提出的Self Attention。

Attention的问题

Google 的这篇论文中看到一条挺“吓人”的公式,

由于无法区分token的位置,在Embedding上叠加一个关于位置的Embedding。为什么要这样设计?从模型角度看,可以理解成是模型去偏置的设计方法(CNN对数据的局部性假设,RNN对数据的递归生成假设),即Attention不对文本位置等相关信息做任何假设,让模型的某个模块自己去学习。从这点出发,也可以理解,为什么Transformer的训练往往需要很大的数据集。

Attention层本身不具备区分位置的能力,解决方案:

  • 提供绝对位置编码,位置信息由给定位置$i$​决定并融入到$\text{token}_i$向量中
  • 提供相对位置编码,位置信息由$|i-j|$决定,改变Attention结构使其分辨token间的相对位置

在此之前,我们首先聊聊什么是位置敏感模型?

位置敏感

对于模型$f$,如果更好序列的位置后,模型的输出和原来的不同,即

那么可以称模型$f$是位置敏感的,像RNN、CNN都是位置敏感。而Attention不是,试设想有序列$[x_{1}, \dots, x_{n}]$,无论其元素的顺序如何改变,输入Attention后并作GlobalMaxPooling所获得的词向量都是一样的。这意味着在分类模型下,shuffle一个句子中的元素,不改变模型的分类结果。这说明,在没有位置信息的情况下Attention、Transformer本质上是一个BOW模型。

CNN和RNN的位置信息

RNN本身是递归计算,

如果输入序列的原来的顺序,隐向量序列就改变了。因此递归计算本身就包括位置信息。

CNN做滑动窗口计算,卷积核为3的情况下

我们都知道词向量本身不具备位置信息,序列自身的位置信息的运用需要特定的模型,如RNN。如果模型本身并不具备序列的位置信息处理能力,那么有什么解决办法?解决方案就是引入位置信息。位置信息又可以分为相对位置编码、绝对位置编码。后者是为输入添加位置信息,前者是在Attention基础上改进,使其具有分别不同token位置差别的能力。

可以理解,CNN、RNN都具有相对位置信息编码的能力,在NLU任务中,我个人的实验是在这些模型中添加绝对位置信息编码有少许提升。从另外一个角度来说,既然CNN、RNN具有学习位置信息的能力,那么在Attention模块下游接上CNN、RNN,模型则能获得学习位置信息的能力。不过如果选择RNN,Attention天生的并行性就因为递归计算而弱化,得不偿失。

我们先从绝对位置编码出发。

绝对位置编码

假设有词向量序列,其第$i$个为$\boldsymbol{x}_i$,绝对位置编码为一个依赖$i$的函数,其添加所对应位置的词向量上,即

直观点看,

如果调换了token的位置,该位置的输出由于位置信息的存在就发生改变了,这样Attention就有了间接分辨不同token位置的能力。这样获得的词向量序列就具有位置信息。$\widetilde{\boldsymbol{x}}_{i}$成了新的token序列,输入到Attention模块中,

那么这个$\widetilde{\boldsymbol{x}}_{i}$有哪些计算方法呢?

可训练的绝对位置编码

既然万物皆Embedding,那么位置也能Embedding,一种最直接的做法就是对位置编号$i$也使用Embedding,即

印象中最早是在Facebook的论文Convolutional Sequence to Sequence Learning中提出,这种位置编码只能支持有限长度的文本,因为训练Embedding是需要指定input_dim,那么可支持文本的最长长度就固定下来了。可训练的绝对位置编码对于不同的位置$i$​是随机初始化,如同token对应的Embedding一样,因此获得的位置编码本身没有显式的语义。

尽管在 Facebook 的 Convolutional Sequence to Sequence Learning 以 CNN 为主,Attention 为辅解决 seq2seq 问题,但Google 则是使用纯 Attention 解决 seq2seq 问题。两者均使用可训练的绝对位置编码得到很好的效果。这说明,位置Embedding在CNN、Attention中都有一定的作用。

sincos绝对位置编码

在论文Attention Is All You Need提到基于三角函数的绝对位置编码。

Attention 模型并不能捕捉序列的顺序信息,是对位置不敏感(position-insensitive)的模型,也就是说,如果我们把序列打乱,通过模型获得的结果还是一样的。

其中$\boldsymbol{p}_{i}$为,

因为三角函数间可以互相表示,因此可以统一表示为,

sincos绝对位置编码的优势是可以对任意位置$p$编码,没有长度约束。

Google的论文对这两种位置编码都试验,证明没有明显的差别。论文提到,通过参数学习的 position embedding 的效果和采用固定的 position embedding 相差无几,不过后者计算量更少。

在我看来,这是放弃 RNN 进行序列编码必然遇到的问题。我们可以可视化位置编码来直观感受,绘图可视化,

换个风格再次感受一下,

Google 提出的 Position Embedding 有一个有趣的性质,位置 $p+k$ 可以由位置 $p$ 线性表示。这里用到高中的三角函数公式,可参考这里)。

正弦余弦公式,

也就是说位置$\alpha + \beta$的向量可以表示成位置$\alpha$和位置$\beta$​的向量组合,这体现出位置的相对性。

代入到 Position Embedding 中,为化简表达,另 $\omega_{i}=\frac{1}{1000^{2i/d_{pos}}}$,

于是可以整理成矩阵形式,

因此位置$PE(p + k)$是可以被$PE(p)$​线性表示,以便模型更好地学习位置关系。

根据三角关系,也容易证明,

这就是说明sincos绝对位置编码无法区分前后关系,而文本的方向性在很多任务中都很重要,因此也能理解为什么BERT等Transformer模型不使用该位置编码。

疑问和思考

相加可以理解成普通的数值平均,

去掉分母也可以,下游网络会把这个scale学习回来,例如直接添加LayerNormalization模块。类别思考,相加也可以,向量拼接也可以吧?是的,这也是一种扩展思路。

既然数值平均可以,那么几何平均如何。几何平均的计算如下,

于是有,

甚至我们可以连开方都可以去掉,这样也可以避免$\boldsymbol{x}_{i} \otimes \boldsymbol{p}_{i}$有负元素的情况,

也就是说相乘,逐位置相乘。当然,这里是我自己推想的,并没有做实验验证。对于下游网络来说,本质就是拟合上游数据,既然逐位置求和可行,那么逐位置相乘也是很自然的类比。

不管可训练的绝对位置编码,或者是sincos绝对位置编码,还是逐位置相乘绝对位置编码,都是直接叠加到token对应的向量上,这类位置编码的好处是“即插即用”,不会对原来Attention模块进行干预。

相对位置编码

相对位置编码则不像绝对位置编码一样直观,需要把Attention模块纳入考虑。所谓的相对位置就是对于两个$\text{token}_i, \text{token}_j$,其位置关系需要二元$(i,j)$来决定转变为由$|i-j|$来决定。而二元关系体现在Attention模块内部,因此现展开Attention模块内部计算来看,尝试能否找到把二元关系$(i,j)$转变为由$|i-j|$。

Google最初的Attention模块中,对于位置$i$​,Attention模型的输出为,

这里softmax是对$j$​​​维度进行归一化。其位置信息叠加到$x_i$​​向量内,因此

于是$e_{ij}$的位置信息有二元结构$(i,j)$决定,如何改为由$|i-j|$决定呢?可以看到二元结构$(i,j)$就体现在$x_i, p_j$上。

为引入相对位置,即把二元关系$(i,j)$转变为由$|i-j|$,在论文Self-Attention with Relative Position Representations对Attention模型做修改,称为Relation-aware Self-Attention,它做如下修改,

引入这两个向量$a_{i j}^{K}$和$a_{i j}^{V}$(红色数学符号)是为了让Attention模型获得相对位置感知。此时还没有体会到位置的相对性,关键就是解决$a_{i j}^{K}$​和$a_{i j}^{V}$​的取值问题,论文的做法是提供$P_V,P_K$​两个矩阵,用于位置的取值检索,有

这里$P_K[r]$​​指矩阵$P_K$​​的第$r$​​行,由于$r = \operatorname{clip}(i-j, p_{\text{min}}, p_{\text{max}})$​​​,因此只要$P_K$​​​矩阵的大小有限即可表达任意长度$|i-j|$​​的相对位置。同理,对于矩阵$P_V$。

此外还有比较知名的相对位置编码:

  • Transformer-XL的位置编码
  • T5位置编码
  • 位置编码

总结

以上我们总结了常见的位置编码方法,总结如下表

位置编码 内容 优点 缺点
绝对位置编码
相对位置编码 处理任意长度文本; 对Attention模型往往是入侵式;
CNN & RNN RNN天然具有处理位置关系的能力;CNN的局部性能够处理局部位置关系。

实践中发现CNN模型中加入Position Embedding能够加强模型的位置感,有一定的提升。Position Embedding对文本分类有用吗?

除了以上位置编码外,学术界的研究还有很多,如Complex 位置编码,引入复数,不过没有深入研究过。

参考

[1] Self-Attention with Relative Position Representations

[2] Convolutional Sequence to Sequence Learning

[3] Attention Is All You Need

转载请包括本文地址:https://allenwind.github.io/blog/11574/
更多文章请参考:https://allenwind.github.io/blog/archives/