目录
“我喜欢苹果”和“苹果喜欢我”使用同样的 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、动手观察“位置指纹”
点击位置,观察多频率“指针”组成的位置指纹。
位置 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 件事
- Token ID 不是 Position ID。 一个是词表身份,一个是序列坐标。
- Causal Mask 不等于位置编码。 它限制能否看见未来,只会间接泄露顺序。
- 正弦余弦是许多种频率同时工作。 不是只有一个周期。
- RoPE 不保证越远 Attention 越小。 它提供表达相对位置的能力,不是写死单调衰减。
- 能生成更大位置,不等于能用好长上下文。 还要看训练分布、缩放方法和真实任务。
8、复习总图
本文的多频率指针、绝对与相对位置、ALiBi、RoPE、NoPE 与长上下文部分,参考了李宏毅老师的课程视频《如何讓 Transformer 知道輸入 Token 的順序?Absolute、Relative、RoPE、到沒有 Positional Embedding》,并按本课主线重新组织。
下一课将专门拆解:RoPE 是怎样把位置变成旋转,并让 Attention 看见相对距离的?