WhiteDLG's

PoPE

2026-01-23 Deep Learning Positional Encoding

注意力机制的核心任务是回答两个问题:“是什么”(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 中被定义为:

$$\tilde{q}_{m,j} = \rho_{q,j} \cdot e^{i(m \cdot \theta_j)}$$

其中:

  • $\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 的内积变为:

$$\text{Score}(q_m, k_n) = \text{Re}[\tilde{q}_m^* \tilde{k}_n] = \rho_q \rho_k \cos((n - m)\theta)$$
  • $\rho_q \rho_k$:代表语义匹配度 (Semantic Match)。
  • $\cos((n - m)\theta)$:代表纯粹的位置衰减/关系 (Positional Relation)。

当需要同时看内容和位置时,如:“请关注你【左边第 3 个】位置的词,且那个词必须是【水果】”, 此时用 attention 的公式来研究。

在 PoPE 的 Attention 计算公式中,最终的得分 (Attention Score) 是这样的:

$$\text{Score} = \underbrace{(\rho_q \cdot \rho_k)}_{\text{内容匹配分}} \times \underbrace{\cos(\text{位置差})}_{\text{位置匹配分}}$$

这是一个乘积关系。这意味着,要想得到高分(被模型注意到),“内容分”和“位置分”必须同时很高。只要其中一项不行,总分就会被拉下来。(乘法关联了二者)