RoPE(Rotary Positional Embedding,旋转位置编码)是现代大模型(如 Llama, Mistral)的标配。它的核心逻辑是将位置信息编码为旋转矩阵,通过旋转向量来表示相对位置。


RoPE 实现细节

1. 从向量

在 Transformer 中,我们首先将输入向量 (位置为 )通过线性变换得到 Query 和 Key:

为了引入位置信息,RoPE 不再使用加法(如 BERT 的 ),而是对 进行一个依赖于位置 的变换

2. 旋转不改变点积的原理

RoPE 的核心设计目标是:两个向量的点积仅取决于它们的相对距离

我们希望寻找一个变换 ,使得:

在二维空间中,这个变换可以看作是将向量旋转一个角度 。假设 是一个复数,旋转操作可以表示为:

证明点积不变性(针对相对位置):

根据复数性质,两个向量的点积等于一个向量与另一个向量共轭的乘积的实部:

可以看到,结果只与 有关。这意味着:旋转操作保留了向量的模长,只改变了它们之间的夹角。


3. 细节操作:高频与低频分量

在处理多维向量(维度为 )时,RoPE 将维度两两分组,每组应用不同的旋转频率

频率的定义

对于第 组分量(),其旋转的基础频率为:

分层的频率特性

由于 是一个指数衰减序列,不同维度的旋转速度截然不同:

分量类型索引 i旋转频率 θ特性说明
High Frequency (高频)较小 (靠近 0)较大随着位置 的微小变化,向量旋转剧烈。对近距离位置非常敏感。
Low Frequency (低频)较大 (靠近 )极小随着位置 变化,向量旋转非常缓慢。能够捕捉长距离的依赖关系。

4. 矩阵实现过程

在具体工程实现中,我们不会真的用复数运算,而是将其写成块对角矩阵的形式:

总结全过程:

  1. 输入分配:将 维向量 分成 个二维子向量。

  2. 频率计算:为每一对维度分配 (从高频到低频)。

  3. 旋转应用

    • 前几维(高频):旋转得飞快,负责编码“左右邻居”是谁。
    • 后几维(低频):旋转得极慢,负责编码“在文章开头还是结尾”。
  4. 点积计算:在 Attention 计算时, 的旋转结果自动抵消了绝对位置,只留下了相对位移。

Fig 1. Long-term decay of PoRE

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) 插值 (目前的主流)

这是最聪明的办法。它的核心逻辑是:高频分量不怎么动,低频分量多挤点。

为什么这么做?

  1. 高频分量负责近距离细节。如果对它做大幅度插值,模型会丧失对邻近词顺序的敏感度。
  2. 低频分量负责长程感知。由于它转得很慢,即便稍微改变一下它的旋转频率 ,模型也能很快适应。

实现细节:改变 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 认为不应该对所有维度一视同仁。它引入了三个区间:

  1. 高频维度(精细刻度)

    这些维度的旋转频率非常高。YaRN 认为这些维度不应该插值。如果强行改变它们的频率,模型会丧失对局部位置的敏锐感。

  2. 低频维度(粗略刻度)

    这些维度转得极慢。YaRN 对它们进行完全插值(即把它们拉长,以覆盖更长的上下文)。

  3. 中频维度(过渡带)

    为了平滑过渡,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 的往往不是这个“数学周期”,而是:

  1. 分辨率衰减:当 极大时,低频分量的旋转角度变化(如 )可能小于 FP16 数值的精度范围,导致模型无法分辨位置 100,000 和 100,001。
  2. 分布偏移:模型在训练时只见过角度在 之间的向量。当推理时角度超过这个范围,注意力机制产生的数值会超出模型“理解能力”。

4. 总结

  • 如果没有低频分量:是的,模型会迅速遇到周期性坍缩,无法感知长距离。
  • 关于公约数:准确来说,是频率的多样性保证了在极长距离内,没有任何两个位置的 维向量表现是完全一致的。

这也就是为什么 Llama 3 把 base 从 10,000 改成 500,000 的原因——它本质上是在“调慢”最慢的那个表盘,让它在更长的长度(128k)内都不至于转完一圈,从而保持位置的唯一性。

Reference