2.1.4 位置编码 (Positional Encoding - RoPE, ALiBi)
位置编码解决的是一个基础但绕不开的问题:自注意力本身不知道顺序. 如果交换输入序列中的两个 token,标准 self-attention 只会对应交换输出位置,权重结构本身并不会意识到“前后顺序”已经变了. 所谓位置编码,本质上就是给 Transformer 注入一种关于「顺序」「距离」和「坐标」的归纳偏置.
这件事远不只是“给 token 加一个位置向量”那么简单. 位置编码会直接影响模型能否外推到更长上下文、KV Cache 如何组织、多模态坐标如何统一,以及长代码、长文档、多文档推理这类任务在远距离依赖上的稳定性. **你选的不是一个小模块,而是模型如何理解序列结构. **
1. 演进脉络与问题主线
位置编码的发展大致经历了四条路线,它们对应四种不同的问题定义:
| 路线 | 代表方案 | 核心做法 | 想解决的问题 |
|---|---|---|---|
| 绝对编码 | Sinusoidal PE / Learnable PE | 在输入端直接注入位置向量 | 如何让无序 token 集合变成有序序列 |
| 相对编码 | Shaw PE / Transformer-XL | 在注意力内部显式建模相对距离 | 模型更该关心谁离谁近,而不是谁是第几位 |
| 旋转编码 | RoPE / NTK-aware / YaRN | 把位置写成相位旋转 | 能否让相对距离自然出现在点积里 |
| 偏置编码 | ALiBi | 在 logits 上加入距离罚项 | 能否用极低成本获得长程外推能力 |
这几条路线的分歧,不在“有没有位置信息”,而在“位置信息应该长在哪一层”.
- 绝对编码把位置放在输入端,与语义 embedding 共享同一表征空间.
- 相对编码把位置放进注意力打分,让距离直接影响 Query-Key 交互.
- RoPE 不再单独加“位置项”,而是把位置写成旋转相位,让相对关系在内积中自然浮现.
- ALiBi 则更激进,它甚至不编码位置向量,只对远距离交互加惩罚.
从今天回头看,现代开源 LLM 大多偏向 RoPE,不是因为别的方法都错了,而是因为 RoPE 在“相对性”“实现复杂度”“社区生态”之间取得了最均衡的结果.
2. 绝对位置编码:最直观,也最早暴露瓶颈
2.1 Sinusoidal 位置编码
Vaswani et al. (2017) 给出的正弦位置编码是最经典的绝对编码形式:
这里 是绝对位置索引,取值范围为 ; 是维度分组索引; 是隐藏维度. 式 (1) 与式 (2) 共同构造了一组跨多尺度频率的周期信号. 低频维度编码长程位置趋势,高频维度编码短程位置差异.
它的优点很清楚:
- 不需要训练,直接可算.
- 值域固定在 ,数值稳定.
- 不同维度覆盖不同波长,能同时表达短程和长程位置模式.
但它的问题也很直接. Sinusoidal PE 是和 token embedding 做加法融合的,这意味着语义信息和位置信息要竞争同一表征空间. 语义 embedding 太强,位置容易被淹没; 位置幅度太大,又会反过来污染语义表征. **这不是实现细节,而是绝对编码的结构性张力. **
另外,绝对编码会把“这是第几位”直接暴露给模型. 无论是 Sinusoidal 还是可学习位置表,本质上都在给每个位置分配一个绝对坐标身份. 这样做的后果是,模型更容易把某些模式绑定到“第 32 位”“第 512 位”这类具体位置上,而不是绑定到“前一个 token”“距离为 3 的依赖”这类可迁移关系上.
这也是绝对编码的另一个根本局限:它并不天然表达相对距离. 位置 100 和 101 的关系,与 1000 和 1001 的关系,并不会自动共享同一结构. 模型必须再额外学会这种“平移不变性”,而这种额外学习在长上下文、长代码和长度外推场景里往往并不稳定.
2.2 可学习位置编码
BERT、GPT-2、GPT-3 一类模型更常用可学习位置矩阵:
它的含义很简单:每个绝对位置直接对应一个可训练向量. 训练长度内,这种方式通常比 Sinusoidal 更灵活,因为模型可以把“第 17 位”“第 1024 位”分别学成最有利的表示.
但代价是位置上限被硬写进了参数表. 只要测试长度超出 ,模型就没有原生定义,后续只能靠插值、重训或者硬外推补救. **绝对编码最致命的问题,不是效果差,而是太静态. **
| 方案 | 最大长度 | 额外参数 | 外推能力 |
|---|---|---|---|
| Sinusoidal PE | 由实现决定 | 0 | 弱 |
| Learnable PE | 由 决定 | 几乎没有 |
从工程角度看,绝对编码最终没有成为长上下文主流,就是因为它不适合上下文窗口持续扩张的 LLM 时代.
3. 相对位置编码:更像语言任务真正需要的东西
语言和代码中的很多依赖,本来就是相对的:代词依赖前文实体,变量引用依赖之前定义,表格单元格依赖相邻行列. 模型真正需要的,往往不是“第几位”,而是“离谁多远”.
3.1 Shaw 相对位置表示
Shaw et al. (2018) 将相对距离直接写入注意力打分:
这里 是位置 的输入向量, 是 Query/Key 投影矩阵, 是与相对距离 对应的可学习位置向量.
式 (4) 里前半项是内容相似度,后半项是距离偏好. 这样一来,模型不用在输入层死记“第几位”,而是在注意力打分阶段显式决定“这个 Query 对某种距离的 Key 有多偏爱”.
这个思路更符合语言任务,但也带来代价:参数量会随着最大距离截断范围增长,实现也更复杂. 你一旦显式引入距离表,就要面对截断、桶化和并行友好性下降的问题.
3.2 Transformer-XL 的递归相对编码
Dai et al. (2019) 在 Transformer-XL 中把相对位置进一步写进片段级递归注意力:
这里 是 Query 和 Key, 是相对距离编码, 是全局内容偏置和位置偏置.
这种设计在长上下文上比绝对编码更自然,因为它把记忆延伸和相对距离建模结合起来了. 但它的代价不能只笼统地说成“更串行”,而要具体看依赖链怎么变长. 标准 Transformer 训练时,每个长度为 的 segment 可以彼此独立计算; Transformer-XL 则必须先算出前一段 的隐藏状态 ,再把它以 的形式缓存给下一段 当作扩展上下文. 这意味着同一条文档流上的 segment 之间不能再完全并行展开,因为后一段的 Key/Value 依赖前一段已经产出的缓存.
不过,这种串行化也不是 RNN 式的“整条链都要反传”. 论文里明确用了 stop-gradient,因此反向传播仍然被截断在单个 segment 内; 跨段传递的是前向记忆,不是跨段梯度. 量化地说,Transformer-XL 训练时可利用的最大依赖长度不是无界增长,而是随层数和 segment 长度线性增长,大致为 . 如果模型有 层、每段长度 ,那么单次训练中理论上最多能把信息传到约 个 token 之外; 如果是 、,上限约为 个 token. 这个量级明显大于 vanilla Transformer 的单段 token,但代价是训练调度不能再把相邻段完全当成互不相关的小样本来并行处理.
所以,相对编码路线虽然方向更对,却一直没有成为最通用的工业解. **它更贴近任务结构,但不够便宜. **
4. RoPE:相对关系不是手写进去,而是自然长出来
RoPE 是位置编码路线里最关键的一步. 它真正的突破不是“用了旋转矩阵”,而是 把绝对位置写成相位,让相对位置在点积里自动出现. 如果要追它的中文源头,最值得直接读的是苏剑林的博客《Transformer升级之路:2、博采众长的旋转式位置编码》; 对应的英文论文入口则是《RoFormer: Enhanced Transformer with Rotary Position Embedding》.
苏老师真是太牛逼了. 此事在 kexue.com 内亦有记载.
RoPE 之所以在今天几乎成为现代开源 LLM 的默认位置编码,不是因为它“最花哨”,而是因为它同时拿到了三件事:天然的相对位置建模、很低的结构侵入性、以及和现有注意力实现的高兼容性. 它把绝对位置写成旋转相位,再让相对距离在 Query-Key 点积里自然浮现,这一点是它和绝对编码、显式相对编码最本质的差别.
如果你现在只想抓住 RoPE 的主体,不想在总览文里继续下潜,直接读这两篇就够了:
5. ALiBi:不旋转,只惩罚远距离
ALiBi 的立场和 RoPE 几乎相反. 它不去构造位置向量,也不引入旋转相位,而是直接在 attention logits 上对远距离交互加线性罚项.
Press et al. (2021) 给出的形式是:
这里 是 Query 和 Key, 是第 个注意力头对应的距离斜率. 常见的头间斜率分配可以写成:
这意味着不同注意力头被分配给不同距离尺度:有的头更强调局部结构,有的头更愿意看远处.
ALiBi 最大的优势不是“更聪明”,而是“更省”:
- 不需要额外位置参数.
- 不需要旋转计算.
- 没有周期相位问题,外推到更长长度时定义始终成立.
- 对 KV Cache 也更友好,因为它不改变 Key 本身,只改变 logits.
这也是为什么它对一些低成本系统、实验性长上下文模型、端侧部署场景依然有吸引力.
问题也同样明显. ALiBi 把“距离越远越不重要”写成了硬编码偏置. 这在很多自然语言任务里成立,但在代码、长文档检索、数学推导、多文档问答里未必成立. 变量定义可能隔着几百行,论文结论可能依赖开头术语,跨文档答案甚至天然需要远距离高精度连接.
所以 ALiBi 不是错,而是它更像一种强任务偏置. **它适合那些远距离依赖确实应该持续衰减的任务,不适合作为所有长上下文任务的统一默认解. **
6. 位置编码为什么会影响工程系统
到这里如果还把位置编码理解成“只是数学模块”,就会低估它的工程后果. 它至少会影响下面三个层面.
长代码任务最容易暴露位置编码问题,因为它要求模型同时做好两件互相冲突的事:
- 保留局部高分辨率,理解缩进、块结构、近距离语法.
- 支撑远距离稳定外推,跨函数、跨文件追踪定义和引用.
RoPE 外推方案之所以在代码模型里尤其重要,就是因为代码比普通对话更苛刻地放大了这个矛盾.
纯文本只需要一维顺序,但图像有二维坐标,视频有时间轴,文档有版面布局,GUI 还有屏幕绝对位置. 此时“位置”已经不再是单一序列索引,而是多个坐标系的组合.
这也是为什么多模态模型常常要扩展 RoPE 到二维、三维,或者引入多轴位置编码. 真正的问题不再是“第几位”,而是如何把文本顺序、图像空间和时间坐标放进同一个可计算的参考系里.
RoPE 会把位置信息直接嵌进 Query / Key 表示里. 因此你只要想压缩 KV Cache,就会立刻遇到问题:压缩后的 Key 还能不能保住这些位置信息?
对于 MQA、GQA 这类共享头结构,这件事还相对简单; 但一旦走到 MLA、latent KV 或更激进的缓存压缩路径,位置相关分量和内容相关分量的分离就会变得很关键. 否则缓存压缩做完,位置编码先失真了.
所以从系统设计看,位置编码不是“输入端处理完就结束”的事情,它会一路影响到缓存组织、量化路径和注意力内核.
7. 失效模式与配图建议
位置编码最常见的失效,并不是“模型完全不会用位置”,而是偏置与任务不匹配:
- 绝对编码在长上下文上外推失真.
- RoPE 在超长长度上高频相位跑飞.
- ALiBi 在远距离高精度依赖任务上过度惩罚.
- 多模态场景里单轴位置编码无法表达空间结构.
从更高层看,位置编码的选择其实是在选一种任务偏置:
- 绝对编码偏向静态坐标表.
- 相对编码偏向距离关系.
- RoPE 偏向连续频谱下的相对相位.
- ALiBi 偏向距离惩罚与低成本外推.
如果后续要给本文补图,最值得画的是下面四类,而且都应该就地服务于理解,不是装饰:
配图建议:画成四联图,分别展示绝对编码、相对编码、RoPE、ALiBi 把位置信息注入到哪一层. 图片描述:对比四种位置编码在输入层、attention 打分层和相位层面的差异. GPT-Image-2 Prompt:Create a technical educational figure with four side-by-side panels comparing absolute positional encoding, relative positional encoding, RoPE, and ALiBi in Transformers. Show where positional information is injected in each method. White background, research-paper style, minimal academic palette, precise arrows, readable labels, no decorative art.
配图建议:画 RoPE 的复平面旋转示意图. 图片描述:展示 Query 与 Key 旋转后,绝对相位抵消,只保留相对相位差. GPT-Image-2 Prompt:Create a technical educational figure showing RoPE as complex-plane rotation. Visualize two vectors rotated by different absolute phases whose inner product depends only on relative phase difference. White background, academic diagram style, blue and orange highlights, no decorative art.
8. 本节小结
位置编码看起来只是 Transformer 里的一个基础组件,实际上它决定了模型如何理解「顺序」「距离」「坐标」和「外推」.
绝对编码解决了“序列从哪里来的问题”,但太静态; 相对编码更符合语言任务,却更重; RoPE 之所以成为主流,是因为它让相对关系自然出现在点积里,同时又保留了很高的工程兼容性; ALiBi 则代表了另一种极端取舍,用极简偏置换低成本外推.
因此,位置编码从来不只是“在 embedding 上加一行东西”. 它是长上下文、代码建模、多模态坐标统一和推理系统设计中的底层基础设施. 后续很多看似分散的问题,最后都会回到同一个核心:**模型究竟该怎样理解位置. **
9. 参考文献
- Vaswani, A., et al. (2017). 注意力就是你所需要的一切(Attention Is All You Need). NeurIPS.
- Shaw, P., Uszkoreit, J., & Vaswani, A. (2018). 带相对位置表示的自注意力(Self-Attention with Relative Position Representations). NAACL.
- Dai, Z., et al. (2019). Transformer-XL:超越固定上下文长度的注意力语言模型(Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context). ACL.
- Su, J., et al. (2021). RoFormer:带旋转位置嵌入的 Transformer(RoFormer: Enhanced Transformer with Rotary Position Embedding). arXiv.
- Press, O., Smith, N. A., & Lewis, M. (2021). 训得短、测得长:线性偏置注意力实现输入长度外推(Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation). arXiv.
- Peng, B., et al. (2023). YaRN:高效扩展大语言模型上下文窗口(YaRN: Efficient Context Window Extension of Large Language Models). arXiv.
- Gu, A., & Dao, T. (2023). Mamba:用选择性状态空间实现线性时间序列建模(Mamba: Linear-Time Sequence Modeling with Selective State Spaces). arXiv.
- Liu, S., et al. (2024). LongRoPE:将大语言模型上下文扩展到 200 万 token 以上(LongRoPE: Extending LLM Context Window Beyond 2 Million Tokens). arXiv.
- Dai, D., et al. (2024). DeepSeek-V2:强大、经济且高效的 MoE 语言模型(DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model). arXiv.