1. RoPE 的核心设计和作用

RoPE(Rotary Position Embedding)是一种相对位置编码方法,通过将位置信息编码为旋转矩阵(基于余弦和正弦函数),将其融入到查询和键的表示中。其核心思想是:

  • 为每个 token 的嵌入添加位置信息:通过旋转操作,将 token 的嵌入向量与位置信息结合,使模型能够区分序列中不同位置的 token。
  • 保持相对位置关系:RoPE 的旋转矩阵设计使得注意力分数依赖于 token 之间的相对位置,而不是绝对位置,这在 Transformer 的自注意力机制中非常有效。

RoPE 的数学形式为:

  • 对于输入嵌入 xmx_mxm(位置 mmm 的 token 嵌入),RoPE 应用旋转矩阵 RmR_mRm

xm′=Rmxm x_m' = R_m x_m xm=Rmxm

其中 RmR_mRm 是一个基于位置 mmm 的旋转矩阵,定义为:

Rm=[cos⁡(mθ)−sin⁡(mθ)sin⁡(mθ)cos⁡(mθ)] R_m = \begin{bmatrix} \cos(m\theta) & -\sin(m\theta) \\ \sin(m\theta) & \cos(m\theta) \end{bmatrix} Rm=[cos(mθ)sin(mθ)sin(mθ)cos(mθ)]

(实际中对每对维度应用不同频率 θ\thetaθ,扩展到高维)。

  • 应用到注意力机制:在自注意力中,查询和键的点积 qmTknq_m^T k_nqmTkn(位置 mmmnnn 的 Q 和 K)会通过 RoPE 变成:

(Rmqm)T(Rnkn)=qmTRmTRnkn (R_m q_m)^T (R_n k_n) = q_m^T R_m^T R_n k_n (Rmqm)T(Rnkn)=qmTRmTRnkn

其中 RmTRnR_m^T R_nRmTRn 是一个只依赖于相对位置 m−nm - nmn 的矩阵,从而使注意力分数反映相对位置关系。

2. 为什么 RoPE 应用在 Query 和 Key 上?

RoPE 被应用到 Query 和 Key 的原因与 Transformer 自注意力机制的计算方式密切相关。注意力机制的核心公式为:

Attention(Q,K,V)=softmax(QKTdk)V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V

其中:

  • QQQ 是查询矩阵,形状为 [batch_size, num_heads, seq_len, head_dim]。
  • KKK 是键矩阵,形状同上(或不同头数,如 GQA)。
  • VVV 是值矩阵,负责携带内容信息。
  • QKTQK^TQKT 计算注意力分数,决定每个 token 对其他 token 的关注程度。

以下是 RoPE 应用在 Query 和 Key 上的具体原因:

2.1 注意力分数依赖 Q 和 K 的交互
  • 注意力分数的计算:注意力分数由 QKTQK^TQKT 决定,表示查询 token 和键 token 之间的相似性。
  • 位置信息的影响:为了让模型感知 token 的相对位置,位置编码必须影响 QKTQK^TQKT 的结果。RoPE 通过对 QQQKKK 应用旋转矩阵,确保 QKTQK^TQKT 包含相对位置信息(m−nm - nmn)。
  • 数学依据

假设原始查询和键为 qm,knq_m, k_nqm,kn,应用 RoPE 后为 Rmqm,RnknR_m q_m, R_n k_nRmqm,Rnkn
注意力分数为:

(Rmqm)T(Rnkn)=qmTRmTRnkn (R_m q_m)^T (R_n k_n) = q_m^T R_m^T R_n k_n (Rmqm)T(Rnkn)=qmTRmTRnkn

RmTRnR_m^T R_nRmTRn 是一个旋转矩阵,依赖于相对位置 m−nm - nmn,使得注意力分数自然编码了位置关系。

  • 为什么不直接应用到 V:值矩阵 VVV 仅在加权求和时使用(softmax(QKT)V\text{softmax}(QK^T)Vsoftmax(QKT)V),不直接影响注意力分数的计算。给 VVV 添加位置信息不会改变注意力分数的分布,因此对位置建模没有直接贡献。
2.2 保持内容与位置分离
  • 内容信息在 V 中:值矩阵 VVV 主要携带 token 的内容信息(语义)。注意力分数(由 QKTQK^TQKT 计算)决定如何加权这些内容。
  • 位置信息在 Q 和 K 中:RoPE 将位置信息嵌入到 QQQKKK,使得注意力分数根据相对位置调整权重,而不直接修改内容(VVV)。这保持了内容和位置信息的分离,便于模型学习。
  • 优势:这种分离允许模型在注意力机制中独立地建模位置关系(通过 QKTQK^TQKT)和内容信息(通过 VVV),提高表达能力。
2.3 高效性和一致性
  • 计算效率:RoPE 只需对 QQQKKK 应用旋转矩阵,计算成本较低(仅涉及矩阵乘法和余弦/正弦运算)。如果也对 VVV 应用 RoPE,会增加不必要的计算开销,且对注意力分数无直接影响。
  • 一致性:Transformer 模型(如 GPT、LLaMA、Phi)通常将位置编码融入 QQQKKK,这是标准设计。RoPE 遵循这一惯例,确保与现有架构兼容。
