旋转位置编码(Rotary Positional Embedding, RoPE)

RoPE(Rotary Positional Embedding)详解:旋转位置编码在 Transformer 中的应用


一、背景:为什么需要位置编码?

Transformer 模型的自注意力机制本质上是 无序的,也就是说,它对序列中 token 的位置是没有感知能力的。因此,在训练 Transformer 时,必须显式地引入位置编码(Positional Encoding),以帮助模型区分不同 token 所在的位置。

常见的位置编码方法包括:

方法 特点
正余弦位置编码(原始 Transformer) 不可学习,固定形式
可学习位置编码 每个位置使用一个独立的可训练向量
相对位置编码(Transformer-XL、T5) 显式引入相对位置信息
RoPE(Rotary Positional Embedding) 用旋转操作将相对位置信息编码进向量结构中

二、RoPE 的核心思想

RoPE(旋转位置编码) 由清华大学在 RoFormer 论文中提出,广泛用于现代语言模型如 LLaMA、ChatGLM、Baichuan、InternLM 等。

核心理念:

将位置编码转换为一种 向量空间中的旋转变换,作用于 self-attention 的 querykey 上,使得:

  • 位置编码 不通过加法引入,而通过旋转引入
  • 注意力得分隐式体现 token 之间的 相对位置关系

RoPE 在结构上与原始 Transformer 完全兼容,无需修改注意力机制结构,仅替换 q/k 的位置编码方式即可。


三、RoPE 的数学机制

1. 二维旋转编码(Rotary Encoding)

假设一个 token 的嵌入向量 x ∈ R d x \in \mathbb{R}^d xRd,我们将其分为 d / 2 d/2 d/2 个二维向量,每一对视为复数形式。

在第 i i i 个 token 位置,将该向量做一个二维旋转:

[ x 2 k ′ x 2 k + 1 ′ ] = [ cos ⁡ ( θ i ) − sin ⁡ ( θ i ) sin ⁡ ( θ i ) cos ⁡ ( θ i ) ] [ x 2 k x 2 k + 1 ] \begin{bmatrix} x_{2k}' \\ x_{2k+1}' \end{bmatrix}= \begin{bmatrix} \cos(\theta_i) & -\sin(\theta_i) \\ \sin(\theta_i) & \cos(\theta_i) \end{bmatrix} \begin{bmatrix} x_{2k} \\ x_{2k+1} \end{bmatrix} [x2kx2k+1]=[cos(θi)sin(θi)sin(θi)cos(θi)][x2kx2k+1]

  • θ i = ω i \theta_i = \omega^i θi=ωi,其中 ω \omega ω 是频率参数
  • 相当于把每个 token 的高维表示在多个 2D 平面上进行角度旋转

2. 旋转带来相对位置信息

在注意力机制中,点积为:
⟨ RoPE ( q i ) , RoPE ( k j ) ⟩ = f ( i − j ) \langle \text{RoPE}(q_i), \text{RoPE}(k_j) \rangle = f(i - j) RoPE(qi),RoPE(kj)⟩=f(ij)
即,两个位置的 dot-product 显式保留了它们之间的相对距离,这是 RoPE 的最大优势。


四、RoPE 在 Transformer 中的使用方式

在多头注意力机制中:

Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V

RoPE 的核心就是对 QK 进行旋转处理:

Q_rope, K_rope = apply_rope(Q, K, position_ids, head_dim)
attn_weights = Q_rope @ K_rope.transpose(-2, -1) / sqrt(d_k)

这样就完成了对位置信息的融合,而不需要加位置向量。

扫描二维码关注公众号,回复: 17617814 查看本文章

五、RoPE 的 PyTorch 实现(简化)

import torch
import math

def apply_rope(q, k, position_ids, dim_head):
    """
    在多头注意力的 q, k 上应用 RoPE 编码。
    q, k: [batch, seq_len, num_heads, head_dim]
    position_ids: [batch, seq_len]
    dim_head: 单个头的维度(必须是偶数)
    """
    half_dim = dim_head // 2
    freq_seq = torch.arange(half_dim, dtype=torch.float32)
    inv_freq = 1.0 / (10000 ** (freq_seq / half_dim))

    pos_emb = torch.einsum("bi,d->bid", position_ids.float(), inv_freq)  # [batch, seq_len, half_dim]
    sin_emb = torch.sin(pos_emb)
    cos_emb = torch.cos(pos_emb)

    def rotate(x):
        x1, x2 = x[..., ::2], x[..., 1::2]  # 将向量拆成偶数/奇数对
        x_rotated = torch.cat([x1 * cos_emb - x2 * sin_emb,
                               x1 * sin_emb + x2 * cos_emb], dim=-1)
        return x_rotated

    return rotate(q), rotate(k)

六、RoPE 的直观理解(可视化思想)

  • 将嵌入向量的每一对维度视为一个平面上的向量
  • RoPE 就是对这个向量在平面上做一个角度为 θ 的旋转
  • 位置越靠后,旋转角度越大
  • 相邻 token 的旋转差值体现了它们的相对位置

这与正余弦位置编码中直接用三角函数“编码”位置信息不同,RoPE 是从 几何变换的角度注入位置信息


七、RoPE 与其他位置编码方法对比

特性 正余弦编码 可学习编码 相对位置编码(T5) RoPE
是否可学习
表达方式 位置向量相加 向量相加 矩阵偏置/结构化位置 向量旋转(复数角度)
支持相对位置 是(隐式)
可扩展性 有限 强(适用于长序列)
应用模型 BERT, GPT-2 ALBERT T5, Transformer-XL LLaMA, ChatGLM, Baichuan, InternLM

八、RoPE 的优点总结

  • 无需参数,无额外模型复杂度
  • 编码方式灵活,自然支持 相对位置信息
  • 与标准注意力完全兼容
  • 支持 大规模文本建模(长文本推理更稳健)
  • 被多个主流大模型采用,是当前主流位置编码方案之一

九、RoPE 的应用模型

RoPE 被广泛用于当前主流的大语言模型中,包括但不限于:

模型 应用说明
LLaMA 系列 使用 RoPE 替代传统位置编码
ChatGLM 系列 中英双语预训练模型的默认位置编码
Baichuan-7B/13B 多语言模型
InternLM 新一代开源基座模型
GPT-NeoX 兼容 RoPE 实现长文本建模

十、总结

项目 内容
名称 Rotary Positional Embedding(RoPE)
提出 RoFormer(2021)
本质 在嵌入向量维度空间做旋转,注入位置
特点 无参、高效、支持相对位置、适配长序列
应用 现代 LLM 的默认配置之一

RoPE 已成为大语言模型中 主流的位置编码技术,特别适合需要建模长文本、相对位置依赖强的自然语言任务。