跳到正文
动手理解 · CONCEPT LAB

旋转一个位置,看看“距离感”怎样出现

在不带 mask、位置特征或其他非对称结构的全可见 self-attention 中,内容相同的排列缺少位置入口;causal mask 本身则会泄露隐式顺序。RoPE 按位置旋转 Q/K,让二者内积的显式位置项依赖相对距离。

已经发生 正在观察 接下来
01 / 03

状态传导图

X0 位置 0 的词
Q0 内容 Query
K? 内容 Key
S 相似度分数

本阶段隔离的是无 mask、全可见 attention;不是完整 decoder-only 语言模型。

观察点 01

没有 mask 或位置特征,排列只会带着输出一起换位

对全可见 self-attention,如果只用内容向量,把“猫追狗”与“狗追猫”的 token 同时换位,输出也只跟着换位;架构没有固定索引或距离入口。causal decoder 另有不对称 mask,所以不能把这句话直接套到 NoPE。

内容线索清楚
显式距离线索没有注入
此刻要记住

显式位置机制破除排列对称;causal mask 也能提供隐式位置线索。

架构机制 · Position Encoding

位置编码不是“页码”:它给注意力一套可学习的顺序与距离坐标

不带 mask、位置特征或其他非对称结构的 self-attention 对输入置换等变,单靠内容无法区分排列;decoder-only 模型的 causal mask 已让不同位置看到不同长度的前缀,因此 NoPE 也可能学到隐式位置。现代 LLM 常把 Rotary Position Embedding(RoPE,旋转位置嵌入)施加在 Q/K 上;扩窗还要判断是否需要长文本训练适配,并处理 KV Cache、算力与任务评测。

先分清三条 RoPE 扩窗路线:PI 统一压缩坐标;NTK-aware 改 base,让各维度获得不同缩放;YaRN 按波长分段并加入 attention scaling。三者都只解决长上下文系统的一部分。
00 · 先抓住

同一句话换顺序会变意思,但“位置”不只有一种写法

生活类比
绝对位置像“第 37 页”,相对位置像“在签名页前两页”,RoPE 更像给每个频率的罗盘按位置转一个角度。模型最终读到的不是单独页码,而是内容与这些位置线索共同形成的 attention score。
小例子
“甲方在收到发票后 30 天付款”里,30 天与“收到发票”相隔很近。把词打乱,词袋没变,法律含义却变了。位置机制提供关系入口;它本身不替模型完成句法或推理。
表示层坐标能不能算到某个位置:配置表长、RoPE 频率和 kernel 是否允许。
训练层模型是否在相近长度、数据分布和任务上学过如何使用这些位置。
能力层在召回、多跳、聚合、代码理解等目标任务上,到多远仍然可靠。三层不能用一个“128K”混为一谈。
01 · 位置从哪里来

双向 attention 需要显式破除排列对称;因果模型还可借 mask 推断位置

对没有位置输入的双向、全可见 self-attention,把输入 token 同时做同一置换,输出也只会跟着置换——这叫 permutation equivariance(置换等变)。但 causal decoder 的第 m 个位置只能看前 m 个位置,计算图已不再对称。2022 年的 probing 实验发现 NoPE causal LM 会在层内形成可读出的绝对位置信息;2024 年研究同时指出它仍有有限有效上下文,并非无限外推。

绝对位置 absolute

原始 Transformer 把固定正弦/余弦向量加到 embedding;BERT 等使用学习式位置表。后者通常有固定表长,前者虽能继续计算,也仍可能离开训练分布。

相对机制 relative

Shaw RPE、T5 relative bias、ALiBi 等直接按 query-key 距离修改 key/value 表示或 attention logit。它们不是同一个公式,只共享“关系优先”的归纳偏置。

旋转位置 rotary

RoPE 用绝对位置角度分别旋转 Q/K,但二者内积里的显式位置项可化成相对差。它不向 V 追加一个“页码通道”。

2017

原始 Transformer 的固定正弦位置