2.4 支持相对位置建模
  • 相对位置的重要性:在自然语言处理中,token 之间的相对位置(如“距离 3 个 token”)比绝对位置更重要。RoPE 通过 QKTQK^TQKT 的旋转矩阵直接建模相对位置 m−nm - nmn,无需额外处理。
  • 例子

假设两个 token 在位置 mmmnnn,RoPE 使 qmTknq_m^T k_nqmTkn 反映 m−nm - nmn,而不是绝对位置 mmmnnn
这对于长序列或自回归生成特别有用,因为模型可以泛化到不同序列长度。

3. 为什么不应用 RoPE 到 Value?

  • 无直接贡献:值矩阵 VVV 仅在注意力分数的加权求和中使用:

Output=softmax(QKTdk)V \text{Output} = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Output=softmax(dk QKT)V

VVV 应用 RoPE(即 RnvnR_n v_nRnvn)不会改变 QKTQK^TQKT 的结果,因此不影响注意力分数的分布,也不会改变位置建模的效果。

  • 增加冗余计算:对 VVV 应用 RoPE 会增加矩阵旋转的计算量,但对模型性能的提升有限,因为位置信息已经通过 QQQKKK 充分编码。
  • 破坏内容表示VVV 携带 token 的语义内容,应用 RoPE 可能会干扰原始内容表示,而这些内容通常不需要位置相关的变换。

4. Phi 模型中的具体实现

比如微软发布的Phi系列模型中,PhiFlashAttention2(以及父类 PhiAttention)的 RoPE :

# Partial rotary embedding
query_rot, query_pass = (
    query_states[..., : self.rotary_emb.dim],
    query_states[..., self.rotary_emb.dim :],
)
key_rot, key_pass = (
    key_states[..., : self.rotary_emb.dim],
    key_states[..., self.rotary_emb.dim :],
)
# [batch_size, seq_length, num_heads, head_dim // config.partial_rotary_factor]
query_rot, key_rot = apply_rotary_pos_emb(query_rot, key_rot, cos, sin, position_ids)
# [batch_size, seq_length, num_heads, head_dim]
query_states = torch.cat((query_rot, query_pass), dim=-1)
key_states = torch.cat((key_rot, key_pass), dim=-1)
  • 代码分析

query_states, key_states: 分别为查询和键张量,形状 [batch_size, num_heads, seq_length, head_dim]。
query_rot, key_rot: 仅对部分维度(self.rotary_emb.dim)应用 RoPE。
apply_rotary_pos_emb: 执行旋转操作,仅对 query_rot 和 key_rot 应用。
query_pass, key_pass: 非旋转部分保持不变。
拼接后恢复完整张量。

  • 细节

Phi 模型使用部分旋转嵌入(partial_rotary_factor),仅对 head_dim 的一部分应用 RoPE,减少计算量。
值张量(value_states)不应用 RoPE,仅用于传递设备和数据类型信息以初始化 cos 和 sin。

  • 原因

注意力分数由 QKTQK^TQKT 计算,RoPE 通过旋转 QQQKKK 影响分数,确保位置信息融入注意力机制。
值张量 VVV 仅在最后加权求和中使用,无需位置旋转。

5. 其他位置编码方法的对比

为了更全面理解为什么 RoPE 选择 QQQKKK,可以对比其他位置编码方法:

  • 绝对位置编码(如 Sinusoidal 或 Learned Positional Embeddings)

直接将位置嵌入加到输入 token 嵌入上(在嵌入层)。
不需要专门对 QQQKKK 操作,但无法有效捕捉相对位置关系。
RoPE 相比更适合长序列和相对位置建模。

  • 相对位置编码(如 T5 的 Relative Position Bias)

在注意力分数计算时添加相对位置偏置(直接修改 QKTQK^TQKT)。
RoPE 通过旋转 QQQKKK 实现类似效果,但更优雅地融入嵌入空间。

RoPE 的优势在于其数学性质(旋转矩阵保持相对位置不变性),以及通过 QQQKKK 的改造直接影响注意力分数,无需额外偏置层。

6. 总结

RoPE 应用在 Query 和 Key 上的原因可以总结为:

  1. 注意力分数的计算依赖 QKTQK^TQKT:RoPE 通过旋转 QQQKKK,使注意力分数直接编码相对位置信息。
  2. 内容与位置分离QQQKKK 负责位置建模,VVV 保留原始内容信息,避免干扰。
  3. 计算效率:仅对 QQQKKK 应用 RoPE,减少不必要的计算开销。
  4. 相对位置建模:RoPE 的设计天然适合捕捉 m−nm - nmn,通过 QKTQK^TQKT 实现。
  5. 一致性与标准:Transformer 模型普遍将位置信息融入 QQQKKK,RoPE 遵循这一设计。
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