Table of Contents

位置编码的发展历程:从绝对、相对到多模态旋转编码

30 minutes read

Published:

Tags: , ,

TL;DR: 本文梳理位置编码的主要演进路线:从可学习绝对位置编码(BERT、GPT)和正弦绝对编码(Transformer)的限制,到相对位置编码(T5、Transformer-XL)的改进,再到旋转位置编码(RoPE)的突破性创新。RoPE 的特点是「以绝对之形,行相对之实」:对每个位置做绝对旋转,但 Attention 内积只依赖相对距离。后续的 2D-RoPE 和 M-RoPE 把这个机制扩展到视觉和多模态场景,用于现代视觉语言模型(如 Qwen2-VL、Qwen3-VL)中的二维/三维时空位置建模。贯穿全文的问题是:模型到底如何表示「距离」,以及这种表示如何同时兼顾外推、KV Cache 和多模态坐标。


1. 引言

Transformer 的 Self-Attention 本质上是在序列中对 Token 做两两内积($\boldsymbol{q}_{m}^{\top} \boldsymbol{k}_{n}$)。如果不额外注入位置信息,这个计算对输入顺序是置换不变的:同一组 token 换一个排列,attention 本身并不知道谁在前、谁在后。位置编码要补的就是这部分信息,让内积结果和 token 之间的位置关系相关。

例如 “Black Cat” 和 “Cat Black” 包含相同 token,但顺序不同。模型要区分它们,只靠词向量不够。下面按绝对位置编码、相对位置编码、RoPE 以及多模态 RoPE 的顺序展开,重点看每一步解决了什么问题,又引入了哪些新的约束。

2. 绝对位置编码 (Absolute Positional Encoding)

核心思想:直接将每个 Token 在序列中的绝对位置信息编码成一个向量,并叠加到 Token 的词嵌入 (Word Embedding) 上。

2.1. 可学习的位置编码 (Learned Positional Encoding)

这是最符合直觉的做法:为每个 token 的绝对位置(从 $0$ 到序列的最大长度 $L_{max}$)分配一个独一无二的向量。这些位置向量在模型训练过程中随机初始化,并作为模型参数一同学习和更新。

  • 优势:实现简单,位置向量直接作为参数学习,模型可以按训练数据拟合任务需要的位置表示。

  • 局限性:
    • 无外推能力:训练时若最大长度设为 2048,推理时一旦遇到 2049,就会因为查表越界(没有对应的训练参数)导致模型直接失效。

    • 缺乏平移不变性:同样的短语(如 “Black Cat”)出现在句首和句尾时,叠加的位置向量完全不同,模型需要在不同位置重复学习相同的局部关系。

    • 参数量大:处理长文本时需要实例化大量位置向量。

  • 代表模型:BERT、GPT 等早期模型及部分现代 Transformer。

2.2. 正余弦位置编码 (Sinusoidal Positional Encoding)

由 Transformer 原始论文《Attention Is All You Need》提出。它舍弃了参数学习,转而使用预设的正弦和余弦函数生成位置编码向量。第 $pos$ 个位置、第 $i$ 个维度 ($PE_{(pos, i)}$) 的计算公式为:

\[PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}})\] \[PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}})\]
  • 优势:
    • 理论可外推:基于解析函数生成,理论上没有绝对的最大长度限制。

    • 零参数负担:完全基于公式计算,不增加模型参数量。

    • 隐含相对位置信息:利用三角函数和角公式,位置 $pos+\delta$ 的编码可以通过位置 $pos$ 的编码线性表示,利于 Self-Attention 学习相对位置关系。

  • 局限性:虽然理论上具有一定的相对位置表达能力,但简单的“相加”操作使得模型难以捕捉精确的相对距离信息,且在极长序列下,注意力的远程噪声难以消除。

3. 相对位置编码 (Relative Positional Encoding)

