浅谈位置编码:从 Sinusoidal 到 RoPE 与 ALiBi
系统梳理 Transformer 位置编码:为什么 Attention 需要它、绝对/相对/RoPE/ALiBi 各方案怎么算、长上下文外推时哪种最稳,以及如何为新模型选型。
第一次手动算 Self-Attention,多数人都会被一件事吓一跳:它完全不在乎输入顺序。把 token 重新排一下,每个注意力分数也跟着排,函数本身严格满足置换等变。所以在让 Transformer 干任何"正经事"之前,必须从外部把"位置"信息塞进去。
这一个设计选择,“怎么塞”,催生了一整片研究小生态:Sinusoidal、Learned、Relative、T5 bucket、RoPE、ALiBi、NoPE……本文是写给工程师的一篇 brief:每种方案给到刚好够看懂的数学,再加足够的横向比较去做选型,重点放在 LLM 时代最关键的一项指标——长度外推(length extrapolation),即在比训练上下文更长的输入上还能不能用。
你将学到什么
- Attention 为什么是置换等变的,这个性质如何决定了位置编码的设计空间
- 两大主流家族:绝对位置编码 与 相对位置编码
- Sinusoidal、Learned、T5 bucket、RoPE、ALiBi 究竟在算什么
- 哪些方案能优雅外推到更长上下文,哪些会直接崩
- 给新架构选型时的一份决策清单
前置知识
- 熟悉 Self-Attention($Q$、$K$、$V$、softmax 那一套)
- 会一点线性代数(矩阵、内积、旋转)
为什么 Attention 一定要位置信息
设输入嵌入为 $X = [x_1, x_2, \ldots, x_n] \in \mathbb{R}^{n \times d}$,缩放点积注意力是:
$$ \text{Attn}(X) = \text{softmax}\!\left(\tfrac{QK^\top}{\sqrt{d_k}}\right) V, \quad Q = XW_Q,\; K = XW_K,\; V = XW_V. $$如果用任意置换矩阵 $P$ 把 $X$ 的行打乱,那么 $Q$、$K$、$V$ 都跟着以同样的方式被打乱,输出也只是按 $P$ 重排。形式化写就是 $\text{Attn}(PX) = P\,\text{Attn}(X)$。
这就是"模型不知道顺序"在数学上的精确含义:注意力函数对输入的置换是等变的。它把"猫坐在垫子上"和"垫子坐在猫上"看成同一份多重集 token 的不同排列——同一组向量进,同一组向量出,只是顺序换了。要让模型分得清这两句,我们必须显式注入顺序,否则它永远做不到。
而注入方式这件事,可以非常干净地拆成两类。
第一类:绝对位置编码
最朴素的想法:给每个位置 $p$ 配一个独立的位置向量 $e_p \in \mathbb{R}^d$,在第一个注意力层之前直接加到 token 嵌入上:
$$ \tilde{x}_p = x_p + e_p. $$这样位置 1 的输入和位置 2 的输入就真的不一样了,哪怕两个 token 都是 “the”。注意力可以读到这种差异,从而捕捉顺序。
剩下的问题就是:$e_p$ 从哪儿来?
1.1 可学习位置编码(Learned PE)
最直接的做法:让 $E \in \mathbb{R}^{L_{\max} \times d}$ 也是一组可训练参数,交给反向传播自己优化。BERT、GPT-2 用的就是这个。
优点。
- 灵活到极致:模型自己学最适合数据的位置表示。
- 实现极简:就一个
nn.Embedding(L_max, d)。
缺点。
- 序列长度被钉死。 $L_{\max}$ 在训练前就定好了,超出这个范围的行根本不存在。要更长就只能从头训练或继续预训练。
- 没有外推能力。 即使在 $L_{\max}$ 内部,训练样本里很少出现的位置也没机会学到合理表示;超过 $L_{\max}$ 就完全失效。

上图右侧那条红色曲线就是要害:可学习的绝对 PE 在分布内表现稳定,分布外几乎是未定义的函数。对一个动辄要处理几万 token 的对话模型来说,这是致命的。
1.2 三角函数位置编码(Sinusoidal)
《Attention Is All You Need》给出了一种手工设计的替代方案。对位置 $p$ 与维度索引 $i$($d$ 偶数):
$$ \text{PE}(p, 2i) = \sin\!\bigl(p / 10000^{2i/d}\bigr), \qquad \text{PE}(p, 2i+1) = \cos\!\bigl(p / 10000^{2i/d}\bigr). $$每对维度 $(2i, 2i+1)$ 是一对 sin/cos,频率随 $i$ 几何衰减。低维抖得最快(周期 $2\pi$),高维几乎在整个序列上都接近常数(周期 $\sim 2\pi \cdot 10000$)。每个位置因此得到一份多尺度指纹。

