写点什么

ROPE 阅读苏神博客有感

作者:antonio
  • 2025-08-11
    北京
  • 本文字数:4183 字

    阅读完需:约 14 分钟

最近再次推到了 ROPE,又产生了很多疑惑,故而做如下笔记记录。苏神科学空间,原文:https://spaces.ac.cn/archives/8265

一、背景知识

1. 二维向量复数表示

二维向量的复数表示是什么意思?

二维向量的复数表示是指将二维向量 映射为复数 ,其中:


  • 是向量的实部(横坐标),对应实轴方向的分量。

  • 是向量的虚部(纵坐标),对应虚轴方向的分量。

  • 是虚数单位,满足


这种表示的本质是将二维向量与复平面中的点或向量一一对应。复数的几何意义在于:


  • (长度):复数的模 对应向量的长度。

  • 辐角(相位角):复数的辐角 对应向量与实轴正方向的夹角。

为什么要用复数表示二维向量?

复数表示二维向量的核心优势在于 简化几何变换的运算,尤其是在旋转、缩放等操作中。


复数乘法在几何上可以分解为:


  • 模的乘积:两个复数相乘,其模等于各自模的乘积。

  • 辐角的相加:两个复数相乘,其辐角等于各自辐角的和。


例如,将复数 乘以 (即单位复数表示旋转),结果为:



这相当于将向量 逆时针旋转 角度后的向量。


对比传统方法


  • 若用矩阵表示旋转,需要计算旋转矩阵:$$

  • 复数乘法直接通过代数运算完成旋转,无需显式构造矩阵。


复数表示的本质是 将代数与几何统一,通过复数的代数性质(如乘法、极坐标形式)高效地描述二维向量的几何变换。这种表示方式在数学理论和工程实践中均具有重要价值。

2. 矩阵

正交矩阵

  • 定义:一个 的实数方阵 满足 ,即其列向量(或行向量)两两正交且为单位向量。

  • 行列式

  • ,称为旋转矩阵(纯旋转)。

  • ,称为反射矩阵(包含反射操作)。

  • 逆矩阵:正交矩阵的逆矩阵为其转置,即

  • 几何意义:保持向量长度和角度不变,但可能改变方向(反射时反转方向)。

  • 封闭性:正交矩阵的乘积、逆矩阵仍是正交矩阵。

旋转矩阵

  • 定义:行列式为 1 的正交矩阵,即

  • 几何意义:仅表示纯旋转操作,不改变空间方向(如右手定则)。

  • 迹与旋转角的关系:在三维空间中,旋转矩阵的迹为 ,其中 是旋转角。

  • 封闭性:旋转矩阵的乘积仍为旋转矩阵。

  • 旋转矩阵的乘积:两个旋转矩阵相乘的结果仍为旋转矩阵,其对应的旋转角度是两者的。例如,

验证示例(二维空间)

  • 旋转矩阵公式:$$

  • 计算 :$$



二、 ROPE 解释

1. Transformer 的局限性

Transformer 架构的核心是自注意力机制,其计算方式 。这种计算方式的本质是计算 Query 和 Key 之间的点积相似度。


然而,点积操作本身不包含任何位置信息。这意味着,如果我们将输入序列的词序打乱,Transformer 在理论上会得到相同的注意力分数(因为 是对所有 Q 和 K 的点积,与它们的原始顺序无关)。这就是 Transformer 的置换不变性


为了引入位置信息,传统的做法有:


  • 绝对位置编码 (Absolute PE):将位置编码 直接加到词向量 上,即

  • 此时

  • 这种方法的问题在于,点积结果包含了词向量自身的相似度、词向量与位置编码的交互、以及位置编码自身的相似度。相对位置信息 无法被简洁地表示,并且在外推(训练时没见过的长序列)时表现不佳。

  • 相对位置编码 (Relative PE):尝试直接在 中引入相对位置信息。例如 Shaw et al. (Transformer-XL) 的方法在计算注意力分数时额外考虑相对位置。


RoPE 的目标是设计一种简洁、高效的位置编码方法,使得点积操作天然地包含相对位置信息,并且能够很好地外推

2. 核心思想:通过旋转引入相对位置

RoPE 的核心思想是:能否找到一种函数 ,它能将位置 的信息编码到向量 中,使得任意两个向量 在经过位置编码后,它们的点积只依赖于它们的相对位置


即,我们希望


考虑二维向量 ,我们可以将其看作复数


复数乘法 对应于在复平面上将 旋转 角。



那么