既然语言的局部结构(相对距离)往往比绝对坐标更重要,研究者们提出了相对位置编码(RPE)。

  • 核心思想:不改变 Embedding,而是直接在计算 Attention Score 时加入一个与相对距离 $(j-i)$ 相关的偏置项 (Bias)。

  • 原理:计算 Attention Score ($e_{ij} = q_{i} \cdot k_{j}$) 时,额外考虑 $j$ 相对于 $i$ 的相对距离。公式演变为 $e_{ij} = q_{i} \cdot (k_{j} + r_{j-i})$ 等形式,其中 $r_{j-i}$ 即为相对距离的编码向量。

  • 优势:
    • 直接建模相对关系:位置项进入 Attention Score,模型看到的是距离,而不是两个独立的绝对坐标。

    • 可外推:对于未见过的相对距离,可以进行泛化(通常会截断最大相对距离,例如 -K 到 K,超出范围的共享编码)。

    • 不增加参数量或少量增加:相对距离编码通常共享或使用函数生成。

  • 主要问题:KV Cache 推理效率低。
    • 原因:相对距离是动态的。在生成第 $t$ 个词时,Cache 中第 1 个词距离它是 $t-1$;但在生成第 $t+1$ 个词时,距离变成了 $t$。这意味着每生成一个新 token,必须重新查表计算历史所有 Token 的相对位置 Bias,无法直接利用缓存好的 KV 进行纯粹的高效矩阵乘法。
  • 代表模型:Transformer-XL、T5 等。

4. 旋转位置编码 (Rotary Positional Encoding, RoPE)

4.1. 核心思想

总体来说,上述传统方案分为两派:

  • 绝对位置编码(APE):直接给每个位置加一个固定向量(如 Sinusoidal、Learned Embedding),简单但无法显式建模相对距离。

  • 相对位置编码(RPE):在 Attention 计算时注入相对距离偏置(如 T5 Bias),能直接表达距离,但破坏了 KV Cache 的复用性。

RoPE 的核心做法是:用绝对位置上的旋转变换,得到相对位置的内积结果。它对每个位置独立施加旋转,看起来是绝对位置编码;但 Query 和 Key 做内积后,结果只依赖两者的相对距离。

4.2. 1D-ROPE

4.2.1. 数学推导

Step 1:二维情形的复数视角

考虑最简单的二维向量 $\boldsymbol{q} = (q_{0}, q_{1})$。将其视为复数 $\boldsymbol{q} = q_{0} + \mathrm{i} q_{1}$,则对位置 $m$ 处的向量施加 RoPE,等价于乘上一个单位复数旋转因子:

\[f(\boldsymbol{q}, m) = \boldsymbol{q} e^{\mathrm{i} m\theta} = \|\boldsymbol{q}\| e^{\mathrm{i}(\Theta(\boldsymbol{q}) + m\theta)}\]

几何意义很直接:把向量 $\boldsymbol{q}$ 在二维平面上旋转 $m\theta$ 的角度。向量的模长 $\|\boldsymbol{q}\|$ 保持不变,只有方向(辐角)增加了 $m\theta$。这就是 “旋转式位置编码” 名称的由来。

写成矩阵形式,就是一个标准的二维旋转矩阵左乘:

\[f(\boldsymbol{q}, m) = \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} q_{0} \\ q_{1} \end{pmatrix}\]

这是一个标准的二维旋转矩阵。


Step 2:推广到高维:分块对角旋转矩阵

实际的 Transformer 中,Query/Key 向量的维度 $d$ 远大于 2(通常为 64 或 128)。由于内积满足线性叠加性,任意偶数维的 RoPE 都可以表示为 $d/2$ 个二维旋转的拼接。

具体做法是将向量的分量两两分组 $(q_{0},q_{1}),(q_{2},q_{3}),\ldots,(q_{d-2},q_{d-1})$,对每组独立施加不同频率的旋转,得到分块对角旋转矩阵 $\mathcal{R}_{m}$:

\[\underbrace{\begin{pmatrix} \cos m\theta_{0} & -\sin m\theta_{0} & 0 & 0 & \cdots & 0 & 0 \\ \sin m\theta_{0} & \cos m\theta_{0} & 0 & 0 & \cdots & 0 & 0 \\ 0 & 0 & \cos m\theta_{1} & -\sin m\theta_{1} & \cdots & 0 & 0 \\ 0 & 0 & \sin m\theta_{1} & \cos m\theta_{1} & \cdots & 0 & 0 \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & 0 & \cdots & \cos m\theta_{d/2-1} & -\sin m\theta_{d/2-1} \\ 0 & 0 & 0 & 0 & \cdots & \sin m\theta_{d/2-1} & \cos m\theta_{d/2-1} \end{pmatrix}}_{\mathcal{R}_{m}} \begin{pmatrix} q_{0} \\ q_{1} \\ q_{2} \\ q_{3} \\ \vdots \\ q_{d-2} \\ q_{d-1} \end{pmatrix}\]

