目录
“我喜欢苹果”和“苹果喜欢我”包含相同的 Token,意思却完全不同。人类一眼就能看出顺序,Transformer 却不会天然知道哪个 Token 在前、哪个在后。
原因是 Attention 主要根据 Token 内容计算相关性。如果不给它额外的位置线索,同一组 Token 换个排列,模型只会看到一组重新排列的向量。
Token Embedding 告诉模型“这是谁”,位置编码告诉模型“它在哪里”。
1、Attention 为什么不认识顺序
先看两个序列:
A:[我, 喜欢, 苹果]
B:[苹果, 喜欢, 我]
如果只有 Token Embedding,那么两边使用的是同三条向量,只是排列不同。Self-Attention 会跟着排列产生对应的排列结果,却没有一个固定坐标告诉它“我”在位置 0 还是位置 2。
这种性质常被称为对排列等变:输入怎样重排,输出也怎样重排。它适合处理集合,却不足以理解语言顺序。
2、位置编号从哪里来
Tokenizer 产生 Token ID 后,框架会同时生成 Position ID:
| Token | 我 | 喜欢 | 苹果 | 。 |
|---|---|---|---|---|
| Token ID | 314 | 5621 | 4612 | 13 |
| Position ID | 0 | 1 | 2 | 3 |
Token ID 指向词表里的 Token,Position ID 表示它在当前序列中的位置。两者不是同一种编号。
Token ID → Token Embedding → 内容信息
Position ID → 位置编码 → 顺序信息
不同位置编码方法的主要区别,就是如何把 Position ID 变成模型能使用的信息。
3、可学习的绝对位置向量
一种直接做法是准备 Position Embedding Matrix。Position ID 像 Token ID 一样查表:
\[h_t=TokenEmbedding(token_t)+PositionEmbedding(t)\]位置 0、1、2 各有一条可学习向量。模型训练时,会一起更新 Token Embedding 和 Position Embedding。
优点是简单直观;限制是位置表通常有固定大小。如果训练时只准备到位置 2047,直接遇到位置 2048 就没有现成向量。
4、正弦余弦位置编码
原始 Transformer 使用固定的正弦、余弦函数生成位置向量,不需要训练一张位置表:
\[PE(pos,2i)=\sin\left(\frac{pos}{10000^{2i/d}}\right)\] \[PE(pos,2i+1)=\cos\left(\frac{pos}{10000^{2i/d}}\right)\]不同隐藏维使用不同频率:有的变化快,用来区分邻近位置;有的变化慢,用来描述更长距离。
它可以为训练范围之外的位置继续计算数值,但“能算出来”不等于模型一定能在更长序列上正常工作。
5、相对位置:关心相隔多远
理解语言时,绝对坐标有时不如相对距离重要。例如一个代词与它前面第 3 个 Token 的关系,可能比它处在全文第 503 个位置更有用。
相对位置方法不只告诉模型“你在位置 503”,还让 Attention 感知两个 Token 相隔多远、方向如何。
| 方法 | 位置信息放在哪里 | 直观理解 |
|---|---|---|
| Learned Absolute | 加到输入 Embedding | 每个位置有自己的向量 |
| Sinusoidal | 加到输入 Embedding | 用多种频率表示坐标 |
| Relative Bias / ALiBi | 加到 Attention 分数 | 根据相对距离调整关注程度 |
| RoPE | 旋转 Q、K | 让点积自然带有相对位置信息 |
现代 LLM 常用 RoPE。它不会简单地把位置向量加到输入上,而是根据位置旋转 Q 和 K。下一课会单独拆解它。
6、因果 Mask 不能替代位置编码
因果语言模型使用 Causal Mask,让当前位置只能关注自己和前面的 Token:
位置 0:可看 0
位置 1:可看 0, 1
位置 2:可看 0, 1, 2
Mask 确实带来“前后”限制,但它主要回答“能不能看见”。它没有完整说明两个可见 Token 之间相隔 1 个还是 100 个位置,也不能提供丰富的相对距离模式。
因此,Causal Mask 与位置编码分工不同:前者防止偷看未来,后者表达顺序与距离。
7、上下文长度与位置外推
模型训练时见过的最大序列长度,会影响它处理长文本的能力。把配置里的最大长度从 4K 改成 32K,并不意味着模型立刻学会理解 32K 上下文。
长上下文通常同时受到三类因素限制:
- 位置表示:训练范围外的位置是否仍然合理。
- 训练数据:模型是否见过足够多的长序列任务。
- 计算与显存:普通 Attention 的计算量随序列长度快速增长。
针对 RoPE,工程上会使用位置插值、频率缩放等方法扩展上下文,但都需要评估长文本效果,而不能只看配置数字。
Padding 时的位置编号
Batch 中的句子长短不同,经常要补 Padding。Attention Mask 会阻止模型关注填充位置,Position ID 则要与真实 Token 的排列方式匹配。
左侧 Padding、右侧 Padding、继续生成和 KV Cache 场景,对 Position ID 的处理可能不同。框架通常会自动完成,但自己实现训练或推理代码时,需要同时检查 Attention Mask 和 Position ID。
容易混淆的 4 件事
- Token ID 不是 Position ID。 一个表示词表身份,一个表示序列位置。
- Causal Mask 不是位置编码。 一个限制可见性,一个表达顺序与距离。
- 能计算更长位置,不等于能理解更长上下文。 还取决于训练和 Attention 行为。
- 位置编码不一定加在 Embedding 上。 RoPE 作用于 Q、K,相对 Bias 作用于 Attention 分数。
记住这 5 件事
- 单靠 Token Embedding,Transformer 没有固定的顺序坐标。
- Position ID 表示 Token 在序列中的位置。
- 绝对位置强调“在哪里”,相对位置强调“相隔多远”。
- Causal Mask 负责禁止偷看未来,不能替代位置编码。
- 上下文长度不仅取决于配置,还取决于位置方法、训练数据与计算能力。
第十一课复习总图
下一课具体拆解现代 LLM 最常见的方法:RoPE 是怎样把位置变成旋转,并让 Attention 看见相对距离的?