这在实数域中,对应于对向量 应用一个旋转矩阵:


$$R(\theta) =


\begin{bmatrix}\cos\theta & -\sin\theta \\sin\theta & \cos\theta\end{bmatrix}$$


所以, 就是将向量 旋转 角。


现在,我们将这个旋转操作应用到我们的 函数中:


,其中 是一个与位置相关的角度参数。


那么,它们的点积为:


由于 是正交矩阵,所以


由于 是旋转矩阵,有 (两次旋转等价于一次旋转角度之和),


我们得到了一个非常漂亮的结果: 只依赖于相对位置 !这正是我们想要的 形式。

3. 从二维推广到高维

要将二维旋转矩阵进行推广,最直接的思路是,把维度两两分组。假设词向量维度为 d(d 为 2 的倍数):



如此,d 个维度被分为了 d/2 组,θ 也有了分别 d/2 个取值。


在代码实现上可以用以下思路来等效计算 M⋅q,节省资源:


$$M·q= \left [ \begin{matrix} q_0\ q_1\q_2\q_3\\vdots\q_{d-2}\q_{d-1} \end{matrix} \right] \odot \left [ \begin{matrix} \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{matrix} \right] + \left [ \begin{matrix} -q_1\ q_0\-q_3\q_2\\vdots\-q_{d-1}\q_{d-2} \end{matrix} \right] \odot \left [ \begin{matrix} \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{matrix} \right]


$$


这样,RoPE 巧妙地将位置信息编码到了 Query 和 Key 向量中,使得它们在计算点积时,天然地反映了相对位置。

4. θ 函数

是 RoPE 中非常关键的参数,它决定了每个维度对的旋转频率。

(1) 的公式

RoPE 中 的计算方式与原始 Transformer 的正弦/余弦位置编码中的频率设置非常相似:


其中:


  • :维度对的索引,从

  • :向量的维度 (hidden size)。

  • :一个超参数,通常取 (与原始 Transformer PE 相同),LLaMA 1 用的是 ,LLaMA 2 则将其扩展到了 , Qwen3 更是扩展到 1,000,000

(2) 为什么选择 10000 作为基数?

  • 历史借鉴:RoPE 的θ设计借鉴了 Transformer 的 Sinusoidal 位置编码,后者同样使用 10000 作为基数。这种设计保证了不同维度的频率范围合理,且具有一定的外推性(能够处理超出训练长度的序列)。

  • 频率分布:10000 的指数衰减使得不同维度的频率覆盖从高频到低频的连续范围,从而能够捕捉不同尺度的相对位置关系。

(3) θ的作用示例

假设一个 128 维的向量,其θ的计算如下:


  • 第 0 维(i=0):

  • 第 1 维(i=2):

  • 第 64 维(i=128):


结果:低维(如 i=0)的θ较大,对应高频旋转;高维(如 i=64)的θ较小,对应低频旋转。

(4) 远程衰减

import numpy as npimport matplotlib.pyplot as plt
# 定义参数d = 128
# 定义Theta函数def theta(t): return 10000 **(-2 * t / d)
# 定义f(m)函数def f(m): total = 0.0 # 外循环,j从0到d/2 - 1 for j in range(int(d/2)): # 内循环,i从0到j inner_sum = 0.0j # 使用复数类型 for i in range(j + 1): inner_sum += np.exp(1j * m * theta(i)) # 计算复数的模并累加到总和 total += np.abs(inner_sum) # 除以d/2并返回结果 return total / (d/2)
# 生成m的取值范围m_values = np.linspace(0, 256, 1000) # 使用1000个点以获得平滑曲线
# 计算每个m对应的f(m)值f_values = [f(m) for m in m_values]
# 绘制图像plt.figure(figsize=(10, 6))plt.plot(m_values, f_values)plt.xlabel('相对距离') # 设置x轴标签plt.ylabel('相对大小') # 设置y轴标签plt.title('f(m)的图像')plt.grid(True)plt.show()
复制代码



从图中可以看到随着相对距离的变大,内积结果有衰减趋势的出现。因此,选择,确实能带来一定的远程衰减性。几乎任意的光滑单调函数都可以,带来远程衰减性。


苏神还试过以为初始化,将视为可训练参数,然后训练一段时间后发现并没有显著更新,因此干脆就直接固定了。

用户头像

antonio

关注

还未添加个人签名 2025-08-05 加入

还未添加个人简介

评论

发布
暂无评论
ROPE 阅读苏神博客有感_antonio_InfoQ写作社区