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

从位置编号到绝对位置、相对位置与上下文长度

目录

  “我喜欢苹果”和“苹果喜欢我”包含相同的 Token,意思却完全不同。人类一眼就能看出顺序,Transformer 却不会天然知道哪个 Token 在前、哪个在后。

  原因是 Attention 主要根据 Token 内容计算相关性。如果不给它额外的位置线索,同一组 Token 换个排列,模型只会看到一组重新排列的向量。

Token Embedding 告诉模型“这是谁”,位置编码告诉模型“它在哪里”。

位置编码的作用与类型

Token 内容与位置信息怎样共同进入 Transformer,点击查看原始 SVG

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 上下文。

  长上下文通常同时受到三类因素限制:

  1. 位置表示:训练范围外的位置是否仍然合理。
  2. 训练数据:模型是否见过足够多的长序列任务。
  3. 计算与显存:普通 Attention 的计算量随序列长度快速增长。

  针对 RoPE,工程上会使用位置插值、频率缩放等方法扩展上下文,但都需要评估长文本效果,而不能只看配置数字。

Padding 时的位置编号

  Batch 中的句子长短不同,经常要补 Padding。Attention Mask 会阻止模型关注填充位置,Position ID 则要与真实 Token 的排列方式匹配。

  左侧 Padding、右侧 Padding、继续生成和 KV Cache 场景,对 Position ID 的处理可能不同。框架通常会自动完成,但自己实现训练或推理代码时,需要同时检查 Attention Mask 和 Position ID。

容易混淆的 4 件事

  1. Token ID 不是 Position ID。 一个表示词表身份,一个表示序列位置。
  2. Causal Mask 不是位置编码。 一个限制可见性,一个表达顺序与距离。
  3. 能计算更长位置,不等于能理解更长上下文。 还取决于训练和 Attention 行为。
  4. 位置编码不一定加在 Embedding 上。 RoPE 作用于 Q、K,相对 Bias 作用于 Attention 分数。

记住这 5 件事

  1. 单靠 Token Embedding,Transformer 没有固定的顺序坐标。
  2. Position ID 表示 Token 在序列中的位置。
  3. 绝对位置强调“在哪里”,相对位置强调“相隔多远”。
  4. Causal Mask 负责禁止偷看未来,不能替代位置编码。
  5. 上下文长度不仅取决于配置,还取决于位置方法、训练数据与计算能力。

第十一课复习总图

大模型第十一课复习总图

第十一课复习总图,点击查看原始 SVG

  下一课具体拆解现代 LLM 最常见的方法:RoPE 是怎样把位置变成旋转,并让 Attention 看见相对距离的?