位置的难题——从正弦波到 RoPE 与长上下文
前两章的战场在"能不能训得动、训得稳"。这一章换一个战场,从一个看起来很小的理论缺陷出发——注意力机制天生不知道顺序——一路走到 2026 年最有感知度的产品能力:把几十万 token 的代码库或几本书一次性塞进模型的长上下文。这条路的主角叫 RoPE(旋转位置编码),它是今天几乎所有大模型的选择;而人们为了拉长它的"视野"发明的一系列技巧(插值、YaRN),是各家模型卡上"128K 上下文"背后真正的工艺。
4.1 一个真实的缺陷:注意力是个无序的集合运算
先把问题本身立起来。回想注意力的计算:每个位置的 query 和所有位置的 key 做点积、softmax、加权求和 value。现在做一个思想实验:把输入序列里的 token 顺序打乱,会发生什么?每个 token 的 embedding 没变,两两之间的点积没变,softmax 权重没变——每个 token 算出的结果和打乱前一模一样(只是排列顺序跟着变了)。换句话说,注意力看待输入的方式是一个集合,不是一个序列。"猫追狗"和"狗追猫",在裸的注意力眼里是同一袋词。
这在 RNN 时代根本不是问题——RNN 逐个吞 token,顺序刻在计算过程里。而 Transformer 为了并行把顺序丢了,就必须用某种方式把"你是第几个"重新注入。这就是位置编码要干的事。注意(一个常见误区):decoder 的因果掩码只提供了"谁在我左边"这个信息,并不提供"左边第几个"——只靠掩码,模型分不清紧邻的上一个词和一千个词之前的词,所以位置编码仍然必需。
4.2 第一代方案和它们的天花板
原版 Transformer(2017)的方案是正弦位置编码:给第 $m$ 个位置造一个 $d$ 维向量,各通道按不同频率的正弦、余弦波取值,直接加到该位置的 embedding 上。不同位置的波形组合不同,模型便可以从中读出位置。选择正弦波而不是随便什么编号,有一个漂亮的动机:固定频率的正余弦满足旋转叠加性质,任意两个位置的编码之间存在只依赖距离差的线性关系,理论上模型能借此学到相对位置的概念。
GPT 系早期(GPT-1/2/3)用了更省事的可学习绝对位置编码:干脆给每个位置配一个可训练向量,第 1 号位置一个、第 2 号位置一个……一直到最大长度 2048 号,让模型自己学每个位置该长什么样。简单,效果也不差。
但两代方案共享两个越来越难忍的毛病。**第一,绝对位置是错误的抽象。**语言里真正要紧的是相对关系——"形容词修饰它后面的名词",这条规律和这对词出现在文章开头还是第 5000 个词处无关。用绝对位置编码,模型得在每个位置上重新学一遍同样的语法规律,学到的知识不能跨位置迁移。**第二,长度被焊死。**可学习编码只有前 2048 个位置的"座位",第 2049 个 token 无位可坐;正弦编码理论上可以无限延伸,但模型从没在训练中见过长位置的波形组合,一超长就性能崩塌。2020 年前后大家对 2K 上下文尚可忍受,但随着"把整份文档、整个代码库给模型看"成为真实需求,这个天花板必须被拆掉。
理想的位置编码应该是什么样?把需求列出来:(1)编码相对位置而非绝对位置;(2)不往 embedding 里加东西——上一章的眼镜告诉我们,往传送带上加内容会挤占宝贵的子空间,最好让位置信息只在"该起作用的地方"起作用;(3)对没见过的长度有起码的推广能力。第一个要求指向一个关键观察:位置信息唯一被"用到"的地方,是注意力里 query 和 key 的点积——那是模型判断"谁该关注谁"的地方。那么,能不能不动 embedding,只在 q、k 点积这一步做文章?
4.3 RoPE:把位置变成旋转
2021 年的 RoPE(Rotary Position Embedding,旋转位置编码,出自苏剑林等人的 RoFormer 论文)给出的答案优雅得近乎数学游戏。
做法:把每个 query/key 向量的 $d$ 维通道两两配对,每一对 $(x_{2i}, x_{2i+1})$ 看作二维平面上的一个小向量。对于序列中第 $m$ 个位置,把第 $i$ 对小向量旋转 $m\theta_i$ 的角度,其中每对通道有自己的固定频率:
$$ \theta_i = \text{base}^{-2i/d}, \qquad \text{base} = 10000 \text{(原始取值)} $$
位置越靠后,转的角度越大;频率高的通道对转得快,频率低的转得慢。就这样,不加任何东西,只是转。
为什么这就解决了问题?关键在二维旋转的一个初等性质:两个分别旋转了 $\alpha$ 和 $\beta$ 角的向量做点积,结果只依赖角度差 $\alpha - \beta$。于是位置 $m$ 的 query 和位置 $n$ 的 key 点积时,位置信息以且仅以 $ (m-n)\theta_i$ 的形式出现——点积天然只感知相对距离。三个设计需求同时满足:相对性是数学性质而非学出来的;embedding 和残差流完全不被触碰,位置信息只出现在注意力打分的瞬间;而"旋转"对任何 $m$ 都有定义,长度没有硬性座位上限。
多频率的设计也值得咂摸:它让不同通道对以截然不同的"尺度"感知距离。高频对转得快,相邻几个 token 就转出明显差异——它们负责分辨"紧邻的词"这种精细结构;低频对转几千个位置才转出一圈的零头——它们负责"很远之前提到过"这种粗粒度远程关系。这和正弦编码的多频思想一脉相承,但作用的位置从"传送带上"挪到了"点积里",干净利落。RoPE 迅速统一了战场:Llama、Qwen、DeepSeek、Kimi、GPT 系(据信)、Gemini(据信)——2026 年你能叫出名字的模型几乎都用它或它的变体。
被淘汰者的遗产
同期还有一个值得一提的竞争者 ALiBi(2021):不做任何编码,直接在注意力分数上按距离线性扣分——离得越远越不容易被注意到。它外推性能好,被 BLOOM、MPT 等采用,但表达力上限不如 RoPE,2026 年的新旗舰已基本不用。不过它"随距离衰减"的思想活在了滑动窗口注意力等设计里。技术史里这种"方案死了、思想活着"的情况非常多。
4.4 视野的极限:为什么 RoPE 也不能直接外推
RoPE 没有座位上限,是否意味着训练在 4K 长度上的模型可以直接处理 40K 的输入?很遗憾,不行——超出训练长度后性能同样断崖式下跌。理解这个失败,才能理解后面所有长上下文技术。
问题出在低频通道上。在 4K 长度内,最低频的那些通道对只转过了很小的角度——模型见过的这些通道的状态,只覆盖了圆周上一小段弧。当输入拉到 40K,这些通道转到了训练中从未出现过的角度区域,注意力面对的是分布之外的输入,行为自然失控。打个比方:模型学会了看一只"时针只在 12 点到 1 点之间走动"的钟,你突然把时针拨到 7 点,它就不认识了。
顺着这个诊断,2023 年涌现的一系列扩展技术其实是同一个思路的三次迭代——别让时针走进没见过的区域:
位置插值(PI):最直接的办法,把位置索引整体等比压缩。想处理 32K 就把所有位置除以 8,塞回 4K 的"已见区域"内,再用少量长文本微调让模型适应。缺点也直接:所有通道一起被压,高频通道的分辨率被压掉了 8 倍——模型对近邻token 的区分度变差,而近邻恰恰是语言结构最密集的地方。
NTK-aware 缩放:既然高频通道压不得、低频通道才是外推的病灶,那就不均匀地处理——高频几乎不动,低频多压。数学上这等效于把 base 调大(base 变大,低频通道的频率进一步变低)。这个方法有个趣闻式的出身:它最早不是论文,而是 2023 年 Reddit 上一位网友(bloc97)的帖子,随后被 Code Llama 等正式产品采用——这个领域的知识生产有时就是这么野。
YaRN(2023):集大成者。把通道按波长明确分成三段:高频段完全不动(保住近邻分辨率)、低频段完全插值(保住"不出圈")、中间段平滑过渡,再配一个注意力温度的微调。用很少的长文本训练就能把上下文扩展一个数量级。DeepSeek V2/V3 正是用 YaRN 把 4K 的预训练长度分两阶段扩到 32K、再到 128K。
与这些"事后拉伸"技术并行的还有一个朴素方向:直接把 base 调大再训。原始 RoPE 的 base 是 10000,Llama 3.1 用到 500000,2025-26 年的模型常见 1000000——base 越大,低频通道越"慢",同样的训练长度下能无混叠表达的距离越远。2026 年的标准工艺是两者结合:预训练主体用中等长度(省算力——注意力开销随长度平方增长,全程用 128K 训练是烧钱),收尾阶段换大 base、配上长文本语料做"长上下文续训",最终交付 128K 到 256K 的原生上下文,旗舰产品线开始摸到 1M。行业在反复比较后形成的共识是:真金白银训出来的原生长上下文,效果稳定优于纯粹的事后外推。
产业一瞥
"上下文长度"是模型卡上最容易被误读的数字之一。它只表示"能塞进去",不保证"塞进去的都被用好"——针对性评测(如"大海捞针"及其更难的变体)反复发现,很多模型在标称长度的后半段检索和推理质量明显衰减。所以从业者看长上下文能力,除了标称值,更要看长上下文基准(如 RULER、LongBench 这类)的成绩。另外一些混合架构(第五章会讲)开始在部分层干脆不加位置编码(NoPE),让位置信息由其他机制隐式提供——位置编码的故事到 2026 年仍在续写。
4.5 位置编码小史的启示
回望这条演化线,有两个模式值得提炼,它们在本卷后面还会反复出现。
**第一,好的设计是"把信息放在唯一用得到它的地方"。**正弦编码把位置加进 embedding,位置信息从此混在传送带上随波逐流;RoPE 只在 q·k 点积的瞬间注入位置,用完即走,传送带保持干净。这和上一章"保护传送带"是同一个品味的两次显现。
**第二,架构定型之后,竞争转入"工艺"层面。**RoPE 本身自 2021 年后没有大改,但围绕它的 base 选择、插值策略、续训配方,构成了各家长上下文能力的真实差距。架构(论文里能画出来的图)越来越同质化,工艺(怎么训、用什么数据、分几阶段)越来越成为护城河——这个主题到了讲预训练的第二卷会全面展开。
下一章我们回到注意力本身,算清第一章预告过的那本"计算账单":KV cache 为什么会成为吞金兽,以及 MQA、GQA、MLA 直到稀疏与线性注意力这条完整的"省钱"演化史。长上下文让这本账单空前膨胀——你会看到,本章和下一章其实是同一场战役的两条战线。
本章要点
- 裸注意力是集合运算,对 token 顺序天然失明;因果掩码只给"左右"不给"距离",位置编码必需。
- 第一代(正弦/可学习绝对编码)的两大病:绝对位置是错误抽象(规律不随位置迁移)、长度被焊死。
- RoPE:通道两两配对,按位置旋转,频率 $\theta_i = \text{base}^{-2i/d}$;点积只依赖相对距离,embedding 零污染,2026 年几乎唯一主流。
- 直接外推失败的根源:低频通道进入训练未见过的角度区域。PI(整体压缩)→ NTK-aware(高频不动低频多压 ≈ 调大 base)→ YaRN(三段处理)是同一诊断下的三次迭代。
- 2026 标准工艺:中等长度预训练 + 大 base(100 万级)+ 长文本续训,交付 128K–256K 原生上下文;原生训练优于事后外推;标称长度 ≠ 有效长度。
- 两个可复用的启示:信息放在唯一用到它的地方;架构同质化后,工艺成为护城河。