RoPE(Rotary Positional Embedding,旋转位置编码)是现代大模型(如 Llama, Mistral)的标配。它的核心逻辑是将位置信息编码为旋转矩阵,通过旋转向量来表示相对位置。
RoPE 实现细节
1. 从向量 到
在 Transformer 中,我们首先将输入向量 (位置为 )通过线性变换得到 Query 和 Key:
为了引入位置信息,RoPE 不再使用加法(如 BERT 的 ),而是对 和 进行一个依赖于位置 的变换 。
2. 旋转不改变点积的原理
RoPE 的核心设计目标是:两个向量的点积仅取决于它们的相对距离 。
我们希望寻找一个变换 ,使得:
在二维空间中,这个变换可以看作是将向量旋转一个角度 。假设 是一个复数,旋转操作可以表示为:
证明点积不变性(针对相对位置):
根据复数性质,两个向量的点积等于一个向量与另一个向量共轭的乘积的实部:
可以看到,结果只与 有关。这意味着:旋转操作保留了向量的模长,只改变了它们之间的夹角。
3. 细节操作:高频与低频分量
在处理多维向量(维度为 )时,RoPE 将维度两两分组,每组应用不同的旋转频率 。
频率的定义
对于第 组分量(),其旋转的基础频率为:
分层的频率特性
由于 是一个指数衰减序列,不同维度的旋转速度截然不同:
| 分量类型 | 索引 i | 旋转频率 θ | 特性说明 |
|---|---|---|---|
| High Frequency (高频) | 较小 (靠近 0) | 较大 | 随着位置 的微小变化,向量旋转剧烈。对近距离位置非常敏感。 |
| Low Frequency (低频) | 较大 (靠近 ) | 极小 | 随着位置 变化,向量旋转非常缓慢。能够捕捉长距离的依赖关系。 |
4. 矩阵实现过程
在具体工程实现中,我们不会真的用复数运算,而是将其写成块对角矩阵的形式:
总结全过程:
-
输入分配:将 维向量 分成 个二维子向量。
-
频率计算:为每一对维度分配 (从高频到低频)。
-
旋转应用:
- 前几维(高频):旋转得飞快,负责编码“左右邻居”是谁。
- 后几维(低频):旋转得极慢,负责编码“在文章开头还是结尾”。
-
点积计算:在 Attention 计算时, 和 的旋转结果自动抵消了绝对位置,只留下了相对位移。

