这道题我先回答为什么要位置编码。纯自注意力本身只看 token 之间的内容关系,如果把输入顺序一起置换,输出也会对应置换,它不会天然知道“谁在前、谁在后”。所以位置方法的本质,是把顺序信号放进 hidden state、注意力分数,或者 Query 和 Key 的几何关系里。
绝对位置编码要分两种。可学习绝对位置是查表后与 token embedding 相加,优点是简单,缺点是超过表长没有训练过的向量。正弦绝对位置用不同频率的 sin 和 cos 直接计算,所以数学上可以为更大的位置生成向量。但“能算出来”不等于模型在训练长度之外就能可靠工作,注意力和其他参数没有见过那个长度分布,仍然要做目标长度评测。不能把它简单说成超长后位置向量会乱套。
相对位置方法直接表达两个 token 的距离或方向,可以把相对距离映射成 bias、embedding 或分桶值,加到 attention score 或 Key、Value 表示中。它并不必然需要存一张完整的 L 乘 L 参数矩阵,很多实现可以按距离即时生成或用 bucket 查表。
RoPE 是另一条常用路线。对位置 m 的向量,它把第 2i 和第 2i+1 个维度看成一个二维对子,按角度 m 乘 θ_i 做旋转。m 是 token 的位置,i 是特征维度索引,这两个变量不能混在一起。Query 和 Key 都旋转后,它们的点积会自然带上位置差 m-n,因此兼容标准点积注意力。RoPE 在长上下文上很常用,但原生 RoPE 也不保证无限外推,超过训练长度往往要位置插值、频率缩放或继续训练并验证。
ALiBi 更直接:每个注意力头有一个斜率,在 attention logit 上加入与相对距离成比例的负偏置,让越远的 token 默认受到越大惩罚。它不需要位置 embedding,扩展长度也方便,但是否比 RoPE 好要看任务和训练设置。
工程选型时,我会先确定训练长度与目标长度,再看模型是否需要兼容已有 checkpoint、KV Cache 和 kernel,最后用长文本困惑度、needle retrieval、多跳问答和真实生成任务验证。还要避免拿未核实的模型做例子,比如 ChatGLM-6B 讨论的是二维 RoPE 语境,不应当被列成 ALiBi 代表。
验证长上下文时也不能只看一个 needle 命中率。我会同时检查短上下文能力是否回退、不同相对距离上的注意力、困惑度随长度变化,以及真实长文中的顺序、引用和多跳任务。这样才能区分位置方案真的外推,还是只对某类人工测试有效。
扩窗改频率后还要检查旧 checkpoint 的兼容性,不能只改最大长度配置就认为完成迁移。