注意力机制的核心任务是回答两个问题:“是什么”(What,内容)和“在哪里”(Where,位置)。
RoPE 实际上将“内容”与“位置”深深地缠绕在了一起。这种缠绕限制了模型在复杂逻辑推理和长文本外推上的表现。
为此,他们提出了 PoPE(极坐标位置编码)。实验证明,PoPE 在长度外推上不仅碾压 RoPE,甚至超越了专门为此设计的 YaRN。
RoPE的问题
“内容干扰位置”
现在,回到你提到的那个任务:“关注左边第 3 个字符,无论它是啥”。
这是一个纯粹的位置逻辑任务。模型心里想:“我不需要知道你是‘苹果’还是‘香蕉’,我只需要找到离我距离为 3 的那个词。”
理想情况 vs 现实情况
理想情况下:
模型希望看到的信号是恒定的。只要距离是 3,信号(比如角度)就应该一样。
现实中 RoPE 的问题(批评的核心):
想象模型是一个试图开锁的锁匠,它要找“向左转 3 格”的位置。
情况 A:
- 句子:“猫咬狗”
- “狗”看“猫”(距离 3)。
- 位置差异提供:30°(假设距离对应 30 度)。
- 内容差异(狗 vs 猫):假设它们的语义角度差本来是 5°。
- 模型看到的总角度: $30° + 5° = 35°$
情况 B:
- 句子:“铁锤钢”
- “钢”看“铁”(距离也是 3)。
- 位置差异提供:30°(没变,因为距离还是 3)。
- 内容差异(钢 vs 铁):假设它们的语义角度差本来是 80°(因为它俩长得不像)。
- 模型看到的总角度: $30° + 80° = 110°$
模型为何“崩溃”?
模型想学一条规则:“看到 35° 就关注它”。
结果下次来了个距离一样的词,角度却变成了 110°!
问题的本质
这就是 “内容干扰位置”。
因为 RoPE 把“位置信息(旋转)”直接加到了“内容信息(原本的角度)”上。当“内容”变化剧烈时,原本清晰的“位置信号”就被淹没在内容的噪声里了。
PoPE能解决此问题
PoPE 的核心思想:极坐标解耦 (Polar Decomposition)
数学形式化
对于第 $m$ 个位置的 Token,其 Query 向量 $\mathbf{q}$ 的第 $j$ 个分量在 PoPE 中被定义为:
其中:
- $\rho_{q,j}$ 是幅值,由输入的内容通过网络层学习得到(通常使用 Softplus 等激活函数保证非负性:$\rho = \text{Softplus}(W_q x)$)。注意,这里不再包含原本内容的初始相位。
- $m \cdot \theta_j$ 是相位,完全由位置索引 $m$ 和频率 $\theta_j$ 决定,不包含任何内容的语义相位。
同理,Key 向量 $\mathbf{k}$ 定义为 $\tilde{k}_{n,j} = \rho_{k,j} \cdot e^{i(n \cdot \theta_j)}$。
Attention 计算
在此定义下,Query 和 Key 的内积变为:
- $\rho_q \rho_k$:代表语义匹配度 (Semantic Match)。
- $\cos((n - m)\theta)$:代表纯粹的位置衰减/关系 (Positional Relation)。
当需要同时看内容和位置时,如:“请关注你【左边第 3 个】位置的词,且那个词必须是【水果】”, 此时用 attention 的公式来研究。
在 PoPE 的 Attention 计算公式中,最终的得分 (Attention Score) 是这样的:
这是一个乘积关系。这意味着,要想得到高分(被模型注意到),“内容分”和“位置分”必须同时很高。只要其中一项不行,总分就会被拉下来。(乘法关联了二者)