[控场AI]
· 10 分钟阅读· 5,232 字

RoPE衰减曲线是噪声:取绝对值也无法修复

RoPE衰减曲线是噪声:取绝对值也无法修复

RoPE的注意力衰减曲线实为采样噪声,根因是固定向量的相位退相干,而非随机pair的幅度衰减。

本文拆解了关于旋转位置编码(RoPE)的三个常见理解偏差。首先,随机向量对的点积期望在任何距离都为零,直接绘制的衰减曲线只是采样噪声;真正的“衰减”来自固定向量对自身在不同距离上的相位退相干,绝对值均值几乎不变,因此取绝对值无法修复。其次,邻近LCG种子会产生高度相关的随机序列,曾让实验均值从±0.38漂移到±2.5,是错误测量的直接来源。最后,在长度外推中,最先失效的是最慢频率对(训练时仅扫过2.6%圈),NTK缩放能将其拉回训练相位,但对最快频率对完全无效;位置插值则对所有频率一视同仁地降速,代价是短程分辨率被压缩。验证器采用复数乘法、矩阵正交性检验与独立极坐标采样器交叉验证,226条断言全部通过。

旋转位置编码(RoPE)在Transformer中被广泛使用:它把每个token的绝对位置注入query和key,而任意两个token的注意力分数却只取决于它们之间的距离。把一整句话整体向后移动十个token,句子内部的分数完全不变。这个反直觉的性质是RoPE的核心卖点,也是许多人误读它的起点。

本文基于一篇交互式技术博客的完整推导、实验数据与验证过程,拆解三个常见的理解偏差:衰减曲线为何是噪声、取绝对值为何救不回来、以及NTK缩放为何碰不到最快的那个频率对。原文提供了一个可在浏览器中直接运行的演示页面,所有结论都配有可复现的代码。

一行恒等式:绝对位置只以差值出现

把位置 m 处的query二维分量写成复数 q,位置 n 处的key写成 k。RoPE的做法是分别乘以 e^(imθ) 和 e^(inθ),于是:

Re[ (q·e^(imθ)) · conj(k·e^(inθ)) ] = Re[ q·conj(k)·e^(i(m−n)θ) ]

绝对位置只在指数里以 (m−n) 的形式残留。原文在42组offset与shift组合上做了验证,其中shift最大到4000,最大偏差为1e−15,属于浮点误差级别。作为对照,可加性正弦位置编码在相同offset、不同绝对位置下会给出不同的分数——这正说明RoPE的“相对性”并非所有位置编码都具备。

原站还给出了一个极简的JavaScript实现,通过成对旋转把每个二维分量按 pos·θ 转动,逻辑上就是上面的复数乘法展开成实数形式。

RoPE衰减曲线分析来源

可加性正弦位置编码(additive sinusoidal positional encoding)是Transformer原论文采用的位置编码方案,由Vaswani等人在2017年提出。它的做法是把位置的正弦、余弦值直接加到输入词嵌入上:PE(pos, 2i) = sin(pos / 10000^(2i/d)),PE(pos, 2i+1) = cos(pos / 10000^(2i/d))。这种编码把位置信息作为信号叠加进token表示,后续每层注意力都会重新接触这些已编码的绝对位置。与RoPE的关键差异在于:RoPE把位置旋转作用于query/key的相位,从而在点积中自然消去绝对量,只留下相对差值;而可加性编码在点积展开后会残留与绝对位置相关的交叉项,因此同一对token在不同绝对位置下会得到不同分数,不具备RoPE那种精确的相对性。

**相位退相干(dephasing)**借自量子力学,描述一组相干振荡因频率不同而逐渐失去相位对齐的过程。在RoPE中,固定向量对自身在不同距离处的点积可以看作一组不同频率分量 cos((m−n)θᵢ) 的加权和。随着距离增大,各分量的相位差变得分散,正负项互相抵消,总和的期望幅度下降——这就是“衰减”的真实来源。它不是向量长度或注意力幅度的衰减,而是相位对齐程度的退化,因此取绝对值等只看幅度的手段无法捕捉或恢复这一现象。

衰减曲线为什么是噪声

流传最广的说法是“RoPE下的注意力随距离衰减”。但如果直接把每对token的注意力分数对距离作图,你会得到一条随机散点组成的平线,而不是一条下降曲线。原因很朴素:两个独立随机向量的期望点积在任何距离上都是零。你画出来的所谓曲线,采样的其实是噪声。