为什么偏偏是这套频率? 两个原因。
线性相对性。 因为 $\sin(p+k)$、$\cos(p+k)$ 都是 $\sin(p)$、$\cos(p)$ 的线性组合(系数只依赖 $k$),位置 $p+k$ 的编码就是位置 $p$ 编码的一个固定线性变换。注意力对 $Q$、$K$ 做的也是线性投影,理论上能"读"出相对偏移。这就是大家常说的"自带相对位置信息"。
没有长度上限。 公式对任意实数 $p$ 都有定义,训练只见过 512 也能直接问位置 100,000 的编码。
优点。
- 无参数、无嵌入表。
- 任意位置都有定义,外推平滑且原理清晰。
- 线性相对性给了注意力一个"开局加成"。
缺点。
- “自带相对信息"基本是理论上的。 LayerNorm 与 FFN 会破坏掉那层线性结构,一两层之后就所剩无几。
- 实测外推不行。 公式优雅归优雅,超出训练长度后困惑度上升得比 ALiBi 还猛。原因是真正需要保持合理的是注意力分数本身,而 sinusoidal 没有任何机制保证这一点。
实践层面:sinusoidal 是个漂亮的设计,但已经被后来者全面接管。
1.3 其他绝对编码(简述)
再快速点两个名字,认得就够了。
- 递归式 / FLOATER(Liu et al., 2020)。 把查表换成一个学到的 ODE:$e_{p+1} = e_p + f_\theta(e_p, p)$。递归带来外推,但破坏并行——这恰恰是 Transformer 想躲开的代价。
- 相乘式编码。 把加法 $\tilde{x}_p = x_p + e_p$ 换成逐元素乘 $\tilde{x}_p = x_p \odot e_p$。基本只在论文里见到,训练稳定性差。
绝对编码这一族的天花板都被同一个事实卡住:位置只在第一层注意力之前注入一次,几层之后"这个 token 距离那个 token $k$ 步"的信号基本就稀释没了。
第二类:相对位置编码
这是支撑现代 LLM 的关键观念转变:在自然语言里,重要的通常是两个 token 之间的距离 $i-j$,而不是它们各自坐在第几页。 “猫坐在垫子上"出现在第 1 页和第 47 页是同一件事。所以直接把相对偏移注入到注意力打分里,注入到它真正被用的地方。
2.1 Shaw 原始方案
Shaw et al.(2018)首次把相对位置作为对 key 的可学习偏置加入注意力:
$$ \text{score}(i, j) = \frac{q_i^\top \bigl(k_j + r_{i-j}\bigr)}{\sqrt{d_k}}, $$其中 $r_{i-j} \in \mathbb{R}^{d_k}$ 是按有符号偏移 $i-j$ 索引的可学习向量。超过截断半径 $K$ 的偏移共享同一个桶,于是有限个偏移向量就能覆盖任意长度。
这为什么有效。 模型可以直接学到"相邻 token 比 5 步远的 token 更重要”,完全不依赖绝对位置。而且每个偏移值的训练样本来自所有间隔为该值的 token 对,数据效率极高。
局限。 每层多出一张 $|R| \times d_k$ 的表,注意力里还多出一组逐对查询,难以与矩阵乘法融合。
2.2 T5 偏置:极简主义
T5(Raffel et al., 2020)把简化推到极致:扔掉 $r_{i-j}$ 向量,直接用一个标量偏置加到打分上:
$$ \text{score}(i, j) = \frac{q_i^\top k_j}{\sqrt{d_k}} + b_{B(i-j)}, $$其中 $B(\cdot)$ 是"分桶函数”:小偏移直接用,大偏移按对数映射到很少的几个桶(典型 32 个)。每个 head 学自己那 32 个标量。就这么多。
T5 还顺手把 value 上的位置偏置也整个去掉,实测毫无副作用,公式干净到令人发指。
2.3 DeBERTa:解耦注意力
DeBERTa(He et al., 2021)走的是相反方向,展开相对编码。把 $(x_i + e_i)^\top (x_j + e_j)$ 展开会得到四项:内容–内容、内容–位置、位置–内容、位置–位置。T5 留下"内容–内容 + 一个位置标量";DeBERTa 留下两个"交叉项"(内容–位置、位置–内容),扔掉了"位置–位置"。直觉是"在相对距离 $k$ 处,这个 token 该看什么"是真正信息丰富的,而内容相关版本的同一句话应该更强。
DeBERTa 短暂占据过 SuperGLUE 榜首;代价是参数和注意力复杂度都更高。
RoPE:把绝对编码"伪装"成相对编码
RoPE(Su et al., 2021)是当下几乎所有开源 LLM 的标配——LLaMA、Qwen、Mistral、Yi、DeepSeek、Gemma 全是 RoPE。它值得单开一节,因为做了一个魔术:看上去是绝对编码(基于 token 的绝对位置对它的 $q$、$k$ 做变换),结果出来的注意力分数却只依赖相对偏移。两全其美。
3.1 构造
把 query/key 向量的每两维看作一个 2D 平面。对位置 $m$,把第 $g$ 对维度旋转角度 $m\theta_g$($\theta_g$ 用和 sinusoidal 相同的几何衰减频率):
$$ R_m^{(g)} = \begin{pmatrix} \cos m\theta_g & -\sin m\theta_g \\ \sin m\theta_g & \cos m\theta_g \end{pmatrix}. $$把这组分块对角旋转作用到 $q$、$k$ 上:
$$ \tilde q_m = R_m\, q_m, \qquad \tilde k_n = R_n\, k_n. $$然后算内积:
$$ \tilde q_m^\top \tilde k_n = q_m^\top R_m^\top R_n\, k_n = q_m^\top R_{n-m}\, k_n. $$两个绝对旋转坍缩成一个相对旋转 $R_{n-m}$。注意力分数现在只跟偏移 $n-m$ 有关。

