一、引言
一个非常朴素的直觉是:
词嵌入是语义,位置编码是词的位置。这两者本身是不同的量纲,就跟身高和体重一样,他们之间有关系,而且我们可以找到他们之间的关系,比如BMI,但是直接把身高(cm)和体重(kg)加起来,就很奇怪了。
所以在回答这个问题之前,我们必须先看看‘位置’这个信息是如何被编码的。
我们要找一个位置信息,要保证两个点
- 位置唯一,这样不会混淆
- 不能过大,不然位置的数值会把词嵌入的信息给淹没或者毫无贡献
二、正余弦编码
$$PE_{(pos,2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)$$ $$PE_{(pos,2i + 1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)$$
- $pos$:词的绝对位置,表示第几个词。
- $i$:代表编码向量的维度索引。这意味着一个位置编码向量 $PE$ 的不同维度上,应用着不同的计算方式。范围是 $d_{\text{model}}/2$ 到 $0$ 之间。
- $d_{\text{model}}$:词嵌入的维度,例如512维。
这个公式的意思可以概括为:用两个有界的函数,通过控制token在不同维度的波长,从而实现高中低维度的数值变化快慢,进而实现向量的不同维度上编码从细到粗粒度的位置信息,共同构成完整的位置表示
三、正余弦编码的特性
3.1 有界性
如果我们直接0,1,2,3,...这样持续的表示位置,很快就会出现位置的值和向量的值差距过大而失去信息。所以我们的位置必须有边界,但是又能同时表示足够的长度。
正弦和余弦函数的值域永远被限制在 [-1, 1]
之间。这就保证了位置编码永远不会因为数值过大而‘淹没’语义信息。它从数学上保证了‘位置’这个信息的‘体重’不会无限增长。
3.2 唯一性和周期性
绝对位置信息
for i in range(8):print(f'{i}的二进制是:{i:>03b}')
0的二进制是:000 1的二进制是:001 2的二进制是:010 3的二进制是:011 4的二进制是:100 5的二进制是:101 6的二进制是:110 7的二进制是:111
P = P[0, :, :].unsqueeze(0).unsqueeze(0) d2l.show_heatmaps(P, xlabel="Col (encoding dim)",ylabel='Row (position)', figsize=(3.5, 4), cmap='Blues')
相对位置信息
为什么需要cos,这涉及到这个公式的另一个特性,就是相对位置的表示能力。
除了捕获绝对位置信息之外,上述的位置编码还允许模型学习得到输入序列中相对位置信息。这是因为对于任何确定的位置偏移\(\delta\),位置\(i + \delta\)处的位置编码可以线性投影位置\(i\)处的位置编码来表示。
这种投影的数学解释是,令\(\omega_j = 1/10000^{2j/d}\),对于任何确定的位置偏移\(\delta\),\((10.6.2)\)中的任何一对\((p_{i,2j}, p_{i,2j+1})\)都可以线性投影到$(p_{i+\delta,2j}, p_{i+\delta,2j+1})$:
$ \[\begin{bmatrix} \cos(\delta\omega_j) & \sin(\delta\omega_j) \\ -\sin(\delta\omega_j) & \cos(\delta\omega_j) \end{bmatrix} \begin{bmatrix} p_{i,2j} \\ p_{i,2j+1} \end{bmatrix} = \begin{bmatrix}
\cos(\delta\omega_j)\sin(i\omega_j) + \sin(\delta\omega_j)\cos(i\omega_j) \\
-\sin(\delta\omega_j)\sin(i\omega_j) + \cos(\delta\omega_j)\cos(i\omega_j)
\end{bmatrix} \\
=
\begin{bmatrix}
\sin((i + \delta)\omega_j) \\
\cos((i + \delta)\omega_j)
\end{bmatrix} \\
=
\begin{bmatrix}
p_{i+\delta,2j} \\
p_{i+\delta,2j+1}
\end{bmatrix},
\] $
\(2 \times 2\)投影矩阵不依赖于任何位置的索引\(i\)。