RoPE:旋转位置编码的实现

news/2025/11/2 9:47:12/文章来源:https://www.cnblogs.com/luxiangyu623/p/19184384

位置编码基本概念

在讲旋转矩阵位置编码之前让我们先深入理解一下为什么自注意力是“顺序失明”的。

自注意力的核心是计算一个句子中每个词与其他所有词的“注意力分数”或“相关性”。这个分数是通过查询向量(Query, Q)和键向量(Key, K)的点积来计算的。

想象一下这个句子:“猫追老鼠”

  1. 模型为“猫”、“追”、“老鼠”生成了词嵌入向量。
  2. 然后通过权重矩阵变换成Q, K, V向量。
  3. 为了计算“猫”应该多关注“老鼠”,模型会计算 Q_猫 和 K_老鼠 的点积。

现在,我们把句子顺序打乱:“老鼠追猫”

  1. 模型为这三个词生成的词嵌入、Q, K, V向量是完全一样的。
  2. 为了计算“猫”应该多关注“老鼠”,模型依然是计算 Q_猫 和 K_老鼠 的点积。

你会发现,dot(Q_猫, K_老鼠) 的计算结果在两个句子中是完全相同的! 自注意力机制无法从这个计算中得知“猫”是在“老鼠”之前还是之后。它只知道这两个词存在于同一个句子中。

这种特性被称为置换不变性(Permutation Invariance)。对于自注意力来说,[A, B, C] 和 [C, B, A] 是一回事。

但这在自然语言中是致命的,因为顺序决定了意义:

  • “我打你” vs “你打我”
  • “猫追老鼠” vs “老鼠追猫”

所以说我们必须引入位置编码,位置编码的核心目的,就是将序列中词元的绝对或相对位置信息注入到模型中,让模型能够理解单词的顺序关系。

在RoPE这一方法出现之前,主流的语言模型(BERT, GPT-1, GPT-2, GPT-3)均是采用的是可学习的绝对位置编码。其核心思想是创建一个位置编码矩阵 E,尺寸为 (max_sequence_length, d_model)。对于位置 i,其位置编码就是矩阵 E 的第 i 行。这个编码向量会与词元嵌入向量相加,然后输入到模型中,本质上就是一个Embbeding层。虽然按照这种方法模型可以灵活的根据具体任务和数据自行学习最优的位置表示,但其外推性极差,如果模型训练时的最大长度是 512,那么它完全不知道位置 513 的编码是什么。这是它在现代 LLM 中被逐渐取代的核心原因。

为什么需要外推性?假设一个模型的最长序列是500token,现在你告诉这个模型生成一个1000token长度的文章,如果模型没有外推性就无法完成这个任务。

随之改进的方法是一种在T5模型中被提到的方法:T5 相对位置偏置。其核心思想是不直接修改输入端的词元嵌入,而是在自注意力计算的最后一步,给注意力分数矩阵加上一个“偏置项”。这个偏置项只取决于查询(Query)和键(Key)之间的相对距离 i-j。

\[\mathrm{AttentionScore}(i, j) = \frac{Q_i K_j^\top}{\sqrt{d_k}} + \mathrm{Bias}_{i-j} \]

模型会学习一个小的查找表,存储不同相对距离的偏置值。为了节省参数,通常会使用“分桶”(Bucketing)技术,将较远的距离(如 > 128)视为同一个距离,共享一个偏置值。由于分桶机制,其外推能力仍然有限,但比可学习的绝对位置编码要好。

再然后就是旋转位置编码 (Rotary Position Embedding, RoPE)的提出,这是目前大语言模型领域最主流、最成功的位置编码方法之一。

算法解析

论文中提出为了能利用上 token 之间的相对位置信息,假设查询向量\(q_m\)和键向量\(k_m\)之间的内积操作可以被一个函数\(g\)表示,\(g\)的输入是词嵌入向量\(x_m\)\(x_n\)以及它们的相对位置\(m-n\)

\[\langle \mathbf{f}_q(\mathbf{x}_m, m), \mathbf{f}_k(\mathbf{x}_n, n) \rangle = g(\mathbf{x}_m, \mathbf{x}_n, m-n) \]

假设现在词嵌入向量的维度是二维\(d=2\),论文中提出了一个满足上述关系的\(f\)\(g\)

\[\begin{align*} f_q(\mathbf{x}_m, m) &= (\mathbf{W}_q \mathbf{x}_m) e^{im\theta} \\ f_k(\mathbf{x}_n, n) &= (\mathbf{W}_k \mathbf{x}_n) e^{in\theta} \\ g(\mathbf{x}_m, \mathbf{x}_n, m-n) &= \mathrm{Re}\left[ (\mathbf{W}_q \mathbf{x}_m) (\mathbf{W}_k \mathbf{x}_n)^* e^{i(m-n)\theta} \right] \end{align*} \]

