1 绝对位置编码

1.1 Transformer的位置编码

加在embedding上,但是由于使用的是sin、cos 交替,可以通过线性变换矩阵得到其他位置的表示,所以可以期望他包含了相对位置的信息,而且由于三角函数有显示的生成规律,所以可以期望有外推性质

PE(Positional Encoding)为位置编码:

PE_{(t)} = \left[ \sin\left(w_0 t\right), \cos\left(w_0 t\right), \sin\left(w_1 t\right), \cos\left(w_1 t\right), \ldots, \sin\left(w_{2d_{model}-1} t\right), \cos\left(w_{2d_{model}-1} t\right) \right]

下方公式可以看出该位置编码具备周期性:

\begin{pmatrix} \sin(t+\Delta t) \\ \cos(t+\Delta t) \end{pmatrix} = \begin{pmatrix} \cos\Delta t & -\sin\Delta t \\ \sin\Delta t & \cos\Delta t \end{pmatrix} \begin{pmatrix} \sin t \\ \cos t \end{pmatrix}

image-rejt.png

但是它也是有缺点的,由于位置编码点积的无向性,它无法表示位置方向

1.2 BERT的可学习位置编码

直接将位置编码当作可训练参数,比如最大长度为512,编码维度为768,那么就初始化一个512×768的矩阵作为位置向量,让它随着训练过程更新。

对于这种训练式的绝对位置编码,一般的认为它的缺点是 没有长度外推性,即如果预训练最大长度为512的话,那么最多就只能处理长度为512的句子,再长就处理不了了。当然,也可以将超过512的位置向量随机初始化,然后继续微调

长度外推性在另一篇大模型优化篇会有介绍,以及如何解决

1.3 RNN 位置编码

递归式的绝对位置编码,input后面接一层RNN,可以用RNN学每个位置的位置编码。优点是外推、灵活,缺点是丧失并行处理性质

RNN处理数据的方式本质上是串行的,因为每个时间步的输出依赖于之前时间步的信息。这就意味着在处理序列时,无法同时计算序列中所有位置的输出。相比之下,Transformer使用自注意力机制,可以在一次计算中考虑到整个序列的所有位置,因此可以并行计算所有位置的输出。

2 相对位置编码

2.1 Relative Position Representation

先对attention公式中的query和key列向量进行拆分,

q_i k_j^T=(x_i +p_i)W_Q W_K^T(x_j +p_j)^T =(x_i W_Q +p_i W_Q)(W_K^T x_j^T +W_K^T p_j^T)
a_{i,j} =softmax(q_i k_j^T)
o_i =\sum_j a_{i,j} v_j = \sum_j a_{i,j}(x_j W_V+p_j W_V)

x_i, p_i 分别为输入embedding和位置编码,
W_Q, W_K 分别为query和key的投影矩阵,同时展开output部分,
W_V 为value的投影矩阵

为了引入相对位置信息,Google将第一项位置(p_ip_i W_Q )去掉,第二项 W_K^T p_j^T 改为二元位置向量 R_{i,j}^K,同时对output部分也改动得到下面的形式

a_{i,j} =softmax(x_i W_Q (x_j W_K + R_{i,j}^K )^\top )
o_i =\sum_j a_{i,j} v_j = \sum_j a_{i,j}(x_j W_V + R_{i,j}^V)

二元相对位置向量只依赖于相对位置,而且通常会进行截断处理,这样只需要有限个位置编码(不管是三角函数式还是训练式),都可以表达出任意长度的相对位置

R_{i,j}^K=p_K[clip(i-j,p_{min},p_{max})]
R_{i,j}^V=p_V[clip(i-j,p_{min},p_{max})]

clip(i-j,p_{min},p_{max}) 为i,j位置之间的,并且截断限制在min,max区间

2.2 XLNET式的位置编码

源自于Transformer-XL论文,继续对attention公式进行完全展开

q_i k_j^\top=x_i W_Q W_K^\top x_j^\top+x_i W_Q W_K^\top p_j^\top+p_i W_Q W_K^\top x_j^\top+p_i W_Q W_K^\top p_j^\top

Transformer-XL的做法很简单,直接将 p_j 替换为相对位置向量 R_{i-j},至于两个 p_i,则干脆替换为两个可训练的向量 u,v

x_i W_Q W_K^\top x_j^\top+x_i W_Q W_K^\top R_{i-j}^\top+uW_Q W_K^\top x_j^\top+vW_Q W_K^\top R_{i-j}^\top

该编码方式中的相对位置向量没有像经典模型那样进行截断,而是直接用了Sinusoidal式的生成方案,由于 R_{i-j} 的编码空间与 x_j 不一定相同,所以前面的 W_K^\top 换了另一个独立的矩阵 W_{K,R}^\top,还有 uW_Q,vW_Q 可以直接合并为单个 u,v,所以最终使用的式子是:

x_i W_Q W_K^\top x_j^\top+x_i W_Q W_{K,R}^\top R_{i-j}^\top+uW_K^\top x_j^\top+vW_{K,R}^\top R_{i-j}^\top

此外,v_j 上的位置偏置就直接去掉了,即直接令 o_i =\sum_j a_{i,j} x_j W_V。似乎从这个工作开始,后面的相对位置编码都只加到Attention矩阵上去,而不加到 v_j 上去了。

2.3 T5式的位置编码

