模型把位置编码裁掉一半,反而更会大海捞针
「我喜欢你」和「你喜欢我」,在自注意力眼里是同一句话。把词序打乱,它算出的相关度一个数都不变——这个性质叫置换等变。所以从 2017 年的 Transformer 起,位置信息都得从外面注入,这被当成常识写进了每一份教程:不告诉模型每个词排在第几位,它就不知道词序。
模型把位置编码裁掉一半,反而更会大海捞针
「我喜欢你」和「你喜欢我」,在自注意力眼里是同一句话。把词序打乱,它算出的相关度一个数都不变——这个性质叫置换等变。所以从 2017 年的 Transformer 起,位置信息都得从外面注入,这被当成常识写进了每一份教程:不告诉模型每个词排在第几位,它就不知道词序。
然后常识被拆了。拆它的过程用了四年,最新的落点是你现在可能每天在用的几个生产模型。
先删干净试试
2022 年,Haviv 和同事们干了件直球的事:把位置编码整个删掉,从头训。他们训了四档模型,125M 到 1.3B,架构照抄 GPT-3 XL。结果在 Pile 数据集上,无位置编码的模型和带可学习位置编码的模型,困惑度只差 0.05——13.10 对 13.05,几乎贴着。顺带一提,同样的实验搬到 WikiText-103 上差距是 0.55,大了一个数量级,但仍然不大。
为什么删了也没事?因果掩码。decoder-only 模型规定第 t 个词只能看见前 t 个词——那么一个词能看见几个词,它自己就是第几个词。模型只要数一数自己的可见范围,位置就有了。这也解释了为什么这条路只在 decoder-only 上走得通:换成双向注意力的编码器,无位置编码的模型真的会退化成一个词袋,词序信息无处可寻。
2023 年 Kazemnejad 等人给这个现象补了数学。两个定理,说得意外地具体。第一个:存在一组权重,让无位置编码模型的第一层就把绝对位置 1 到 T 恢复出来,写进隐藏状态。第二个:只要这个位置信息没被中间层覆盖掉,后续层的注意力点积就能分解成「内容项加相对距离项」——正是相对位置编码的数学形式。
注意「存在」两个字。这两个定理说的是模型有这个能力,不是说它免费。位置信息挤占第一层的算力去算,挤占残差流的带宽去存,还要求中间几十层都克制着别把它抹掉。RoPE 这类显式编码是每层注意力现场注入,不占残差流、不怕覆盖。省掉参数的账,是在别处付的。
工业界没人用纯的
2025 年起,无位置编码开始进生产,但所有厂子做了同一个选择:不删干净,删一半。Llama 4、Cohere 的 Command A、HuggingFace 的 SmolLM3,都是每四层里有一层是无位置编码的全注意力,其余层带位置编码。我翻了几家的配置文件确认:Llama 4 的源码默认值就写着「每 4 层一个 NoPE 层」;Command A 的模型卡说得更直白——三层是带 RoPE 的滑动窗口注意力管局部,第四层是不带任何位置编码的全局注意力,管整个序列的无限制交互。
有个细节各家不一样:Llama 4 和 Command A 的其余层是滑动窗口,SmolLM3 的其余层其实是全注意力配 RoPE。共同点只有一个——每四层留一个不要位置编码的层。
为什么?Cohere 做了目前规模最大的一次系统研究:先在 7500 亿 token 上分析,再在 5 万亿 token 上预训练。他们发现一个没人安排过的分工:训练跑完,无位置编码的层自己长成了全局检索专家——在长上下文里大海捞针,针在哪里它的注意力就集中在哪里;带 RoPE 的层自己长成了局部聚合专家——注意力贴着近期上下文。没有人给模型下过「你管全局你管局部」的指令,分工是从训练里自发涌现的。
顺着这个发现,他们试了一个更狠的配置:既然分工是自发的,那就顺势把 RoPE 层的注意力窗口硬限到 8192,无位置编码层保留全注意力。长上下文成绩不降反升。反过来,把 RoPE 的频率参数调大去硬扩长度,无位置编码层的注意力质量反而恶化——针上的注意力占比从 0.0765 掉到 0.0369。
三个坑
纯 NoPE 进不了生产,是因为有三个坑,一个比一个隐蔽。
第一个坑在训练之后才出现。Qwen3.8 的技术报告做了消融:预训练阶段,带不带 RoPE 指标几乎没差;可后训练一做,无位置编码的版本开始停不下来——生成永不终止,一直输出到用户手动掐断。Qwen 的解法很经济:全注意力层的 head 是 256 维,只在前 64 维上保留 RoPE,25% 的剂量,够让模型知道该停了。
第二个坑跟位置无关,但只有把位置问题解决后它才暴露。序列一长,参与 softmax 归一化的 token 变多,注意力被摊薄、熵升高,聚焦消失。研究者发现这个能用调参修:把注意力分数的系数从 1/√d 提到 1.2/√d,相当于压低温度,2K 上训练的模型直接泛化到 4K;要 8 倍长度,系数提到 1.8。同样的操作对 RoPE 无效——RoPE 还有自己的位置分布外问题,温度修不了它。
第三个坑在训练曲线里。从头训的纯 NoPE 模型,整个训练过程的困惑度一直劣于 RoPE 模型;参数量到十亿以上、又是并行架构又是长上下文时,还会出现不可恢复的 loss spike——损失曲线一路上翘,模型训废。有两个解法:QK-Norm 能压住尖峰但最终收敛到更高的损失;或者留 10% 维度的 partial RoPE,训练损失追平全量 RoPE,还省下十倍的 RoPE 缓存开销。
三个坑合起来指向一个哲学上的转向,DroPE 这篇论文把它说穿了:位置编码不是模型的器官,是训练期间的脚手架——训练的时候用它保证收敛,训完了它就可以拆。实验显示,训完把位置编码整个丢掉,模型在原训练长度内的困惑度不掉,在更长的上下文上反而更稳。
另一条路:位置住进结构里
以上所有方案,位置信息都来自因果掩码。还有一条平行路线:让模型里天生按顺序处理信息的模块去携带位置。
Jamba 是第一个把 Transformer 注意力、Mamba 状态空间和 MoE 揉在一起的生产级模型。Mamba 层逐 token 递归,天然知道先后。论文原话说得干脆:有了 Mamba 层,RoPE 这类机制就没有必要了,所以 Jamba 的注意力层不加任何位置编码。他们做了对照实验——加不加 RoPE,结果相似。
Kimi Linear 把这条路做得更细。它把 Kimi Delta Attention(KDA)层和全注意力层按 3:1 混着用。KDA 的机制说穿了很简单:往一个固定大小的记忆矩阵里不断压新信息,写入前先比对新旧差异,再用遗忘门控制衰减——Kimi 把单一的遗忘系数升级成向量,让每个通道有自己的衰减速度。论文里有个漂亮的对照:RoPE 是固定的、正交的、只看下标的旋转,给不同维度不同角速度;KDA 的逐通道衰减恰好补上了这个「不同维度不同节奏」的位置感,但它是可学习的、跟着内容走的。两组人证明了这些递归结构和因果线性注意力本来就是同一个东西的两种写法,殊途同归。
想亲手跑一遍无位置编码的训练,有个刚出的教学项目 ZetaGPT 值得一看:每个注意力层前面垫一个状态空间模块,让递归状态把顺序写进每个词的表示。论文自己承认测试和消融做得不充分,仓库只有十几个 star,但它把数据整理、分词器训练、预训练、后训练、诊断的全流程都搭齐了,适合当练手标本。
回头看
回到开头那个常识:不注入位置信息,模型就不知道词序。四年后的修正版是这样的:词序信息可以在因果掩码里、可以在递归结构里、可以只在四分之一的层里给一点点。位置编码从必备参数,降级成了训练期脚手架加局部工具——Cohere 那 5 万亿 token 的训练场里,全局检索这件事,恰恰是不带位置编码的那几层做得最好。