这其中的\(Re\)表示复数中的实部。
通过欧拉公式的变换,\(f_q\)\(f_k\)可以变成下面的式子

\[\begin{align*} f_q(\mathbf{x}_m, m) &= \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} W_q^{(1,1)} & W_q^{(1,2)} \\ W_q^{(2,1)} & W_q^{(2,2)} \end{pmatrix} \begin{pmatrix} x_m^{(1)} \\ x_m^{(2)} \end{pmatrix} \\ &= \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} q_m^{(1)} \\ q_m^{(2)} \end{pmatrix} \end{align*} \]

\[\begin{align*} f_k(\mathbf{x}_m, m) &= \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} W_k^{(1,1)} & W_k^{(1,2)} \\ W_k^{(2,1)} & W_k^{(2,2)} \end{pmatrix} \begin{pmatrix} x_m^{(1)} \\ x_m^{(2)} \end{pmatrix} \\ &= \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} k_m^{(1)} \\ k_m^{(2)} \end{pmatrix} \end{align*} \]

这相当于一个q或向量乘以一个旋转矩阵,这也就是为什么叫做旋转位置编码

最终\(g(\mathbf{x}_m, \mathbf{x}_n, m-n)\)可以表示如下

\[g(\mathbf{x}_m, \mathbf{x}_n, m-n) = \begin{pmatrix} \mathbf{q}_m^{(1)} & \mathbf{q}_m^{(2)} \end{pmatrix} \begin{pmatrix} \cos((m-n)\theta) & -\sin((m-n)\theta) \\ \sin((m-n)\theta) & \cos((m-n)\theta) \end{pmatrix} \begin{pmatrix} k_n^{(1)} \\ k_n^{(2)} \end{pmatrix} \]

从二维拓展到多维:

\[f_{\{q,k\}}(\mathbf{x}_m, m) = \mathbf{R}^d_{\Theta,m} \mathbf{W}_{\{q,k\}} \mathbf{x}_m \]

\[\mathbf{R}^d_{\Theta,m} = \begin{pmatrix} \cos m\theta_0 & -\sin m\theta_0 & 0 & 0 & \cdots & 0 & 0 \\ \sin m\theta_0 & \cos m\theta_0 & 0 & 0 & \cdots & 0 & 0 \\ 0 & 0 & \cos m\theta_1 & -\sin m\theta_1 & \cdots & 0 & 0 \\ 0 & 0 & \sin m\theta_1 & \cos m\theta_1 & \cdots & 0 & 0 \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & 0 & \cdots & \cos m\theta_{d/2-1} & -\sin m\theta_{d/2-1} \\ 0 & 0 & 0 & 0 & \cdots & \sin m\theta_{d/2-1} & \cos m\theta_{d/2-1} \end{pmatrix} \]

\[\Theta = \{ \theta_i = 10000^{-2(i-1)/d}, \; i \in [1, 2, \dots, d/2] \} \]

这里的超参数设置为10000可以带来良好的远程衰减性

![[Pasted image 20251031145438.png]]

代码实现

原文中提到由于\(\mathbf{R}^d_{\Theta,m}\)的稀疏性,直接用矩阵乘法来实现会很浪费算力,推荐通过下述方式来实现 RoPE:

\[\mathbf{R}^d_{\Theta,m} \mathbf{x} = \begin{pmatrix} x_0 \\ x_1 \\ x_2 \\ x_3 \\ \vdots \\ x_{d-2} \\ x_{d-1} \end{pmatrix} \otimes \begin{pmatrix} \cos m\theta_0 \\ \cos m\theta_0 \\ \cos m\theta_1 \\ \cos m\theta_1 \\ \vdots \\ \cos m\theta_{d/2-1} \\ \cos m\theta_{d/2-1} \end{pmatrix} + \begin{pmatrix} -x_1 \\ x_0 \\ -x_3 \\ x_2 \\ \vdots \\ -x_{d-1} \\ x_{d-2} \end{pmatrix} \otimes \begin{pmatrix} \sin m\theta_0 \\ \sin m\theta_0 \\ \sin m\theta_1 \\ \sin m\theta_1 \\ \vdots \\ \sin m\theta_{d/2-1} \\ \sin m\theta_{d/2-1} \end{pmatrix} \]