这里的 $q$ 指的是一个 Token 对应的整个 Query 向量。

其中每组旋转的频率 $\theta_{i}$ 不同,定义为:

\[\theta_{i} = 10000^{-2i/d}, \quad i = 0, 1, \dots, d/2-1\]

后续很多 RoPE 变体,本质上都在调整这两个变量:

  • Token 位置 $m$:随着 $m$ 增大,旋转角度增大,旋转速度变快,频率变大

  • 分量位置 $i$:随着 $i$ 增大,旋转角度变小,旋转速度变慢,频率变小

    • 低维分量($i$ 小)→ $\theta_{i}$ 大 → 旋转快 → 捕捉高频/短距离关系
    • 高维分量($i$ 大)→ $\theta_{i}$ 小 → 旋转慢 → 捕捉低频/长距离关系

这种多频率设计让不同维度承担不同尺度的位置变化:低维更敏感,高维变化更慢。


Step 3:核心恒等式:为什么效果是 “相对的”

给位置 $m$ 的 Query 乘上 $\mathcal{R}_{m}$,位置 $n$ 的 Key 乘上 $\mathcal{R}_{n}$,再用变换后的 $Q,K$ 做 Attention。相对位置信息来自下面这个恒等式:

\[(\mathcal{R}_{m} \boldsymbol{q})^{\top} (\mathcal{R}_{n} \boldsymbol{k}) = \boldsymbol{q}^{\top} \mathcal{R}_{m}^{\top} \mathcal{R}_{n} \boldsymbol{k} = \boldsymbol{q}^{\top} \mathcal{R}_{n-m} \boldsymbol{k}\]

关键恒等式 $\mathcal{R}_{m}^{\top} \mathcal{R}_{n} = \mathcal{R}_{n-m}$ 成立的原因是:旋转矩阵的转置等于其逆(正交矩阵性质),而两个旋转的复合等于角度相加。因此:

最终的内积结果只依赖相对位置 $(n - m)$,与绝对位置 $m, n$ 无关。

这就是 RoPE “以绝对之形,行相对之实”的核心数学机制。

4.2.2. 工程实现:利用稀疏性加速

$\mathcal{R}_{m}$ 是正交矩阵,不改变向量模长,因此通常不会明显破坏原模型的数值稳定性。

同时,$\mathcal{R}_{m}$ 非常稀疏,绝大部分元素都是 0。直接做完整矩阵乘法会浪费算力,工程实现一般会改写成逐位对应相乘:

\[\begin{pmatrix} q_{0} \\ q_{1} \\ q_{2} \\ q_{3} \\ \vdots \\ q_{d-2} \\ q_{d-1} \end{pmatrix} \otimes \begin{pmatrix} \cos m\theta_{0} \\ \cos m\theta_{0} \\ \cos m\theta_{1} \\ \cos m\theta_{1} \\ \vdots \\ \cos m\theta_{d/2-1} \\ \cos m\theta_{d/2-1} \end{pmatrix} + \begin{pmatrix} -q_{1} \\ q_{0} \\ -q_{3} \\ q_{2} \\ \vdots \\ -q_{d-1} \\ q_{d-2} \end{pmatrix} \otimes \begin{pmatrix} \sin m\theta_{0} \\ \sin m\theta_{0} \\ \sin m\theta_{1} \\ \sin m\theta_{1} \\ \vdots \\ \sin m\theta_{d/2-1} \\ \sin m\theta_{d/2-1} \end{pmatrix}\]

其中 ⊗ 是逐位对应相乘(element-wise),即 Numpy、PyTorch 等框架中的 * 运算。这个实现只需要两次逐位乘法和一次加法,计算量远低于完整的矩阵乘法。

