Transformer 为什么需要位置编码?RoPE 相比绝对位置编码好在哪?
简化版
自注意力本身对顺序无感(打乱输入词序,注意力结果不变),所以必须额外注入「位置」信息,这就是位置编码。早期用绝对位置编码(正弦函数或可学习向量,加到词嵌入上);现代大模型主流用 RoPE(旋转位置编码)——它通过对 Query 和 Key 按位置做旋转,使注意力分数只依赖两个 token 的相对距离。RoPE 的好处是:天然编码相对位置、不增加参数、能较好地外推到更长序列,且方便做长上下文扩展。另一条路线是 ALiBi(给注意力分数加一个随距离线性衰减的偏置)。
详细版
为什么必须有位置编码
注意力计算 softmax(QKᵀ/√d)·V 是置换等变的:交换两个输入 token 的位置,输出只是跟着交换,注意力权重的数值不变。也就是说,自注意力看不到「谁在前、谁在后」。而语言强烈依赖语序(“狗咬人” ≠ “人咬狗”),所以要人为注入位置信号。
三大类位置编码
-
绝对位置编码
- 正弦式(Sinusoidal):用不同频率的 sin/cos 生成位置向量,加到词嵌入上(原始 Transformer)。
- 可学习式(Learned):位置向量作为参数训练(BERT、GPT-2)。
- 缺点:编码的是绝对位置,外推到训练时没见过的更长位置效果差。
-
相对位置编码
- 让注意力分数依赖 token 间的相对距离
i−j(T5 的相对位置偏置、Transformer-XL)。更符合语言的平移不变性。
- 让注意力分数依赖 token 间的相对距离
-
旋转位置编码 RoPE(当代主流)
- 对 Q、K 按其绝对位置施加旋转矩阵,使得
Q_m和K_n的点积只与相对位置m−n有关——用绝对位置的旋转实现了相对位置的效果。Llama、Qwen、GLM 等几乎都用它。
- 对 Q、K 按其绝对位置施加旋转矩阵,使得
-
ALiBi
- 不加位置向量,而是在注意力分数上直接加一个
−(m−n)·斜率的线性偏置:距离越远、惩罚越大。实现简单、外推性好。
- 不加位置向量,而是在注意力分数上直接加一个
RoPE 的三个优点
- 相对位置感知:符合语言平移不变性。
- 零额外参数:只是对 Q/K 做旋转,不引入可学习参数。
- 外推 + 可扩展:配合插值/NTK/YaRN 能把上下文窗口扩到训练长度的数倍。
完整版教学
记忆钩子:架构题不要只背名字,要沿着「张量怎么变、复杂度怎么变、训练/推理代价怎么变」三步讲。
一、先把”注意力对顺序无感”证清楚
自注意力对每个位置的输出是所有位置 V 的加权和,权重来自 Q·Kᵀ。如果把输入序列的两个位置对调,Q、K、V 也随之对调,最终每个位置拿到的加权和不变——注意力不含任何顺序信息。
这和 RNN/CNN 不同:RNN 靠递归天然有先后,CNN 靠卷积核位置有局部顺序。Transformer 为了并行放弃了递归结构,代价就是必须显式补上位置信息。所以位置编码不是可选项,是让 Transformer「懂语序」的必需品。
二、绝对位置编码的思路与短板
绝对编码给每个位置一个向量 p_i,加到词嵌入上:x_i' = x_i + p_i。
- 正弦式用不同频率的三角函数生成,好处是任意长度都能算、有一定相对位置线索(因为 sin/cos 有和差公式)。
- 可学习式直接把
p_i当参数训。
核心短板是外推差:模型只在位置 0~L 上训练过,遇到超过 L 的位置(如训练 2K、推理要 8K),要么没有对应向量(可学习式),要么进入没训练过的编码区(正弦式),性能明显下降。而语言里「相对距离」往往比「绝对位置」更本质——第 5 个词和第 6 个词的关系,不该因为整句话前面多加了 100 个词就变。这推动了相对位置编码的发展。
三、RoPE 的核心思想:用旋转把绝对变相对
RoPE 的巧妙在于:对每个位置的 Q、K 向量施加一个依赖其绝对位置的旋转,但旋转的数学性质让二者点积只依赖相对位置。
把 Q、K 的维度两两分组,每组看成一个二维向量,位置 m 处旋转角度 m·θ:
对位置 m 的向量施加旋转 R(m·θ):
Q_m = R(m·θ)·q
K_n = R(n·θ)·k
则点积: Q_m · K_n = qᵀ·R((m-n)·θ)·k → 只依赖 (m−n)
不同维度分组用不同的 θ(频率),像时钟的时针分针秒针,低频维度管长距离、高频维度管短距离。
为什么这很美妙:
- 它给的是绝对位置的操作(每个 token 按自己位置旋转),却在注意力里产生相对位置的效果——两全其美。
- 旋转是正交变换,不改变向量模长,不破坏原有语义幅度。
- 没有引入任何可学习参数,几乎零成本。
四、RoPE vs 绝对 vs ALiBi 对比
| 特性 | 绝对(正弦/可学) | RoPE | ALiBi |
|---|---|---|---|
| 注入方式 | 加到词嵌入 | 旋转 Q/K | 加到注意力分数 |
| 位置类型 | 绝对 | 相对(由旋转实现) | 相对(线性偏置) |
| 额外参数 | 可学习式有 | 无 | 无 |
| 外推能力 | 差 | 中→好(配合插值) | 好 |
| 长上下文扩展 | 难 | 成熟(PI/NTK/YaRN) | 直接外推较好 |
| 采用 | 早期 BERT/GPT-2 | Llama/Qwen/GLM 等主流 | BLOOM、部分模型 |
RoPE 之所以成为主流,是「相对位置 + 零参数 + 可扩展生态成熟」的综合最优;ALiBi 在外推上简单直接,但在部分任务上的表达力和 RoPE 各有胜负。
五、RoPE 与长上下文扩展的关系
RoPE 的旋转角 m·θ 随位置线性增长。当推理位置远超训练范围时,旋转角进入没训练过的区域,性能下降。业界发展出一系列改 θ 或改位置索引的扩展法(是长上下文的高频考点):
- 位置插值 PI:把位置索引按
L/L'缩小,让长序列的位置”挤”回训练过的范围,配合少量微调即可扩展。 - NTK-aware scaling:调整 RoPE 的 base(频率底数),高频维度基本不变、低频维度插值,可在不训练或少训练下扩展中等长度。
- YaRN:结合 NTK 与注意力温度缩放,用更少的微调达到更好的长上下文效果。
这些能奏效,正是因为 RoPE 把位置信息编码成了可解析、可缩放的旋转频率——换句话说,RoPE 的结构本身就为长度扩展留了口子。
六、常见误区与追问
- 误区:位置编码是给注意力”加个偏置”。 绝对编码是加到词嵌入,ALiBi 是加到分数,RoPE 是旋转 Q/K,三种注入位置不同。
- 误区:RoPE 有可学习参数。 没有,纯几何旋转。
- 追问:为什么自注意力需要位置编码而 RNN 不需要? 注意力置换等变、看不到顺序;RNN 递归结构天然含顺序。
- 追问:RoPE 加在哪一步? 加在每一层算注意力前对 Q、K 旋转(不是只在输入层加一次),V 不旋转。
- 追问:为什么不同维度用不同频率 θ? 多频率让模型同时感知短程和长程的相对距离,类似多分辨率。
- 追问:RoPE 能无损外推吗? 直接外推会退化,需 PI/NTK/YaRN 等手段配合,通常还要少量长文本微调。
七、加强记忆
位置编码记「注意力对顺序无感,必须补位置」;RoPE 记简要说:「对 Q、K 按绝对位置做旋转,使点积只依赖相对距离」——用绝对的操作实现相对的效果,零参数、可扩展。 三条线并记:绝对编码(加到嵌入、外推差)、RoPE(旋转 Q/K、相对位置、主流)、ALiBi(分数加线性距离惩罚、外推好)。再挂一个钩子——RoPE 把位置编成可缩放的旋转频率,所以长上下文扩展(PI/NTK/YaRN)都是在动它的频率或位置索引。