背景
由于Transformer的self-attention无法捕捉token的位置顺序,所以需要对token的位置进行编码。如果直接将位置信息融入输入中,这就是绝对位置编码的一般做法,如果调整attention让他有能力辨别不同位置的token,这就是相对位置编码的一般做法。
绝对位置编码
一般来说,绝对位置编码会加入到输入中,在输入的第k个向量中加入位置向量作为自注意力的输入。
Learnable Position Embeddings
最朴素的做法就是直接将位置编码作为一个可学习的向量learnable embeddings(如随机初始化一个512token长度x768特征维度),BERT中用的就是这种。但是这种方法的缺点是没有外推性,如果token长度变化则无法处理了。
三角式(Sinusoidal Positional Encoding)
Transformer原文中使用的就是这种位置编码方式:
k是token位置,和是token特征维度上第2i和2i+1位置,d是token向量总长度。在做self-attention的时候,token之间做点积,相邻的维度乘加间可以通过三角函数公式转化为了token相对位置t的函数,从而注入了相对位置信息。
相对位置编码
相对位置编码没有完整建模每个输入的位置信息,而在算attention的时候考虑当前位置。
RoPE(Rotary Position Embedding)
RoPE的思路就是直接在q,k添加绝对位置信息,在self-attention内积后将结果变为相对位置的函数。即找到函数f(x)令内积为。
这里我们省去推理过程,直接把RoPE的结果拿上来,他的f(x)函数如下:
将复数用实矩阵表达可以转换成如下矩阵:
将情况推演至任意偶数维的RoPE可以为如下公式:
,即给位置为m的Query乘上位置编码矩阵Rm,给位置为n的Key乘上位置编码矩阵Rn,用变换后的序列做self-attention就包含了相对位置信息:
在实际代码中,Rm是稀疏矩阵,一般使用如下方式实现RoPE:
其中,和Sinusoidal的位置编码类似。
M-RoPE
在图像领域使用ViT时,如果将patch展开使用1维的位置编码,就会有一些位置编码上的不自然,如(x+1,y)(x,y+1)对于(x,y)来说应该都是相邻的位置,但是展开为1维这两个位置对于(x,y)来说并不是相邻的。这里引入一个2维的RoPE:
其与1维的区别是,RoPE-1D是特征两两一组,而RoPE-2D是四个一组,每组去乘Rx,y矩阵。
那么同样,RoPE也可以拓展到3维,这就是Qwen2-VL中使用的了,只不过这里变成了6个一组,其3个维度分别为time,height,width,如下图所示进行编码,图像则time维度数值固定,文本则time、height、width都相同。
参考资料
Transformer升级之路:2、博采众长的旋转式位置编码 - 科学空间|Scientific Spaces