Transformer 模型在使用了 RoPE 后,能够更自然地关注“离得近”的内容,而逐渐减少对“离得远”内容的关注。
Extrapolation
在标准的 RoPE 中,位置 对应的角度是 。
- 高频分量: 很大,随着 增加,向量在单位圆上转了很多圈。模型对这些维度的感知是“精细”的。
- 低频分量: 很小,随着 增加,向量可能只转动了一个微小的角度(甚至不到 1/4 圈)。模型对这些维度的感知是“全局”的。
当我们要把上下文从 4k 扩展到 128k 时,最大的问题在于:位置 超出了训练时的范围。 如果直接让 继续增大,高频分量会转到模型从未见过的位置,导致“分布偏移(OOD, Out-of-Distribution)”,推理效果崩塌。
因此为了解决 过大的问题,有几种主流的操作思路:
从线性插值到 NTK-aware
A. 线性插值 (Linear Interpolation)
最简单的办法是“挤一挤”。如果要扩展 2 倍长度,就把所有位置 变成 。
- 代价:这会把高频分量也给“压扁”了。原本相邻的两个 token,旋转角度差变小了,模型分辨不出谁是谁,导致短文本精度下降。
B. NTK-aware (Neural Tangent Kernel) 插值 (目前的主流)
这是最聪明的办法。它的核心逻辑是:高频分量不怎么动,低频分量多挤点。
为什么这么做?
- 高频分量负责近距离细节。如果对它做大幅度插值,模型会丧失对邻近词顺序的敏感度。
- 低频分量负责长程感知。由于它转得很慢,即便稍微改变一下它的旋转频率 ,模型也能很快适应。
实现细节:改变 Base 值
RoPE 的频率公式是 。
传统的 base 是 10,000。
- 在 NTK-aware 中,我们会动态增大这个 base(比如增加到 1,000,000)。
- 根据公式,base 变大后, 会变小。
- 神奇之处:由于 在分母上,高频部分的 受 base 变化的影响较小,而低频部分的 受影响极大。这完美实现了“高频保精度,低频扩容量”。
YaRN (Yet another RoPE extension method)
YaRN 的出现,是因为人们发现仅仅靠“拉长”低频分量的周期(NTK-aware)是不够的。当上下文极度拉长时,注意力机制产生的信息密度会发生改变,导致模型“变笨”。
YaRN 做了两件非常关键的修正:分层频率处理和温度缩放(Attention Scaling)。
1. 频率分层:谁该插值,谁该外推?
在插值(Interpolation)过程中,YaRN 认为不应该对所有维度一视同仁。它引入了三个区间:
-
高频维度(精细刻度):
这些维度的旋转频率非常高。YaRN 认为这些维度不应该插值。如果强行改变它们的频率,模型会丧失对局部位置的敏锐感。
-
低频维度(粗略刻度):
这些维度转得极慢。YaRN 对它们进行完全插值(即把它们拉长,以覆盖更长的上下文)。
-
中频维度(过渡带):
为了平滑过渡,YaRN 使用一个插值系数。
逻辑:这种做法保留了高频分量的原有动态特性,确保了模型在长文本下依然能保持极强的“短程感知”能力。
2. 核心痛点:注意力熵(Entropy)的坍缩
这是 YaRN 最核心的数学修正。
在 Transformer 中,Attention 的计算公式含有 的缩放:
当你使用 RoPE 插值将上下文从 4k 扩展到 128k 时,虽然位置编码解决了,但你会发现:由于位置分布变稀疏了,平均每个 Query 对 Key 的关注度(点积的均值)会下降。
这会导致 Softmax 后的分布变得非常“平滑”或“离散”,也就是所谓的注意力熵变大。模型会觉得“到处都长得差不多”,从而丧失了聚焦核心信息的能力。
3. YaRN 的温度修正(Temperature Scaling)
为了修正这个“变平滑”的趋势,YaRN 引入了一个重缩放因子 。
它不直接修改 或 ,而是给点积结果乘上一个系数:
其中 是一个基于扩展倍数(Scale )计算出来的常数。通过这个操作,YaRN 强行把变得平滑的注意力分布重新“捏”得尖锐起来,让模型重新找回那种“精准打击”的注意力集中感。
4. 总结:YaRN 的全套“整形手术”
如果说传统的线性插值是把整把尺子强行拉长,那么 YaRN 就是:
- 保住刻度:尺子上小的毫米刻度(高频)不变,只拉大厘米和分米(低频)的间距。
- 增强对比:因为尺子变长了,看东西模糊了,所以特意戴上一副大倍率的眼镜(温度缩放 ),让视线重新聚焦。
相比于普通的 NTK-aware,YaRN 在长文本下的 Perplexity(困惑度) 表现非常丝滑。这也是为什么很多基于 Llama 社区微调的长文本模型(如 128k 甚至更长)都首选 YaRN 方案。
Question
所以如果没有低频分量的话,context length是不是就360 token就完结了?context length是跟频率的最大公约数有关吗?
如果只有单一的高频分量,模型确实会因为“分不清转了多少圈”而导致有效的上下文长度极短;但 context length 并不是简单地由最大公约数决定,而是受限于“位置编码的唯一性(Uniqueness)”。
1. 为什么 360°(或 )是道坎?
在 RoPE 中,位置编码是靠旋转角度 来识别距离的。
如果你只有一个固定频率 :
-
当相对距离 增加到使得 时,旋转角度回到了原点。
-
对于模型来说,距离为 0 的词和距离为 的词,在数学上是完全等价的。
结论:如果没有低频分量提供“大刻度”参考,模型会陷入“位置幻觉”,认为几百个 token 之外的内容就在自己身边。
2. 低频分量:打破周期的“长信使”
RoPE 之所以使用多组频率(从 到 ),本质上是构建了一个类似齿轮计数器的系统。
-
高频分量(快齿轮):负责区分位置 1 和位置 2。
-
低频分量(慢齿轮):负责区分位置 1 和位置 10000。
即使高频分量已经转了 100 圈回到原点,低频分量可能才刚刚转了 5°。模型通过组合这些维度,就能唯一地确定当前 token 的绝对位置。
类比钟表:如果只有“秒针”,你只能区分 60 秒内的差异,过了 60 秒就重置了;只有加上“分针”和“时针”(低频分量),你才能区分出一整天里的任何一个时刻。
3. Context Length 与“最大公约数”的关系?
你提到的“最大公约数”在信号处理里很接近公倍周期的概念。理论上的最大 Context Length 确实受限于所有分量共同回到原点的那个最小位置 。
但在深度学习的实际工程中,限制 context length 的往往不是这个“数学周期”,而是:
- 分辨率衰减:当 极大时,低频分量的旋转角度变化(如 )可能小于 FP16 数值的精度范围,导致模型无法分辨位置 100,000 和 100,001。
- 分布偏移:模型在训练时只见过角度在 之间的向量。当推理时角度超过这个范围,注意力机制产生的数值会超出模型“理解能力”。
4. 总结
- 如果没有低频分量:是的,模型会迅速遇到周期性坍缩,无法感知长距离。
- 关于公约数:准确来说,是频率的多样性保证了在极长距离内,没有任何两个位置的 维向量表现是完全一致的。
这也就是为什么 Llama 3 把 base 从 10,000 改成 500,000 的原因——它本质上是在“调慢”最慢的那个表盘,让它在更长的长度(128k)内都不至于转完一圈,从而保持位置的唯一性。