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




所有评论(0)