从这个实现形式也可以看到,RoPE 可以视为一种乘性位置编码。它不是把位置向量 “加” 到特征上(如 Sinusoidal APE),而是把位置信息以 “乘” 的方式写进每个分量。


4.2.3. 直观理解

想象一个时钟的表盘。序列中的每个 Token 都是一根指针,它的”内容”决定了指针的长度和初始方向,而它的”位置”决定了额外旋转的角度。

  • 第 1 个 Token 旋转 $1\theta$

  • 第 2 个 Token 旋转 $2\theta$

  • 第 m 个 Token 旋转 $m\theta$

当我们计算两个 Token 的内积(注意力分数)时,实际上在比较两根指针的夹角。夹角只取决于它们旋转角度的差 $(n-m)\theta$,也就是相对距离,而不是各自的绝对位置。

向量的每组分量使用不同频率 $\theta_{i}$ 旋转,可以理解为多个指针以不同速度转动。低维分量转得快,对近距离变化敏感;高维分量转得慢,更适合表达长距离关系。

可视化示例

下图展示了旋转位置编码的具体效果。样本包含 6 个 token:Enhanced、Transformer、with、Rotary、Position、Embedding。每个 token 对应一个 d 维向量,其分量两两分组后各自执行旋转。

每个 token 的每组分量的旋转角度为 $m\theta_{i}$,其中 $\theta_{i}$ 的公式为 $\theta_{i} = 10000^{-2i/d}$:

  • 随着 token 位置 $m$ 增大:旋转角度增大,旋转速度变快,频率变大
  • 随着分量位置 $i$ 增大:旋转角度变小,旋转速度变慢,频率变小

4.2.4. 解决问题

解决“平移不变性”缺失问题

  • 针对对象:绝对位置编码(APE)(如 BERT, GPT-2)。

  • 问题:同样的短语(如 “Black Cat”)在句首和句尾被加上了完全不同的位置向量,模型需要重复学习相同的语义关系。

  • RoPE 的处理方式:基于旋转角度差。

  • 原理:无论绝对位置 $m$ 和 $n$ 是多少,只要相对距离不变,内积中的角度差 $(n-m)$ 就不变。模型学到的是局部关系,而不是某个固定坐标上的关系。

解决“长序列外推”能力差问题

  • 针对对象:可学习的位置编码(Learned Embedding)。

  • 问题:训练时最大长度(如 2048)限制了推理长度。推理时一旦超过该长度,查表越界(没有对应的训练参数),模型直接失效。

  • RoPE 的处理方式:基于数学函数。

  • 原理:即使位置索引超过训练时的最大值,旋转角仍然可以通过公式计算。这里要注意,”可计算” 不等于 “任意长度都稳定”,真实长上下文效果仍然取决于训练长度、频率缩放和后续外推策略。

远程衰减:降低“远程关注噪音”

  • 针对对象:标准 Attention 机制。

  • 问题:模型在处理超长文本时,难以自然降低对极远距离、无关 Token 的关注度。

  • RoPE 的处理方式:多频震荡抵消。

  • 原理:当两个 Token 距离很远($n-m$ 很大)时,不同维度上的旋转频率不同,内积求和时正负项更容易相互抵消,Attention 分数会自然变小。这给 RoPE 带来一定的局部偏置。

解决“KV Cache 推理效率”问题

  • 针对对象:相对位置编码(RPE)(如 T5)。

  • 问题:相对距离是动态的。推理时每生成一个新词,Cache 中所有历史 Token 距当前词的距离都变了,必须重新查表计算 Bias 并加到矩阵上,无法只复用缓存好的 KV 做矩阵乘法。

  • RoPE 的处理方式:把位置信息注入向量。

  • 原理:位置信息在存入 Cache 前已经通过旋转写进 Key 向量。推理时拿当前 Query 和 Cache 里的 Key 直接做矩阵乘法,相对位置关系会由旋转矩阵的性质自动体现,不需要额外查表。

4.3. 2D-ROPE

4.3.1. 计算流程

2D-RoPE 的输入是特征张量 $X$,形状为 $(B, L, D)$。同时需要两组位置索引:高度索引 $P_h$,形状为 $(B, L)$,例如 [0,0,0, 1,1,1...];宽度索引 $P_w$,形状同样为 $(B, L)$,例如 [0,1,2, 0,1,2...]。常见实现会把 hidden dimension 按 50% : 50% 切给高度和宽度。