absolute sinusoidal encoding
PE(p,2i)=sin ⁣(p/100002i/d),PE(p,2i+1)=cos ⁣(p/100002i/d)\mathrm{PE}(p,2i)=\sin\!\left(p/10000^{2i/d}\right),\quad \mathrm{PE}(p,2i+1)=\cos\!\left(p/10000^{2i/d}\right)

不同维度使用几何级数波长;论文给出的波长范围从 10000·2π,并假设固定偏移可由线性关系表达。注意:公式能算到更长位置,只代表“有数值”,不证明模型在未训练长度上仍会正确使用。

ALiBi

不改 embedding,直接给远距离 logit 加惩罚

Attention with Linear Biases
h,m,n=qh,mTkh,ndhαh(mn),nm\ell_{h,m,n}=\frac{q_{h,m}^{\mathsf T}k_{h,n}}{\sqrt{d_h}}-\alpha_h(m-n),\qquad n\le m

α_h 是每个 head 不同、训练前固定的正斜率;对 causal attention,历史 key 离当前 query 越远,偏置越负。原论文展示 1.3B 模型 train 1,024 / test 2,048,并不意味着任意模型、任意倍数都可靠。

02 · RoPE 推导

每两个维度是一只不同转速的表,Q/K 的相对相位进入内积

先把每个 attention head 中参与旋转的维度记为 dᵣ,两两组成二维子空间。常见实现先做 Wq/Wk 投影,再旋转 Q/K;有的模型旋转整个 head,有的只旋转一部分。标准 RoPE 不旋转 V。

频率

第 i 对维度的角步长

angular frequency
θi=b2i/dr,i=0,,dr/21,λi=2πθi\theta_i=b^{-2i/d_r},\quad i=0,\ldots,d_r/2-1,\quad \lambda_i=\frac{2\pi}{\theta_i}

b 是 RoPE base,θᵢ 是每前进一个 token 的旋转角,λᵢ 是转满一圈所需 token 数。不同模型会改变 base、旋转维度或频率方案。

旋转

位置乘角频率

pairwise rotation
R(ϕ)=[cosϕsinϕsinϕcosϕ]q~m,i=R(mθi)qm,i,k~n,i=R(nθi)kn,i\begin{aligned}R(\phi)&=\begin{bmatrix}\cos\phi&-\sin\phi\\ \sin\phi&\cos\phi\end{bmatrix}\\[4pt]\widetilde q_{m,i}&=R(m\theta_i)q_{m,i},\qquad \widetilde k_{n,i}=R(n\theta_i)k_{n,i}\end{aligned}

位置 m 的 query 与位置 n 的 key 分别转 mθᵢnθᵢ。旋转矩阵是正交矩阵,所以共同的绝对旋转会在内积里抵消。

关键

相对位置来自 R(mθ)ᵀR(nθ)

relative phase identity
q~m,iTk~n,i=qm,iTR(mθi)TR(nθi)kn,i=qm,iTR((nm)θi)kn,i\widetilde q_{m,i}^{\mathsf T}\widetilde k_{n,i}=q_{m,i}^{\mathsf T}R(m\theta_i)^{\mathsf T}R(n\theta_i)k_{n,i}=q_{m,i}^{\mathsf T}R((n-m)\theta_i)k_{n,i}

显式位置项只依赖 n−m;但 attention score 仍不只由距离决定,因为 q/k 携带 token 内容与前层上下文。若交换 query/key,符号也会相应变化,不能只背一句“RoPE 是相对位置”。

图中二维圆只为展示相位恒等式;真实模型并行使用许多频率对子,并把位置关系与内容向量一起送入 softmax attention。
手算 1:相对相位
只看一个对子,令 q=k=(1,0)θ=π/2。query 在位置 0,key 在位置 1 时内积为 0;key 在位置 2 时内积为 −1。把二者同时右移 3 位,相位差不变,内积仍相同。
手算 2:波长不是窗口
b=10,000dᵣ=128θ₀=1,波长约 6.28 tokens;θ₆₃≈1.15×10⁻⁴,波长约 54.4K tokens。不能据此宣布“窗口就是 54.4K”:多频率组合、内容、训练和层间计算共同决定有效能力。
频率区间数值行为扩窗时的矛盾
高频 / 短波长相邻 token 的角度差大,对局部位置变化更敏感。统一插值会把局部角差压小,可能扰动模型熟悉的近邻模式。
低频 / 长波长跨很多 token 才转一圈,可在更长尺度上保持相位变化。直接外推仍会产生训练期没见过的相位组合。
语义边界“高频=语法、低频=章节语义”可以做直觉类比,但 RoPE 公式没有固定这种分工;实际功能由训练学出。
03 · 长上下文外推

