位置编码 (Position Encoding) 📋24
Keywords: Transformer 改进
-
动机:
- 自注意力的本质是 加权求和, 在数学上是一种 集合 操作, 具有 置换等变性 (Permutation Equivariant);
- 这意味着 即使打乱输入序列的顺序, 注意力机制也会产生相同的分布;
- 为了使其能够理解序列的 顺序 概念, 必须显式引入 位置信息;
-
方法 (如何引入位置信息)
- 在输入模型前, 对词嵌入施加位置编码 (如 正弦位置编码);
- 在计算注意力前, 对 Q/K 施加变换 (如 RoPE);
- 在得到注意力后, 对 logits 施加偏置 (如 ALiBi);
-
理想属性
-
唯一性: 每个位置的编码唯一 (所有位于位置
$i$ 的 token 有相同的编码) - 确定性: 由确定性公式或算法生成, 便于模型学习/泛化;
- 外推性 (Extrapolation): 能泛化到比训练序列更长的输入;
- 相对位置感知: 两个位置编码之间应该蕴含 相对位置 信息, 并具有简单的数学关系 (最好是线性的);
- 距离衰减: 距离越远的两个位置, 注意力越弱;
- 扩展性: 能自然扩展到多维数据 (图像, 视频);
-
唯一性: 每个位置的编码唯一 (所有位于位置
- 来源/使用模型: Transformer 原版
- 思路/原理: 使用具有固定模式的三角函数为每个位置生成独一无二的编码向量;
-
公式:
$PE_{(pos, 2i)} = \sin(\dfrac{pos}{10000^{2i/d_{model}}}), \hspace{1em} PE_{(pos, 2i+1)} = \cos(\dfrac{pos}{10000^{2i/d_{model}}})$ - 其中
-
$pos$ 是 token 的位置索引 (从$0$ 到max_len); -
$i$ 是编码向量的维度索引 (从$0$ 到$d_{model}-1$ ); -
$d_{model}$ 是编码向量的总维度;
-
- 生成过程:
# max_len, d_model = 3, 4 # 1. 初始化一个全零的位置编码矩阵 [max_len, d_model] pe = np.zeros((max_len, d_model)) # 2. 生成位置序列 [0, 1, 2, ..., max_len-1], 并转换为列向量 [max_len, 1] pos = np.arange(0, max_len).reshape(-1, 1) # 3. 计算分母中的项 (取倒数): inv = 10000^(-2i/d_model) # 公式: 10000^(-2i/d_model) 等价于 exp( (-2i / d_model * log(10000))) inv = np.exp(np.arange(0, d_model, 2) * (-np.log(10000.0) / d_model)) # 4. 对偶数索引 (2i) 位置应用正弦函数, 奇数索引 (2i+1) 位置应用余弦函数 pe[:, 0::2] = np.sin(pos * inv) pe[:, 1::2] = np.cos(pos * inv)
-
优点:
-
唯一, 确定, 无需学习 (节省参数);
-
具备一定的 外推能力 (extrapolation), 可处理比训练更长的序列;
根据三角函数的性质 (sin/cos 相位差公式), 任意两个位置的编码可以通过相对位移的线性组合互相推导, 从而在绝对编码中隐含了相对位置信息;
-
其数学特性 蕴含相对位置信息, 即
$PE(pos+k)$ 可表示为$PE(pos)$ 的线性函数;
-
-
缺点:
- 外推能力有限/效果不佳;
-
拓展:
- 正弦位置编码中的 "波长" 是什么意思? 不同维度对应的波长有何不同?
波长
$\lambda$ 由公式中的$10000^{2i/d_{model}}$ 决定. 随着维度$i$ 从$0$ 增加到$d_{model}/2 - 1$ , 波长从$2π$ (高频, 变化快) 增长到$10000 * 2π$ (低频, 变化慢); 这使模型能同时捕获近距离和远距离的位置关系.
- 正弦位置编码中的 "波长" 是什么意思? 不同维度对应的波长有何不同?
- 来源/模型: BERT
- 方法: 随机初始化一个大小为
(max_seq_len, d_model)的矩阵作为位置编码参数, 然后与模型的其他参数一起通过训练学习得到; - 优点:
- 灵活, 可能学到更适合特定任务的位置模式;
- 缺点:
- 不具备外推能力 (内插), 严格依赖于训练时见过的位置 (
max_len); - 增加了模型参数量;
- 不具备外推能力 (内插), 严格依赖于训练时见过的位置 (
-
思路:
-
相对位置编码本质就是实现 平移不变性, 即:
其中
$x_{i\ »\ c}$ 表示平移$c$ 个位置; -
一个最简单的实现:
实际上, ALiBi 就是基于该实现.
-
-
实现方法:
- 将带有 绝对位置编码 的注意力打分公式展开:
🚨 相对位置编码做的, 实际上就是将其中
$2,3,4$ 项替换为只与相对位置$i{-}j$ 有关的函数$R(i{-}j)$ :具体实现: SHAW, XLNet, T5, DeBERTa, ALiBi 等.
-
优点:
- 外推能力更好
-
缺点:
- 有的实现较复杂, 可能会增加计算复杂度;
SHAW 是作者名
-
思路: 去掉
$p_i W_Q$ , 并将$p_j W_K$ 替换为相对位置向量$R^K_{i,j}$ , 其中$R^K_{i,j}$ 依赖于相对距离$i-j$ :
-
思路: 将
$p_j$ 替换为相对位置向量$R_{i-j}$ , 将$p_i$ 替换为可训练向量$u, v$ , 其中$R_{i-j}$ 用正弦位置编码生成:
-
思路: 去掉 2, 3 两项, 并用可训练偏置
$\beta_{i,j}$ 代替 4 项, 其中$\beta_{i,j}$ 通过 分桶 映射相对距离后查表得到:
-
思路: 去掉 4 项, 保留 2, 3 两项, 并替换为相对位置向量, 其中
$R_{i,j}$ 依赖相对距离:
-
思路: 去掉 2, 3 两项, 并用 固定线性偏置 代替 4 项, 其中
$m$ 为第$h$ 个注意力头的常数斜率:
RoPE, Rotary Positional Encoding
- 来源: RoFormer
- 特点: 同时具有绝对位置编码和相对位置编码的特点, 既能表达绝对位置信息, 也具备平移不变性;
-
思路/直觉/实现:
-
从数学上看, 设计目标可以转化为, 寻找一种变换
$f$ , 使得对于位置$m$ /$n$ 的向量$q$ /$k$, 有:$\langle \cdot, \cdot \rangle$ 表示求内积 -
二维旋转变换可以满足这一性质
- 在二维平面上, 将一个向量旋转角度
$\theta$ , 其模长不变; - 两个分别旋转了
$m\theta$ 和$n\theta$ 角度的向量, 其点积结果只与它们的原始模长和相对旋转角度$(m-n)\theta$ 有关;
- 在二维平面上, 将一个向量旋转角度
-
二维 RoPE
对位于
$m$ 的向量$q$ 施加$m\theta$ 角度的旋转 -
因此, RoPE 本质上是 通过对输入向量施加一个位置相关的旋转 来编码 绝对位置信息, 而 旋转后向量的点积内在地反映了相对位置信息;
RoPE 实际上是一种 绝对位置编码
-
-
$n$ 维 RoPE ($n$ 为偶数) 📌- 内积满足分块线性叠加, 即 高维 RoPE 可以分解为多个二维旋转的独立拼接, 即
由于旋转矩阵的稀疏性, 直接用矩阵乘法来实现会很浪费算力, 等价于
其中
$\otimes$ 为逐位相乘 -
旋转角度 的设计 💡
-
对第
$m$ 个 token, 其第$i$ 维$\big(i \in {1,2,..,d/2}\big)$ 的旋转角度为: -
参数
$i$ 的作用: 让向量中不同维度的分量负责不同尺度的位置信息 📌- 低维 (
$i$ 小):$θ_i$ 较大 (高频), 波长短; 这些维度旋转很快, 对位置变化敏感; 负责捕捉局部、精细的位置关系; - 高维 (
$i$ 大):$θ_i$ 较小 (低频), 波长长; 这些维度旋转缓慢; 负责提供全局、稳定的位置信号;
- 低维 (
-
为什么这么设计
$\theta$ ? —— 远程衰减性, 即内积随相对距离增大而衰减, 这与 距离越远, 依赖越弱 的直觉一致;
-
-
优点:
- 以绝对位置编码的形式, 实现相对位置编码的效果 (可以从绝对位置推导出相对关系);
-
长文本外推能力: 实验表明, RoPE 具有比之前的位置编码更好的 外推性;
原始版本的 RoPE 在超长上下文中依然存在外推性不足的问题, 这也是后来 RoPE 改进的方向;
-
远程衰减性: 随着相对距离的增加, 内积结果会自然衰减, 有助于模型聚焦近邻依赖;
旋转角度差越大, 两个向量的点积越小;
- 数值稳定性: 旋转矩阵是正交矩阵, 不改变向量模长, 不会破坏数值稳定性;
-
♦️ 具体实现♦️ -
将高维向量的 每两维视为一个复数, 或看作一组独立的二维平面;
-
对于每个位置, 根据其位置索引计算出一个 旋转角度;
-
通过 旋转矩阵 对 Q 和 K 向量的每一组二维分量进行旋转变换;
-
经过此变换后, Q 和 K 的内积结果 仅依赖于 它们所对应 token 的 相对位置;
$\text{RoPE}_{\theta}(v, p)$ : 对位于$p$ 的向量$v$ 旋转$p \cdot \theta$ 度; -
计算步骤
=== RoPE 计算步骤演示 === 步骤 1: 向量两两分组 [[0.497, -0.138], [0.648, 1.523], [-0.234, -0.234]] ... 步骤 2: 计算各组的旋转角度, 数量为 D/2 [3.0, 0.3, 0.03] ... 步骤 3: 分组应用旋转 原始向量 (分组): [[0.497, -0.138], [0.648, 1.523], [-0.234, -0.234]] ... 旋转后向量 (分组): [[-0.472, 0.207], [0.169, 1.646], [-0.227, -0.241]] ... 旋转后向量 (展开): [-0.472, 0.207, 0.169, 1.646, -0.227, -0.241] ... 范数比较 原始范数: 2.48947373 旋转后范数: 2.48947373
-
相对性验证:
$\langle \text{RoPE}(q, m), \text{RoPE}(k, n) \rangle = \langle q, \text{RoPE}(k, m - n) \rangle$ === RoPE 相对性验证 === m n m-n dot_val ro_dot_val ---------------------------------------- 0 0 0 -4.081900 -4.081900 4 4 0 -4.081900 -4.081900 10 0 10 -2.769302 -3.336345 15 5 10 -2.769302 -3.336345 18 8 10 -2.769302 -3.336345 6 16 -10 -3.336345 -2.769302 16 26 -10 -3.336345 -2.769302 3 13 -10 -3.336345 -2.769302
-
直观解释: 对于两个经过 RoPE 旋转后的向量
$q_m$ (位于$m$ ) 和$k_n$ (位于$n$ ), 它们的点积结果只与它们的相对位置$m-n$ 有关, 与绝对位置无关;
-
直观解释: 对于两个经过 RoPE 旋转后的向量
-
思路: 自注意力机制具有 "置换不变性" → 需要位置编码提供的 顺序信息;
-
展开详情 ⬇️
- 核心原因
- 自注意力机制的核心/本质是 加权求和, 在数学上不依赖输入顺序 → 置换不变性;
- 解决方法
- 通过显式加入 位置编码 为模型提供 顺序感知 能力;
- 核心原因
打乱序列的输入顺序, 其自注意力计算的加权结果不变
1, 与词嵌入相加; 2, 在计算注意力前, 对 Q/K 施加变换 (如 RoPE); 3, 在得到注意力后, 对 logits 施加偏置 (如 ALiBi).
大多数实现是的; 也有不共享的, 比如 Swin Transformer;
-
展开详情 ⬇️
- 默认 Transformer 中位置参数是跨头共享的, 以保证位置一致性 (参考系一致), 提升参数效率 (减少过拟合);
- 缺点: 会 牺牲不同头在位置感知上的多样性与多尺度能力;
- 因此在需要让 不同头专注不同距离模式 时, 也会采用分头位置参数的设计 (如 Swin Transformer);
绝对位置编码 (正弦位置编码, 可学习位置编码), 相对位置编码 (SHAW, XLNet, T5, DeBERTa, ALiBi), 旋转位置编码 (RoPE)
唯一性, 确定性, 外推性, 相对位置
-
展开详情 ⬇️
根据三角函数的性质 (sin/cos 相位差公式), 任意两个位置的编码可以通过相对位移的线性组合互相推导, 从而在绝对编码中隐含了相对位置信息;
波长
$\lambda$ 由公式中的$10000^{2i/d_{model}}$ 决定. 随着维度$i$ 从$0$ 增加到$d_{model}/2 - 1$ , 波长从$2π$ (高频, 变化快) 增长到$10000 * 2π$ (低频, 变化慢); 这使模型能同时捕获近距离和远距离的位置关系.
简洁, 直观, 计算与参数效率; 在同一表示空间下融合语义与位置信息; 拼接 是 加法 的一种特殊情况;
-
展开详情 ⬇️
-
实用角度:
- 直观, 简洁, 保持维度一致;
-
计算与参数效率 (加入 PE 多出来的维度意味着更大的隐藏层);
不成立, 计算量可以通过隐层维度控制, 神经网络设计中, 隐层的维度很少会小于输入层 (降维); - 已证实有效性;
-
表示空间:
- 加法 将位置向量视为对词向量的 "偏移", 直接在同一表示空间中融合语义与位置信息;
- 拼接 把语义和位置分成两个 子空间, 模型需要额外学习如何跨空间交互;
- 在高维嵌入空间中, 词嵌入子空间与位置编码子空间往往近似 正交;
- 直接加法, 模型也能通过线性变换分别处理语义和位置成分, 不必依赖拼接来保证正交;
-
表达能力:
- 加法的 表达能力更强, 拼接 只是 加法 的一种特殊情况;
- 考虑以下情况:
- 使用 拼接 方法, 设置词嵌入部分的维度为
$d_w$ , 位置向量的维度为$d_p$ ; - 设置 加法 的维度为
$d_w + d_p$ , - 假设 拼接 方法更好, 那么模型可以通过学习, 使 加法 中词嵌入后
$d_p$ 维的分量为 0, 位置向量前$d_w$ 维的分量为 0; - 从而模拟 拼接 的效果, 或者说 拼接 只是 加法 的一种特殊情况;
- 使用 拼接 方法, 设置词嵌入部分的维度为
-
实用角度:
序列长度固定, 任务需要灵活捕捉顺序模式 (视觉, 多模态, 蛋白质结构预测 等); 优势: 拟合特定数据分布, 在下游任务上快速迁移.
-
展开详情 ⬇️
- 可学习位置编码的优势在于它能 拟合特定数据分布、适配固定或可控长度、跨模态对齐非规则结构、自动调节位置权重, 并在迁移中快速适应新任务 —— 这些都是固定公式型编码难以做到的;
⁃ 绝对位置编码: 为每个 token 指定唯一坐标 (这是第 5 个词),
⁃ 相对位置编码: 强调 token 之间的距离关系 (这个词在那个词的左边第 3 个位置).
⁃ 核心区别: 编码所表达的 "位置信息" 是基于 绝对坐标 还是 相对距离 来定义的.
编码所表达的 "位置信息" 是基于 绝对坐标 还是 相对距离 来定义的.
-
展开详情 ⬇️
-
绝对位置编码
-
定义: 每个位置
$p$ 都有一个唯一的编码, 直接表示它在序列中的 全局位置; -
特点:
- 编码与位置一一对应, 位置
$i$ 的编码在任何序列中都是相同的; - 注意力机制需要通过计算两个绝对编码的差异, 间接推断相对距离;
- 编码与位置一一对应, 位置
- 优点: 实现简单, 可直接生成任意位置的编码;
- 缺点: 对超出训练长度的序列泛化能力依赖编码设计;
-
常见实现:
- 正弦位置编码;
- 可学习位置向量;
-
定义: 每个位置
-
相对位置编码
-
定义: 编码直接表示两个位置之间的相对距离
$r=j-i$ , 而不是它们的全局坐标; -
特点:
- 注意力分数中直接引入与距离相关的偏置或变换;
- 模型天然对平移不敏感 (shift-invariant), 即整体平移序列不会改变相对关系;
- 优点: 更容易泛化到不同长度, 尤其是长序列;
-
缺点:
- 实现复杂, 增加了计算复杂度;
- 需要额外设计来控制参数规模;
-
定义: 编码直接表示两个位置之间的相对距离
-
绝对位置编码
训练好的模型能否在 推理 时有效处理 比训练阶段见过更长的输入
当模型在长于其训练长度的序列上, 其性能指标显著差于在训练长度范围内的性能时, 即为外推失败; 诊断图 (困惑度随位置曲线, 注意力距离分布热图); 对照实验 (长度扫描曲线, 位置策略 A/B 测试)
RoPE 的核心是把位置信息编码为向量的 旋转相位, 使注意力分数天然依赖相对位置差, 从而兼具绝对位置和相对位置信息, 具备优秀的外推性.
-
展开详情 ⬇️
RoPE 通过一个 基于绝对位置 的 旋转变换, 在计算注意力分数时, 使绝对位置信息自动抵消, 只留下相对位置信息;
决定了 RoPE 在不同维度的旋转频率分布;
$θ$ 越小 ($d$ 越大) → 强化短距分辨率但长距失真快;$θ$ 越大 ($d$ 越小) → 提升长距稳定性但削弱局部精度; 公式中加入$i$ 可以使向量中不同维度的分量负责不同尺度的位置信息.
-
展开详情 ⬇️
-
旋转角 公式:
- 其中
-
$p$ 为 token 位置索引; -
$i$ 为 向量 的分量索引;
-
- 其中
-
底数
$d$ 增大/减小的影响-
$\theta$ 减小 (波长变长,$d$ 增大) → 相邻位置的相位差减小小 → 损害模型捕捉 局部模式 的能力 / 增强模型的外推能力; -
$\theta$ 变大 (波长变短,$d$ 减小) → 过早发生 相位失真/相位绕回 → 损害模型的外推能力 / 增强了捕捉 近距离 位置变化的能力 / 高频震荡, 难以训练;
-
-
公式中加入
$i$ 的作用:- 让向量中不同维度的分量负责不同尺度的位置信息;
-
低维 (
$i$ 小):$θ_i$ 较大 (高频), 波长短; 这些维度对位置变化非常敏感, 旋转很快; 它们负责捕捉局部、精细的位置关系; -
高维 (
$i$ 大):$θ_i$ 较小 (低频), 波长长; 这些维度旋转缓慢, 负责提供全局、稳定的位置信号;
-
增大频率基底数
$d$ ; 位置插值 (Position Interpolation); 频率重标定 (如 NTK-aware / 动态 NTK); 分段频率缩放 (如 YaRN / Hybrid Scaling);
-
展开详情 ⬇️
策略 核心思路 作用 副作用 增大频率基底数 $d$ 降低整体频率 稳定长距外推 短距分辨率下降 位置插值 线性缩放位置索引 延缓相位绕回 损害高频信息/局部细节, 整体性能下降 NTK-aware 差异化缩放频率 (高频少缩, 低频多缩) 长短距兼顾 参数敏感 YaRN 缩放频率 + 调节注意力分布 (温度缩放) 平衡长短距 实现复杂, 调参成本高
偏好外推: RoPE, ALiBi; 偏好相对性/平移不变性: RoPE, 偏置+可学习; 短序列: 可学习位置编码
显存占用: 嵌入加法
$O(Nd)$ ; 注意力偏置$O(N^2)$ 或 分桶$O(N)$ ; 旋转编码$O(1)$ ;
推理时延: 注意力偏置 > 旋转编码 > 嵌入加法; 对模型整体影响不大;
RoPE: 架构改造 (替换位置编码) → 持续预训练 (低学习率) → 微调 → (如果是 RoPE) 推理时做 位置插值 或 频率基重标定 (NTK-aware scaling);
ViT 将图像切分成一系列的图像块 (Patch), 每个 Patch 被视为一个词元; 然后为每个 Patch 的位置 (通常是2D的) 生成一个可学习的位置编码, 与 Patch 的嵌入向量相加.