原文用一张三列对照表把这个问题摊开:固定同一批向量、同一批offset,分别看“与自身比较”“600对随机pair的原始分数均值”“同一批pair的绝对值均值”。

offsetq与自身比较原始分数均值(600对)|分数|均值
010.60−0.073.17
168.05−0.373.12
2564.95−0.283.04
10240.69−0.383.02

三列数据指向同一个事实:原始分数均值始终没离开±0.38,而典型量级是3.2;绝对值均值在整个距离范围内只动了4%。真正塌缩的只有“与自身比较”那一列。

这才是人们口中“衰减”的真实含义:固定向量对自身在不同距离上的相位逐渐错开,余弦相互抵消。它是相位退相干(dephasing),不是幅度衰减(attenuation)。用随机向量去测,等于把信号本身丢掉了。

取绝对值为什么救不回来

发现原始均值为零之后,常见的补救是改看幅度。上表第三列已经给出答案:绝对值均值在offset=0到1024之间仅从3.17滑到3.02。如果存在随距离衰减的机制,这里应该有单调且显著的下降,但实际变化幅度落在噪声量级。

原因在于绝对值损失了相位方向信息,两个相位完全反相的向量和一个同相向量在幅度上无法区分,而衰减恰恰是一种相位现象。

“距离衰减”是对固定向量自身相似度的描述,不是对随机pair注意力权重的统计规律。混淆这两者,是大多数错误测量的源头。

那个制造错误测量的随机数bug

原文坦白了一个更隐蔽的坑。最初每个“随机”向量都由一个独立的Park-Miller生成器产生,种子取自邻近的整数。问题在于:邻近的LCG种子会产生高度相关的序列。

后果是,本该独立、均值为零的样本,其均值竟然漂移到±2.5——比标准误高出一个数量级,看上去像极了某种真实结构。换成整个实验共用一个生成器后,均值立刻回到±0.38。

教训很直接:如果你的“独立样本”来自 rng(seed + i),它们并不独立。这在做数值实验时是高频陷阱,尤其容易在小样本或序列相关性未检验时被忽略。

Park-Miller生成器(也称最小标准LCG)是一种线性同余伪随机数生成器:xₙ₊₁ = (16807 · xₙ) mod (2³¹ − 1)。它实现简单、速度快,但存在一个致命弱点:当种子值本身很接近时,生成的序列在前若干项中会保持高度相关。这是因为LCG本质上是在模数空间里做固定步长的乘法跳跃,邻近种子的初始轨迹会成簇移动,直到经过足够多步后才会混洗开。

**LCG(线性同余生成器)**的行为可以这样理解:所有输出都由状态乘以常数再取模产生,因此状态空间中邻近的点在短期内会保持邻近的“几何”关系。更糟的是,LCG的低位比特周期极短,如果直接取 xₙ mod 小整数 作为随机数,会暴露出明显的周期结构。

在数值实验中,用 rng(seed + i) 为每个样本单独播种,等价于让相邻样本从几乎相同的初始条件出发,输出序列因此高度相关。这会让本应独立的样本平均值的方差被人为压低或抬高,均值漂移出标准误范围,看起来像是发现了某种“真实结构”。正确做法是整个实验共用一个生成器顺序采样,或用Marsaglia极坐标法等从多个种子输出中二次混合的方法,避免种子间相关性污染样本独立性。

NTK缩放碰不到最快的那一对

另一个常见困惑来自长度外推:训练到512,推理问4096,到底哪个频率对出问题?直觉会怪“转得太快”的高频对,但它们在训练窗口内早就反复绕圈了,再多转二十圈并不新鲜。

真正离开熟悉区域的是最慢的那一对。它的周期比整个上下文还长,训练全程只扫过2.6%圈;位置放大八倍后,它才第一次进入训练中从未出现过的角度区间。

策略最慢对的相位角说明
训练时,位置5120.162 rad模型见过的
不处理,位置40961.295 rad超出训练分布8倍
位置插值0.162 rad精确回到训练点
NTK-aware base0.162 rad精确回到训练点

两种修复手段在最慢端把它送回了同一位置,差别出现在最快端:θ₀ = base⁰ = 1,无论怎么调base都不变,所以NTK缩放根本无法减慢最快的那一对频率;而位置插值对所有频率一视同仁地降速,代价是相邻token之间的分辨率被压缩。

