位置编码:模型如何知道 Token 的顺序?

从“我喜欢苹果”到绝对位置、相对距离、RoPE 与 NoPE

目录

  “我喜欢苹果”和“苹果喜欢我”使用同样的 Token,只是换了位置,意思就变了。

  人类读到一句话时,内容和顺序同时到达。Transformer 最先拿到的却只是一排 Token 向量。向量告诉它“这是谁”,却没有天然告诉它“谁在前面”。

先记住一句话:Token Embedding 说明“是什么”,位置机制补充“在哪里、离多远”。

1、Transformer 为什么需要位置线索

  暂时去掉位置信息和 Causal Mask。Self-Attention 对每个 Token 使用同样的规则生成 Q、K、V,再按相关性对 V 求加权和。如果只把输入重新排列,Q、K、V 也会跟着排列,计算规则本身没有一把固定的尺子。

[我, 喜欢, 苹果] → 对应的输出向量
[苹果, 喜欢, 我] → 同样的向量跟着换位

  这叫排列等变:输入怎么换序,输出就怎么换序。它适合处理“一组东西”,却不足以表达语言的前后关系。

线索 它回答的问题 例子
Token ID 词表中是谁 “喜欢”是哪个 Token
Position ID 在序列的哪里 这是第 12 个 Token
Relative Position 两个 Token 相隔多远 “我”和“苹果”相隔 2 步

2、位置的本质是关系

  “第 503 个 Token”是位置。但对语言理解来说,更有用的往往是:它在谁前面?离上一个动词多远?

  在“我喜欢苹果”前加上一千个 Token,“我”和“苹果”的绝对坐标都变了,它们仍然相隔 2 步。这就是相对位置重要的原因。

绝对位置像门牌号;相对位置像“出门左转第三家”。语言更常依赖后者。

3、四种位置方法:从哪里加入顺序

四种位置方法总览

3.1 可学习绝对位置:每个座位一张卡

\[h_t=TokenEmbedding(token_t)+PositionEmbedding(t)\]

  位置 0、1、2 各有一条可学习向量。好处是直接;局限是位置表通常有固定大小,相同距离在不同坐标上的共性要由模型自己学会。

3.2 正弦余弦:不是一只钟,是一排钟

\[PE(pos,2i)=\sin\left(\frac{pos}{10000^{2i/d}}\right),\quad PE(pos,2i+1)=\cos\left(\frac{pos}{10000^{2i/d}}\right)\]

  别被公式吓到。把相邻两维放在一起,它就是平面上的一根指针:一维是 sine,另一维是 cosine。位置往后走,指针就转动。

  一条向量里有许多根指针。有的约 6 个 Token 就转一圈,有的要几万个 Token 才转一圈。快指针区分附近位置,慢指针描述长距离。多种频率合在一起,就得到一个“位置指纹”。

3.3 ALiBi:距离越远,直接扣分

\[score(i,j)=\frac{q_i k_j^T}{\sqrt d}-m|i-j|\]

  ALiBi 不再绕路:两个 Token 越远,Attention 分数就扣得越多。不同 Head 使用不同斜率,有的偏好附近,有的愿意看得更远。它证明了一个直觉:相对距离是很有用的归纳偏置。

3.4 RoPE:把位置变成 Q、K 的旋转角

  RoPE 不把位置向量加到 Token Embedding。它按位置旋转 Q 和 K。两个位置同时平移时,相对角度不变,因此内积里自然出现 $i-j$。

\[(R_iq)^T(R_jk)=q^TR_{j-i}k\]

  RoPE 并不保证距离越远,Attention 就一定越小。旋转有周期性,它允许模型学出“专门看前两个 Token”这种比单纯近处优先更细致的模式。

方法 放在哪里 直观理解 特点
Learned Absolute 输入表示 每个座位一张卡 直接,长度常固定
Sinusoidal 输入表示 一排转速不同的钟 固定函数,藏有相对位移结构
ALiBi Attention 分数 越远扣分越多 简单,距离偏置强
RoPE Q、K 位置是旋转角 相对位置直接进入点积

4、没有显式位置编码会怎样?

  “没有位置编码,Transformer 就完全不知道顺序”并不严谨。

  因果语言模型的 Causal Mask 让不同位置看到不同长度的历史。经过多层后,这些不同的“历史摘要”会间接暴露顺序。这就是 NoPE(无显式位置编码)仍能完成一些顺序任务的原因。

  但“有办法推断”不等于“容易学好”。显式位置机制通常能让训练更容易、损失更低。DroPE 甚至尝试训练前期使用位置机制,后期再移除,像过河时用船,到岸后把船放下。

更准确的说法是:位置编码不是顺序信息的唯一来源,而是帮助模型更直接、更稳定地学会顺序关系。

  Mask 主要回答“能不能看见”;位置机制直接提供“在哪里、离多远”。两者仍然不是一回事。

长上下文:能算出来,不等于能用好

  训练时只看过 4K 上下文的模型,即使位置函数能计算到 32K,也可能因为看到从未出现的旋转角而失效。位置插值、NTK-aware scaling、YaRN 等方法,都在尝试把新的长距离翻译成模型熟悉的频率范围。最终还需要真实长文本任务验证。

5、动手观察“位置指纹”

交互实验:同一个 Token,换个位置会怎样?

点击位置,观察多频率“指针”组成的位置指纹。

高频
区分附近位置
中高频
较快变化
中低频
较慢变化
低频
追踪长距离

位置 0:所有指针从起点出发。

6、一分钟视频总结

  视频时长约 58 秒,画面、中文旁白和字幕同步生成。

时间 画面 旁白重点
00–07s “我喜欢苹果 / 苹果喜欢我”换位 同样 Token,顺序改变语义
07–17s 四种位置方法依次出现 绝对位置、Sin/Cos、ALiBi 与 RoPE
17–28s 快慢两只指针转动 多频率构成位置指纹
28–40s 整句平移,距离不变 语言更在意相对位置
40–50s ALiBi 扣分与 RoPE 旋转 两种相对位置思路
50–58s 内容、位置、NoPE 总结 显式位置不是唯一来源,但能帮助学习

7、容易混淆的 5 件事

  1. Token ID 不是 Position ID。 一个是词表身份,一个是序列坐标。
  2. Causal Mask 不等于位置编码。 它限制能否看见未来,只会间接泄露顺序。
  3. 正弦余弦是许多种频率同时工作。 不是只有一个周期。
  4. RoPE 不保证越远 Attention 越小。 它提供表达相对位置的能力,不是写死单调衰减。
  5. 能生成更大位置,不等于能用好长上下文。 还要看训练分布、缩放方法和真实任务。

8、复习总图

位置编码复习总图

  本文的多频率指针、绝对与相对位置、ALiBi、RoPE、NoPE 与长上下文部分,参考了李宏毅老师的课程视频《如何讓 Transformer 知道輸入 Token 的順序?Absolute、Relative、RoPE、到沒有 Positional Embedding》,并按本课主线重新组织。

  下一课将专门拆解:RoPE 是怎样把位置变成旋转,并让 Attention 看见相对距离的?