位置编码

位置编码

绝对位置编码

训练式

该类方法将位置编码作为可训练的参数,例如最大长度为512,编码维度为768,那么就初始化一个\(512*768\)的矩阵作为位置向量,随着训练过程更新。目前的BERT、GPT1等模型使用的就是该类编码。

对于这类方法的缺点,普遍的想法都是缺乏外推性,只能处理最大长度以内的句子,或者将超过最大长度的位置向量随机初始化,进行微调。最近有研究发现,可以通过层次分解的方法,让绝对位置编码外推到一定长度的范围。

三角式(Sinusoidal位置编码)

\[ \begin{cases}\boldsymbol{p}_{k,2\boldsymbol{i}}=\sin\left(k/10000^{2\boldsymbol{i}/\boldsymbol{d}}\right)\\\boldsymbol{p}_{k,2\boldsymbol{i}+1}=\cos\left(k/10000^{2\boldsymbol{i}/\boldsymbol{d}}\right)\end{cases} \]

其中\(\boldsymbol{p}_{k,2\boldsymbol{i}}、\boldsymbol{p}_{k,2\boldsymbol{i}+1}\)分别是位置\(k\)的位置编码向量的第\(2i、2i+1\)个分量,\(d\)是位置向量的维度。

递归式

如果在输入后先接入一层RNN,然后再输入Transformer,理论上就不需要再加入位置编码。因此,可以用RNN模型来学习一种绝对位置编码。这种基于递归模型的方法具有比较好的外推性,但是牺牲了一定的并行性,在速度方面存在一定瓶颈。代表方法有FLOATER,他提出用微分方程的方式来建模位置编码。

相对位置编码

经典式

通常认为相对位置编码是通过绝对位置编码启发得到的,对于一般的绝对位置编码的Attention: \[ \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_ja_{i,j}\boldsymbol{v}_j\end{aligned} \] 展开\(q_ik^T_j:\) \[ q_ik_j^\top=(\boldsymbol{x}_i+\boldsymbol{p}_i)\boldsymbol{W}_Q\boldsymbol{W}_K^\top(\boldsymbol{x}_j+\boldsymbol{p}_j)^\top=(\boldsymbol{x}_i\boldsymbol{W}_Q+\boldsymbol{p}_i\boldsymbol{W}_Q)\left(\boldsymbol{W}_K^\top\boldsymbol{x}_j^\top+\boldsymbol{W}_K^\top\boldsymbol{p}_j^\top\right) \] 为了引入相对位置信息,将(3)中的第一项位置部分去掉,第二项\(p_jW_k\)改为二元位置向量\(R^K_{i,j}\)​,变成: \[ a_{i,j}=softmax\left(\boldsymbol{x}_i\boldsymbol{W}_Q\left(\boldsymbol{x}_j\boldsymbol{W}_K+\boldsymbol{R}_{i,j}^K\right)^\top\right) \] 同时将\(v_j\)中的\(p_jW_v\)换成\(R^V_{i,j}\)

相对位置表示的是将依赖二元坐标\((i,j)\)的向量\(R^K_{i,j},R^V_{i,j}\),改为只依赖于相对距离\(i-j\)​,并且通常来说会进行截断,来适应不同的距离: \[ \boldsymbol{R}_{i,j}^{K}=\boldsymbol{p}_K\left[\mathrm{clip}(i-j,p_{\min},p_{\max})\right]\\\boldsymbol{R}_{i,j}^{V}=\boldsymbol{p}_V\left[\mathrm{clip}(i-j,p_{\min},p_{\max})\right] \]

XLNET式

将经典式中的\(q_ik^T_j\)​完全展开: \[ q_ik_j^\top=x_iW_QW_K^\top x_j^\top+x_iW_QW_K^\top p_j^\top+p_iW_QW_K^\top x_j^\top+p_iW_QW_K^\top p_j^\top \] 该方法直接将\(p_j\)替换成相对位置向量\(R_{i-j}\),对于两个\(p_i\),直接替换为两个可训练的向量\(u、v\): \[ \boldsymbol{x}_i\boldsymbol{W}_Q\boldsymbol{W}_K^\top\boldsymbol{x}_j^\top+\boldsymbol{x}_i\boldsymbol{W}_Q\boldsymbol{W}_K^\top R_{i-j}^\top+\boldsymbol{u}\boldsymbol{W}_Q\boldsymbol{W}_K^\top\boldsymbol{x}_j^\top+\boldsymbol{v}\boldsymbol{W}_Q\boldsymbol{W}_K^\top R_{i-j}^\top \] 该编码方式中的\(R_{i-j}\)直接使用了三角式的生成方案,由于\(R_{i-j}\)的编码空间与\(x_j\)不一定相同,所以\(R_{i-j}\)前的\(W^T_K\)换成了一个独立矩阵\(W^T_{K,R}\),将\(uW_Q和vW_Q\)直接合并成单个\(u、v\)​: \[ \boldsymbol{x}_i\boldsymbol{W}_Q\boldsymbol{W}_K^\top\boldsymbol{x}_j^\top+\boldsymbol{x}_i\boldsymbol{W}_Q\boldsymbol{W}_{K,R}^\top R_{i-j}^\top+\boldsymbol{u}\boldsymbol{W}_K^\top\boldsymbol{x}_j^\top+\boldsymbol{v}\boldsymbol{W}_{K,R}^\top R_{i-j}^\top \] 另外,\(v_j\)上的位置偏置直接去掉。

T5式

该方式思路源自(6),其中每一项的含义可以分别理解为“输入-输入”、“输入-位置”、“位置-输入”、“位置-位置”四项注意力的组合。如果我们认为输入信息与位置信息应该是独立(解耦)的,那么它们就不应该有过多的交互,所以“输入-位置”、“位置-输入”两项Attention可以删掉,\(p_iW_QW_K^\top p_j^\top\)实际上只是依赖于\((i,j)\)​的标量,可以将其作为参数进行训练,将(6)简化成: \[ x_iW_QW_K^\top\boldsymbol{x}_j^\top+\beta_{i,j} \] 简而言之,在Attention矩阵上加入了一个可训练的偏置项。而跟XLNET式一样,在\(v_j\)上的位置偏置则直接被去掉了。

DeBERTa式

DeBERTa的主要改进也是在位置编码上,同样还是从展开式(6)出发,DeBERTa刚好相反,去掉了第四项,保留了二、三项,并且替换为相对位置编码: \[ q_ik_j^\top=x_iW_QW_K^\top x_j^\top+x_iW_QW_K^\top R_{i,j}^\top+R_{j,i}W_QW_K^\top x_j^\top \] 对于\(R_{i,j}\)的设计与经典式相同。

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


位置编码
http://example.com/2024/05/05/位置编码/
作者
Z Z
发布于
2024年5月5日
许可协议