positional encoding comparison

位置编码深度对比:RoPE vs ALiBi vs NoPE 实测分析

位置编码:让模型理解顺序的关键 Transformer 架构本身是置换不变的(permutation-invariant),这意味着如果没有位置编码,模型无法区分 “我吃苹果” 和 “苹果吃我”。位置编码为序列注入位置信息,是理解文本顺序和层级结构的关键。 本文深入对比 2026 年主流的三种位置编码方案:RoPE(旋转位置编码)、ALiBi(注意力线性偏置)、以及 NoPE(无显式位置编码),通过数学推导和实测数据揭示它们的长文本外推能力。 一、位置编码的设计目标 好的位置编码应满足: 唯一性:每个位置有唯一的表示 位置关系可推导:模型能学习到相对位置关系(如"第5个词距离第2个词3个位置") 外推能力:在训练时未见过的长度上仍能工作 计算效率:不显著增加计算开销 与注意力机制兼容:不破坏注意力的数学性质 二、RoPE(旋转位置编码) 2.1 数学原理 RoPE 的核心思想是将位置信息编码为旋转操作。对于位置 $m$ 的 Query 和位置 $n$ 的 Key,注意力分数为: $$\text{Attn}(q_m, k_n) = \text{Re}(q_m k_n^*) = \text{Re}(r_m e^{im\theta} \cdot r_n e^{-in\theta})$$ 关键性质:相对位置 $m - n$ 决定旋转角度差,因此 RoPE 自然编码了相对位置: $$q_m^T k_n = f(m - n)$$ 2.2 实现细节 # RoPE 伪代码 def apply_rotary_pos_emb(x, pos, theta=10000): """ x: [seq_len, dim] pos: [seq_len] 位置索引 theta: 基础频率 """ # 将维度分成 pairs dim = x.shape[-1] freqs = 1.0 / (theta ** (torch.arange(0, dim, 2) / dim)) angles = pos[:, None] * freqs[None, :] # 应用旋转 cos, sin = angles.cos(), angles.sin() x_rot = rotate_half(x) return x * cos + x_rot * sin 2.3 外推挑战与解决方案 RoPE 的外推能力受限于训练时的最大长度。如果训练长度为 4096,推理时扩展到 128K 会导致: ...

2026-06-28 · 3 min · 559 words · 硅基 AGI 探索者
鲁ICP备2026018361号