让研究人员绞尽脑汁的Transformer位置编码
By 苏剑林 | 2021-02-03 | 191873位读者 |不同于RNN、CNN等模型,对于Transformer模型来说,位置编码的加入是必不可少的,因为纯粹的Attention模块是无法捕捉输入顺序的,即无法区分不同位置的Token。为此我们大体有两个选择:1、想办法将位置信息融入到输入中,这构成了绝对位置编码的一般做法;2、想办法微调一下Attention结构,使得它有能力分辨不同位置的Token,这构成了相对位置编码的一般做法。
虽然说起来主要就是绝对位置编码和相对位置编码两大类,但每一类其实又能衍生出各种各样的变种,为此研究人员可算是煞费苦心、绞尽脑汁了,此外还有一些不按套路出牌的位置编码。本文就让我们来欣赏一下研究人员为了更好地表达位置信息所构建出来的“八仙过海,各显神通”般的编码方案。
绝对位置编码 #
形式上来看,绝对位置编码是相对简单的一种方案,但即便如此,也不妨碍各路研究人员的奇思妙想,也有不少的变种。一般来说,绝对位置编码会加到输入中:在输入的第$k$个向量$\boldsymbol{x}_k$中加入位置向量$\boldsymbol{p}_k$变为$\boldsymbol{x}_k + \boldsymbol{p}_k$,其中$\boldsymbol{p}_k$只依赖于位置编号$k$。
训练式 #
很显然,绝对位置编码的一个最朴素方案是不特意去设计什么,而是直接将位置编码当作可训练参数,比如最大长度为512,编码维度为768,那么就初始化一个$512\times 768$的矩阵作为位置向量,让它随着训练过程更新。现在的BERT、GPT等模型所用的就是这种位置编码,事实上它还可以追溯得更早,比如2017年Facebook的《Convolutional Sequence to Sequence Learning》就已经用到了它。
对于这种训练式的绝对位置编码,一般的认为它的缺点是没有外推性,即如果预训练最大长度为512的话,那么最多就只能处理长度为512的句子,再长就处理不了了。当然,也可以将超过512的位置向量随机初始化,然后继续微调。但笔者最近的研究表明,通过层次分解的方式,可以使得绝对位置编码能外推到足够长的范围,同时保持还不错的效果,细节请参考笔者之前的博文《层次分解位置编码,让BERT可以处理超长文本》。因此,其实外推性也不是绝对位置编码的明显缺点。
三角式 #
三角函数式位置编码,一般也称为Sinusoidal位置编码,是Google的论文《Attention is All You Need》所提出来的一个显式解:
\begin{equation}\left\{\begin{aligned}&\boldsymbol{p}_{k,2i}=\sin\Big(k/10000^{2i/d}\Big)\\
&\boldsymbol{p}_{k, 2i+1}=\cos\Big(k/10000^{2i/d}\Big)
\end{aligned}\right.\end{equation}
其中$\boldsymbol{p}_{k,2i},\boldsymbol{p}_{k,2i+1}$分别是位置$k$的编码向量的第$2i,2i+1$个分量,$d$是位置向量的维度。
很明显,三角函数式位置编码的特点是有显式的生成规律,因此可以期望于它有一定的外推性。另外一个使用它的理由是:由于$\sin(\alpha+\beta)=\sin\alpha\cos\beta+\cos\alpha\sin\beta$以及$\cos(\alpha+\beta)=\cos\alpha\cos\beta-\sin\alpha\sin\beta$,这表明位置$\alpha+\beta$的向量可以表示成位置$\alpha$和位置$\beta$的向量组合,这提供了表达相对位置信息的可能性。但很奇怪的是,现在我们很少能看到直接使用这种形式的绝对位置编码的工作,原因不详。
递归式 #
原则上来说,RNN模型不需要位置编码,它在结构上就自带了学习到位置信息的可能性(因为递归就意味着我们可以训练一个“数数”模型),因此,如果在输入后面先接一层RNN,然后再接Transformer,那么理论上就不需要加位置编码了。同理,我们也可以用RNN模型来学习一种绝对位置编码,比如从一个向量$\boldsymbol{p}_0$出发,通过递归格式$\boldsymbol{p}_{k+1}=f(\boldsymbol{p}_k)$来得到各个位置的编码向量。
ICML 2020的论文《Learning to Encode Position for Transformer with Continuous Dynamical Model》把这个思想推到了极致,它提出了用微分方程(ODE)$d\boldsymbol{p}_t/dt=\boldsymbol{h}(\boldsymbol{p}_t,t)$的方式来建模位置编码,该方案称之为FLOATER。显然,FLOATER也属于递归模型,函数$\boldsymbol{h}(\boldsymbol{p}_t,t)$可以通过神经网络来建模,因此这种微分方程也称为神经微分方程,关于它的工作最近也逐渐多了起来。
理论上来说,基于递归模型的位置编码也具有比较好的外推性,同时它也比三角函数式的位置编码有更好的灵活性(比如容易证明三角函数式的位置编码就是FLOATER的某个特解)。但是很明显,递归形式的位置编码牺牲了一定的并行性,可能会带速度瓶颈。
相乘式 #
刚才我们说到,输入$\boldsymbol{x}_k$与绝对位置编码$\boldsymbol{p}_k$的组合方式一般是$\boldsymbol{x}_k + \boldsymbol{p}_k$,那有没有“不一般”的组合方式呢?比如$\boldsymbol{x}_k \otimes \boldsymbol{p}_k$(逐位相乘)?我们平时在搭建模型的时候,对于融合两个向量有多种方式,相加、相乘甚至拼接都是可以考虑的,怎么大家在做绝对位置编码的时候,都默认只考虑相加了?
很抱歉,笔者也不知道答案。可能大家默认选择相加是因为向量的相加具有比较鲜明的几何意义,但是对于深度学习模型来说,这种几何意义其实没有什么实际的价值。最近笔者看到的一个实验显示,似乎将“加”换成“乘”,也就是$\boldsymbol{x}_k \otimes \boldsymbol{p}_k$的方式,似乎比$\boldsymbol{x}_k + \boldsymbol{p}_k$能取得更好的结果。具体效果笔者也没有完整对比过,只是提供这么一种可能性。关于实验来源,可以参考《中文语言模型研究:(1) 乘性位置编码》。
相对位置编码 #
相对位置并没有完整建模每个输入的位置信息,而是在算Attention的时候考虑当前位置与被Attention的位置的相对距离,由于自然语言一般更依赖于相对位置,所以相对位置编码通常也有着优秀的表现。对于相对位置编码来说,它的灵活性更大,更加体现出了研究人员的“天马行空”。
经典式 #
相对位置编码起源于Google的论文《Self-Attention with Relative Position Representations》,华为开源的NEZHA模型也用到了这种位置编码,后面各种相对位置编码变体基本也是依葫芦画瓢的简单修改。
一般认为,相对位置编码是由绝对位置编码启发而来,考虑一般的带绝对位置编码的Attention:
\begin{equation}\left\{\begin{aligned}
\boldsymbol{q}_i =&\, (\boldsymbol{x}_i + \boldsymbol{p}_i)\boldsymbol{W}_Q \\
\boldsymbol{k}_j =&\, (\boldsymbol{x}_j + \boldsymbol{p}_j)\boldsymbol{W}_K \\
\boldsymbol{v}_j =&\, (\boldsymbol{x}_j + \boldsymbol{p}_j)\boldsymbol{W}_V \\
a_{i,j} =&\, softmax\left(\boldsymbol{q}_i \boldsymbol{k}_j^{\top}\right)\\
\boldsymbol{o}_i =&\, \sum_j a_{i,j}\boldsymbol{v}_j
\end{aligned}\right.\end{equation}
其中$softmax$对$j$那一维归一化,这里的向量都是指行向量。我们初步展开$\boldsymbol{q}_i \boldsymbol{k}_j^{\top}$:
\begin{equation}
\boldsymbol{q}_i \boldsymbol{k}_j^{\top} = \left(\boldsymbol{x}_i + \boldsymbol{p}_i\right)\boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\left(\boldsymbol{x}_j + \boldsymbol{p}_j\right)^{\top} = \left(\boldsymbol{x}_i \boldsymbol{W}_Q + \boldsymbol{p}_i \boldsymbol{W}_Q\right)\left(\boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + \boldsymbol{W}_K^{\top}\boldsymbol{p}_j^{\top}\right)
\end{equation}
为了引入相对位置信息,Google把第一项位置去掉,第二项$\boldsymbol{p}_j \boldsymbol{W}_K$改为二元位置向量$\boldsymbol{R}_{i,j}^{K}$,变成
\begin{equation}
a_{i,j} = softmax\left(\boldsymbol{x}_i \boldsymbol{W}_Q\left(\boldsymbol{x}_j\boldsymbol{W}_K + \color{green}{\boldsymbol{R}_{i,j}^K}\right)^{\top}\right)
\end{equation}
以及$\boldsymbol{o}_i =\sum\limits_j a_{i,j}\boldsymbol{v}_j = \sum\limits_j a_{i,j}(\boldsymbol{x}_j\boldsymbol{W}_V + \boldsymbol{p}_j\boldsymbol{W}_V)$中的$\boldsymbol{p}_j \boldsymbol{W}_V$换成$\boldsymbol{R}_{i,j}^{V}$:
\begin{equation}\boldsymbol{o}_i = \sum_j a_{i,j}\left(\boldsymbol{x}_j\boldsymbol{W}_V + \color{green}{\boldsymbol{R}_{i,j}^{V}}\right)
\end{equation}
所谓相对位置,是将本来依赖于二元坐标$(i,j)$的向量$\boldsymbol{R}_{i,j}^{K},\boldsymbol{R}_{i,j}^{V}$,改为只依赖于相对距离$i-j$,并且通常来说会进行截断,以适应不同任意的距离
\begin{equation}\begin{aligned}
\boldsymbol{R}_{i,j}^{K} = \boldsymbol{p}_K\left[\text{clip}(i-j, p_{\min}, p_{\max})\right]\\
\boldsymbol{R}_{i,j}^{V} = \boldsymbol{p}_V\left[\text{clip}(i-j, p_{\min}, p_{\max})\right]
\end{aligned}\label{eq:rp-clip}\end{equation}
这样一来,只需要有限个位置编码,就可以表达出任意长度的相对位置(因为进行了截断),不管$\boldsymbol{p}_K,\boldsymbol{p}_V$是选择可训练式的还是三角函数式的,都可以达到处理任意长度文本的需求。
XLNET式 #
XLNET式位置编码其实源自Transformer-XL的论文《Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context》,只不过因为使用了Transformer-XL架构的XLNET模型并在一定程度上超过了BERT后,Transformer-XL才算广为人知,因此这种位置编码通常也被冠以XLNET之名。
XLNET式位置编码源于对上述$\boldsymbol{q}_i \boldsymbol{k}_j^{\top}$的完全展开:
\begin{equation}
\boldsymbol{q}_i \boldsymbol{k}_j^{\top} = \boldsymbol{x}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + \boldsymbol{x}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{p}_j^{\top} + \boldsymbol{p}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + \boldsymbol{p}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{p}_j^{\top}\label{eq:qk-exp}
\end{equation}
Transformer-XL的做法很简单,直接将$\boldsymbol{p}_j$替换为相对位置向量$\boldsymbol{R}_{i-j}$,至于两个$\boldsymbol{p}_i$,则干脆替换为两个可训练的向量$\boldsymbol{u},\boldsymbol{v}$:
\begin{equation}\boldsymbol{x}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + \boldsymbol{x}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\color{green}{\boldsymbol{R}_{i-j}^{\top}} + \color{red}{\boldsymbol{u}}\boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + \color{red}{\boldsymbol{v}} \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\color{green}{\boldsymbol{R}_{i-j}^{\top}}
\end{equation}
该编码方式中的$\boldsymbol{R}_{i-j}$没有像式$\eqref{eq:rp-clip}$那样进行截断,而是直接用了Sinusoidal式的生成方案,由于$\boldsymbol{R}_{i-j}$的编码空间与$\boldsymbol{x}_j$不一定相同,所以$\boldsymbol{R}_{i-j}$前面的$\boldsymbol{W}_K^{\top}$换了另一个独立的矩阵$\boldsymbol{W}_{K,R}^{\top}$,还有$\color{red}{\boldsymbol{u}}\boldsymbol{W}_Q$ 、$\color{red}{\boldsymbol{v}} \boldsymbol{W}_Q$可以直接合并为单个$\color{red}{\boldsymbol{u}}$ 、$\color{red}{\boldsymbol{v}}$,所以最终使用的式子是
\begin{equation}\boldsymbol{x}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + \boldsymbol{x}_i \boldsymbol{W}_Q \boldsymbol{W}_{K,R}^{\top}\color{green}{\boldsymbol{R}_{i-j}^{\top}} + \color{red}{\boldsymbol{u}}\boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + \color{red}{\boldsymbol{v}} \boldsymbol{W}_{K,R}^{\top}\color{green}{\boldsymbol{R}_{i-j}^{\top}}
\end{equation}
此外,$\boldsymbol{v}_j$上的位置偏置就直接去掉了,即直接令$\boldsymbol{o}_i = \sum\limits_j a_{i,j}\boldsymbol{x}_j\boldsymbol{W}_V$。似乎从这个工作开始,后面的相对位置编码都只加到Attention矩阵上去,而不加到$\boldsymbol{v}_j$上去了。
T5式 #
T5模型出自文章《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》,里边用到了一种更简单的相对位置编码。思路依然源自展开式$\eqref{eq:qk-exp}$,如果非要分析每一项的含义,那么可以分别理解为“输入-输入”、“输入-位置”、“位置-输入”、“位置-位置”四项注意力的组合。如果我们认为输入信息与位置信息应该是独立(解耦)的,那么它们就不应该有过多的交互,所以“输入-位置”、“位置-输入”两项Attention可以删掉,而$\boldsymbol{p}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{p}_j^{\top}$实际上只是一个只依赖于$(i,j)$的标量,我们可以直接将它作为参数训练出来,即简化为
\begin{equation}\boldsymbol{x}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + \color{green}{\boldsymbol{\beta}_{i,j}}\end{equation}
说白了,它仅仅是在Attention矩阵的基础上加一个可训练的偏置项而已,而跟XLNET式一样,在$\boldsymbol{v}_j$上的位置偏置则直接被去掉了。包含同样的思想的还有微软在ICLR 2021的论文《Rethinking Positional Encoding in Language Pre-training》中提出的TUPE位置编码。
比较“别致”的是,不同于常规位置编码对将$\boldsymbol{\beta}_{i,j}$视为$i-j$的函数并进行截断的做法,T5对相对位置进行了一个“分桶”处理,即相对位置是$i-j$的位置实际上对应的是$f(i-j)$位置,映射关系如下:
\begin{array}{c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c}
\hline
i - j & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15\\
\hline
f(i-j) & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 8 & 8 & 8 & 9 & 9 & 9 & 9 \\
\hline
i - j & 16 & 17 & 18 & 19 & 20 & 21 & 22 & 23 & 24 & 25 & 26 & 27 & 28 & 29 & 30 & \cdots\\
\hline
f(i-j) & 10 & 10 & 10 & 10 & 10 & 10 & 10 & 11 & 11 & 11 & 11 & 11 & 11 & 11 & 11 & \cdots \\
\hline\end{array}
具体的映射代码,读者自行看源码就好。这个设计的思路其实也很直观,就是比较邻近的位置(0~7),我们需要比较得精细一些,所以给它们都分配一个独立的位置编码,至于稍远的位置(比如8~11),我们不用区分得太清楚,所以它们可以共用一个位置编码,距离越远,共用的范围就可以越大,直到达到指定范围再clip。
DeBERTa式 #
DeBERTa也是微软搞的,去年6月就发出来了,论文为《DeBERTa: Decoding-enhanced BERT with Disentangled Attention》,最近又小小地火了一把,一是因为它正式中了ICLR 2021,二则是它登上SuperGLUE的榜首,成绩稍微超过了T5。
其实DeBERTa的主要改进也是在位置编码上,同样还是从展开式$\eqref{eq:qk-exp}$出发,T5是干脆去掉了第2、3项,只保留第4项并替换为相对位置编码,而DeBERTa则刚刚相反,它扔掉了第4项,保留第2、3项并且替换为相对位置编码(果然,科研就是枚举所有的排列组合看哪个最优):
\begin{equation}
\boldsymbol{q}_i \boldsymbol{k}_j^{\top} = \boldsymbol{x}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + \boldsymbol{x}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\color{green}{\boldsymbol{R}_{i,j}^{\top}} + \color{green}{\boldsymbol{R}_{j,i}} \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top}
\end{equation}
至于$\boldsymbol{R}_{i,j}$的设计也是像式$\eqref{eq:rp-clip}$那样进行截断的,没有特别的地方。
不过,DeBERTa比较有意思的地方,是提供了使用相对位置和绝对位置编码的一个新视角,它指出NLP的大多数任务可能都只需要相对位置信息,但确实有些场景下绝对位置信息更有帮助,于是它将整个模型分为两部分来理解。以Base版的MLM预训练模型为例,它一共有13层,前11层只是用相对位置编码,这部分称为Encoder,后面2层加入绝对位置信息,这部分它称之为Decoder,还弄了个简称EMD(Enhanced Mask Decoder);至于下游任务的微调截断,则是使用前11层的Encoder加上1层的Decoder来进行。
SuperGLUE上的成绩肯定了DeBERTa的价值,但是它论文的各种命名真的是让人觉得极度不适,比如它自称的“Encoder”、“Decoder”就很容易让人误解这是一个Seq2Seq模型,比如EMD这个简称也跟Earth Mover's Distance重名。虽然有时候重名是不可避免的,但它重的名都是ML界大家都比较熟悉的对象,相当容易引起误解,真不知道作者是怎么想的...
其他位置编码 #
绝对位置编码和相对位置编码虽然花样百出,但仍然算是经典范围内,从上述介绍中我们依然可以体会到满满的套路感。除此之外,还有一些并不按照常规套路出牌,它们同样也表达了位置编码。
CNN式 #
尽管经典的将CNN用于NLP的工作《Convolutional Sequence to Sequence Learning》往里边加入了位置编码,但我们知道一般的CNN模型尤其是图像中的CNN模型,都是没有另外加位置编码的,那CNN模型究竟是怎么捕捉位置信息的呢?
如果让笔者来回答,那么答案可能是卷积核的各项异性导致了它能分辨出不同方向的相对位置。不过ICLR 2020的论文《How Much Position Information Do Convolutional Neural Networks Encode?》给出了一个可能让人比较意外的答案:CNN模型的位置信息,是Zero Padding泄漏的!
我们知道,为了使得卷积编码过程中的feature保持一定的大小,我们通常会对输入padding一定的0,而这篇论文显示该操作导致模型有能力识别位置信息。也就是说,卷积核的各向异性固然重要,但是最根本的是zero padding的存在,那么可以想象,实际上提取的是当前位置与padding的边界的相对距离。
不过,这个能力依赖于CNN的局部性,像Attention这种全局的无先验结构并不适用,如果只关心Transformer位置编码方案的读者,这就权当是扩展一下视野吧。
复数式 #
复数式位置编码可谓是最特立独行的一种位置编码方案了,它来自ICLR 2020的论文《Encoding word order in complex embeddings》。论文的主要思想是结合复数的性质以及一些基本原理,推导出了它的位置编码形式(Complex Order)为:
\begin{equation}\left[r_{j, 1} e^{\text{i}\left(\omega_{j, 1} k+\theta_{j, 1}\right)}, \ldots, r_{j, 2} e^{\text{i}\left(\omega_{j, 2} k+\theta_{j, 2}\right)}, \cdots, r_{j, d} e^{\text{i}\left(\omega_{j, d} k+\theta_{j, d}\right)}\right]\label{eq:complex}\end{equation}
这里的$\text{i}$是虚数单位,$j$代表某个词,$k$代表该词所在的位置,而
\begin{equation}\begin{aligned}
\boldsymbol{r}_j =&\, [r_{j, 1},r_{j, 2},\cdots,r_{j, d}]\\
\boldsymbol{\omega}_j =&\, [\omega_{j, 1},\omega_{j, 2},\cdots,\omega_{j, d}]\\
\boldsymbol{\theta}_j =&\, [\theta_{j, 1},\theta_{j, 2},\cdots,\theta_{j, d}]\\
\end{aligned}\end{equation}
代表词$j$的三组词向量。你没看错,它确实假设每个词有三组跟位置无关的词向量了(当然可以按照某种形式进行参数共享,使得它退化为两组甚至一组),然后跟位置$k$相关的词向量就按照上述公式运算。
你以为引入多组词向量就是它最特立独行的地方了?并不是!我们看到式$\eqref{eq:complex}$还是复数形式,你猜它接下来怎么着?将它实数化?非也,它是将它直接用于复数模型!也就是说,它走的是一条复数模型路线,不仅仅输入的Embedding层是复数的,里边的每一层Transformer都是复数的,它还实现和对比了复数版的Fasttext、LSTM、CNN等模型!这篇文章的一作是Benyou Wang,可以搜到他的相关工作基本上都是围绕着复数模型展开的,可谓复数模型的铁杆粉了~
融合式 #
无偶独有,利用复数的形式,笔者其实也构思了一种比较巧的位置编码,它可以将绝对位置编码与相对位置编码融于一体,分享在此,有兴趣的读者欢迎一起交流研究。
简单起见,我们先假设$\boldsymbol{q}_m,\boldsymbol{k}_n$是所在位置分别为$m,n$的二维行向量,既然是二维,那么我们可以将它当作复数来运算。我们知道,Attention关键之处在于向量的内积,用复数表示为
\begin{equation}\langle \boldsymbol{q}_m, \boldsymbol{k}_n\rangle = \text{Re}\left[\boldsymbol{q}_m \boldsymbol{k}_n^*\right]\end{equation}
其中$^*$是共轭复数,右端的乘法是普通的复数乘法,$\text{Re}[]$表示取结果的实部。上式也就是说:
两个二维向量的内积,等于把它们当复数看时,一个复数与另一个复数的共轭的乘积实部。
如果我们将$\boldsymbol{q}_m,\boldsymbol{k}_n$分别乘以$e^{\text{i}m\theta},e^{\text{i}n\theta}$变成$\boldsymbol{q}_m e^{\text{i}m\theta}, \boldsymbol{k}_n e^{\text{i}n\theta}$,那么就相当于给它们配上了绝对位置编码了(因为显式地依赖绝对位置$m,n$),然后放到内积里边,我们有
\begin{equation}\langle \boldsymbol{q}_m e^{\text{i}m\theta}, \boldsymbol{k}_n e^{\text{i}n\theta}\rangle = \text{Re}\left[\left(\boldsymbol{q}_m e^{\text{i}m\theta}\right) \left(\boldsymbol{k}_n e^{\text{i}n\theta}\right)^*\right] = \text{Re}\left[\boldsymbol{q}_m \boldsymbol{k}_n^* e^{\text{i}(m-n)\theta}\right]\end{equation}
相当有意思的是,内积只依赖于相对位置$m-n$!这就巧妙地将绝对位置与相对位置融合在一起了。
注意,我们没有像Complex Order那么“疯狂”,上述运算本质上还是在实数范畴内的,只不过我们是借助复数来完成了某些推导而已。由上述结果可知,对于位置为$n$的二维实数向量$[x,y]$,我们当它复数来运算,乘以$e^{\text{i}n\theta}$,得到恒等式
\begin{equation}(x + y\text{i})e^{\text{i}n\theta} = (x \cos n\theta - y\sin n\theta) + \text{i} (x \sin n\theta + y\cos n\theta)\end{equation}
这也就是意味着,通过
\begin{equation}\begin{pmatrix}x \\ y\end{pmatrix}
\to
\begin{pmatrix}x \cos n\theta - y\sin n\theta \\ x \sin n\theta + y\cos n\theta
\end{pmatrix} = \begin{pmatrix}x \\ y
\end{pmatrix}\cos n\theta + \begin{pmatrix}-y \\ x
\end{pmatrix}\sin n\theta\end{equation}
来赋予$[x, y]$绝对位置信息,那么在Attention运算的时候也等价于相对位置编码。如果是多于二维的向量,可以考虑每两维为一组进行同样的运算,每一组的$\theta$可以不一样。
这样一来,我们得到了一种融绝对位置与相对位置于一体的位置编码方案,从形式上看它有点像乘性的绝对位置编码,通过在$\boldsymbol{q},\boldsymbol{k}$中施行该位置编码,那么效果就等价于相对位置编码,而如果还需要显式的绝对位置信息,则可以同时在$\boldsymbol{v}$上也施行这种位置编码。总的来说,我们通过绝对位置的操作,可以达到绝对位置的效果,也能达到相对位置的效果,初步实验显示它是可以work的,但还没有充分验证,欢迎大家尝试交流。
文章内容小结 #
本文汇总了一些位置编码的工作,大体分为绝对式、相对式、非套路式三种,从中我们可以看到各种神奇的操作。最后,笔者分享了自己构思的一种融合绝对位置与相对位置的编码方案,供有兴趣的读者参考。
转载到请包括本文地址:https://spaces.ac.cn/archives/8130
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Feb. 03, 2021). 《让研究人员绞尽脑汁的Transformer位置编码 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/8130
@online{kexuefm-8130,
title={让研究人员绞尽脑汁的Transformer位置编码},
author={苏剑林},
year={2021},
month={Feb},
url={\url{https://spaces.ac.cn/archives/8130}},
}
February 3rd, 2021
目前有这些不同position embedding的效果对比实验么
有论文的都有它们自己的评测结果,而且既然发了论文说明它们在某些方面都会有一定的优势,至于统一的比较,目前还没看到~
February 5th, 2021
以前读transformer-xl论文的时候,就感觉transformer-xl的相对位置编码老有点怪怪的味道,不符合自己的直觉。当时就想到了DeBERTa式的结构,看来每个人的脑洞都不太一样。感谢苏神的分享。
February 19th, 2021
我覺得,從物理的角度看,「加性位置編碼」確實是很奇怪的。因為在物理上,可以相加代表單位因次相同,不同單位因次的物理量相加是沒有意義的。所以,如果說輸入$x$的單位是「字」,而位置向量$p$的單位是「字的位置」,兩者應該是不同物理量,不能相加的。
而「乘性位置編碼」是比較有物理意義的。例如在量子力學中,你可以對一個粒子乘上一個複數代表「相位」,根據每個粒子不同的相位,將粒子「相加」起來後,就會產生建設性或破壞性干涉的結果。
但是,由於attention操作本身就是把輸入兩兩相乘,當把位置向量用加的加到輸入的時候,經過attention的相乘操作,還是會產生類似「相位」的效果,就如上面的式 $(7)$ 展開的結果:
$$\boldsymbol{q}_i \boldsymbol{k}_j^{\top} = \boldsymbol{x}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + \boldsymbol{x}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{p}_j^{\top} + \boldsymbol{p}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + \boldsymbol{p}_i \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{p}_j^{\top}$$
其中的第 $2$, $3$項可以看成是$x_i$乘上了相位資訊,只是這裡並非自己的相位($p_i$),而是對方的相位($p_j$)。
而若將式 $(8)$ 的 1,3 項 2,4 合併後,可以整理成下式:
$$(\boldsymbol{x}_i + \color{red}{\boldsymbol{u}}) \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\boldsymbol{x}_j^{\top} + (\boldsymbol{x}_i + \color{red}{\boldsymbol{v}}) \boldsymbol{W}_Q \boldsymbol{W}_K^{\top}\color{green}{\boldsymbol{R}_{i-j}^{\top}}$$
這樣可以把$(\boldsymbol{x}_i + \color{red}{\boldsymbol{u}})$ 看成是 $x_j$ 的相位資訊(受$x_i$影響),而$(\boldsymbol{x}_i + \color{red}{\boldsymbol{v}})$ 看成是$x_i$跟$x_j$的相對向量 $x_{i-j}$,乘上它的相對相位資訊$R_{i-j}$
而式$(12)$ 就是更加一般化的形式了,直接把每個輸入$x$的相位寫到了虛數的定義中,而且不同的維度還有各自獨立的相位頻率$\omega$及相位角$\theta$。
而你的式$(15)$ 就是一種簡化版的做法,這裡你的假設是相位角都是0 (注意,式$(15)$的$\theta$跟式$(12)$ 的$\theta$ 意義並不相同,容易造成混淆),而且對每個維度的影響都一樣。因此,就有可能發生任何兩個輸入$x$只要在某個特定位置的情況下,結果會是0。(例如: 當 $(m-n)\theta = \frac{n}{2}\pi, n \in N $ 時)
我認為可以這樣改進:乘上一個跟輸入$x$及位置$p$相關的相位頻率 $f(x, p)$,結果變成 $\boldsymbol{q}_m,\boldsymbol{k}_n$ 分別乘以 $e^{\text{i}m f(\boldsymbol{q}_m, m)},e^{\text{i}n f(\boldsymbol{k}_n, n)}$得到$\boldsymbol{q}_m e^{\text{i}m f(\boldsymbol{q}_m, m)}, \boldsymbol{k}_n e^{\text{i}nf(\boldsymbol{k}_n, n)}$,其中 $f(x)$ 是學習出來的,這樣式$(15)$就變成:
$$\text{Re}\left[\boldsymbol{q}_m \boldsymbol{k}_n^* e^{\text{i}(mf(\boldsymbol{q}_m, m)-nf(\boldsymbol{k}_n, n))}\right]$$
當然,這樣仍然有可能造成結果是0,但就不會只根據位置,而是會根據輸入的內容及位置來調整相位。這裡的 $mf(\boldsymbol{q}_m, m)-nf(\boldsymbol{k}_n, n)$ 可以看成是等效的相對相位差。也就是說,相位造成的影響確實跟絕對位置有關(例如,開頭的字往往特別重要),也跟字義有關(例如某些字特別不重要,所以他的影響距離非常短),兩種因素相乘得到一個等效位置,再將兩個等效位置相減得到等效位置差,做為評估任意長度文章中兩個詞的關聯性強度。
感谢你的长文评论,很有价值的意见。
我不大理解你说的“就有可能发生任何两个输入$x$只要在某个特定位置的情况下,结果会是0”会有什么负面影响?我这里的$\theta$是可学习的,理论上你说的$(m-n)\theta = \frac{n}{2}\pi, n \in N$出现概率几乎为0;然后每两维配一个$\theta$,共有$d/2$个不同的可学习的$\theta$,就算其中一个导致0,也不至于所有都导致0;最后就是“结果会是0”我也看不出有什么负面影响呀。
我设计的$(15)$跟Complex Order的$(12)$确实有一定的相似之处,但其实际意义和用法都是没啥联系的(一个是纯实数,一个是纯复数;一个是配合Attention使用,一个仅仅是为了得到带有位置信息的token向量;等等)。你的“相位”解释应该是更接近于Complex Order的思想,而我的想法很简单,就是要摆脱这些物理诠释,回归到纯实数范围内,复数只是一个推导过程的工具。
March 1st, 2021
看了您的这篇文章很有启发。 位置编码应该和处理数据密切相关,不能一概而论。我目前遇到的多维时间序列数据,数据本身就带有时间戳,这种自身就带有绝对位置信息的数据应该用绝对编码么?
我也不确定,取决于你的任务依赖于什么位置信息吧?
March 5th, 2021
请问有位置编码的代码吗
部分位置编码(不是全部)在bert4keras有实现了,可以读源码参考,剩下的可以看各自论文的源码。
April 9th, 2021
受教,感谢!
April 13th, 2021
Hi,谢谢您这篇文章的总结和分享,非常有启发性。有一个小问题,最近在读相关的paper,注意到XLNET里除了trainable的u、v向量,也把sinusoidal部分的weights改成了不同于Wk的trainable Wk,p,从而也有一定可训练的空间(XLNET paper的p5,没有公式编号)。
另外关于用RNN做位置编码,我在FLOATER那篇paper里看到了一些讨论,想请教下有没有更多相关的讨论或者测试?
谢谢~
RNN做位置编码的我自己也没测试过,不好过多评价。
April 13th, 2021
Transformer + 2维位置信息代替卷积,Transformer + 3维位置信息,代替3D卷积;
卷积是Transformer的一种特例而已,位置编码选的好,transformer可以横扫视觉领域了
这样说,倒也没毛病~
May 28th, 2021
苏神,三角函数形式的位置编码说是表达了相对位置的可能,那这难道不是相对位置编码吗
我有可能成为首富,跟我是首富,那能是一回事嘛?
August 26th, 2021
也太厉害了叭,期待能写成一篇综述
这不是已经算是综述了吗?