把"我 爱 北 京"四个字打乱顺序,变成"北 京 我 爱",意思完全变了。但对Transformer的自注意力机制来说,这两个输入几乎没有区别——它会以完全相同的方式计算每个词与其他词的关联度。
这不是设计缺陷,而是特性。自注意力的核心优势在于并行处理和全局信息交互,代价是丢失了序列顺序。2017年Google团队在《Attention Is All You Need》中提出的解决方案是一个看起来很"奇怪"的设计:用正弦和余弦函数给每个位置生成一个向量,加到词向量上。
八年后的今天,位置编码已经从简单的向量相加,演变成了一个涉及复数旋转、线性偏置、分段插值的复杂技术领域。Llama、Mistral、GPT-NeoX等主流开源模型选择了RoPE;BLOOM、MPT选择了ALiBi;而2025年发布的Llama 4甚至开始尝试"无位置编码"的混合架构。这些选择背后,是对同一个问题的不同回答:模型到底需要什么样的位置信息?
自注意力的盲点:为什么位置编码不可或缺
理解位置编码的价值,需要先理解自注意力的工作原理。
给定一个序列 $\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_n$,自注意力将每个位置的向量转换为Query、Key、Value三个投影,然后计算:
$$\text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left(\frac{\mathbf{Q}\mathbf{K}^\top}{\sqrt{d_k}}\right)\mathbf{V}$$关键在于 $\mathbf{Q}\mathbf{K}^\top$ 这一步。假设我们交换位置 $i$ 和 $j$ 的输入向量,$\mathbf{Q}\mathbf{K}^\top$ 矩阵只是对应地交换了第 $i$ 行和第 $j$ 行、第 $i$ 列和第 $j$ 列——但softmax之后的注意力权重分布模式完全相同。换句话说,自注意力对输入顺序是置换不变的(permutation invariant)。
这对NLP任务是致命的。自然语言严重依赖语序:“狗咬人"和"人咬狗"截然不同。如果模型无法区分这两个句子,再强大的参数量也无济于事。
位置编码的任务就是打破这种置换不变性。最直观的方法是给每个位置分配一个唯一标识符,然后以某种方式融合到输入中。但"如何标识"和"如何融合"这两个问题,困扰了研究者整整八年。
Sinusoidal:一个优雅但受限的开端
2017年原始Transformer论文中的Sinusoidal位置编码,至今仍被认为是设计精巧的典范。其公式为:
$$PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right)$$$$PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right)$$
其中 $pos$ 是位置索引,$i$ 是维度索引,$d$ 是嵌入维度。每个维度使用不同频率的正弦或余弦函数,形成了一种多尺度的位置表示。
图片来源: Dive into Deep Learning - Self-Attention and Positional Encoding
这个设计的精妙之处在于利用三角恒等式。根据 $\sin(\alpha + \beta) = \sin\alpha\cos\beta + \cos\alpha\sin\beta$,可以证明位置 $pos + k$ 的编码可以表示为位置 $pos$ 编码的线性变换:
$$\begin{pmatrix} PE_{pos+k, 2i} \\ PE_{pos+k, 2i+1} \end{pmatrix} = \begin{pmatrix} \cos(k\omega_i) & \sin(k\omega_i) \\ -\sin(k\omega_i) & \cos(k\omega_i) \end{pmatrix} \begin{pmatrix} PE_{pos, 2i} \\ PE_{pos, 2i+1} \end{pmatrix}$$这意味着模型不仅获得了绝对位置信息,理论上还能学习到相对位置关系。同时,由于公式是连续的,理论上可以处理任意长度的序列——不需要像可学习位置编码那样为每个位置存储参数。
但实践中,Sinusoidal暴露出两个问题。第一,外推能力并没有理论预期的那么好。当推理序列长度远超训练长度时,模型的注意力模式会崩溃。第二,位置编码加在输入端,只能以"加法"方式影响注意力,表达能力有限。
相对位置编码:换一个视角看问题
绝对位置编码为每个位置分配一个唯一向量,但自然语言真的需要知道"这个词是第5个位置"吗?对于大多数语言理解任务,更重要的是"这个词和那个词隔了多远”。
这个认知催生了相对位置编码。2018年Shaw等人的论文《Self-Attention with Relative Position Representations》首次系统性地将相对位置引入注意力机制。核心思想是:不再给输入向量加位置编码,而是在计算注意力分数时,根据Query和Key的相对距离添加一个可学习的偏置。
设位置 $m$ 的Query与位置 $n$ 的Key之间的相对距离为 $m - n$,相对位置编码将注意力计算修改为:
$$e_{mn} = \frac{\mathbf{q}_m^\top (\mathbf{k}_n + \mathbf{a}_{mn}^K)}{\sqrt{d_k}}$$其中 $\mathbf{a}_{mn}^K$ 是一个只依赖于相对距离 $m - n$ 的可学习向量。距离超过某个阈值后通常会被截断(clip),假设相对位置超过128个token就不再精细区分。
这种设计有几个优势。首先,它直接建模相对距离,符合语言直觉。其次,截断机制使得模型能够处理任意长度的输入——即使训练时只见过长度1000的序列,推理时遇到相对距离2000,也会被截断到已知范围内。
T5模型进一步简化了这个设计。它不再使用向量形式的相对位置编码,而是直接在注意力分数上加一个标量偏置:
$$e_{mn} = \frac{\mathbf{q}_m^\top \mathbf{k}_n}{\sqrt{d_k}} + b_{m-n}$$其中 $b_{m-n}$ 是一个可学习的标量,T5对不同范围的相对距离采用"分桶"策略:距离0-7每个分配一个独立参数,距离8-11共享一个参数,距离12-15共享另一个参数……越远的距离分桶越粗。
相对位置编码解决了绝对位置编码的部分问题,但也引入了新的权衡。它需要在注意力计算中增加额外步骤,实现更复杂。更重要的是,它假设相对位置比绝对位置更重要——但某些任务(如文档检索、表格处理)确实需要知道"这个词在整个文档中的大概位置"。
RoPE:复数旋转的数学之美
2021年,苏剑林在论文《RoFormer: Enhanced Transformer with Rotary Position Embedding》中提出了RoPE,这个设计后来被证明是绝对位置和相对位置的完美统一体。
RoPE的核心思想极其简洁:不是给向量加位置信息,而是对向量进行旋转。
假设我们有一个二维向量 $\mathbf{x} = (x_1, x_2)$,将其视为复数 $z = x_1 + ix_2$。如果乘以 $e^{im\theta}$(其中 $m$ 是位置,$\theta$ 是固定角度),根据欧拉公式:
$$z \cdot e^{im\theta} = (x_1 + ix_2)(\cos m\theta + i\sin m\theta) = (x_1\cos m\theta - x_2\sin m\theta) + i(x_1\sin m\theta + x_2\cos m\theta)$$对应的实数操作是一个旋转矩阵:
$$\begin{pmatrix} x_1' \\ x_2' \end{pmatrix} = \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} x_1 \\ x_2 \end{pmatrix}$$关键的性质在于:如果位置 $m$ 的Query旋转角度 $m\theta$,位置 $n$ 的Key旋转角度 $n\theta$,那么它们在注意力计算中的点积会包含相对位置信息:
$$\mathbf{q}_m^\top \mathbf{k}_n = |\mathbf{q}_m||\mathbf{k}_n|\cos((m-n)\theta)$$注意点积只依赖于相对位置 $(m-n)$!这正是相对位置编码想要的效果,但我们是通过给每个位置分配一个绝对角度实现的——绝对位置编码的框架下,自然涌现出了相对位置信息。
对于更高维度,RoPE将向量分成若干二维子空间,每个子空间使用不同的旋转频率。频率的定义与Sinusoidal类似:
$$\theta_i = 10000^{-2i/d}, \quad i = 0, 1, \ldots, d/2-1$$这使得不同维度捕捉不同粒度的位置信息:低频维度关注全局位置,高频维度关注局部细节。
def apply_rotary_pos_emb(x, cos, sin):
# x: [batch, seq_len, num_heads, head_dim]
# 将head_dim分成两半,进行二维旋转
x1, x2 = x[..., ::2], x[..., 1::2]
# 旋转操作
return torch.cat([x1 * cos - x2 * sin,
x1 * sin + x2 * cos], dim=-1)
RoPE的另一个优势是**长期衰减(long-term decay)**特性。数学上可以证明,当相对距离增大时,注意力分数会自然下降——这符合语言直觉:距离越远的词,关联度通常越低。
正是这些优雅的数学性质,使得RoPE成为Llama 2、Llama 3、Mistral、Gemma、Qwen等几乎所有主流开源大模型的选择。
ALiBi:简单粗暴的长序列外推
RoPE虽然优雅,但有一个弱点:当推理序列长度远超训练长度时,表现会下降。这是因为虽然旋转角度可以自然延伸,但模型在训练时学到的注意力模式可能无法泛化到未见过的角度范围。
2021年Press等人提出的ALiBi(Attention with Linear Biases)采取了完全不同的策略:干脆不使用位置编码。
ALiBi的核心设计极其简单。在计算注意力分数后、softmax之前,根据Query和Key的距离添加一个线性惩罚:
$$\text{softmax}(\mathbf{q}_m^\top \mathbf{k}_n - m \cdot |m-n|)$$其中 $m$ 是每个注意力头独有的斜率参数,按几何序列从 $2^{-8/n}$ 开始递减($n$ 是注意力头数)。
这个设计有几个直觉上的解释。首先,它引入了一个"近因偏置"(recency bias):距离越远的Key,惩罚越大,注意力权重越低。其次,由于惩罚是简单的线性函数,它可以自然地延伸到任意距离——训练时见过相对距离1024,推理时遇到相对距离2048,直接计算就行。
ALiBi论文报告了一个令人印象深刻的结果:使用ALiBi训练的13亿参数模型,在序列长度1024上训练,可以直接在2048长度上推理,达到与在2048长度上训练的Sinusoidal模型相同的困惑度——而且训练速度更快、内存更少。
| 方法 | 训练长度 | 推理长度 | 困惑度 | 训练速度 | 内存占用 |
|---|---|---|---|---|---|
| Sinusoidal | 2048 | 2048 | 基准 | 基准 | 基准 |
| ALiBi | 1024 | 2048 | 相同 | +11% | -11% |
这种"短训练长推理"的能力,使得ALiBi成为资源受限场景下的热门选择。BLOOM和MPT系列模型采用了ALiBi。
但ALiBi也有代价。它的归纳偏置(近因偏置)可能不适合所有任务——某些场景下远距离依赖确实很重要。同时,它完全放弃了绝对位置信息,这在需要定位特定位置的任务上可能是劣势。
长上下文之战:当RoPE需要扩展
大模型时代的一个核心挑战是上下文长度。Llama 2的原始上下文长度是4096个token,但实际应用中经常需要处理几万甚至几十万token的文档。从头训练一个超长上下文模型成本极高,因此研究者开始探索如何扩展已有模型的上下文窗口。
对于RoPE模型,核心问题是:训练时学到的旋转角度范围是 $[0, L\theta_{max}]$,推理时需要处理 $[0, L'\theta_{max}]$,其中 $L' \gg L$。如何让模型适应更大的角度范围?
位置插值(Position Interpolation, PI)
2023年,Meta和kaiokendev几乎同时提出了位置插值方法。核心思想非常直接:不是让模型适应更大的角度,而是把更大的位置范围"压缩"到训练时的角度范围内。
如果训练长度是 $L$,目标长度是 $L'$,则将位置 $m$ 映射为 $m \cdot L / L'$。这样,位置 $L'$ 对应的角度等于原来位置 $L$ 的角度——模型看到的始终是它熟悉的范围。
这个方法简单有效,但有代价:所有频率的旋转都被等比例压缩,导致高频信息丢失。研究者发现,当扩展比例超过8倍时,模型性能开始明显下降。
NTK-aware缩放
2023年,Reddit用户bloc97提出了NTK-aware插值,灵感来自神经正切核理论。核心洞察是:高频维度不应该被压缩太多。
高频维度捕捉的是局部位置关系,对模型的"定位"能力至关重要。如果压缩太多,模型可能无法区分相邻token。NTK-aware方法对不同频率维度使用不同的缩放因子:高频维度几乎不压缩,低频维度大幅压缩。
具体实现是修改RoPE的base参数。原始RoPE使用 $base = 10000$,NTK-aware将其增大为:
$$base_{new} = base \cdot s^{\frac{d}{d-2}}$$其中 $s$ 是扩展比例。
YaRN:集大成者
2023年底,YaRN(Yet another RoPE extensioN)论文将上述思想整合并进一步改进。它提出了三个关键组件:
-
NTK-by-parts:根据每个维度的"波长"决定如何处理。波长小于上下文长度的维度不插值,波长大于上下文长度的维度线性插值,中间的维度使用斜坡函数过渡。
-
温度缩放:在注意力softmax之前,对分数除以一个温度系数 $t > 1$,缓解分布熵增的问题。
- 动态缩放:推理时根据当前序列长度动态调整缩放因子,而非使用固定值。
YaRN报告称,使用该方法扩展Llama 2到128K上下文,只需要原预训练数据量的0.1%进行微调,就能达到与从头训练相近的效果。
| 方法 | 微调数据量 | 训练步数 | 128K困惑度 |
|---|---|---|---|
| 从头训练 | 100% | 完整 | 基准 |
| PI | ~10% | 多 | 较差 |
| YaRN | ~0.1% | 400步 | 接近基准 |
最新演进:从NoPE到iRoPE
位置编码的故事远未结束。2022年的一项研究发现:Transformer语言模型即使完全没有位置编码,也能学到位置信息。
这篇题为《Transformer Language Models without Positional Encodings Still Learn Positional Information》的论文指出,因果注意力掩码(causal mask)本身就隐含了位置信息——第 $n$ 个位置的token只能看到前 $n$ 个位置,这种不对称性足以让模型推断出相对顺序。
这个发现启发了新的研究方向:也许位置编码不是必须的,或者至少不需要每层都有。
Llama 4的iRoPE
2025年4月,Meta发布Llama 4系列模型,引入了iRoPE(interleaved RoPE)架构。其核心设计是:交替使用RoPE层和无位置编码层。
具体而言,Llama 4 Scout模型的注意力层分为两类:
- RoPE层:使用标准的旋转位置编码
- NoPE层:完全不使用位置编码
这种设计的理论基础是:深层网络可能已经通过因果注意力学会了足够的位置信息,额外的位置编码可能是冗余甚至有害的。交替使用可以在保持位置感知能力的同时,减少位置编码对模型的约束。
更激进的探索正在进行中。一些研究者尝试让位置编码成为可学习的模块,根据任务和数据自适应调整;另一些研究探索将位置编码与注意力计算更深度地融合。
实践中的选择指南
面对如此多的选项,模型设计者应该如何选择?以下是基于当前研究共识的决策框架:
外推能力优先:选择ALiBi。如果应用场景需要处理超长文档,且训练资源有限,ALiBi的线性外推能力是最大优势。
性能平衡:选择RoPE。如果上下文长度相对固定,追求在标准基准测试上的最优表现,RoPE是目前最成熟的选择。
极长上下文:选择RoPE + YaRN。如果需要在预训练模型基础上扩展到64K+上下文,YaRN是目前最高效的方案。
实现简洁:选择Sinusoidal或Learned。如果只是原型开发或资源受限,直接在输入端加位置编码最简单。
值得注意的是,位置编码的选择还会影响其他设计决策。例如,RoPE需要特殊的attention实现才能与Flash Attention等优化技术兼容;ALiBi需要调整注意力分数的计算流程;T5风格的相对位置编码需要额外的参数存储。
从更宏观的视角看,位置编码的演进反映了深度学习领域的一个普遍规律:先有足够强的归纳偏置,再逐步放松约束,让模型学习更灵活的表示。Sinusoidal提供了强约束(固定公式、固定频率),RoPE保留了数学结构但允许更丰富的表示,而NoPE则近乎完全放松约束——但前提是模型足够大、数据足够多,能够自己学会位置信息。
八年过去了,位置编码仍然是一个活跃的研究方向。每年都有新的变体提出,试图解决某个特定场景下的问题。但无论技术如何演进,核心问题始终是同一个:如何用最少的代价,让模型理解"顺序"这个看似简单却无比重要的概念。
参考文献
- Vaswani, A., et al. (2017). Attention Is All You Need. NeurIPS 2017.
- Shaw, P., et al. (2018). Self-Attention with Relative Position Representations. NAACL 2018.
- Su, J., et al. (2021). RoFormer: Enhanced Transformer with Rotary Position Embedding. arXiv:2104.09864.
- Press, O., et al. (2021). Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation. arXiv:2108.12409.
- Chen, S., et al. (2023). Extending Context Window of Large Language Models via Positional Interpolation. arXiv:2306.15595.
- Peng, B., et al. (2023). YaRN: Efficient Context Window Extension of Large Language Models. arXiv:2309.00071.
- Haviv, A., et al. (2022). Transformer Language Models without Positional Encodings Still Learn Positional Information. arXiv:2203.16634.
- Raffel, C., et al. (2020). Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer. JMLR.
- Su, J. (2021). 让研究人员绞尽脑汁的Transformer位置编码. 科学空间.
- ICLR Blogposts (2025). Positional Embeddings in Transformer Models: Evolution from Text to Vision Domains.