如果你做过 Transformer 相关的项目,一定遇到过这个选择:位置编码用 Sinusoidal 还是可学习?我第一次看《Attention is All You Need》的时候,被 Sinusoidal 的数学美感击中了——一个不依赖训练的函数,居然能编码顺序信息。然后我高高兴兴地把它用到自己的模型上,结果训练完一测,效果比用可学习编码差了不止一点点。我很困惑,于是翻了很多资料,终于明白了:Sinusoidal 的优雅是纸面上的,它的问题藏在训练动态里。

要理解它为什么不够好,先得知道它想解决什么问题。
Transformer 本身分不清词序
Transformer 的注意力机制是全局的。你给它“我打你”和“你打我”,它会算出一模一样的注意力分数,因为 token 之间的关系与顺序无关。如果不加位置编码,模型看到的都是同一个词袋。位置编码的任务,就是把“位置”信息注入输入,通常直接加到词向量上。
Sinusoidal 编码是什么?
原论文给出的公式是:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
这里的 pos 是位置,i 是维度索引。维度越低,频率越高;维度越高,频率越低。也就是说,位置被拆到了多个不同频率的正弦、余弦波上。直观理解:每个位置是一组旋转角度的组合。相邻位置的向量相差很小,距离越远差得越多。
纸面优点:一个线性变换的巧思
选择 Sinusoidal,最重要的理由是:对于任意偏移 k,位置 pos 和位置 pos+k 的编码之间存在一个线性变换。这让模型不需要记住所有绝对位置,只要学一个线性矩阵,就能推导出相对位置关系。
“我们选择这个函数,是因为它允许模型轻松学会相对位置,因为 PE(pos+k) 可以被表示成 PE(pos) 的线性函数。”——原论文
这个性质听起来很适合语言任务,因为句子中真正重要的是“相对距离”,而不是“第几个词”。但理想与现实之间,还隔着四个问题。
问题一:固定编码不可学习
可学习位置编码拥有额外的参数,而 Transformer 是参数越多表达空间越大的模型。Sinusoidal 完全写死,模型只能被动接受这个几何结构,无法根据任务调整频率和相位。BERT 用随机初始化的位置向量跟着训练一起更新,能学到更贴合语料的位置模式,上限自然更高。
问题二:外推能力被严重高估
理论上正弦波无限延续,可以外推到任意长度。但现实中,模型在有限长度序列上训练时,会发现记住“绝对位置”比学会“相对变换”简单得多。结果就是,一旦推理长度超过训练长度,注意力分布迅速紊乱。
为什么会这样?因为绝对位置信息在训练中太容易获取了。模型只需要在注意力里记住“第5个词和第10个词”,比学会一个线性变换矩阵更直接。多层叠加之后,这种捷径会被进一步固化,模型实际上学到的是一张绝对位置查找表,而不是论文设想的相对位置计算。
我自己做过一个小实验:训练长度 128,推理长度推到 512,困惑度直接失控。后来查资料发现,这并非个例,不少研究都报告过固定编码外推失效的问题。
问题三:位置与词向量的干扰
位置编码直接加到词向量上,等于把位置信号叠加在语义信号上。Sinusoidal 的固定波形可能与词向量发生干扰,而且没有任何手段去消除它。可学习编码则可以通过训练,把位置向量调整到与语义空间更兼容的方向。
问题四:原论文的消融并不充分
《Attention is All You Need》里只证明了“有位置编码比没有好”,并没有和可学习位置编码做直接对比。所以 Sinusoidal 更像是一个合理的默认项,而不是被验证过的最优解。直到 BERT 用可学习位置编码在很多核心任务上超越了它,大家才开始反思固定编码的局限。
可学习编码:默认选择,但有硬伤
BERT 之后,可学习位置编码成了主流配置,GPT 系列早期模型也用。它的优点很直接:模型可以根据任务自由塑造位置表示。但缺点同样明显:长度上限固定,训练时定义 512 个位置,超过就不知道怎么外推。
一种简单的缓解方法是对位置嵌入做插值,比如训练长度 512,推理长度 1024,就把位置编号压缩映射到 [0,512] 区间内。这个方法有效但不完美,会模糊高频位置的区分度。更优雅的方案还是使用相对位置或旋转位置编码。
于是研究继续往前推动。Transformer-XL 提出了相对位置编码,不再关注绝对位置,而是建模两个 token 之间的距离;RoPE 则通过旋转矩阵把相对位置嵌入注意力分数,既能学习又能外推,是目前很多大模型的选择。
| 方案 | 可学习 | 外推能力 | 长度限制 |
|---|---|---|---|
| Sinusoidal | 否 | 理论上强,实际弱 | 无,但会崩 |
| 可学习编码 | 是 | 差 | 有,固定长度 |
| 相对位置编码 | 是 | 较好 | 几乎无 |
| RoPE | 是 | 强 | 可扩展 |
常见误解
- Sinusoidal 能外推? 实际上模型在训练长度内会走绝对位置捷径,外推通常失败。
- 可学习编码不可外推? 是的,训练最大长度之外没有对应向量,除非用插值等技巧。
- 相对位置编码一定更好? 不一定,它往往增加计算或内存开销,需要权衡。
我的判断
位置编码的本质,是在给 Transformer 提供一种先验。Sinusoidal 提供的先验是“相对位置重要”,但表达方式太间接;可学习编码没有先验,全靠数据;相对位置编码则直接把先验注入注意力,效果更直接。
如果你处理的是固定长度任务,直接用可学习位置编码,简单且有保障;如果你做长序列生成,优先考虑 RoPE 这类现代方案。Sinusoidal 不是不能用了,但它在工程上的优势并不明显。
真正让我想通的是:位置编码不是孤立模块,它的效果取决于和注意力机制的配合。模型会走捷径,会用最省力的方式利用你给的表示。你不应该假设模型会按照你的设计意图去理解位置信息,而是通过实验验证。
Sinusoidal 的位置编码是 Transformer 历史中的一个重要起点,但起点往往意味着后面还有更远的路。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/772.html