Transformer 的 self-attention 有一个优点,也有一个问题:它天然不关心顺序。给定一组 token,如果不加入位置信息,attention 看到的更像一个集合,而不是一句话。可是语言、代码、图像 patch、视频帧都离不开顺序。
原始 Transformer 用 sinusoidal positional encoding 解决这个问题。后来模型又发展出 learned positional embedding、相对位置偏置、RoPE、ALiBi 等方案。位置编码不再只是“第几个 token”的坐标,而逐渐变成“两个 token 相隔多远、这种距离如何影响 attention”的机制。
本篇能让你学会三件事:
- 为什么 Transformer 必须显式注入位置信息;
- RoPE 和 ALiBi 为什么在大语言模型时代变得重要;
- 为什么能扩展上下文长度,不等于模型真正理解长上下文。
一、没有位置,Transformer 只是一袋 token
Self-attention 的核心是比较 Query 和 Key 的相似度。如果两个输入 token 交换位置,但它们的向量本身不变,那么没有位置编码的 Transformer 很难知道顺序发生了变化。
这对语言是致命的。“狗咬人”和“人咬狗”包含相同词,但意义完全不同。代码中一行语句的位置、括号嵌套和变量作用域也都依赖顺序。Transformer 需要某种方式知道 token 的位置。
位置编码的基本任务就是给内容向量加入顺序信息。问题在于:这个顺序信息应该是绝对位置,还是相对距离?应该加到 embedding 上,还是进入 attention logits?应该能外推到更长长度,还是只要训练长度内有效?
二、原始正弦位置编码
《Attention Is All You Need》使用正弦和余弦函数构造位置编码。不同维度使用不同频率:
\[ PE(pos,2i)=\sin(pos/10000^{2i/d}) \]
\[ PE(pos,2i+1)=\cos(pos/10000^{2i/d}) \]
直觉上,高频维度刻画短距离变化,低频维度刻画长距离变化。模型可以通过这些周期性信号推断位置,也可以通过线性组合表达相对位移。
正弦编码的好处是不用学习参数,并且理论上可以生成训练长度之外的位置。缺点是它把位置作为一个外加向量加到 token embedding 上,后续模型是否学会良好使用这些信号,仍然取决于训练。
三、learned positional embedding
Learned positional embedding 更直接:为每个位置学习一个向量。BERT、GPT 系列早期模型常用这种方式。它简单有效,在固定最大长度内表现很好。
问题是外推。训练时只学了 0 到 512 或 0 到 2048 的位置向量,推理时突然要求 8192,模型没有对应的 learned embedding。即使通过插值或扩展解决参数形状问题,模型也未必学过那么远的距离关系。
这也是长上下文时代相对位置和 RoPE/ALiBi 受到关注的原因。模型不只需要知道“这是第 50000 个 token”,更需要知道“当前 token 和那个 token 相隔多少、这种距离是否应该衰减”。
四、绝对位置与相对位置
绝对位置关注 token 在序列中的坐标:第 1 个、第 2 个、第 100 个。相对位置关注两个 token 之间的距离:相隔 1、相隔 8、相隔 1024。
语言中的许多关系更像相对关系。一个形容词通常修饰附近名词,括号匹配依赖相对结构,代码缩进和作用域也常常由局部和层级关系决定。绝对位置当然有用,但相对距离往往更接近 attention 需要的信息。
相对位置方案通常把距离信息加入 attention 计算中,而不是只加到输入 embedding 上。这样 Query 和 Key 的相互作用可以直接感知距离。
五、RoPE:把位置变成旋转
RoPE(Rotary Position Embedding)的核心思想,是对 Query 和 Key 的向量按位置进行旋转。不同位置对应不同旋转角度;两个位置向量做点积时,相对位移会自然进入结果。
它的优点是把相对位置信息嵌入 attention score 中,而不是简单附加在 token embedding 上。现代 LLaMA 等模型采用 RoPE,很大程度上是因为它在 Decoder-only LLM 中表现稳定,也比较适合长上下文扩展。
RoPE scaling、NTK-aware scaling、插值等方法试图把训练长度之外的位置映射到模型可处理范围。但这些方法都不是免费午餐:位置频率被压缩后,短距离和长距离分辨率会改变,模型是否还能稳定使用长上下文需要评测。
六、ALiBi:用 bias 表达距离偏好
ALiBi(Attention with Linear Biases)不学习位置向量,而是在 attention logits 上加入随距离线性变化的偏置。距离越远,bias 越不利;不同 head 可以有不同斜率。
它的直觉很朴素:越近的 token 通常越相关,但模型仍然可以在需要时关注远处。因为 bias 规则可以直接应用到更长序列,ALiBi 在长度外推上有吸引力。
和 RoPE 相比,ALiBi 更像给 attention 加一个距离先验;RoPE 则把位置关系编码到 Query/Key 几何结构中。二者都说明位置已经不只是输入层的小补丁,而是 attention 机制的一部分。
七、长上下文扩展的风险
把最大上下文从 4K 扩到 32K,不只是改一个配置。位置编码、训练数据、attention kernel、KV Cache、评测任务都会一起变。模型可能能处理更长输入,但未必能可靠利用远处信息。
常见评测如 needle-in-a-haystack 可以测试模型能否在长文本中找一个显著片段,但真实任务更难:信息分散、互相矛盾、需要跨段推理。位置编码能提供坐标系统,却不能保证模型学会长期记忆和复杂检索。
所以长上下文能力要谨慎表述。能跑更长长度只是第一步;能稳定理解、检索、推理和拒绝无关信息,才是更高要求。
八、关键概念回顾
- 绝对位置编码:给每个位置一个坐标向量。
- 相对位置:关注 token 之间的距离,而不是单个 token 的绝对坐标。
- RoPE:通过旋转 Query/Key 把相对位置信息引入 attention。
- ALiBi:在 attention logits 上加入距离相关线性偏置。
- 长度外推:模型在超过训练长度的上下文上保持可用的能力。
九、常见误解
9.1 “正弦位置编码已经解决长度外推”
它能生成任意长度的位置向量,但不保证模型在训练外长度上学会可靠推理。
9.2 “RoPE scaling 可以免费扩上下文”
RoPE scaling 会改变位置频率和距离分辨率,需要训练或评测验证。它不是无代价开关。
9.3 “长窗口就是长期记忆”
长窗口是一次上下文内可访问更多 token,长期记忆还需要持久化、检索、更新和遗忘。
十、下一步
位置编码解决的是“token 在哪里”。接下来进入另一个问题:如果 attention 公式不变,能不能把计算路径改得更适合硬件?这就是 42|FlashAttention 的主题。
十一、参考文献
- Vaswani, A. et al. “Attention Is All You Need.” NeurIPS 2017.
- Su, J. et al. “RoFormer: Enhanced Transformer with Rotary Position Embedding.” Neurocomputing 2024.
- Press, O. et al. “Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation.” ICLR 2022.
- Touvron, H. et al. “LLaMA: Open and Efficient Foundation Language Models.” arXiv:2302.13971, 2023.
← 上一篇:40|三大路线之争 | 下一篇:42|FlashAttention →
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【Transformer 与注意力机制】43|稀疏与局部注意力:Longformer、BigBird、Sparse Transformer
FlashAttention 优化的是 full attention 的实现路径,稀疏注意力则直接改变 token 之间的连接图。本文解释局部窗口、全局 token、随机连接和结构化稀疏为什么能降低长序列成本,以及 Longformer、BigBird、Sparse Transformer 各自代表什么取舍。
【Transformer 与注意力机制】55|Transformer 的根本局限:为什么 O(n²) 是终极瓶颈
Transformer 的成功没有消除它的结构性代价。本文区分工程瓶颈和架构瓶颈,解释 O(n²) attention、KV Cache 线性增长、自回归串行性、长上下文与长期记忆的差异、位置外推和数据效率问题,并说明为什么 Mamba、RWKV、RetNet、线性注意力等路线都在试图绕开同一组限制。
【Transformer 与注意力机制】21|位置编码:为什么需要它,为什么用正弦
从「self-attention 是排列等变的」这件几乎被忽视的事实出发,推导出位置编码不是装饰、不是工程小技巧,而是结构性必需。原论文为什么选正弦、那个奇怪的 10000 是怎么来的、PE 与 embedding 是相加还是拼接、可学习位置和 sinusoidal 的本质差别在哪、为什么训练 512 推理 2048 会让可学习位置难以直接外推——这一篇把这些问题一次讲完,并把读者交到现代位置编码(RoPE、ALiBi)的门口。
【Transformer 与注意力机制】18|注意力的复杂度问题
为什么 attention 是 O(n²),O(n²) 到底贵在哪里,5 类降复杂度方案的优劣,FlashAttention 不是 O(n) 这件事,长上下文是怎么把架构师逼疯的。