其中\(\otimes\)是逐位对应相乘,即计算框架中的\(*\)运算。
结合原文中的Figure 1可以发现,原文作者是把相邻的两个维度作为一组进行旋转变换,这样会带来一个问题:q,k矩阵都是存储在一个连续的内存上,如果照着原论文的处理方法(x[..., 0::2]),就需要产生非常多的切片,意味着计算时需要在内存中来回“跳跃”着读取数据,而不是顺序读取。这对CPU缓存和GPU内存读取来说是非常不友好的,会大大降低访存效率。
dot(RoPE(q_pair, m), RoPE(k_pair, n)) 的结果是一个只依赖于 (m-n) 和原始 q_pair, k_pair 的函数。无论取哪两个维度,最终的和都具有我们需要的那个核心性质:只依赖于相对位置 m-n。所以我们可以认为取任意两个维度的值进行旋转变换都是可行的。
所以我们决定只对q,k在中间进行一次切分,将前半部分的所有维度与后半部分的所有维度一一对应起来。\(d_0 与 d_{n/2}\) 配对,\(d_1 与 d_{n/2 + 1}\) 配对......

def apply_rope(x, cos, sin):assert x.ndim == 4n = x.shape[3] // 2x1 = x[..., n:]x2 = x[..., :n]y1 = x1 * cos + x2 * siny2 = x1 * -sin + x2 *cosout = torch.cat([y1, y2], 3)out = out.to(x.dtype)return out

apply_rope会在注意力层中被使用
接下来就是构建cos和sin矩阵

def _precompute_rope_(self, rope_len, head_dim, base=10000):channel_range = torch.arange(0, head_dim, 2, dtype=torch.float32)theta = 1 / (base ** (channel_range / head_dim))m = torch.arange(rope_len, dtype=torch.float32)freqs = torch.outer(m, theta)cos, sin = freqs.cos(), freqs.sin()cos, sin = cos.bfloat16, sin.bfloat16cos, sin = cos[None, :, None, :], sin[None, :, None, :] return cos, sin

在这里我们对每个头单独进行RoPE,因为注意力分数的计算是在每个头内部发生的。因为 RoPE 的基本操作单位是“维度对”,而不是单个维度。每一对维度共享同一个旋转频率,所以我们只需要计算 head_dim / 2 个频率就足够了。
.outer()是外积

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年靠谱的防火玻璃厂家最新推荐排行榜

2025年靠谱的防火玻璃厂家最新推荐排行榜 防火玻璃作为建筑安全的重要组成部分,广泛应用于住宅、商业综合体、交通枢纽、医院等场景。随着建筑安全标准的提高,市场对高品质防火玻璃的需求持续增长。本文根据产品性能…

2025年评价高的黑点清洗料实力厂家TOP推荐榜

2025年评价高的黑点清洗料实力厂家TOP推荐榜在当今工业生产领域,黑点清洗料作为特殊功能材料,在塑料、橡胶、电子元件等行业的品质控制中扮演着关键角色。随着制造业对产品表面质量要求的不断提高,能够有效去除材料…

2025年口碑好的工装定制厂家最新热销排行

2025年口碑好的工装定制厂家最新热销排行 在当今竞争激烈的商业环境中,工装不仅是企业形象的直观体现,更是企业文化与专业度的延伸。随着企业对品牌形象要求的提升,工装定制行业迎来了快速发展期。2025年,市场上涌…

SVM多分类准确率优化方案-斯坦福大学经典课程CS231n

svm.ipynb(作业或项目)其实是计算机视觉和机器学习的“入门桥梁”,很多同学一开始困惑的正是如何“跨过这道门槛”。 下面我会分 4 个层次帮你“读懂和吃透”这个项目,结合你已有的 Python 基础 和基础级视觉背景,…

2025年比较好的植物工厂生长灯高评价厂家推荐榜

2025年比较好的植物工厂生长灯高评价厂家推荐榜 随着现代农业技术的快速发展,植物工厂已成为高效、可持续的农业生产模式之一。而植物生长灯作为核心设备,其性能直接影响作物的生长速度、产量和品质。2025年,市场上…

2025年知名的全屋定制生态板厂家最新用户好评榜

2025年知名的全屋定制生态板厂家最新用户好评榜随着消费者对家居环保、健康与个性化需求的不断提升,全屋定制生态板市场迎来了蓬勃发展。生态板以其环保性能优越、花色丰富、耐用性强等特点,成为现代家居装修的首选材…

2025年评价高的缺口耙犁片厂家最新热销排行

2025年评价高的缺口耙犁片厂家最新热销排行 在农业机械领域,缺口耙犁片作为耕作设备的重要部件,其质量直接影响作业效率和土壤处理效果。随着农业机械化程度不断提高,市场对高性能、耐用的缺口耙犁片需求持续增长。…

