位置编码
为什么自注意力不感知顺序,正弦位置编码、可学习编码与 RoPE 各有什么取舍。
自注意力对输入序列做的是置换等变的计算——把序列打乱重排, 每个位置的输出也跟着重排,但内容完全相同。换句话说, 「猫 追 狗」和「狗 追 猫」在没有位置信息时是同一句话。
正弦位置编码
原始 Transformer 把位置信息直接加在词向量上:
选择正弦函数的好处: 可以表示为 的线性变换, 模型更容易学到相对位置关系。
不同频率的三角函数像一组刻度尺:低频区分粗粒度的前后段, 高频区分相邻 token。把它们按维度交错拼起来,就得到每个位置的唯一指纹。
可学习位置编码
BERT 等模型把位置向量当作普通参数训练:
self.position_embeddings = nn.Embedding(max_seq_len, d_model)
x = token_embeddings + position_embeddings(positions)
实现简单,但序列长度被 max_seq_len 钉死,超长输入只能截断或插值。
RoPE:旋转位置编码
RoPE 不是相加而是旋转:按位置角度把 query/key 在二维平面上旋转, 旋转后两个向量的点积只依赖相对位置 :
这让模型天然编码相对位置,长度外推能力明显好于绝对位置编码, 是 LLaMA、Qwen 等主流模型的选择。
小结
| 方案 | 形式 | 外推 | 代表 |
|---|---|---|---|
| 正弦 | 相加 | 弱 | Transformer、GPT-2 |
| 可学习 | 相加 | 弱 | BERT |
| RoPE | 旋转 | 较好 | LLaMA、Qwen |