位置编码是给句子里每个词额外附上的一组顺序信号,让模型知道哪个词在前、哪个词在后。注意力机制会把所有词两两比较,却天生不分先后:没有位置信息,「狗咬人」和「人咬狗」在它眼里就是同一堆词。位置编码补的正是这个缺口。
为什么注意力机制看不见顺序
注意力算的是任意两个词之间的相关程度,和词站在哪里无关,把输入顺序打乱,计算结果几乎不变。但语言的意义恰恰靠顺序区分,所以位置必须作为一种独立信号,先写进每个词的向量里,模型才谈得上理解句子。
三种经典做法
第一种是原始 Transformer 论文用的正弦编码:把不同频率的固定波形叠加到词向量上。不用训练、能外推到更长的文本,缺点是死板。第二种是可学习编码:给每个位置准备一个可训练的向量,灵活,但训练时没见过的位置就抓瞎,上限被最长训练长度锁死。第三种是 RoPE 旋转编码,现在主流大模型大多在用:按位置把向量的一部分旋转一个角度,让注意力天然感知两个词之间的相对距离。它对长文本更友好,已经成了事实标准。
绝对位置和相对位置不是一回事
绝对编码告诉模型「你是第 7 个词」,相对编码告诉它「你离参照词隔了 3 个词」。语言里重要的往往是距离而不是门牌号,这也是现代方案偏爱相对信息的原因。这还能解释一个常见现象:文本远超训练长度时,模型不是「记性用完了」,而是熟悉的距离模式用完了,所以越往后读越糊。
三个常见误解
位置编码不等于理解力,它只提供顺序,不提供含义。位置编码也不是记忆装置,长对话里前面的细节丢失,多半是注意力和上下文预算的问题,不能全怪它。另外,上下文窗口标得越长,不代表远处读得越准:靠缩放 RoPE 基数硬拉长度的做法,能扩大范围,却会摊薄近处位置的分辨率。
所以判断一个模型是不是真能读长文档,别只看窗口数字,还要看它怎么编码位置、怎么分辨距离。位置编码平时不出声,却是这项能力的地基。