旋转位置编码

旋转位置编码的核心诉求就是需要让 embedding 同时体现出相似度相对位置这两个信息

RoPE(Q,i),RoPE(K,j)=PosSim(QKT,ji) \lang\text{RoPE}(Q,i), \text{RoPE}(K,j)\rang=\text{PosSim}(QK^T,j-i)

我们先考虑如果 Q,KQ,K 都只是二维向量,即

Q=[ab],K=[cd] Q=\begin{bmatrix}a\\ b\end{bmatrix}, K=\begin{bmatrix}c\\ d\end{bmatrix}

那么通常的 Scaled Dot Product Attention 的计算结果应为 QKT=ac+bdQK^T=ac+bd,考虑写成复数的话,令 cq=a+bi,ck=c+dic_q=a+bi,c_k=c+di,且 ckc_k 的共轭为 ckc_k^\ast,则有 q,k=[cqck]\lang q,k \rang=\Re[c_qc_k^\ast],其中 [c]\Re[c] (Latex Code: \real) 表示 cc 的实数部分,[c]\Im[c] 表示 cc 的虚数部分 (Latex Code: \image)。

我们假设 RoPE(x,i)\text{RoPE}(x,i) 可以表示为复数形式,即 RoPE(x,i)=ax+bxi=Rxeiθ(x,i)\text{RoPE}(x,i)=a_x+b_xi=R_x e^{i\theta(x,i)},这里第二个等号是复数的指数表示法。

RoPE
RoPE

虽然论文里是要求对 xm2ix_m^{2i}xm2i+1x_m^{2i+1} 加上 cos,sin\cos,\sin 的 embedding,不过从数学的角度来说,这里的配对实际上不影响最终的结果,“不同的配对方式本质上不影响模型的表达能力,并且可以相互转化”。因此在工程上,考虑到内存连续性,我们通常不用这种相邻配对,而是 xix^{i}xi+d/2x^{i+d/2} 进行配对计算。