2025年评价高的缓冲铰链厂家最新TOP实力排行

2025年评价高的缓冲铰链厂家最新TOP实力排行缓冲铰链作为现代家具五金的核心部件,其品质直接影响家具的使用寿命和用户体验。随着家居行业对静音、耐用和美观需求的不断提升,优质缓冲铰链的市场需求持续增长。本文基…

Golang-数组与切片

数组与切片 数组 所谓数组,即内存上一块连续的存储空间。使用方式 // 声明数组 var nums [3]int// 数组赋值 nums[0] = 1 nums[1] = 2 nums[2] = 3// 输出数组元素 for i:=0; i<3; i++ {fmt.Println(nums[i]) //1、…

2025年比较好的双功能缓冲隐藏轨厂家最新实力排行

2025年比较好的双功能缓冲隐藏轨厂家最新实力排行 随着家居与工业领域对功能性与美学要求的不断提升,双功能缓冲隐藏轨作为高端滑轨系统的代表,正成为市场的主流选择。这类产品不仅具备静音、缓冲、顺滑等基础性能,…

2025年热门的玻璃温室TOP品牌厂家排行榜

2025年热门的玻璃温室TOP品牌厂家排行榜 随着现代农业和园艺产业的快速发展,玻璃温室因其透光性好、保温性强、使用寿命长等优势,成为现代设施农业的核心组成部分。2025年,玻璃温室市场需求持续增长,众多厂家凭借…

SVM多分类准确率优化方案-

svm.ipynb(作业或项目)其实是计算机视觉和机器学习的“入门桥梁”,很多同学一开始困惑的正是如何“跨过这道门槛”。 下面我会分 4 个层次帮你“读懂和吃透”这个项目,结合你已有的 Python 基础 和小白级视觉背景,…

2025年靠谱的白刚玉磨料用户口碑最好的厂家榜

2025年靠谱的白刚玉磨料用户口碑最好的厂家榜 白刚玉磨料作为工业制造中不可或缺的高性能材料,广泛应用于磨具制造、耐火材料、精密铸造等领域。随着市场需求的不断增长,选择一家技术实力强、产品质量稳定、服务优质…

Django外键反向查询机制解析

Django中不使用 _set 语法,是因为Django在未显式定义 related_name 时,为多个指向同一模型的外键自动生成了唯一的反向名称。 🔍 原理分析:为什么你的代码可以工作 在你的 ChengWuKaoQinBiao 模型中,有两个外键指…

2025年比较好的离子风机检测用户好评厂家排行

2025年比较好的离子风机检测用户好评厂家排行 随着工业4.0的快速发展,离子风机作为静电防护领域的重要设备,在半导体、光电、PCBA制造等行业中发挥着关键作用。选择一家技术领先、品质可靠的离子风机供应商至关重要…

2025年靠谱的素色金钻绒厂家最新用户好评榜

2025年靠谱的素色金钻绒厂家最新用户好评榜 随着纺织行业对高品质面料需求的持续增长,素色金钻绒因其细腻质感、耐用性和广泛的应用场景,成为服装、家纺领域的热门选择。为帮助采购商快速锁定优质供应商,本文基于用…

2025年评价高的装箱机高评价厂家推荐榜

2025年评价高的装箱机高评价厂家推荐榜 随着工业自动化需求的持续增长,装箱机作为生产线后端包装的核心设备,其效率、稳定性和智能化水平直接影响企业产能与成本控制。2025年,市场对高性能装箱机的需求进一步聚焦于…

2025年口碑好的厚壁不锈钢焊管优质厂家推荐榜单

2025年口碑好的厚壁不锈钢焊管优质厂家推荐榜单 不锈钢焊管因其优异的耐腐蚀性、高强度及美观性,广泛应用于石化、制药、食品、供水工程等行业。随着市场需求的增长,厚壁不锈钢焊管的质量与供应商的选择变得尤为重要…

2025年质量好的旅游观光车厂家最新TOP排行榜

2025年质量好的旅游观光车厂家最新TOP排行榜随着旅游业和城市观光产业的蓬勃发展,电动观光车作为环保、便捷的交通工具,在各景区、酒店、房地产项目和大型企业园区中扮演着越来越重要的角色。2025年,市场上涌现出一…

2025年11月填料厂家最新推荐,实力品牌深度解析采购无忧之选!

近期,行业权威协会发布 2025 年第三季度环保填料厂家测评报告,本次测评从技术实力、产品质量、市场口碑、服务能力四大维度,结合 12 项核心指标(含材质耐腐性、结构稳定性、处理效率等),对 50 余家主流填料厂家进…