从 Token 到 Transformer · 05 / 10
“我打你”和“你打我”使用了完全相同的三个字。若模型只知道序列里有哪些 token,却不知道它们各自站在哪里,两句话就很难区分。
RNN 逐步读取输入,顺序天然写进状态传递。Transformer 选择并行处理整段序列,换来了更高的训练效率,也失去了这份免费的先后感。位置编码就是为这项交换补上的结构信息。
Self-attention 为什么不自带顺序
先忽略位置信号,想象把一组 token 向量同时送入 self-attention。如果我们用同一种方式打乱输入位置,输出也只会跟着以同样方式打乱。计算知道“这些向量之间有什么关系”,却没有额外依据判断谁原本在第一位。
这叫排列等变。它对集合建模很自然,对语言却不够,因为语法、指代和因果都依赖方向与距离:
- “狗追猫”与“猫追狗”角色相反;
- “没有不同意”与“不同意”只差一个位置关系;
- 代码中的作用域、括号和调用顺序也不能任意交换。
Attention 可以利用顺序,但前提是输入或注意力计算先提供顺序线索。
原始 Transformer 如何加入位置
2017 年的 Transformer 论文使用正弦和余弦函数生成位置编码,再与 token embedding 相加。不同频率让每个位置获得一组独特模式,也让模型有机会从组合中推断相对距离。
概念上可以写成:
text进入第一层的表示 = token embedding + position encoding
同一个 token 出现在第 2 位和第 20 位时,初始表示因此不同。后续 Q、K、V 投影就能把位置信息带进 attention score。
论文同时尝试过可学习位置向量。两者说明一个重要事实:模型不要求位置必须由某个固定公式表达,只要求序列结构以可学习、可利用的方式进入计算。
绝对位置不是唯一答案
随着上下文变长,位置方法逐渐从“这是第几个”转向“两个 token 相隔多远、方向如何”。
- 可学习绝对位置:为每个位置保存参数,直接但通常受训练长度约束;
- 相对位置:在注意力计算中表示 token 之间的距离或方向;
- RoPE:通过旋转 Q、K 的表示,把相对位置信息编码进它们的点积关系。
现代模型常使用 RoPE 或其变体,但没有一种方法可以免费解决无限上下文。超过训练分布后,位置外推、注意力质量和显存开销仍会成为问题;扩大“可接受长度”也不等于模型能同样可靠地使用每个位置。
位置告诉模型什么,又不告诉什么
位置信号能帮助模型区分先后、邻近和距离,却不会直接提供句法规则。它不会自动知道“谁是主语”,也不会规定模型必须关注最近的 token。
这些关系仍要从数据中学习。位置编码提供坐标系,Attention 决定如何使用坐标,FFN 和更深层网络再把结果变成可用于预测的表示。
可以把它们的分工理解为:
| 信息 | 主要来源 |
|---|---|
| 这是什么 token | Token embedding |
| 它处在什么位置 | 位置机制 |
| 它与谁相关 | Attention |
| 当前上下文中它意味着什么 | 多层 Transformer 共同形成 |
长上下文为什么仍然困难
即使每个 token 都有位置,模型仍要在海量候选中找到真正相关的信息。标准 attention 的计算量会随序列长度快速增加,位置距离扩大后,训练数据中也未必有足够信号教会模型稳定利用远端内容。
因此,长上下文能力至少包含三个问题:能不能装下、能不能算完、能不能找对。位置编码主要解决“如何表示顺序与距离”,不能代替检索、注意力优化和长程训练。
小结
Transformer 的并行结构不会自动保留输入顺序。位置机制让同一组 token 不再只是无序集合,使模型能够区分方向、距离和站位。
现在,每个 token 已经有了内容表示和位置线索。下一篇要进入 Transformer 最关键的交换机制:Attention 如何决定一个位置应该从其他位置取回多少信息。