扩窗是在“局部分辨率、远距覆盖、训练分布”之间重新分账

原生 RoPE 直接跑到远超训练窗口的位置,会出现未见过的角度与 attention pattern。扩展方法不是简单把一个开关调大,而是选择哪些频率插值、哪些频率保留或外推,以及是否用长文本继续训练。

路线真正改了什么重要边界
Position Interpolation(PI)所有 RoPE 维度都用 p/s,把目标窗口压回原训练坐标范围。稳定地避免访问更大坐标,但局部角差也统一缩为 1/s;原论文仍进行少量微调。
NTK-aware改变 RoPE base,让高频少缩、低频多缩,形成按维度非均匀缩放。最初来自社区方案,YaRN 论文给出系统化说明;部分维度会轻微外推,不能把名字当作严谨的 NTK 保证。
Dynamic NTK根据当前序列长度动态更新缩放,而非从一开始固定最大扩展因子。短序列退化可减轻,但缩放变化会牵涉已缓存 K 的旋转一致性。
YaRN按波长做 NTK-by-parts:短波不插值、长波插值、中间平滑混合,再做 attention scaling。论文推荐值来自 Llama/Llama 2 实验;其他模型仍需验证,静态 YaRN 也可能影响短文本。
继续预训练 / 长文本微调让模型在接近目标长度的数据上重新适应位置与 attention 分布。数据长度不等于数据质量;只堆重复或弱监督长文本,未必学会多跳和聚合。
PI

把目标坐标压回训练范围

Position Interpolation
p=pLtrainLtarget=ps,s=LtargetLtrainp'=p\frac{L_{\mathrm{train}}}{L_{\mathrm{target}}}=\frac{p}{s},\qquad s=\frac{L_{\mathrm{target}}}{L_{\mathrm{train}}}

若从 4,096 扩到 32,768,s=8:新位置 24,000 映射为原坐标 3,000,相邻 token 的坐标差从 1 压成 0.125。这是示意手算;PI 论文的 LLaMA 实验从原生 2,048 扩到最高 32,768,并报告在 1,000 steps 内完成适配。

为什么“按频率处理”更细
YaRN 论文按每个维度的波长与原训练窗口之比划分区域:波长远短于窗口的高频不插值,波长不短于窗口的低频做完整插值,中间用 ramp function 混合;再用 attention temperature/length scaling 修正长输入带来的数值分布偏移。它不是一句“把低频拉长”就能完整概括。
04 · 工程契约

配置能启动、缓存能复用、任务能答对,是三份不同验收单

配置窗口 configured

max_position_embeddings、rope 参数和 serving engine 接受该长度。只证明请求不会立刻因长度被拒绝。

训练窗口 trained

预训练或继续训练实际见过的序列长度与位置分布。模型卡的“native”通常更接近这一层,但仍要读定义。

有效窗口 effective

在具体任务、信息位置、并发和精度要求下仍达标的长度;它往往小于配置上限,而且随任务变化。