3.2 它为什么这么好用
三点让 RoPE 成了现代 LLM 的默认选择:
- 天生相对。 Sinusoidal 的"相对信息"要靠线性投影去抠出来,LayerNorm 还会顺手破坏。RoPE 直接把相对依赖烧进打分本身,每一层都成立。
- 长度无关。 旋转矩阵 $R_m$ 对任意实数 $m$ 都有定义,跟 $\sin(m\theta)$ 一样。没有嵌入表要扩。
- 几乎免费。 块旋转的成本相当于每对维度做一次复数乘法,代码里就是几个
cos/sin加逐元素乘,与 attention 矩阵乘相比可以忽略。
3.3 把 RoPE 拉到更长上下文
RoPE 在超出训练长度时也并非完美——困惑度还是会涨,只是没 sinusoidal 那么剧烈。社区于是发展出一连串"长度扩展"技巧:
- 位置插值(PI, Chen et al., 2023)。 在喂给 RoPE 之前把所有位置缩放 $L_{\text{train}} / L_{\text{test}}$ 倍,这样比如位置 4096 用的就是训练时位置 2048 见过的角度。便宜,需要短期微调。
- NTK-aware scaling 与 YaRN(Peng et al., 2023)。 只缩放低频维度(在训练区间内角度变化极小的那些),不动高频维度。长上下文还原度更好。
- LongRoPE(Ding et al., 2024)。 搜索每个维度独立的非均匀缩放因子。在最少微调的情况下把可用上下文推到 200 万 token。
这就是为什么每个新 LLM 的 config 里都有 RoPE base = 10000,推理时还要再写一行 RoPE scaling = ...。
ALiBi:最务实的外推方案
ALiBi(Press et al., 2022)可能是名单里最反直觉的一个,因为它简单到不像话:没有嵌入、没有旋转,直接在注意力分数上加一项固定的、按 head 区分的线性距离惩罚:
$$ \text{score}(i, j) = \frac{q_i^\top k_j}{\sqrt{d_k}} - m_h \cdot |i - j|. $$斜率 $m_h$ 按几何衰减预先固定(head 1:$m_1 = 1/2$;head 2:$m_2 = 1/4$;……),啥都不学。

