浅谈位置编码:从 Sinusoidal 到 RoPE 与 ALiBi
系统梳理 Transformer 位置编码:为什么 Attention 需要它、绝对/相对/RoPE/ALiBi 各方案怎么算、长上下文外推时哪种最稳,以及如何为新模型选型。
第一次手动计算 Self-Attention 时,多数人会惊讶地发现:它完全不依赖输入顺序。若将 token 序列重新排列,各注意力分数也会随之同步重排——该函数严格满足置换等变性。因此,在让 Transformer 完成需要理解序列顺序的任务之前,必须显式注入位置信息。
这一设计选择——即‘如何注入位置信息’——催生了涵盖 Sinusoidal、Learned、Relative、T5 bucket、RoPE、ALiBi、NoPE 等多种方案的活跃研究方向。本文面向工程师,以简明为原则,每种方案都提供足以理解其核心思想的数学表达,并辅以充分的横向对比,支撑工程选型决策,重点放在 LLM 时代最关键的一项指标——长度外推(length extrapolation),即在比训练上下文更长的输入上还能不能用。
你将学到什么#
- Attention 为什么是置换等变的,这个性质如何决定了位置编码的设计空间
- 两大主流家族:绝对位置编码 与 相对位置编码
- Sinusoidal、 Learned、 T5 bucket、 RoPE、 ALiBi 究竟在算什么
- 哪些方案能优雅外推到更长上下文,哪些会直接崩
- 给新架构选型时的一份决策清单
前置知识#
- 熟悉 Self-Attention ($Q$ 、$K$ 、$V$ 、 softmax 那一套)
- 会一点线性代数(矩阵、内积、旋转)
为什么 Attention 一定要位置信息#
$$ \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 向量构成的多重集的不同排列——输入向量集合相同,输出向量集合也相同,仅顺序不同。要使模型能区分这两句话,必须显式注入位置信息;否则,模型在数学上无法完成此任务。
而注入方式这件事,可以非常干净地拆成两类。
第一类:绝对位置编码#
$$\tilde{x}_p = x_p + e_p.$$这样位置 1 的输入和位置 2 的输入就真的不一样了,哪怕两个 token 都是 “the”。注意力可以读到这种差异,从而捕捉顺序。
剩下的问题就是:$e_p$ 从哪儿来?
可学习位置编码(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 的对话模型来说,这是致命的。
三角函数位置编码(Sinusoidal)#
$$ \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 是个漂亮的设计,但已经被后来者全面接管。
其他绝对编码(简述)#
再快速点两个名字,认得就够了。
- 递归式 / 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 页是同一件事。所以直接把相对偏移注入到注意力打分里,注入到它真正被用的地方。
Shaw 原始方案#
$$\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$ 的表,注意力里还多出一组逐对查询,难以与矩阵乘法融合。
T5 偏置:极简主义#
$$\text{score}(i, j) = \frac{q_i^\top k_j}{\sqrt{d_k}} + b_{B(i-j)},$$其中 $B(\cdot)$ 是“分桶函数”:小偏移直接用,大偏移按对数映射到很少的几个桶(典型 32 个)。每个 head 学自己那 32 个标量。就这么多。
T5 还顺手把 value 上的位置偏置也整个去掉,实测毫无副作用,公式干净到令人发指。
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$ 做变换),结果出来的注意力分数却只依赖相对偏移。两全其美。
构造#
$$ R_m^{(g)} = \begin{pmatrix} \cos m\theta_g & -\sin m\theta_g \\ \sin m\theta_g & \cos m\theta_g \end{pmatrix}. $$ $$\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$ 有关。

它为什么这么好用#
三点让 RoPE 成了现代 LLM 的默认选择:
- 天生相对: Sinusoidal 的“相对信息”要靠线性投影去抠出来, LayerNorm 还会顺手破坏。 RoPE 直接把相对依赖烧进打分本身,每一层都成立。
- 长度无关: 旋转矩阵 $R_m$ 对任意实数 $m$ 都有定义,跟 $\sin(m\theta)$ 一样。没有嵌入表要扩。
- 几乎免费: 块旋转的成本相当于每对维度做一次复数乘法,代码里就是几个
cos/sin加逐元素乘,与 attention 矩阵乘相比可以忽略。
把 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:最务实的外推方案#
$$\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