计算过程分三步。先沿最后一维切分特征:

\[X_{height} = X[\ldots, 0 : D/2]\] \[X_{width} = X[\ldots, D/2 : D]\]

然后分别对两个子空间施加 1D-RoPE:

\[X'_{height} = \text{RoPE}(X_{height}, P_h)\] \[X'_{width} = \text{RoPE}(X_{width}, P_w)\]

最后做 Concat,拼回 hidden dimension:

\[X_{out} = \text{Concat}(X'_{height}, X'_{width}, \text{dim}=-1)\]

输出 $X_{out}$ 的形状仍然是 $(B, L, D)$。区别在于,前半部分编码垂直位置,后半部分编码水平位置。

4.3.2. 解决问题

2D-RoPE 主要处理动态分辨率图像里的两个问题。

问题 1:一维拉平破坏了“二维空间邻接性”

传统方法把图片按行扫描成一维序列。在二维网格中,点 $(0,0)$ 和点 $(1,0)$ 是垂直邻居;但如果图片宽度是 100,拉平后它们的索引分别是 0 和 100。对 1D 位置编码来说,这两个点看起来隔了 100 个位置,空间邻接关系被稀释了。

2D-RoPE 把向量切成 $h,w$ 两部分分别编码。无论 token 如何拉平,垂直邻居在 $h$ 分量上的角度差都是 $\theta_0$,在 $w$ 分量上的角度差是 0。几何关系留在坐标差里,而不是被一维索引差间接表示。

问题 2:动态分辨率导致的“相对位置错乱”

Qwen2-VL 这类模型需要处理不同尺寸和长宽比的图片。如果输入是 $200 \times 200$,垂直邻居的 1D 索引差是 200;如果输入是 $400 \times 400$,同样的垂直邻居索引差变成 400。用 1D-RoPE 时,模型需要同时解释“差 200 是邻居”和“差 400 也是邻居”,这对分辨率变化不友好。

2D-RoPE 直接使用网格坐标 $(h,w)$。无论图片多大,垂直邻居的坐标差都是 $\Delta h=1, \Delta w=0$。这让位置关系更接近图像本身的几何结构,也更适合动态分辨率输入。

4.4. M-ROPE

4.4.1. 计算流程

M-RoPE 可以看作 2D-RoPE 的三维扩展。输入特征张量 $X$ 的形状为 $(B,L,D)$,位置索引从两组变成三组:时间索引 $P_t$、高度索引 $P_h$、宽度索引 $P_w$,形状都为 $(B,L)$。视频 token 使用真实的帧号和空间坐标;图片可以把时间维设为常数;文本可以映射成一维序列坐标。

先沿 hidden dimension 切成三份:

\[X_t = X[\ldots, 0 : D_t]\] \[X_h = X[\ldots, D_t : D_t + D_h]\] \[X_w = X[\ldots, D_t + D_h : D]\]

再分别施加 1D-RoPE:

