在 Transformer 中,位置信息的引入是模型理解序列顺序的关键。本文主要介绍两部分内容:

RoPE,即 Rotary Position Embedding(旋转位置编码);
YaRN,即一种基于 RoPE 的长上下文扩展方法。

RoPE 的核心作用是通过“旋转”的方式,把位置信息注入到 Attention 的 Query 和 Key 中;YaRN 的核心作用是对 RoPE 的频率进行平滑缩放,使模型能够更稳定地支持长上下文。

一、为什么 Transformer 需要位置编码

Transformer 的 Self-Attention 是 permutation-invariant,也就是不感知序列顺序。例如,“我 喜欢 你”和“你 喜欢 我”含义不同,但如果没有位置编码,模型无法区分。

Self-Attention 的核心计算公式是:

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

其中 Q、K、V 分别由输入 X 通过权重矩阵映射得到。Attention 权重由 QK 的点积决定,如果没有位置信息,模型只能根据 token 内容相似度做注意力分配,无法感知顺序。

二、传统位置编码的问题

传统 Transformer 常用绝对位置编码,即直接将位置向量 p_i 加到 token embedding x_i 上:

h_i = x_i + p_i

问题如下:

强调绝对位置,不易表达相对距离关系;
对训练长度外的序列外推能力弱,如果推理长度超过训练最大长度,位置编码无法有效表示。
三、RoPE 的核心思想

Rotary Position Embedding (RoPE) 通过旋转矩阵把位置信息注入 Query 和 Key。

假设第 m 个位置的 Query 为 q_m,第 n 个位置的 Key 为 k_n,则旋转后为:

q_m’ = R_m * q_m
k_n’ = R_n * k_n

最终 Attention 点积为:

(q_m’)^T * k_n’ = q_m^T * R_m^T * R_n * k_n = q_m^T * R_{n-m} * k_n

可以看到,Attention 分数天然依赖相对位置 n - m,而不是绝对位置。

四、二维旋转公式

对二维向量 [x1, x2],旋转角度 theta 的矩阵形式为:

x1’ = x1 * cos(theta) - x2 * sin(theta)
x2’ = x1 * sin(theta) + x2 * cos(theta)

RoPE 会将每个 attention head 的向量拆成多个二维子空间,分别进行旋转。

有些实现使用前半部分和后半部分配对,如 x = [x1, x2],则 rotate_half(x) = [-x2, x1],旋转公式可以写成:

x_rot = x * cos(theta) + rotate_half(x) * sin(theta)

五、RoPE 的频率公式

每个二维维度对的频率为:

omega_i = base^(-2*i/d)

其中 d 是 head dimension,i = 0,1,…,d/2 - 1,base 通常取 10000。

每个位置 m 的旋转角度为:

theta_m,i = m * omega_i

代码实现对应为:

freqs = 1 / (base ** (arange(0, dim, 2)/dim))
angles = outer(positions, freqs)

六、RoPE 的优点
天然表达相对位置;
不需要额外训练参数;
与 Attention 点积紧密结合;
支持 KV Cache 和自回归生成;
公式生成的 cos/sin 可在序列长度外推。
七、RoPE 在长上下文的问题

当位置 m 很大时,角度 theta = m * omega_i 增长很快,高频维度变化过快会导致模型在长上下文中不稳定。

八、YaRN 的核心思想

YaRN 对 RoPE 的频率进行平滑缩放,缓解长序列角度过快的问题,同时尽量保留短距离能力。

缩放公式为:

omega_i’ = omega_i * (1 - gamma_i + gamma_i / s)

其中 s 为缩放倍数,gamma_i ∈ [0,1] 是线性 ramp,决定不同维度的缩放程度。

gamma_i = 0 → 不缩放
gamma_i = 1 → 完全缩放
0 < gamma_i < 1 → 平滑过渡

九、YaRN ramp 计算

gamma_i 通过 ramp 计算:

gamma_i = clamp((i - low) / (high - low), 0, 1)

low/high 是通过 beta_fast / beta_slow 反推维度索引得到的。

最终角度为:

theta_m,i’ = m * omega_i’ = m * omega_i * (1 - gamma_i + gamma_i / s)

这样既保证了长序列旋转角度平缓,又保留了短序列的注意力模式。

十、总结
RoPE 用旋转把位置信息注入 Q/K,使 Attention 点积天然包含相对位置。
YaRN 对 RoPE 频率做平滑缩放,提高模型长上下文外推稳定性。
旋转公式:

x_rot = x * cos(theta) + rotate_half(x) * sin(theta)

频率公式:

omega_i = base^(-2*i/d)
theta_m,i = m * omega_i
omega_i’ = omega_i * (1 - gamma_i + gamma_i / s)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