为什么Rotary Position Embedding(RoPE)是在query和Key上进行?
注意力分数的计算依赖QKTQK^TQKT:RoPE 通过旋转QQQ和KKK,使注意力分数直接编码相对位置信息。内容与位置分离QQQ和KKK负责位置建模,VVV保留原始内容信息,避免干扰。计算效率:仅对QQQ和KKK应用 RoPE,减少不必要的计算开销。相对位置建模:RoPE 的设计天然适合捕捉m−nm - nm−n,通过QKTQK^TQKT实现。一致性与标准:Transformer 模型普遍将位置
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(位置 mmm 和 nnn 的 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 - nm−n 的矩阵,从而使注意力分数反映相对位置关系。
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(dkQKT)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 通过对 QQQ 和 KKK 应用旋转矩阵,确保 QKTQK^TQKT 包含相对位置信息(m−nm - nm−n)。
- 数学依据:
假设原始查询和键为 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 - nm−n,使得注意力分数自然编码了位置关系。
- 为什么不直接应用到 V:值矩阵 VVV 仅在加权求和时使用(softmax(QKT)V\text{softmax}(QK^T)Vsoftmax(QKT)V),不直接影响注意力分数的计算。给 VVV 添加位置信息不会改变注意力分数的分布,因此对位置建模没有直接贡献。
2.2 保持内容与位置分离
- 内容信息在 V 中:值矩阵 VVV 主要携带 token 的内容信息(语义)。注意力分数(由 QKTQK^TQKT 计算)决定如何加权这些内容。
- 位置信息在 Q 和 K 中:RoPE 将位置信息嵌入到 QQQ 和 KKK,使得注意力分数根据相对位置调整权重,而不直接修改内容(VVV)。这保持了内容和位置信息的分离,便于模型学习。
- 优势:这种分离允许模型在注意力机制中独立地建模位置关系(通过 QKTQK^TQKT)和内容信息(通过 VVV),提高表达能力。
2.3 高效性和一致性
- 计算效率:RoPE 只需对 QQQ 和 KKK 应用旋转矩阵,计算成本较低(仅涉及矩阵乘法和余弦/正弦运算)。如果也对 VVV 应用 RoPE,会增加不必要的计算开销,且对注意力分数无直接影响。
- 一致性:Transformer 模型(如 GPT、LLaMA、Phi)通常将位置编码融入 QQQ 和 KKK,这是标准设计。RoPE 遵循这一惯例,确保与现有架构兼容。
2.4 支持相对位置建模
- 相对位置的重要性:在自然语言处理中,token 之间的相对位置(如“距离 3 个 token”)比绝对位置更重要。RoPE 通过 QKTQK^TQKT 的旋转矩阵直接建模相对位置 m−nm - nm−n,无需额外处理。
- 例子:
假设两个 token 在位置 mmm 和 nnn,RoPE 使 qmTknq_m^T k_nqmTkn 反映 m−nm - nm−n,而不是绝对位置 mmm 或 nnn。
这对于长序列或自回归生成特别有用,因为模型可以泛化到不同序列长度。
3. 为什么不应用 RoPE 到 Value?
- 无直接贡献:值矩阵 VVV 仅在注意力分数的加权求和中使用:
Output=softmax(QKTdk)V \text{Output} = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Output=softmax(dkQKT)V
对 VVV 应用 RoPE(即 RnvnR_n v_nRnvn)不会改变 QKTQK^TQKT 的结果,因此不影响注意力分数的分布,也不会改变位置建模的效果。
- 增加冗余计算:对 VVV 应用 RoPE 会增加矩阵旋转的计算量,但对模型性能的提升有限,因为位置信息已经通过 QQQ 和 KKK 充分编码。
- 破坏内容表示: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 通过旋转 QQQ 和 KKK 影响分数,确保位置信息融入注意力机制。
值张量 VVV 仅在最后加权求和中使用,无需位置旋转。
5. 其他位置编码方法的对比
为了更全面理解为什么 RoPE 选择 QQQ 和 KKK,可以对比其他位置编码方法:
- 绝对位置编码(如 Sinusoidal 或 Learned Positional Embeddings):
直接将位置嵌入加到输入 token 嵌入上(在嵌入层)。
不需要专门对 QQQ 或 KKK 操作,但无法有效捕捉相对位置关系。
RoPE 相比更适合长序列和相对位置建模。
- 相对位置编码(如 T5 的 Relative Position Bias):
在注意力分数计算时添加相对位置偏置(直接修改 QKTQK^TQKT)。
RoPE 通过旋转 QQQ 和 KKK 实现类似效果,但更优雅地融入嵌入空间。
RoPE 的优势在于其数学性质(旋转矩阵保持相对位置不变性),以及通过 QQQ 和 KKK 的改造直接影响注意力分数,无需额外偏置层。
6. 总结
RoPE 应用在 Query 和 Key 上的原因可以总结为:
- 注意力分数的计算依赖 QKTQK^TQKT:RoPE 通过旋转 QQQ 和 KKK,使注意力分数直接编码相对位置信息。
- 内容与位置分离:QQQ 和 KKK 负责位置建模,VVV 保留原始内容信息,避免干扰。
- 计算效率:仅对 QQQ 和 KKK 应用 RoPE,减少不必要的计算开销。
- 相对位置建模:RoPE 的设计天然适合捕捉 m−nm - nm−n,通过 QKTQK^TQKT 实现。
- 一致性与标准:Transformer 模型普遍将位置信息融入 QQQ 和 KKK,RoPE 遵循这一设计。
更多推荐
所有评论(0)