位置编码的核心作用主要是为了将位置信息编码进序列之中,从而建模token 与 token 之间的位置关系。
为了建模相应的位置关系,一个自然的想法就是给每一个 token 构造一个位置向量 PE(p)∈Rdmodel ,即将
zp=xp+PE(p)
送入 Transformer 中。
1 sinusoidal PE 正弦编码
1.1 位置表示的需求性质
我们希望位置表示至少具有几个性质:
- 不同位置应该可区分
- 应该能表达相应位置
- 对于不同尺度的序列长度都有表示能力
- 数值范围尽量稳定,即利于神经网络学习建模相应的位置关系
在引入 sinusoidal PE 前,我们可以先考虑一些简单的例子,例如
PE(p)=[p,p,…,p]
这个位置编码显然不符合稳定的数值范围的要求,而且不容易表达相应的尺度结构。
再比如 One-hot 编码,以 p=3 的情形为例
PE(3)=[0,0,1,0,…]
然而,此种编码难以反映出相对的位置关系,对于 x=y ,
PE(x)⋅PE(y)=0
换言之,one-hot 编码缺乏天然的距离结构。
1.2 sinusoidal PE 的推导
一个简单的想法是从数值稳定的正弦函数开始,例如
PE(p)=sin(ωp)
然而,sin(ωp) 是周期函数,也就是说一个正弦函数无法表示唯一位置。那么很自然的想法就是考虑采用多个频率不同的正弦波来表示一个位置,我们可以构造
PE(p)=[sin(ω0p),cos(ω0p),sin(ω1p),cos(ω1p),…]
其中,ωi=10000−2i/dmodel .
对于 sinusoidal PE 最重要的关键点在于不同的频率有利于分别建模不同的距离关系——对于短波有利于捕获局部的位置关系,对于长波有利于捕获长距离的位置关系。
sinusoidal PE 的频率按照几何级数排列,相邻波长满足
λiλi+1=100002/dmodel
为常数,此种安排使得位置编码能够覆盖不同数量级的编码,具有相对更加高效的尺度。
1.3 sinusoidal PE 对于相对位置关系的捕获
我们考虑位置 p→p+k 的情形
[sin(ω(p+k))cos(ω(p+k))]=[cos(ωk)−sin(ωk)sin(ωk)cos(ωk)][sin(ωp)cos(ωp)]
并记为
PEi(p+k)=Ri(k)PEi(p)
一方面,我们可以发现正弦波与余弦波对于相对位置关系的建模是必要的(从另一个角度理解,只有当一个位置的正弦和余弦同时确定时我们才可以在单位圆上确定该位置的唯一位置);另一方面,对于固定的 k 始终对应同样的旋转结构 Ri(k) ,为相对位置提供了非常规整的数学结构。
更进一步的,我们取两个位置
PEi(p)=[sin(ωip),cos(ωip)],PEi(q)=[sin(ωiq),cos(ωiq)].
两者点积
PEi(p)⋅PEi(q)=sin(ωip)sin(ωiq)+cos(ωip)cos(ωiq)=cos(ωi(p−q))
结果只与 p , q 的相对距离关系有关。