\[X'_t = \text{RoPE}(X_t, P_t)\] \[X'_h = \text{RoPE}(X_h, P_h)\] \[X'_w = \text{RoPE}(X_w, P_w)\]

最后做 Concat,拼接回原维度:

\[X_{out} = \text{Concat}(X'_t, X'_h, X'_w, \text{dim}=-1)\]

输出 $X_{out}$ 的形状仍为 $(B,L,D)$。Attention 计算时,时间差主要体现在 $X'_t$ 部分,空间差主要体现在 $X'_h$ 和 $X'_w$ 部分。

4.4.2. 解决问题

M-RoPE 的目标是用一套位置机制处理文本、图像和长视频的混合输入。

问题 1:多模态数据的“维度不兼容”

文本是 1D,图片是 2D,视频是 3D。若每种模态各用一套位置编码,跨模态 attention 里还需要处理不同坐标系统之间的对齐;若全部压成 1D,视频和图像的时空结构又会混在一个长索引里。

M-RoPE 使用统一的 $(t,h,w)$ 坐标。文本可以用 $(i,i,i)$ 表示一维顺序,图片可以用 $(1,h,w)$ 表示二维网格,视频使用 $(t,h,w)$ 表示时空位置。这样不同模态进入同一个 Embedding 空间时,位置含义仍然可比较。

问题 2:长视频的“索引爆炸”与“外推失败”

视频会产生大量 token。假设一个视频有 1000 帧,每帧 256 个 token,总 token 数就是 256,000。如果用 1D 索引,位置号 $pos$ 会一路增长到 250,000 以上;当推理位置远超训练时见过的范围(例如训练只覆盖到 32k),$\cos(m\theta)$ 的旋转角分布会明显偏离训练区间,性能容易下降。

M-RoPE 的做法是把一个很长的一维索引拆成三个小得多的坐标分量。总 token 数可能是 25 万,但时间索引 $t$ 可能只到 1000,高度索引 $h$ 可能只到 16,宽度索引 $w$ 也可能只到 16。每个分量上的数值都更接近训练时的位置范围。

这不等于彻底解决长视频外推,但它把外推压力从单个巨大位置号分摊到时间、高度、宽度三个维度。时间变长时主要影响时间分量,空间分量仍保留原有几何关系。


5. 总结与展望

5.1. 完整的技术演进脉络

位置编码这条线可以概括为:先把绝对坐标加到 token 表示里,再把相对距离放进 attention score,最后用旋转矩阵把相对距离写进 Query/Key 的内积。多模态场景下,问题又从一维序列扩展到 $(t,h,w)$ 坐标。

方案核心机制主要优势关键局限代表模型
Learned APE查表取位置向量灵活性高无外推,参数多,缺乏平移不变性BERT, GPT-2
Sinusoidal APE三角函数零参数,有外推隐式相对性,长序列下远程衰减差Transformer, GPT-3
Relative PE相对距离偏置显式相对,自然高效破坏 KV Cache,推理成本高T5, Transformer-XL
RoPE (1D)旋转矩阵绝对形式、相对效果、KV Cache友好单维设计,难以直接扩展到多模态LLaMA, Qwen-LM
2D/M-RoPE多维旋转分解统一多模态坐标系,改善长视频位置外推压力实现复杂,频谱分布需优化Qwen2-VL, Qwen2.5-VL

5.2. 关键设计原则

从这些方案里,可以看到几条比较稳定的设计原则:

  1. 显式优于隐式:从隐含的三角函数关系到显式的旋转矩阵,从相对距离偏置到绝对位置旋转,显式的数学表示通常更容易和 attention 机制对齐。

  2. 正交性降低扰动:RoPE 使用正交旋转矩阵,不改变向量模长。这一点让它在引入位置信息时,对原有表示空间的扰动更可控。

  3. 统一坐标系有利于跨模态对齐:M-RoPE 用一套三维坐标系 $(t,h,w)$ 处理文本、图像、视频,避免每种模态维护一套互不兼容的位置语义。

  4. 分解比单一路径更稳:M-RoPE 将长视频的一维大索引拆成时间、高度、宽度三个维度,降低单个位置号越界带来的外推压力。

5.3. 未来研究

RoPE 及其多维变体已经成为很多 LLM/VLM 的默认选择,但还有几类问题需要结合训练和评测继续验证:

  • 自适应频率:不同的任务可能需要不同的频率分布(如密集物体检测 vs 长距离推理),能否动态调整 $\theta_i$ 的基座?

  • 显式时间戳与隐式时间编码的融合:Qwen3-VL 引入的显式文本时间戳很直观,但它和 RoPE 中的隐式时间位置如何配合,还需要看具体任务上的收益和代价。

  • 多粒度位置的层次化表示:目前大多数方案把所有信息都编码到位置 ID 中。更细的设计可能需要区分全局位置、局部窗口位置和 patch 内位置。

  • 位置编码与注意力机制的共同设计:RoPE 本身是与 Dot-Product Attention 绑定的。对于其他注意力变体(如线性注意力、稀疏注意力),应如何重新设计位置编码?



6. 延伸阅读

下面几篇材料适合继续查公式推导和实现细节:

理论推导和实现细节


本文为个人论文阅读笔记整理,如有疏漏欢迎指正。

Leave a Comment