就这。上图右侧揭示了设计意图:head 1 斜率最陡,专注局部(“刚刚发生了什么”);head 8 斜率最缓,几乎全局(“整篇文档”)。
为什么能外推。 偏置是关于偏移的闭式函数。推理时给 32K 上下文,哪怕训练只到 2K,它依然按线性继续衰减——没有任何"魔法",也不需要微调。
取舍。 实测上,ALiBi 在训练长度上的语言建模略弱于 RoPE,超出训练长度后则远胜——BLOOM、MPT 选它就是冲着这一点。
综合:长度外推全景
2026 年最实际的问题是:当推理上下文超过训练上下文时,困惑度变成什么样?

定性结论——绝对 PE 崩溃、RoPE 渐进式下降、ALiBi 几乎免费——在文献里高度一致(Press et al. 2022;RoFormer 论文;以及一系列 RoPE 长度扩展报告)。图是示意性的,绝对数字会随模型、数据、解码设置变化。
从这张图能抽出几个工程层面的判断:
- 如果你不打算超出训练上下文(例如 BERT 风格的分类/抽取),可学习绝对 PE 就够,简单稳定。
- 如果想兼顾外推与分布内质量,RoPE + 一种长度扩展技巧(PI、NTK-aware、YaRN)是当下默认,几乎所有开源 LLM 都这么做。
- 如果你必须服务远超训练长度的请求且不想微调,ALiBi 是最可预测的选择。BLOOM、MPT、Falcon-RW 都选它。
- 混合方案(RoPE + 小型可学偏置,或 NoPE 在部分层完全去掉位置信息)是活跃方向,结果有潜力但跨规模复现不稳。
选型清单
一个简短的决策树:
- 最大上下文 $\leq$ 训练上下文,编码器风格(分类/QA,输入有界):可学习绝对 PE。打住。
- 解码器风格 LM,自己控制训练长度,要分布内质量最好:RoPE。需要更长就推理时叠 YaRN/PI。
- 解码器风格 LM,必须服务远超训练长度的上下文,没时间微调:ALiBi。
- 小型 T5 风格 encoder-decoder:T5 bucket 偏置。说真的够用了。
- 想发论文:搞个新组合,在 64K 上跑一下,报困惑度。
常见误解
我自己被坑过、也看到很多人混淆的几个点:
- “Sinusoidal 是相对的。” 它在线性代数意义上含有相对信息,但模型必须靠投影把它抠出来,而 LayerNorm 会把那种线性结构破坏掉。实测它的行为更接近绝对编码。
- “RoPE 没有长度上限。” 公式没有上限,但模型有:训练里没见过的偏移对应的注意力分数本质上是分布外样本,所以才需要 PI/YaRN。
- “ALiBi 只是个启发式。” 它确实是启发式,但这个启发式编码了一个很强的归纳偏置——越近的 token 越重要——而这件事在自然语言里恰好成立。仅这一条先验就足以撑起强外推。
- “训练完可以换位置编码。” 不行。整张网络(包括 LayerNorm 增益、注意力 head 的专门化、FFN 偏置)都和原本的位置信号联合优化过。换 PE 至少要长时间微调,多数情况下要重训。
参考
- Vaswani et al., 2017. Attention Is All You Need. arXiv:1706.03762
- Shaw et al., 2018. Self-Attention with Relative Position Representations. arXiv:1803.02155
- Dai et al., 2019. Transformer-XL. arXiv:1901.02860
- Raffel et al., 2020. Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer (T5). arXiv:1910.10683
- Liu et al., 2020. Learning to Encode Position for Transformer with Continuous Dynamical Model (FLOATER). arXiv:2003.09229
- He et al., 2021. DeBERTa: Decoding-enhanced BERT with Disentangled Attention. arXiv:2006.03654
- Su et al., 2021. RoFormer: Enhanced Transformer with Rotary Position Embedding. arXiv:2104.09864 —— 苏神博文 《让研究人员绞尽脑汁的 Transformer 位置编码》 。
- Press et al., 2022. Train Short, Test Long: Attention with Linear Biases (ALiBi). arXiv:2108.12409
- Chen et al., 2023. Extending Context Window of Large Language Models via Positional Interpolation. arXiv:2306.15595
- Peng et al., 2023. YaRN: Efficient Context Window Extension of Large Language Models. arXiv:2309.00071
- Ding et al., 2024. LongRoPE: Extending LLM Context Window Beyond 2 Million Tokens. arXiv:2402.13753