Sinusoidal 位置编码追根溯源
-
这篇文章主要是介绍自己对Google在《Attention is All You Need》中提出来的Sinusoidal位置编码
$$
\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. \tag{1}\end{equation}
$$
的新理解,其中p<em>k,2i,p</em>k,2i+1\boldsymbol{p}<em>{k,2i},\boldsymbol{p}</em>{k,2i+1}p<em>k,2i,p</em>k,2i+1分别是位置kkk的编码向量的第2i,2i+12i,2i+12i,2i+1个分量,ddd是向量维度作为位置编码的一个显式解,Google在原论文中对它的描述却寥寥无几,只是简单提及了它可以表达相对位置信息,后来知乎等平台上也出现了一些解读,它的一些特点也逐步为大家所知,但总体而言比较零散。特别是对于“它是怎么想出来的”、“非得要这个形式不可吗”等原理性问题,还没有比较好的答案。因此,本文主要围绕这些问题展开思考
泰勒展开
假设我们的模型为f(⋯ ,xm,⋯ ,xn,⋯ )f(\cdots,\boldsymbol{x}_m,\cdots,\boldsymbol{x}_n,\cdots)f(⋯,xm,⋯,xn,⋯),其中标记出来的xm,xn\boldsymbol{x}_m,\boldsymbol{x}_nxm,xn分别表示第m,nm,nm,n个输入。像Transformer这样的纯Attention模型,它是全对称的,即对于任意的m,nm,nm,n,都有
$$
\begin{equation}f(\cdots,\boldsymbol{x}_m,\cdots,\boldsymbol{x}_n,\cdots)=f(\cdots,\boldsymbol{x}_n,\cdots,\boldsymbol{x}_m,\cdots)\tag{2}\end{equation}
$$
这就是我们说Transformer无法识别位置的原因——全对称性,简单来说就是函数天然满足恒等式f(x,y)=f(y,x)f(x,y)=f(y,x)f(x,y)=f(y,x),以至于我们无法从结果上区分输入到底是[x,y][x,y][x,y]还是[y,x][y,x][y,x]换句话说,"xx你好xx"和"xx好你xx"大概率具有一样的输出,这在NLP里面显然是不合理的
因此,我们要做的事情,就是打破这种对称性,比如在每个位置都加上一个不同的编码向量:
$$
\begin{equation}\tilde{f}(\cdots,\boldsymbol{x}_m,\cdots,\boldsymbol{x}_n,\cdots)=f(\cdots,\boldsymbol{x}_m + \boldsymbol{p}_m,\cdots,\boldsymbol{x}_n + \boldsymbol{p}_n,\cdots)\tag{3}\end{equation}
$$
一般来说,只要每个位置的编码向量不同,那么这种全对称性就被打破了,即可以用f~\tilde{f}f~代替fff来处理有序的输入。但现在我们希望能进一步分析位置编码的性质,甚至得到一个显式解为了简化问题,我们先只考虑m,nm,nm,n这两个位置上的位置编码,将它视为扰动项,泰勒展开到二阶:
$$
\begin{equation}\tilde{f}\approx f + \boldsymbol{p}_m^{\top} \frac{\partial f}{\partial \boldsymbol{x}_m} + \boldsymbol{p}_n^{\top} \frac{\partial f}{\partial \boldsymbol{x}_n} + \frac{1}{2}\boldsymbol{p}_m^{\top} \frac{\partial^2 f}{\partial \boldsymbol{x}_m^2}\boldsymbol{p}_m + \frac{1}{2}\boldsymbol{p}_n^{\top} \frac{\partial^2 f}{\partial \boldsymbol{x}_n^2}\boldsymbol{p}_n + \underbrace{\boldsymbol{p}_m^{\top} \frac{\partial^2 f}{\partial \boldsymbol{x}_m \partial \boldsymbol{x}_n}\boldsymbol{p}n}{\boldsymbol{p}_m^{\top} \boldsymbol{\mathcal{H}} \boldsymbol{p}_n}\tag{4}\end{equation}
$$可以看到,第1项与位置无关,第2项到第5项都只依赖于单一位置,它们都是存粹的绝对位置信息,第6项是第一个同时包含pm,pn\boldsymbol{p}_m,\boldsymbol{p}_npm,pn的交互项,我们将它记为pm⊤Hpn\boldsymbol{p}_m^{\top} \boldsymbol{\mathcal{H}} \boldsymbol{p}_npm⊤Hpn
补充一下二元函数泰勒展开知识:
$$
f(x+h,y+k)=f(x, y)+h\frac{\partial f}{\partial x}+k\frac{\partial f}{\partial y}+\frac{1}{2!}(h\frac{\partial f}{\partial x}+k\frac{\partial f}{\partial y})^2+\cdots
$$相对位置
我们先从简单的例子入手,假设H=I\boldsymbol{\mathcal{H}}=\boldsymbol{I}H=I是单位阵,此时pm⊤Hpn=pm⊤pn=⟨pm,pn⟩\boldsymbol{p}_m^{\top} \boldsymbol{\mathcal{H}} \boldsymbol{p}_n = \boldsymbol{p}_m^{\top} \boldsymbol{p}_n = \langle\boldsymbol{p}_m, \boldsymbol{p}_n\ranglepm⊤Hpn=pm⊤pn=⟨pm,pn⟩是两个位置编码的内积,我们希望在这个简单的例子中该项表达的是相对位置信息,即存在某个函数ggg使得
$$
\begin{equation}\langle\boldsymbol{p}_m, \boldsymbol{p}_n\rangle = g(m-n)\tag{5}\end{equation}
$$
这里的pm,pn\boldsymbol{p}_m,\boldsymbol{p}_npm,pn是ddd维向量,这里我们从最简单的d=2d=2d=2入手对于2维向量,我们借助复数来推导,即将向量[x,y][x,y][x,y]视为复数x+yix+y\text{i}x+yi,根据复数乘法的运算法则,我们不难得到:
$$
\begin{equation}\langle\boldsymbol{p}_m, \boldsymbol{p}_n\rangle = \text{Re}[\boldsymbol{p}_m \boldsymbol{p}_n^]\tag{6}\end{equation}
$$
其中pn</em>\boldsymbol{p}_n^</em>pn</em>是pn\boldsymbol{p}_npn的共轭复数,Re[]\text{Re}[]Re[]代表复数的实部。举个栗子:[3,5][3,5][3,5]对应的复数为3+5i3+5\text{i}3+5i,[1,6][1,6][1,6]对应的复数为1+6i1+6\text{i}1+6i,其共轭复数为1−6i1-6\text{i}1−6i
[3,5]⋅[1,6]⊤=33[3,5]\cdot [1,6]^{\top}=33[3,5]⋅[1,6]⊤=33,而(3+5i)(1−6i)=33−13i(3+5\text{i})(1-6\text{i})=33-13\text{i}(3+5i)(1−6i)=33−13i,且Re[33−13i]=33\text{Re}[33-13\text{i}]=33Re[33−13i]=33
为了满足式(5),我们可以假设存在复数q<em>m−n\boldsymbol{q}<em>{m-n}q<em>m−n使得
$$
\begin{equation}\boldsymbol{p}m \boldsymbol{p}n^* = \boldsymbol{q}{m-n}\tag{7}\end{equation}
$$
这样两边取实部就得到了式(5)。为了求解这个方程,我们可以使用复数的指数形式,即设p<em>m=rmeiϕm,p<em>n∗=rne−iϕn,q</em>m−n=R</em>m−neiΦ</em>m−n\boldsymbol{p}<em>m=r_m e^{\text{i}\phi_m}, \boldsymbol{p}<em>n^*=r_n e^{-\text{i}\phi_n}, \boldsymbol{q}</em>{m-n}=R</em>{m-n} e^{\text{i}\Phi</em>{m-n}}p<em>m=rmeiϕm,p<em>n∗=rne−iϕn,q</em>m−n=R</em>m−neiΦ</em>m−n得到
$$
\begin{equation}r_m r_n e^{\text{i}(\phi_m - \phi_n)} = R{m-n} e^{\text{i}\Phi_{m-n}}\quad\\Rightarrow\quad \left{\begin{aligned}&r_m r_n = R_{m-n}\ & \phi_m - \phi_n=\Phi_{m-n}\end{aligned}\right.\tag{8}\end{equation}
$$这里补充一下复数的指数形式:
根据定义有复数的三角形式r(cosθ+isinθ)r(\cos\theta+\text{i}\sin\theta)r(cosθ+isinθ),又由于欧拉公式
$$
\cos\theta +\text{i}\sin\theta=e^{\text{i}\theta}
$$
上式两端同乘以$r(r>0)$,得
$$
r(\cos\theta+\text{i}\sin\theta)=re^{\text{i}\theta}
$$
这说明复数可以用指数形式reiθre^{i\theta}reiθ来表示。实际上,复数的代数形式、三角形式和指数形式之间有下面的关系
$$
a+b\text{i}=r(\cos\theta+\text{i}\sin\theta)=re^{\text{i}\theta}
$$对于第一个方程,带入n=mn=mn=m得rm2=R0r_m^2=R_0rm2=R0,即rmr_mrm是一个常数,简单起见这里设为1
对于第二个方程,带入n=0n=0n=0得ϕm−ϕ0=Φm\phi_m-\phi_0=\Phi_mϕm−ϕ0=Φm,简单起见设ϕ0=0\phi_0=0ϕ0=0,那么ϕm=Φm\phi_m=\Phi_mϕm=Φm
对于第二个方程,带入n=m−1n=m-1n=m−1(在NLP中,这个式子的含义相当于两个词的位置是相邻的)得ϕm−ϕm−1=Φ1=ϕ1\phi_m-\phi_{m-1}=\Phi_1=\phi_1ϕm−ϕm−1=Φ1=ϕ1,那么ϕm{\phi_m}ϕm只是一个等差数列,通解为mθm\thetamθ,因此我们就得到二维情形下的位置编码的解为:
$$
\begin{equation}\boldsymbol{p}_m = e^{\text{i}m\theta}\quad\Leftrightarrow\quad \boldsymbol{p}m=\begin{pmatrix}\cos m\theta \ \sin m\theta\end{pmatrix}\tag{9}\end{equation}
$$
由于内积满足线性叠加性,所以更高维的偶数维位置编码,我们可以表示为多个二维位置编码的组合:
$$
\begin{equation}\boldsymbol{p}m = \begin{pmatrix}e^{\text{i}m\theta_0} \ e^{\text{i}m\theta_1} \ \vdots \ e^{\text{i}m\theta{d/2-1}}\end{pmatrix}\quad\Leftrightarrow\quad \boldsymbol{p}m=\begin{pmatrix}\cos m\theta_0 \ \sin m\theta_0 \ \cos m\theta_1 \ \sin m\theta_1 \ \vdots \ \cos m\theta{d/2-1} \ \sin m\theta{d/2-1} \end{pmatrix}\tag{10}\end{equation}
$$
它同样满足式(5)。当然,这只能说是式(5)的一个解,但不是唯一解,对于我们来说,求出这一个简单的解就行了远程衰减
基于前面的假设,我们推导出了位置编码的形式(10),它跟标准的Sinusoidal位置编码(1)形式基本一样了,只是sin,cos\sin,\cossin,cos的位置有点不同。一般情况下,神经网络的神经元都是无序的,所以哪怕打乱各个维度,也是一种合理的位置编码,因此除了各个θi\theta_iθi没确定下来外,式(10)和式(1)并无本质区别
式(1)的选择是θi=10000−2i/d\theta_i=10000^{-2i/d}θi=10000−2i/d,这个选择有什么意义呢?事实上,这个形式有一个良好的性质:它使得随着∣m−n∣|m-n|∣m−n∣的增大,⟨pm,pn⟩\langle\boldsymbol{p}_m, \boldsymbol{p}_n\rangle⟨pm,pn⟩有着趋近于零的趋势。按照我们的直观想象,输入句子中相对距离越大的两个单词,其相关性应该越弱,因此这个性质是符合我们的直觉的。只是,明明是周期性的三角函数,为什么会呈现出衰减的趋势呢?
这的确是个神奇的现象,源于高频振荡积分的渐近趋零性。具体来说,我们将内积写为
$$
\begin{equation}\begin{aligned}
\langle\boldsymbol{p}m, \boldsymbol{p}n\rangle =&, \text{Re}\left[e^{\text{i}(m-n)\theta_0} + e^{\text{i}(m-n)\theta_1} + \cdots + e^{\text{i}(m-n)\theta{d/2-1}}\right]\
=&, \text{Re}\left[\sum{i=0}^{d/2-1}e^{\text{i}(m-n)\theta_i}\right]\
=&,\text{Re}\left[\frac{d}{2}\cdot\frac{1}{d/2}\cdot\sum_{i=0}^{d/2-1} e^{\text{i}(m-n)10000^{-i/(d/2)}}\right]\
\sim&, \frac{d}{2}\cdot\text{Re}\left[\int_0^1 e^{\text{i}(m-n)\cdot 10000^{-t}}dt\right]
\end{aligned}\tag{11}\end{equation}
$$对于式(11),将d/2d/2d/2看成一个整体nnn,于是就变为:
$$
\text{Re}\left[n\cdot\frac{1}{n}\sum_{i=0}^{n-1}e^{\text{i}(m-n)10000^{-\frac{i}{n}}}\right]
$$
根据定积分的定义,即
$$
\lim \limits_{n\to \infty} \frac{1}{n}\sum_{i=1}^{n}f(\frac{i}{n})=\int_0^1 f(x)dx
$$
于是即可推导出式(11)这样问题就变成了积分∫01ei(m−n)θtdt\int_{0}^1 e^{\text{i}(m-n)\theta_t}dt∫01ei(m−n)θtdt的渐进估计问题了。对我们来说,最直接的方法就是通过Mathematica把积分结果的图像画出来
[Theta][t_] = (1/10000)^t; f[x_] = Re[Integrate[Exp[I*x*[Theta][t]], {t, 0, 1}]]; Plot[f[x], {x, -128, 128}]
从图像中我们可以看出确实具有衰减趋势
那么问题来了,必须是θt=10000−t\theta_t=10000^{-t}θt=10000−t才能呈现出远程衰减趋势吗?当然不是。事实上,对于我们这里的场景,"几乎"每个值域在[0,1][0,1][0,1]上的单调光滑函数θt\theta_tθt,都能使得积分∫01ei(m−n)θtdt\int_0^1e^{\text{i}(m-n)\theta_t}dt∫01ei(m−n)θtdt具有渐近衰减趋势,比如幂函数θt=tα\theta_t=t^{\alpha}θt=tα。那么θt=10000−t\theta_t=10000^{-t}θt=10000−t有什么特别的吗?我们来比较一些结果(下面两张图分别是短距离和长距离时的趋势)
这样看上去,除了θt=t\theta_t=tθt=t比较异常之外(与横轴有交点),其他都没有什么明显的区分度,很难断定孰优孰劣,无非就是幂函数在短距离降的快一点,而指数函数则在长距离降的快一点。如此来看θt=10000−t\theta_t=10000^{-t}θt=10000−t也只是一个折中的选择,没有什么特殊性,要是笔者来选,多半会选θt=1000−t\theta_t=1000^{-t}θt=1000−t。还有一个方案是,直接让θi=10000−2i/d\theta_i=10000^{-2i/d}θi=10000−2i/d作为各个θi\theta_iθi的初始化值,然后将它设为可训练的,由模型自动微调,这样也不用纠结选哪个了
一般情况
前面两节中,我们展示了通过绝对位置编码来表达相对位置信息的思想,加上远程衰减的约束,可以"反推"出Sinusoidal位置编码,并且给出了关于θi\theta_iθi的其他选择。但是别忘了,到目前为止,我们的推导都是基于H=I\boldsymbol{\mathcal{H}}=\boldsymbol{I}H=I这个简单情况的,对于一般的H\boldsymbol{\mathcal{H}}H,使用上述Sinusoidal位置编码,还能具备以上的良好性质吗?
如果H\boldsymbol{\mathcal{H}}H是一个对角阵,那么上面的各个性质可以得到一定的保留,此时
$$
\begin{equation}\boldsymbol{p}m^{\top} \boldsymbol{\mathcal{H}} \boldsymbol{p}n=\sum{i=1}^{d/2} \boldsymbol{\mathcal{H}}{2i,2i} \cos m\theta_i \cos n\theta_i + \boldsymbol{\mathcal{H}}{2i+1,2i+1} \sin m\theta_i \sin n\theta_i\tag{12}\end{equation}
$$
由积化和差公式得到
$$
\begin{equation}\sum{i=1}^{d/2} \frac{1}{2}\left(\boldsymbol{\mathcal{H}}{2i,2i} + \boldsymbol{\mathcal{H}}{2i+1,2i+1}\right) \cos (m-n)\theta_i + \frac{1}{2}\left(\boldsymbol{\mathcal{H}}{2i,2i} - \boldsymbol{\mathcal{H}}{2i+1,2i+1}\right) \cos (m+n)\theta_i\tag{13}
\end{equation}
$$
可以看到它也是确实包含了相对位置m−nm-nm−n,只不过可能会多出m+nm+nm+n这一项,如果不需要它,模型可以让H<em>2i,2i=H</em>2i+1,2i+1\boldsymbol{\mathcal{H}}<em>{2i,2i} = \boldsymbol{\mathcal{H}}</em>{2i+1,2i+1}H<em>2i,2i=H</em>2i+1,2i+1来消除它。在这个特例下,我们指出的是Sinusoidal位置编码赋予了模型学习相对位置的可能,至于具体需要什么位置信息,则由模型的训练自行决定特别地,对于上式,远程衰减特性依然存在,比如第一项求和,类比前一节的近似,它相当于积分
$$
\begin{equation}\sum_{i=1}^{d/2} \frac{1}{2}\left(\boldsymbol{\mathcal{H}}{2i,2i} + \boldsymbol{\mathcal{H}}{2i+1,2i+1}\right) \cos (m-n)\theta_i \sim \int_0^1 h_t e^{\text{i}(m-n)\theta_t}dt\tag{14}\end{equation}
$$其实式(14)没有严格的推导,∼\sim∼的意思是"类比",“相当于”,就是说我们要分析∑iaibi\sum_i a_ib_i∑iaibi的性态,大致上相当于分析∫a(x)b(x)dx\int a(x)b(x)dx∫a(x)b(x)dx的性态。读者不要一味的钻牛角尖想办法证明两者相等
同样地,振荡积分的一些估计结果(参考《Oscillatory integrals》、《学习笔记3-一维振荡积分与应用》等)告诉我们,该振荡积分在比较容易达到的条件下,有∣m−n∣→∞|m-n|\to\infty∣m−n∣→∞时积分值趋于零,因此远程衰减特性是可以得到保留的
如果H\boldsymbol{\mathcal{H}}H不是对角阵,那么很遗憾,上述性质很难重现。我们只能寄望于H\boldsymbol{\mathcal{H}}H的对角线部分占了主项,这样一来上述性质还能近似保留。对角线部分占主项,意味着ddd维向量之间任意两个维度的相关性比较小,满足一定的解耦性。对于Embedding层来说,这个假设还是有一定的合理性的,笔者检验了BERT训练出来的词Embedding矩阵和位置Embedding矩阵的协方差矩阵,发现对角线元素明显比非对角线元素大,证明了对角线元素占主项这个假设有一定的合理性
问题讨论
有读者会反驳:“就算你把Sinusoidal位置编码说的无与伦比,也改变不了直接训练的位置编码比Sinusoidal位置编码效果要好的事实”,的确,有实验表明,在像BERT这样经过充分预训练的Transformer模型中,直接训练的位置编码效果是要比Sinusoidal位置编码好些,这个并不否认。本文要做的事情,只是从原理和假设出发,推导Sinusoidal位置编码为什么可以作为一个有效的手段,但并不代表它就一定是最好的位置编码方式
推导是基于一些假设的,如果推导出来的结果不够好,那么就意味着假设与实际情况不够符合。那么,对于Sinusoidal位置编码来说,问题可能出现在哪呢?我们可以逐步来反思下
第一步,泰勒展开,这个依赖于p\boldsymbol{p}p的值比较小,笔者也在BERT中做了检验,发现词Embedding的平均模长要比位置Embedding的平均模长大,这说明p\boldsymbol{p}p的值比较小在某种程度上是合理的,但是多合理也说不准,因为Embedding模长虽然更大但也并不是压倒性的
第二步,假设H\boldsymbol{\mathcal{H}}H是单位阵,因为上一节我们分析了它很可能是对角线占主项的,所以先假设单位阵也没什么太大的问题
第三步,假设通过两个绝对位置向量的内积来表达相对位置信息,这个直觉上来说是合理的,绝对位置的交互应当有能力表达一定程度的相对位置信息
最后一步,通过自动远程衰减的特性来确定θi\theta_iθi,这个本身应该也是好的,但就是这一步变数太大,因为可选的θi\theta_iθi形式太多,甚至还有可训练的θi\theta_iθi,很难挑出最合理的,因此如果说Sinusoidal位置编码不够好,这一步是最值得反思的
Reference