T5模型里边用到了一种更简单的相对位置编码。思路依然源自之前的展开式,如果非要分析每一项的含义,那么可以分别理解为“输入-输入”、“输入-位置”、“位置-输入”、“位置-位置”四项注意力的组合。如果认为输入信息与位置信息应该是独立(解耦)的,那么它们就不应该有过多的交互,所以“输入-位置”、“位置-输入”两项Attention可以删掉,而 p_i W_Q W_K^\top p_j^\top 实际上只是一个只依赖于 (i,j) 的标量,我们可以直接将它作为参数训练出来,即简化为:

x_i W_Q W_K^\top x_j^\top+\beta_{i,j}

该方法仅仅是在Attention矩阵的基础上加一个可训练的偏置项,包含同样的思想的还有微软在ICLR 2021的论文《Rethinking Positional Encoding in Language Pre-training》中提出的TUPE位置编码,T5对相对位置进行了一个“分桶”处理,即相对位置是 i-j 的位置实际上对应的是 f(i-j) 位置,映射关系如下:

image-krdy.png

这种分桶思路其实就是距离越近分配的位置越精细,越远的位置共享一个“桶”。

2.4 DeBERTa的位置编码

同样还是从 q_{i,k}^j 展开式出发,T5干脆去掉了第2、3项,只保留第4项并替换为相对位置编码,而DeBERTa则刚刚相反,扔掉了第4项,保留第2、3项并替换为相对位置编码:

q_{i,k}^j =x_i W_Q W_K^T x_k^j +x_i W_Q W_K^T R_{i,j}^k +R_{j,i}^k x_i W_Q W_K^T x_k^j

DeBERTa提供了使用相对位置和绝对位置编码的一个新视角,它指出NLP的大多数任务可能都只需要相对位置信息,但确实有些场景下绝对位置信息更有帮助,于是它将整个模型分为两部分来理解。以Base版的MLM预训练模型为例,它一共有13层,前11层只是用相对位置编码,这部分称为Encoder,后面2层加入绝对位置信息,这部分它称之为Decoder,还弄了个简称EMD(Enhanced Mask Decoder);至于下游任务的微调截断,则是使用前11层的Encoder加上1层的Decoder来进行 (需要注意的是他这里命名的encoder和decoder不是传统意义的,不要混淆了)

3 RoPE和ALiBi

3.1RoPE

旋转式位置编码 Rotary Position Embedding,通过绝对位置编码的方式实现相对位置编码,综合了绝对位置编码和相对位置编码的优点。主要就是对attention中的q, k向量注入了绝对位置信息,然后用更新的q,k向量做attention中的内积就会引入相对位置信息了。RoPE广泛应用在目前的大模型生态中。

二维情况下,对于向量q用复数表示的RoPE如下所示:

f(q_m,m) = R_m(f(q_m,m))e^{i\theta(q_m,m)} = \|q_m\|e^{i(\theta(q_m)+m\theta)} = qe^{im\theta}

根据复数乘法的几何意义,该变换实际上对应着向量的旋转,所以称之为“旋转式位置编码”,它还可以写成矩阵形式:

f(q_m,m)=\begin{pmatrix} \cos m\theta & \sin m\theta \\ -\sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} q_0 \\ q_1 \end{pmatrix}

由于内积满足线性叠加性,因此任意偶数维的RoPE,都可以表示为二维情形的拼接,即

R_m\begin{pmatrix} \cos m\theta & \sin m\theta & 0 & 0 & \cdots & 0 & 0 \\ -\sin m\theta & \cos m\theta & 0 & 0 & \cdots & 0 & 0 \\ 0 & 0 & \cos m\theta & \sin m\theta & \cdots & 0 & 0 \\ 0 & 0 & -\sin m\theta & \cos m\theta & \cdots & 0 & 0 \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & 0 & \cdots & \cos m\theta & \sin m\theta \\ 0 & 0 & 0 & 0 & \cdots & -\sin m\theta & \cos m\theta \\ \end{pmatrix} \begin{pmatrix} q_0 \\ q_1 \\ q_2 \\ q_3 \\ \vdots \\ q_{d-2} \\ q_{d-1} \end{pmatrix}

也就是说,给位置为m的向量q乘上矩阵R_m、位置为n的向量k乘上矩阵R_n,用变换后的QK序列做Attention,那么Attention就自动包含相对位置信息了,因为成立恒等式:

(R_m q)^T (R_n k) = q^T R_m^T R_n k = q^T R_{m-n} k

R_m R_n 本来是绝对位置信息,但是由于旋转矩阵的这一性质: R_m^T R_n = R_{m-n} ,意味着具备相对位置信息

值得指出的是,R_m是一个正交矩阵,它不会改变向量的模长,因此通常来说它不会改变原模型的稳定性。

image-zzll.png

3.2 ALiBi

ALIBI所做的改动非常简单,只是在Softmax之前,将Attention的计算从

q_m^T k_n

改为

q_m^T k_n - \lambda|m-n|

其中,\lambda > 0是超参数,每个head可以设置不同的值。从这个定义就可以看出ALIBI跟局部注意力的相似之处了,两者都是在Softmax之前减去一个非负矩阵,只不过被减去的非负矩阵有所不同。ALIBI可以看成是局部注意力的“平滑版”。

这意味着,在计算注意力分数时,ALIBI通过引入与位置差相关的偏置项来鼓励模型关注更近邻的位置,而这种做法相比直接限制注意力范围的方式更加灵活和平滑。这种方法允许模型在不增加计算复杂度的情况下,自然地倾向于局部依赖性,同时保留全局信息交互的能力。

image-skiy.png