1.8 位置编码与 RoPE#
自注意力只会比较 token 内容,本身不知道谁在前、谁在后;位置编码负责把顺序注入模型。现代大模型通常对每层注意力的 Q/K 施加 RoPE:位置 $m$ 与 $n$ 分别旋转后,点积可化为只依赖相对位移 $n-m$ 的形式,但超过训练长度后仍会遭遇未见过的旋转相位,因此长上下文需要额外的频率缩放或位置插值。
核心问题
能解释为什么没有位置编码的自注意力无法区分猫追狗和狗追猫。
能区分可学习绝对位置、正弦位置、相对位置偏置、ALiBi 与 RoPE 的注入位置和取舍。
能计算正弦位置编码的不同频率,并解释固定偏移为什么对应二维线性变换。
能从二维旋转矩阵推导 $R_m^\top R_n=R_{n-m}$,说明 RoPE 如何把绝对位置转成相对位置关系。
能判断 RoPE 应施加于 Q/K 的哪些维度,并排查 KV-Cache offset、维度布局和缩放配置错误。
能解释原生 RoPE 为什么不能自动保证长度外推,以及位置插值、基频调整和 YaRN 在改变什么。
前置:建议先读 1.2 · Token 与嵌入 和 1.3 · 注意力与 Transformer,熟悉向量、点积以及 Q/K/V。
一、为什么 Transformer 必须另行注入顺序#
结论先行:标准自注意力能判断哪些 token 内容相关,却不能仅凭自身判断这些 token 原来排在哪里。原因是注意力对输入位置的同步置换具有等变性。
令输入矩阵为 $X\in\mathbb R^{n\times d}$,$P\in\mathbb R^{n\times n}$ 为一个置换矩阵。忽略位置编码时:
$$ Q=XW_Q,\qquad K=XW_K,\qquad V=XW_V, $$$$ \operatorname{Attn}(X) =\operatorname{Softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V. $$若把输入位置按 $P$ 重新排列,则 $Q'=PQ$、$K'=PK$、$V'=PV$。注意力分数变为:
$$ Q'K'^\top =(PQ)(PK)^\top =P(QK^\top)P^\top. $$行 softmax 会按同样方式重新排列,因此:
$$ \operatorname{Attn}(PX)=P\,\operatorname{Attn}(X). $$这表示输入换一个排列,输出只会跟着换相同排列;网络内部没有一个量告诉它这是第 3 个 token或两个 token 相距 17 位。因果掩码虽然规定当前位置不能看未来,却只提供可见/不可见边界,不能完整表达可见区间内的具体距离。内容信息与顺序信息的分工见图 1。
图中的两路信息不可互相替代:内容注意力回答该看谁,位置机制回答对方在哪里。语言、代码、音乐和时间序列都依赖顺序,因此位置编码不是装饰项,而是 Transformer 表达序列结构的必要组成。
二、位置编码的主要路线#
位置方法可以按位置信息注入到哪里分成三类:加入输入表示、加入注意力分数,或直接变换 Q/K。
| 方法 | 注入位置 | 核心形式 | 主要特点 |
|---|---|---|---|
| 可学习绝对位置 | token embedding | $x_m+e_m$ | 简单、位置可学习,但表大小固定,训练长度之外没有已学习参数。 |
| 正弦绝对位置 | token embedding | $x_m+\operatorname{PE}(m)$ | 无位置参数,固定偏移可由线性变换表示。 |
| 相对位置偏置 | attention logits | $q_m^\top k_n+b_{m-n}$ | 直接按相对距离影响打分,但需设计偏置表或函数。 |
| ALiBi | attention logits | $q_m^\top k_n-a_h(m-n)$ | 每个头使用固定斜率,距离越远惩罚越大,结构极简。 |
| RoPE | Q/K | $(R_mq_m)^\top(R_nk_n)$ | 以绝对旋转注入位置,点积自然出现相对位移。 |
正弦位置编码#
原始 Transformer 将位置编码与 token embedding 逐元素相加。对模型维度 $d$,位置 $m$ 在第 $2i$ 与 $2i+1$ 维使用同一频率:
$$ \operatorname{PE}(m,2i) =\sin\left(m\theta_i\right), \qquad \operatorname{PE}(m,2i+1) =\cos\left(m\theta_i\right), $$$$ \theta_i=10000^{-2i/d}. $$不同维度的波长构成几何级数:高频维对相邻位置变化敏感,低频维要跨越更长距离才发生明显变化。更关键的是,对任意固定偏移 $\Delta$,三角恒等式给出:
$$ \begin{pmatrix}\sin((m+\Delta)\theta_i) \\ \cos((m+\Delta)\theta_i)\end{pmatrix}=\begin{pmatrix}\cos(\Delta\theta_i)&\sin(\Delta\theta_i) \\ -\sin(\Delta\theta_i)&\cos(\Delta\theta_i)\end{pmatrix}\begin{pmatrix}\sin(m\theta_i) \\ \cos(m\theta_i)\end{pmatrix}. $$因此从位置 $m$ 移到 $m+\Delta$,在每个二维频率对子空间中都对应一个只依赖 $\Delta$ 的线性变换。这解释了正弦编码为何不仅记录绝对位置,也让模型有机会学习相对偏移1。
可学习绝对位置则直接为每个位置维护一个 $d$ 维参数向量。它不要求预设正弦频率,但训练中没有出现的位置没有对应的可靠参数,且位置表会把最大长度写进模型结构。两类绝对编码都在 Transformer 最底部与 token embedding 相加,位置信号经过很多层后可能被内容变换逐渐改写。
相对偏置与 ALiBi#
相对位置方法不再问当前位置编号是多少,而直接问Query 与 Key 相隔多远。一般形式是在注意力 logit 上加入距离函数:
$$ s_{m,n} =\frac{q_m^\top k_n}{\sqrt{d_k}}+b(m-n). $$ALiBi 取一个特别简单的线性函数。对第 $h$ 个注意力头,因果注意力中 $n\le m$:
$$ s_{m,n}^{(h)} =\frac{(q_m^{(h)})^\top k_n^{(h)}}{\sqrt{d_k}} -a_h(m-n), $$其中 $a_h>0$ 为固定斜率。距离越远,logit 被扣得越多。ALiBi 不构造位置向量,论文报告在长度 1024 上训练的 1.3B 模型可以外推到 2048,并比使用正弦编码在 2048 上训练节省约 11% 时间和内存2。不过现代主流 LLM 更普遍采用 RoPE,因为它能在 Q/K 几何结构中表达更丰富的相对位置关系。
三、RoPE:把位置写进二维旋转#
RoPE 的核心做法是把偶数维的 Q/K 两两组成二维向量,并按位置旋转。设参与旋转的维度为 $d_r$,第 $j$ 个二维对子空间的角频率为:
$$ \theta_j=b^{-2j/d_r}, \qquad j=0,1,\dots,\frac{d_r}{2}-1, $$其中经典基数 $b=10000$。位置 $m$ 对应的二维旋转矩阵为:
$$ R(m\theta_j)=\begin{bmatrix}\cos(m\theta_j)&-\sin(m\theta_j)\\ \sin(m\theta_j)&\cos(m\theta_j)\end{bmatrix}. $$记 $c_j=\cos(m\theta_j)$、$s_j=\sin(m\theta_j)$,把全部 $d_r/2$ 个二维旋转块展开后,完整的 $d_r\times d_r$ 矩阵结构为:
$$ R_m=\left[\begin{array}{cc:cc:c:cc}c_0&-s_0&0&0&\cdots&0&0\\s_0&c_0&0&0&\cdots&0&0\\\hdashline 0&0&c_1&-s_1&\cdots&0&0\\0&0&s_1&c_1&\cdots&0&0\\\hdashline \vdots&\vdots&\vdots&\vdots&\ddots&\vdots&\vdots\\\hdashline 0&0&0&0&\cdots&c_{d_r/2-1}&-s_{d_r/2-1}\\0&0&0&0&\cdots&s_{d_r/2-1}&c_{d_r/2-1}\end{array}\right]. $$横向与纵向虚线框出的每个 $2\times2$ 区域对应一个频率 $\theta_j$;对角块执行旋转,其余位置全为零,因此不同频率对子空间互不混合。位置 $m$ 的 Query 和位置 $n$ 的 Key 分别变为:
$$ q_m^R=R_mq_m,\qquad k_n^R=R_nk_n. $$相对位置恒等式#
二维旋转矩阵是正交矩阵,故 $R_m^\top=R_{-m}$;连续旋转的角度相加,故 $R_aR_b=R_{a+b}$。于是:
$$ R_m^\top R_n =R_{-m}R_n =R_{n-m}. $$旋转后的注意力点积因此可化为:
$$ \begin{aligned}(q_m^R)^\top k_n^R&=(R_mq_m)^\top(R_nk_n)\\ &=q_m^\top R_m^\top R_nk_n\\ &=q_m^\top R_{n-m}k_n.\end{aligned} $$最终式只显式依赖相对位移 $n-m$。这正是 RoPE 最重要的性质:它对 Q/K 施加的是各自的绝对位置旋转,而二者的点积呈现的是相对位置关系3。
用复数看同一过程会更紧凑。把二维向量 $(x_{2j},x_{2j+1})$ 写成复数 $z_j=x_{2j}+ix_{2j+1}$,位置 $m$ 的旋转就是:
$$ z_j^{R}=z_j\,e^{im\theta_j}. $$Query 与 Key 的共轭乘积中,相位变成 $e^{i(n-m)\theta_j}$,同样只留下相对位移。不同 $\theta_j$ 相当于用多组时钟同时测量距离:快时钟分辨局部变化,慢时钟覆盖长程变化。
RoPE 不是一个单调的距离惩罚函数。 $R_{n-m}$ 只说明打分中的位置部分依赖相对位移;最终分数仍由内容向量 $q_m,k_n$ 与多个周期频率共同决定。RoFormer 讨论了随距离衰减的整体性质,但不能据此断言任意一对 token 的注意力一定随距离单调下降。
四、RoPE 在注意力层中怎样落地#
RoPE 与最底层相加式位置 embedding 不同:它通常在每一层注意力内部,完成 Q/K 线性投影之后、计算 $QK^\top$ 之前执行,完整数据流见图 2。
图中 V 不旋转,因为位置只需影响Query 与哪个 Key 匹配的权重;一旦权重确定,Value 仍作为内容被加权读取。对单个向量,常见实现可写成:
$$ \operatorname{RoPE}(x,m) =x\odot\cos(m\Theta) +\operatorname{rotate\_half}(x)\odot\sin(m\Theta), $$其中 $\Theta$ 将每个 $\theta_j$ 扩展到对应的二维分量,$\odot$ 表示逐元素乘法。rotate_half 对每个二维对执行 $(a,b)\mapsto(-b,a)$,正好是旋转公式中的四分之一圈基向量变换。
工程实现中有四项必须与模型检查点完全一致:
- 配对布局:有的实现按相邻维配对 $(x_0,x_1),(x_2,x_3)$,有的先把向量分成两半再配对。两者只要训练和推理一致都成立,但不能在已有检查点上互换。
- 旋转维度:
rotary_dim必须为偶数。部分模型只旋转每头维度的一部分,其余维度保留为纯内容通道。 - 位置编号:训练、prefill 和 decode 必须使用同一套
position_ids语义;padding 与 packed sequence 需要明确哪些位置重置编号。 - 缓存 offset:增量解码第 $t$ 步的新 Q/K 必须使用真实绝对位置 $t$,不能每次从 0 重新旋转。
KV-Cache 通常保存已经按各自历史位置旋转过的 K。解码时只需按当前 offset 旋转新 Q/K,再让新 Query 与缓存 Key 做点积。若 offset 错一位,张量形状和程序都可能正常,但模型看到的相对距离全部偏移,属于很难从异常日志直接发现的静默错误。
五、频率如何同时覆盖局部与长程#
经典频率为 $\theta_j=b^{-2j/d_r}$。其对应波长:
$$ \lambda_j=\frac{2\pi}{\theta_j} =2\pi b^{2j/d_r}. $$当 $j$ 较小时,$\theta_j$ 大、$\lambda_j$ 短,位置移动一两步就会产生明显相位差,适合分辨标点、相邻词和局部语法。当 $j$ 较大时,$\theta_j$ 小、$\lambda_j$ 长,需要跨越较多 token 才有明显相位变化,负责提供长程尺度。
| 频率分量 | 旋转速度 | 主要提供的位置信号 |
|---|---|---|
| 高频维 | 快 | 对相邻 token 和短距离顺序敏感。 |
| 中频维 | 中等 | 覆盖短语、句子和段落尺度。 |
| 低频维 | 慢 | 在较长距离上仍保持可区分的相位变化。 |
多尺度频率使模型不必用单一标尺表示所有距离。但周期函数也意味着相位会重复;RoPE 的距离表示并不是一个无限长、绝不碰撞的整数编码。模型能可靠利用多长的距离,既取决于频率设计,也取决于训练时实际见过的长度分布。
六、为什么原生 RoPE 不能自动外推到任意长度#
RoPE 公式可以计算任意位置,不等于模型能理解任意长度。若模型只在 $m\in[0,L_{\text{train}})$ 的位置上训练,超过该范围后会出现训练时未见过的相位组合和 attention logit 分布;长度越远,分布偏移越明显。YaRN 的论文也明确指出,RoPE 模型通常无法直接泛化到训练长度之外4。
位置插值#
若希望把窗口从 $L_{\text{train}}$ 扩到 $L_{\text{target}}$,位置插值将新位置按比例压回原训练范围:
$$ m' =m\frac{L_{\text{train}}}{L_{\text{target}}}, \qquad R_m\longrightarrow R_{m'}. $$例如从 4K 扩到 32K 时,缩放因子为 $1/8$;目标位置 16000 会使用原相位坐标 2000。这样避免直接把所有频率推到训练范围之外,但代价是相邻位置的相位差被压缩,局部分辨率下降。Position Interpolation 论文报告仅需少量微调即可把 LLaMA 上下文扩至 327685。
基频调整与 YaRN#
增大基数 $b$ 会让一部分维度旋转得更慢,相当于拉长波长。NTK-aware scaling 等方法不会对所有频率做完全相同的线性压缩,而是更精细地平衡高频局部分辨率与低频长程范围。
YaRN 在频率维度上组合插值与外推思想,并加入 attention scaling,以较少的训练 token 和步骤扩展上下文。它不是改一个配置就凭空得到长上下文能力;频率缩放方式、微调数据长度、目标窗口和推理时配置必须匹配。
长上下文配置中的rope_theta、rope_scaling、原训练长度与目标长度是一组共同契约。仅把服务端允许的max_model_len调大,不会改变模型学到的位置分布;若 RoPE 配置和检查点训练配方不一致,模型可能能够运行,却在长文本中严重退化。
七、RoPE 与 MLA 为什么需要解耦#
RoPE 直接乘在完整 Key 上时,低秩键上投影与位置旋转通常不可交换。若 $k_n=W^{UK}c_n^{KV}$,朴素做法得到:
$$ (R_mq_m)^\top(R_nW^{UK}c_n^{KV}) =q_m^\top R_{n-m}W^{UK}c_n^{KV}. $$$R_{n-m}$ 随历史位置变化,因而 $W^{UK}$ 不能再作为固定矩阵一次性吸收到 Query 投影中。DeepSeek MLA 将 Q/K 分成不旋转的内容通道与小型 RoPE 位置通道,使内容分数继续在低秩潜空间计算,位置分数单独保留相对位置。
完整的权重吸收、双通道分数与 $512+64=576$ 维缓存推导,见 10.2 · 架构层压缩的 MLA 部分。这里应记住的接口关系是:RoPE 改变 Q/K 的几何结构;任何试图压缩、共享或缓存 K 的架构,都必须明确旋转发生在压缩之前还是之后。
主流模型怎样配置位置信息#
| 模型或方案 | 位置机制 | 具体例子 |
|---|---|---|
| Transformer | 正弦绝对位置向量与 token embedding 相加 | 位置 $m$ 的偶数维使用 $\sin(m\omega_i)$,奇数维使用 $\cos(m\omega_i)$1 |
| BERT | 可学习绝对位置表 | 位置 0 至 511 各查一行向量,再与词向量和 segment 向量相加 |
| Llama 系列 | RoPE 旋转 Q/K,并按目标长度调整频率 | 4K 模型扩到 32K 时,位置插值可把位置 $m$ 映射为 $m/8$5 |
| ALiBi | 每个头按距离在线性偏置中扣分 | 同一头内距离 8 比距离 2 额外减少 $6a_h$ 的 attention logit2 |
| YaRN | 按频率维组合插值、外推和 attention scaling | 目标窗口增大时,低频与高频维采用不同缩放区间4 |
| DeepSeek MLA | 内容通道保持低秩,位置通道单独应用 RoPE | 每个历史 token 保存 512 维内容 latent 与 64 维位置 Key,共 576 维 |
八、常见错误与排查顺序#
位置编码错误常表现为能运行但质量异常,因此应按数据流逐项核对。
| 现象 | 优先检查 | 原因 |
|---|---|---|
| 单步正常,长文本逐渐退化 | decode position offset | 新 token 可能重复从位置 0 旋转。 |
| batch 中短样本异常 | padding 的 position_ids | padding 与真实 token 的位置编号可能混用。 |
| packed 训练不收敛 | 序列边界是否重置 | 不同文档被误当成一条连续相位链。 |
| 转换权重后输出完全错误 | 相邻配对与 split-half 布局 | 两种 RoPE 排列不兼容。 |
| 提高最大长度后检索能力下降 | rope_theta、scaling 与训练长度 | 只放宽运行时窗口,没有匹配位置缩放。 |
| MLA 推理显存突然变大 | 是否物化完整旋转 Key | 可能破坏了解耦 RoPE 与权重吸收路径。 |
排查时先固定一个很短的确定性输入,比对完整前向与逐 token KV-Cache 解码的 logits;二者应在数值容差内一致。随后分别测试有 padding、packed sequence 和跨越原训练长度的样本。这样能把基础旋转错误offset 错误和长度外推能力不足分开定位。
小结#
- 自注意力对位置同步置换等变,必须额外注入顺序
- 绝对位置编码把位置向量加到 token embedding,相对偏置直接修改 attention logits
- RoPE 则在每层注意力中旋转 Q/K,并凭 $R_m^\top R_n=R_{n-m}$ 让点积显式依赖相对位移
- 它以多组频率同时覆盖局部与长程,但公式可计算任意位置并不代表模型能外推到任意长度
- 位置插值、基频调整与 YaRN 都是在重新安排相位分布,并需与训练配方一致
上一节:1.7 · 现代 Transformer 架构 | 下一章:第 2 章 · 生成与解码 | 本章总览:第 1 章 · 大模型基础
参考文献#
Vaswani et al. Attention Is All You Need (2017). 第 3.5 节提出正弦/余弦位置编码,说明固定偏移可由线性函数表示,并将其与 token embedding 相加。https://arxiv.org/abs/1706.03762 ↩︎ ↩︎
Press et al. Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation (2021). 提出 ALiBi,以与距离成比例的线性偏置修改 attention score。https://arxiv.org/abs/2108.12409 ↩︎ ↩︎
Su et al. RoFormer: Enhanced Transformer with Rotary Position Embedding (2021). 提出 RoPE,以旋转矩阵编码绝对位置,并在自注意力点积中引入显式相对位置依赖。https://arxiv.org/abs/2104.09864 ↩︎
Peng et al. YaRN: Efficient Context Window Extension of Large Language Models (2023, revised 2026). 组合频率缩放与 attention scaling,以更少训练 token 和步骤扩展 RoPE 上下文。https://arxiv.org/abs/2309.00071 ↩︎ ↩︎
Chen et al. Extending Context Window of Large Language Models via Positional Interpolation (2023). 将位置索引线性压回原训练范围,以少量微调扩展 RoPE 模型上下文。https://arxiv.org/abs/2306.15595 ↩︎ ↩︎