Transformer中的位置编码
Pure Attention Module无法捕捉位置信息,无法区分不同位置的Token,因此大致有两条选择
1.将位置信息融入到输入中,这就是一般的绝对位置编码
2.微调一下Attention结构,使得它有办法分辨不同位置的Token,这就是一般的相对位置编码
以上两种编码方式又衍生了众多变种
绝对位置编码
一般来说,绝对位置编码会加到输入中:在输入的第 $k$ 个向量 $x_k$ 中加入位置向量 $p_k$ 变为 $x_k+p_k$,其中 $p_k$ 只依赖于位置编号 $k$
三角式
论文《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}
$$
其中 $p_{k,2i},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$ 的向量组合,也就提供了表达相对位置信息的可能性
训练式
...
递归式
...
$\ $
相对位置编码
相对位置并没有完整建模每个输入的位置信息,而是在算Attention的时候考虑当前位置与被Attention的位置的相对距离,由于自然语言一般更依赖于相对位置,所以相对位置编码通常也有着优秀的表现
经典式
由Google论文《Self-Attention with Relative Position Representations》提出,一般认为,相对位置编码是由绝对位置编码启发而来,考虑一般的带绝对位置编码的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{red}{\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{red}{\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}
$$
这样一来,只需要有限个位置编码,就可以表达出任意长度的相对位置(因为进行了截断),不管 $pK,pV$ 是选择可训练式的还是三角函数式的,都可以达到处理任意长度文本的需求
$\ $
参考