为什么需要位置编码?
Transformer 的核心是自注意力机制,它把句子中的所有词同时计算,天然没有顺序概念(“我打你”和“你打我”在模型看来最初是一样的)。为了让模型知道词的先后顺序,必须额外给每个位置注入一个“位置标签”——这就是位置编码。
原论文《Attention Is All You Need》选择的是正弦和余弦函数的固定编码,而不是学出来的编码。为什么偏偏是 sin 和 cos 配对?评论区经常提到“用两个 sin”,这到底行不行?下面我们从数学角度讲一下
一、核心原因:为了完美的“相对位置线性关系”
Transformer 作者选择交替使用 sin 和 cos 的最核心动机,是希望模型能轻松学到相对位置信息——也就是任意两个位置的距离。
具体来说:对于任意固定的位移
数学推导
根据三角函数的两角和公式:
写成矩阵乘法的形式就是:
💡 关键点:变换矩阵(旋转矩阵)里只包含
,与当前绝对位置 无关。这意味着无论词在句子的哪里,只要它们距离为 ,位置编码之间的线性映射是恒定、可复用的。能让模型轻松学到相对位置关系(如“前一个词”“后两个词”)。
二、为什么“只用两个纯 sin”不行?
很多同学疑惑:为什么不能用两个不同频率的 sin?或者同一个频率但带相位差的 sin?
情况 A:使用不同频率的纯 sin(如 和 )
假设位置编码只包含
这里出现了一个
打个比方:你想用红绿蓝三原色调出黄色,结果只给了红和蓝,没有绿——那就永远调不出纯黄色。
情况 B:同一频率但带相位差的两个 sin(如 和 )
如果两个 sin 是同一频率,但人为加上相位差
但是:当
三、总结
| 方案 | 可以表示相对位置吗? | 简洁度 |
|---|---|---|
| sin和cos配对 | ✅ 完美,线性变换只含 |
⭐⭐⭐⭐⭐ |
| 两个不同频率 sin | ❌ 无法直接线性推导 | ⭐⭐ |
| 同一频率带相位差的两个 sin | ✅ 可行,但本质就是sin/cos | ⭐⭐⭐ |
所以,Transformer 最终选用 sin 和 cos 交替,是为了让模型能以最简洁、最直接的方式捕捉到相对位置信息,这是数学上的最优解。
思考题与答案
思考题:
为什么固定位置编码(sin/cos)有时比可学习的位置编码效果更好?什么场景下可学习编码可能更优?
答案:
-
固定编码的优势:
- 外推能力强:sin/cos 编码可以处理比训练时更长的序列(因为公式能计算任意位置)。
- 无需额外参数:减少模型参数量,降低过拟合风险。
- 理论保证:相对位置线性关系使模型能自然泛化到不同长度的句子。
-
可学习编码的优势场景:
- 当训练数据量非常大且序列长度固定时,可学习编码能更灵活地适应数据分布。
- 某些特定任务中,位置本身有语义含义(如代码中的缩进),可学习编码可能更好。
总的来说,固定编码更像“通用底座”,可学习编码是“定制优化”。现代很多模型(如BERT)使用可学习编码,但长度受限;而GPT等生成模型更多采用改进版的相对位置编码(如RoPE、ALiBi),它们本质上都是在 sin/cos 思想上的扩展。