上线检查为什么必须检查可验证动作
RoPE 配置一致checkpoint、Transformers/vLLM/SGLang 与自定义 kernel 必须对 rope_type/base/factor/original length/partial rotary 解释一致。对照模型卡与 config.json,用短序列 logits 回归测试,再测边界长度。
KV Cache 一致常规 cache 保存已经旋转的 K。若 Dynamic Scaling 随长度改映射,旧 K 仍按旧角度旋转。固定整次请求的映射;或按论文提示缓存 pre-RoPE K 并在映射变化时重旋转/重算。不能中途无成本换 scale。
容量与延迟RoPE scaling 不减少 KV 元素数。常规 KV 容量随 N 线性增长,标准 full attention 的 prefill 核心算术量随 增长。分别压测 prefill latency、decode latency、KV bytes、并发与 OOM;FlashAttention 降 IO,不把精确全 attention 算术量改成线性。
任务评测单 needle 只测简单召回,无法覆盖多 needle、多跳、聚合、冲突证据和中间位置偏置。至少组合 RULER 类多任务、真实长文集与“信息放在开头/中间/结尾”的位置切片。
当前框架口径(截至 2026-07)
Hugging Face Transformers 的 RoPE 工具文档列出 default / linear / dynamic / yarn / longrope / llama3 等类型,并支持 partial_rotary_factor。这些名字只是配置协议,不是质量担保;不同版本字段名和实现细节可能变化,上线应锁版本并回归。
评测证据
RULER(2024)用 13 个任务评测 17 个宣称至少 32K 的模型;论文报告只有约一半在 32K 仍保持其“满意”阈值表现。Lost in the Middle 还发现,相关信息从开头/结尾移到长输入中部时,准确率可能显著下降。窗口数字不能替代位置切片与任务级验收。
05 · 论文与模型

真实案例都在提醒:方法、训练口径与产品上限要分开读

案例可核对的原始口径正确解读
Position Interpolation论文对 LLaMA 7B–65B 做少量微调,把 2,048 窗口扩到最高 32,768,并称在 1,000 steps 内完成。这是特定模型与训练配方的结果;“坐标映射可算”不等于零训练即可保质。
YaRN最新 v3 摘要仍报告相对先前方法 10× 更少 tokens、2.5× 更少 steps;正文实验使用 400 steps,并分别对照 Code Llama 的训练数据量和 PI 的 steps。这是论文基线下的效率比较,不应写成所有模型固定节省 10×;核心方法是 NTK-by-parts + attention scaling。
Gemini 1.52024 技术报告在研究测试中报告至少到 10M tokens 的 >99% retrieval,并讨论百万级多模态上下文。这是特定 retrieval 测试,不是 10M 在所有公开产品、所有任务和复杂推理上都同样可用。
Qwen3-Next-80B-A3B官方模型卡:head dim 256、RoPE dim 64;原生 262,144,给出 YaRN 配置上限 1,010,000,并报告到 1,000K 的 RULER 结果。官方同时警告常见框架的 static YaRN 可能影响短文本。1,010,000 是配置/启动上限,不应冒充精确实测长度;模型还采用 3 个 Gated DeltaNet 层配 1 个 Gated Attention 层,长上下文收益不能只归因于 RoPE。
06 · 常见误区

别把一根“坐标尺”误当成长上下文的全部能力

误区 1:没有显式位置就完全看不见顺序

对无 mask 的双向 attention 近似成立;对 causal decoder 不成立。不同位置拥有不同大小的可见前缀,NoPE 可从 causal 结构形成隐式位置,但能力仍有限。

误区 2:某个 RoPE 波长就是上下文长度

单维相位会周期重复,但多频率、内容向量、训练分布和层间计算共同决定行为。最长波长既不是硬上限,也不是可靠能力承诺。

误区 3:改 base / factor 就得到长文能力

它可能只让程序接受更大位置。零微调外推可以成立,但仍要分别验收是否需训练/数据适配、attention/KV 系统成本和目标任务质量。

误区 4:动态缩放可随时切换

若已缓存的 K 是在旧映射下旋转的,中途改变映射会不一致。必须明确 cache 存在 RoPE 前还是后,以及是否重算。

误区 5:Needle 过了就代表长文理解

简单 needle 主要测定位与复制;多跳、聚合、冲突证据、代码依赖和中间位置偏置需要另外评测。

误区 6:高频和低频各自承载固定语义

公式只规定角速度。模型可能学出不同尺度的使用方式,但“高频=局部语法、低频=章节语义”不是 RoPE 的硬编码事实。

资料来源

主要论文、实现文档与模型卡

核查日期:2026-07-14。“支持 N tokens”可能指配置上限、原生训练长度、缩放后的可运行长度或某项 retrieval 评测长度;本文保留各来源口径,不把它们直接等同于所有任务的有效上下文。