这也解释了为什么两种方法在不同任务上表现各异:它们处理高频与低频的方式并不等价。

Neural Tangent Kernel(NTK)理论由Jacot等人在2018年提出,指出无限宽神经网络在梯度下降训练下的演化可以等价为一个核方法,其核函数由网络初始化时的雅可比矩阵决定。在位置编码外推的语境中,“NTK-aware”这个术语被借用并改造:它并非直接使用原始NTK,而是借用了“不同频率分量应当以不同速度调整”这一直觉。

RoPE的每个频率维度 θᵢ = base^(−2i/d) 对应一个旋转速度。训练时,低频维度转得慢、在窗口内覆盖不到一个完整周期;高频维度转得快、反复绕圈。当推理长度扩展时,低频维度首次进入训练中未见过的相位区间,是外推失败的主因。原始NTK理论中的“谱偏置”告诉我们,神经网络倾向于先学习低频函数——这为“低频维度更需要在长度外推时被保护”提供了理论背景。NTK-aware缩放因此选择增大base值(如从10000提到1000000),让所有频率的周期整体变长,从而在保持高频旋转不变的前提下,把低频维度拉回训练过的相位。但正如原文指出的,最快频率 θ₀ = base⁰ = 1 完全不随base变化,因此NTK缩放对其毫无作用,它的调控能力集中在低频端。

**位置插值(Position Interpolation)**则采取另一种思路:不改变base,而是把推理位置索引整体压缩,例如把4096映射回512以内的范围。这样每个频率的相位都按同一比例缩小,所有频率都被“减速”,相邻token的相位差被均匀压缩。代价是模型在短距离上区分token位置的分辨率下降,可能损害短程依赖的建模。两者在高频与低频处理上的不对称,正是它们在不同任务上表现差异的根源。

验证方法与几个关键结论

原文的验证器做了三件事:用复数乘法而非实数2×2形式计算;把旋转提取为矩阵并检验 RᵀR = I 且 det = +1;用Marsaglia极坐标采样器重新测量衰减,避免页面自身生成器的bug在验证中复现。这套交叉检查甚至抓出了作者闭式解中的一个符号错误——sin项上本该是 − 却写成了 +。

最终结果是226条验证断言、28项页内检查、0失败。

把整条线索收束起来:

  • RoPE的绝对位置只以差值出现,42组测试最大偏差1e−15,这是它的数学根基。
  • 随机向量对的注意力分数在任何距离期望为零,直接作图得到的是噪声;“衰减”描述的是固定向量自身的相位退相干。
  • 取绝对值无法恢复衰减信号,因为相位方向信息已丢失。
  • 邻近LCG种子导致的样本相关性,能把均值从±0.38推到±2.5,是最初错误测量的直接原因。
  • 长度外推最先出问题的是最慢频率对(训练时仅扫过2.6%圈),NTK缩放对其有效,但对最快频率对完全无能为力。

下次再看到一条平滑的“RoPE衰减曲线”,先确认它的采样对象是固定向量还是随机pair,以及随机数生成器有没有共用。这两点,决定了你看到的是物理规律还是采样噪声。

Marsaglia极坐标采样器是一种生成标准正态分布随机数的经典方法。它从单位圆内均匀采样一个点 (u, v),丢弃圆外及零点的样本,然后令 s = u² + v²,输出 z₁ = u · √(−2 ln s / s) 和 z₂ = v · √(−2 ln s / s)。这两个输出相互独立且服从标准正态分布。

相比Box-Muller方法(从极坐标角度和半径出发),Marsaglia方法避免了三角函数计算,速度更快,且数值稳定性更好,因为它直接利用圆内均匀采样的几何性质来构造正态分布。在原文的验证器中,使用Marsaglia极坐标采样器重新测量衰减,目的是绕开页面自身生成器可能存在的LCG种子相关性问题,用完全不同且经过充分检验的随机数生成机制来交叉验证衰减数据的真实性。如果两次独立实现给出了相同的统计结论,说明原先观察到的现象不是特定生成器的假象。这一做法体现了数值实验中的一条原则:关键结论应当在独立实现路径上复现,而不是仅在同一套可能有缺陷的工具链内自洽。

#RoPE#旋转位置编码#注意力衰减#NTK缩放#位置插值#相位退相干#Transformer位置编码#长度外推
分享:

相关推荐