【ML】rope

一、为什么需要位置编码

Transformer的Attention机制本质上是在做加权平均

Attention(qm,kn)=qm⊤kn \text{Attention}(q_m, k_n) = q_m^\top k_n Attention(qm,kn)=qm⊤kn

这个点积运算只关心向量的内容,不关心向量在序列中的位置。也就是说,如果你把一句话的词语顺序打乱,只要每个词对应的向量不变,Attention算出来的分数是完全一样的------模型"感觉不到顺序"。

但语言、图像、视频里,顺序/位置至关重要("猫追狗"和"狗追猫"含义完全不同)。所以必须有一种机制,把"位置"这个信息注入到Attention的计算过程中。

早期的做法(如原始Transformer)是学一张位置向量表

复制代码
位置1 → 向量A(训练学出来的)
位置2 → 向量B
...
位置512 → 向量Z

这种方法的缺陷很明显:它是"查表",不是"计算"。如果推理时序列长度超过训练时见过的最大长度,表里没有对应的向量,模型直接失效。

RoPE(Rotary Position Embedding,旋转位置编码)用了一个完全不同的思路:不查表,而是用一个数学公式,把位置信息编码成"旋转角度",直接施加在Q和K向量上

二、旋转的数学本质:2D旋转矩阵

RoPE的操作对象是二维平面上的向量旋转。设一个二维向量 (x,y)(x, y)(x,y),把它绕原点旋转 θ\thetaθ 角度后,变成:

(x′y′)=(cos⁡θ−sin⁡θsin⁡θcos⁡θ)(xy) \begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} (x′y′)=(cosθsinθ−sinθcosθ)(xy)

即:

x′=xcos⁡θ−ysin⁡θy′=xsin⁡θ+ycos⁡θ x' = x\cos\theta - y\sin\theta \\ y' = x\sin\theta + y\cos\theta x′=xcosθ−ysinθy′=xsinθ+ycosθ

直觉理解 :把向量想象成一根箭头,这个操作就是让箭头绕圆心转了 θ\thetaθ 度,箭头的长度不变,只是指向变了

RoPE的核心规则就一句话:

给定一个token在位置 mmm,就把它的query/key向量按角度 m×ωm \times \omegam×ω 转一下 (ω\omegaω是某个固定频率,后面详细讲)。

三、RoPE的核心魔法:为什么点积只依赖"相对位置差"

这是理解RoPE最关键的一步,我们完整推导一遍。

设两个向量:

  • Query向量 q=(q1,q2)q=(q_1,q_2)q=(q1,q2),位置为 mmm,旋转角度 α=mω\alpha = m\omegaα=mω
  • Key向量 k=(k1,k2)k=(k_1,k_2)k=(k1,k2),位置为 nnn,旋转角度 β=nω\beta = n\omegaβ=nω

旋转后:

q′=(q1cos⁡α−q2sin⁡α, q1sin⁡α+q2cos⁡α)k′=(k1cos⁡β−k2sin⁡β, k1sin⁡β+k2cos⁡β) q' = (q_1\cos\alpha - q_2\sin\alpha,\ q_1\sin\alpha + q_2\cos\alpha) \\ k' = (k_1\cos\beta - k_2\sin\beta,\ k_1\sin\beta + k_2\cos\beta) q′=(q1cosα−q2sinα, q1sinα+q2cosα)k′=(k1cosβ−k2sinβ, k1sinβ+k2cosβ)

计算点积 q′⋅k′q' \cdot k'q′⋅k′,展开后合并同类项,利用三角恒等式:

cos⁡αcos⁡β+sin⁡αsin⁡β=cos⁡(α−β)sin⁡αcos⁡β−cos⁡αsin⁡β=sin⁡(α−β) \cos\alpha\cos\beta + \sin\alpha\sin\beta = \cos(\alpha-\beta) \\ \sin\alpha\cos\beta - \cos\alpha\sin\beta = \sin(\alpha-\beta) cosαcosβ+sinαsinβ=cos(α−β)sinαcosβ−cosαsinβ=sin(α−β)

最终化简得到:

q′⋅k′=(q1k1+q2k2)cos⁡(α−β)+(q1k2−q2k1)sin⁡(α−β) q' \cdot k' = (q_1k_1+q_2k_2)\cos(\alpha-\beta) + (q_1k_2-q_2k_1)\sin(\alpha-\beta) q′⋅k′=(q1k1+q2k2)cos(α−β)+(q1k2−q2k1)sin(α−β)

观察这个结果 :α\alphaα和β\betaβ单独的数值完全消失了,公式里只出现了 (α−β)(\alpha-\beta)(α−β) 这一个组合,也就是:

α−β=mω−nω=(m−n)ω \alpha - \beta = m\omega - n\omega = (m-n)\omega α−β=mω−nω=(m−n)ω

3.1 数值验证

设 ω=1\omega=1ω=1,q=k=(1,0)q=k=(1,0)q=k=(1,0):

情况 mmm nnn m−nm-nm−n 点积结果
A 5 3 2 cos⁡(2)≈−0.416\cos(2)\approx -0.416cos(2)≈−0.416
B 105 103 2 cos⁡(2)≈−0.416\cos(2)\approx -0.416cos(2)≈−0.416(完全一样!)

尽管情况B的位置数值(105,103)远大于情况A(5,3),只要位置差(m-n)相同,点积结果就完全一致

这就是RoPE被称为"相对位置编码"的原因:模型感受到的不是"你在第几位",而是"你我相差多远"。

四、多频率设计:钟表比喻与高频/低频

4.1 为什么一个频率不够

如果只用一个固定的 ω\omegaω,会遇到一个致命问题:三角函数是周期函数 ,每转 2π2\pi2π(一整圈)就会回到原点。

周期=2πω \text{周期} = \frac{2\pi}{\omega} 周期=ω2π

一旦位置差 (m−n)(m-n)(m−n) 超过这个周期,转出来的角度就会开始"重复",导致:

位置差是2 和 位置差是 2+2πω2+\frac{2\pi}{\omega}2+ω2π,模型算出来的旋转效果完全一样------模型无法分辨这两种情况

4.2 "调小ω"能不能解决问题?------分辨率与覆盖范围的矛盾

直觉上,把 ω\omegaω 调得足够小,周期就会变得很大,看起来能覆盖任意长的序列。但代价是什么?

设序列最长100,000,要求周期 >100000>100000>100000:

ω<2π100000≈0.0000628 \omega < \frac{2\pi}{100000} \approx 0.0000628 ω<1000002π≈0.0000628

再看位置差 Δ=1\Delta=1Δ=1 时转的角度:

1×0.0000628=0.0000628 弧度≈0.0036° 1 \times 0.0000628 = 0.0000628 \text{ 弧度} \approx 0.0036° 1×0.0000628=0.0000628 弧度≈0.0036°

这个角度小到 cos⁡\coscos值的变化量只有约 6×10−96\times10^{-9}6×10−9,会被浮点数精度直接淹没------模型完全分不清位置差1和位置差2

结论

复制代码
ω大(高频):分辨率高,能区分相邻位置;但周期短,大范围内会重复撞车
ω小(低频):周期长,大范围内不会重复;但相邻位置转的角度太小,分辨率不够

这是同一个ω永远无法兼顾的矛盾------好比总预算固定的一圈360°,要分给的位置范围越大,每个刻度能分到的角度就越小,这是数学上的死结,不是"选参数不够聪明"的问题。

4.3 解法:像钟表一样,叠加多根不同转速的"指针"

一块手表用时针+分针+秒针三根指针协同工作:

复制代码
秒针(转得快):走1秒动一大格 → 能分辨"这一秒"和"上一秒",但60秒转一圈,会重复
分针(转得中等):能分辨"差几分钟"
时针(转得慢):走1小时才动一点 → 分不清"1点01分"和"1点02分",但能告诉你大概是什么时段

单独看任何一根指针都存在"分辨率不足"或"会重复"的问题,但三根指针组合起来看,就能同时唯一确定任意一个时刻(比如"3点15分42秒"),不会与其他任何时刻混淆。

RoPE的做法完全一致:把一个高维向量切成很多组(比如64组),每组用不同的转速 ωi\omega_iωi,从快到慢排列,组合起来同时兼顾"局部精细区分"和"长程不重复"。

五、具体公式与代码实现

5.1 频率公式

ωi=θ−2iD,i=0,1,...,D2−1 \omega_i = \theta^{-\frac{2i}{D}}, \quad i = 0, 1, ..., \frac{D}{2}-1 ωi=θ−D2i,i=0,1,...,2D−1

其中:

  • DDD 是该轴分配到的总维度
  • θ\thetaθ 是固定超参数,几乎所有实现都取 θ=10000\theta=10000θ=10000(继承自原始Transformer的正弦编码)
  • iii 是分组序号,i=0i=0i=0对应最高频,iii越大频率越低

5.2 代码示例

python 复制代码
import torch

dim = 128       # 单个attention head的维度
theta = 10000   # 固定超参数

# 计算每一组的频率(共64组)
inv_freq = 1.0 / (theta ** (torch.arange(0, dim, 2).float() / dim))
print(inv_freq)
# 结果从 1.0000(i=0,最高频)平滑递减到 ≈0.0001155(i=63,最低频)

5.3 具体数值表(D=128, θ=10000)

计算公式

ωi=θ−2iD=10000−2i128,i=0,1,2,...,63 \omega_i = \theta^{-\frac{2i}{D}} = 10000^{-\frac{2i}{128}}, \quad i = 0, 1, 2, ..., 63 ωi=θ−D2i=10000−1282i,i=0,1,2,...,63

每一组占据向量中的第 (2i,2i+1)(2i, 2i+1)(2i,2i+1) 两个维度位置。

示例计算过程

第0组(i=0):

ω0=10000−0128=100000=1 \omega_0 = 10000^{-\frac{0}{128}} = 10000^0 = 1 ω0=10000−1280=100000=1

对应维度:(2×0,2×0+1)=(0,1)(2\times0, 2\times0+1) = (0, 1)(2×0,2×0+1)=(0,1)

Δ=1时旋转角度:

1×ω0=1×1=1 弧度=1×180°π≈57.3° 1 \times \omega_0 = 1 \times 1 = 1 \text{ 弧度} = 1 \times \frac{180°}{\pi} \approx 57.3° 1×ω0=1×1=1 弧度=1×π180°≈57.3°

第8组(i=8):

ω8=10000−16128=10000−0.125 \omega_8 = 10000^{-\frac{16}{128}} = 10000^{-0.125} ω8=10000−12816=10000−0.125

拆解计算(利用 10000=10410000=10^410000=104):

10000−0.125=(104)−0.125=104×(−0.125)=10−0.5=110≈0.3162 10000^{-0.125} = (10^4)^{-0.125} = 10^{4\times(-0.125)} = 10^{-0.5} = \frac{1}{\sqrt{10}} \approx 0.3162 10000−0.125=(104)−0.125=104×(−0.125)=10−0.5=10 1≈0.3162

对应维度:(16,17)(16, 17)(16,17)

Δ=1时旋转角度:

1×0.3162≈0.3162 弧度≈18.1° 1 \times 0.3162 \approx 0.3162 \text{ 弧度} \approx 18.1° 1×0.3162≈0.3162 弧度≈18.1°

第16组(i=16):

ω16=10000−32128=10000−0.25=(104)−0.25=10−1=0.1 \omega_{16} = 10000^{-\frac{32}{128}} = 10000^{-0.25} = (10^4)^{-0.25} = 10^{-1} = 0.1 ω16=10000−12832=10000−0.25=(104)−0.25=10−1=0.1

对应维度:(32,33)(32, 33)(32,33)

Δ=1时旋转角度:

1×0.1=0.1 弧度≈5.7° 1 \times 0.1 = 0.1 \text{ 弧度} \approx 5.7° 1×0.1=0.1 弧度≈5.7°

第32组(i=32):

ω32=10000−64128=10000−0.5=(104)−0.5=10−2=0.01 \omega_{32} = 10000^{-\frac{64}{128}} = 10000^{-0.5} = (10^4)^{-0.5} = 10^{-2} = 0.01 ω32=10000−12864=10000−0.5=(104)−0.5=10−2=0.01

对应维度:(64,65)(64, 65)(64,65)

Δ=1时旋转角度:

1×0.01=0.01 弧度≈0.57° 1 \times 0.01 = 0.01 \text{ 弧度} \approx 0.57° 1×0.01=0.01 弧度≈0.57°

第63组(i=63,最后一组):

ω63=10000−126128=10000−0.984375=(104)−0.984375=10−3.9375 \omega_{63} = 10000^{-\frac{126}{128}} = 10000^{-0.984375} = (10^4)^{-0.984375} = 10^{-3.9375} ω63=10000−128126=10000−0.984375=(104)−0.984375=10−3.9375

拆解:

10−3.9375=10−4×100.0625≈0.0001×1.1548≈0.0001155 10^{-3.9375} = 10^{-4} \times 10^{0.0625} \approx 0.0001 \times 1.1548 \approx 0.0001155 10−3.9375=10−4×100.0625≈0.0001×1.1548≈0.0001155

对应维度:(126,127)(126, 127)(126,127)(正好是128维的最后两位)

Δ=1时旋转角度:

1×0.0001155≈0.0001155 弧度≈0.0066° 1 \times 0.0001155 \approx 0.0001155 \text{ 弧度} \approx 0.0066° 1×0.0001155≈0.0001155 弧度≈0.0066°

完整数值表
组号 iii 对应维度 ωi\omega_iωi 计算式 ωi\omega_iωi 结果 Δ=1时角度(弧度) Δ=1时角度(角度制) 高低频
0 0, 1 10000−0/12810000^{-0/128}10000−0/128 1.0000 1.0000 57.3° 最高频(秒针)
8 16, 17 10000−16/12810000^{-16/128}10000−16/128 0.3162 0.3162 18.1° 高频
16 32, 33 10000−32/12810000^{-32/128}10000−32/128 0.1000 0.1000 5.7° 中频
32 64, 65 10000−64/12810000^{-64/128}10000−64/128 0.0100 0.0100 0.57° 中低频
63 126, 127 10000−126/12810000^{-126/128}10000−126/128 0.0001155 0.0001155 0.0066° 最低频(时针)
规律小结

观察可以发现,每当 iii 增加16(即跳过16组),指数部分正好增加0.25,对应 ωi\omega_iωi 缩小 10倍

1→0.3162(i=0→8,缩小约3.16倍)→0.1(i=16,累计缩小10倍)→0.01(i=32,累计缩小100倍)→0.0001155(i=63,累计缩小约8659倍) 1 \rightarrow 0.3162(i=0\to8,缩小约3.16倍) \rightarrow 0.1(i=16,累计缩小10倍) \rightarrow 0.01(i=32,累计缩小100倍) \rightarrow 0.0001155(i=63,累计缩小约8659倍) 1→0.3162(i=0→8,缩小约3.16倍)→0.1(i=16,累计缩小10倍)→0.01(i=32,累计缩小100倍)→0.0001155(i=63,累计缩小约8659倍)

这说明 ωi\omega_iωi 是指数级递减 ,不是线性递减------越靠前的组(低iii),频率下降得越快;越靠后的组(高iii),频率变化越平缓、越逼近于0。这种指数分布保证了整组频率能够同时覆盖"局部精细差异"(高频)和"全局粗粒度差异"(低频),中间也有平滑过渡的频段。

5.4 为什么θ取10000

  • θ=10000\theta=10000θ=10000使得最高频 ω0=1\omega_0=1ω0=1(位置差1时转约57°,一个"刚好能被有效感知"的角度)
  • 同时让最低频足够小,保证在合理的序列长度范围内不会转满一圈、避免撞车
  • 中间频率按指数平滑过渡

这个值继承自原始Transformer的正弦位置编码,是一个经验性常数,不需要针对每个任务精细调整,因为它定义的是"最高频与最低频的相对比例关系",只要比例足够大(覆盖几个数量级),具体取10000还是50000效果差异很小。

六、从1D扩展到多轴:文本 vs 图像 vs 视频

前面讲的都是"1D情形"------只有一种位置信息(比如文本里"第几个词")。但不同模态的数据,携带的位置信息种类不同:

复制代码
文本token:只有1种坐标 ------ "第几个词"        → 只需要1个轴
图像token:有2种坐标 ------ "第几行、第几列"     → 需要2个轴(h, w)
视频token:有3种坐标 ------ "第几帧、第几行、第几列" → 需要3个轴(t, h, w)

关键理解:这是"两层嵌套"的结构,不要把"多轴"和"多频率"混为一谈:

复制代码
第一层(人为设计决策):
  根据token有几种独立的物理属性,决定切几个轴,以及每个轴分配多少维度
  
第二层(数学公式自动生成):
  每个轴内部,把分配到的维度按公式ωi=θ^(-2i/D_axis)切成从高频到低频的多组指针

用钟表的比喻类推:不是"一块表有时分秒三根指针",而是"戴了三块完全独立的手表"

复制代码
手表A(占t轴维度):专门报告"现在是几点"(时间位置),这块表内部有自己完整的一套快慢指针
手表B(占h轴维度):专门报告"现在在多高的楼层"(高度位置),也有自己独立的一套快慢指针
手表C(占w轴维度):专门报告"现在在多宽的位置"(宽度位置),同样独立的一套快慢指针

三块表各管各的事,互不干扰。看着三块表拼在一起的"总面板"(完整向量),就能同时知道这个token的时间、高度、宽度位置。

6.1 具体数字示例(D=128的3D-RoPE)

复制代码
Dt = 32维 → 16个指针(时间轴内部从高频到低频)
Dh = 48维 → 24个指针(高度轴内部从高频到低频)
Dw = 48维 → 24个指针(宽度轴内部从高频到低频)
(32+48+48=128,正好用完总维度)

注意:各轴分配的维度不是平均分的(不是128÷3),而是设计者根据"这个轴需要多大分辨率/覆盖范围"手动决定的超参数。例如空间轴(h/w)通常比时间轴分配更多维度,因为图像空间位置的取值范围往往比帧序号更大更复杂。

6.2 3D旋转的公式(对应论文公式5-6)

对两个token位置 pm=(tm,hm,wm)p_m=(t_m,h_m,w_m)pm=(tm,hm,wm),pn=(tn,hn,wn)p_n=(t_n,h_n,w_n)pn=(tn,hn,wn):

Δm,np=(Δm,nt,Δm,nh,Δm,nw) \Delta_{m,n}^p = (\Delta_{m,n}^t, \Delta_{m,n}^h, \Delta_{m,n}^w) Δm,np=(Δm,nt,Δm,nh,Δm,nw)

旋转矩阵是三个子空间旋转的直和(block-diagonal拼接)

RΔm,np=(⨁i=1Dt/2RΔm,nt(i))⊕(⨁i=1Dh/2RΔm,nh(i))⊕(⨁i=1Dw/2RΔm,nw(i)) R_{\Delta_{m,n}^p} = \left(\bigoplus_{i=1}^{D_t/2} R^{(i)}{\Delta{m,n}^t}\right) \oplus \left(\bigoplus_{i=1}^{D_h/2} R^{(i)}{\Delta{m,n}^h}\right) \oplus \left(\bigoplus_{i=1}^{D_w/2} R^{(i)}{\Delta{m,n}^w}\right) RΔm,np= i=1⨁Dt/2RΔm,nt(i) ⊕ i=1⨁Dh/2RΔm,nh(i) ⊕ i=1⨁Dw/2RΔm,nw(i)

意思是:向量的前32维只按"帧号差"旋转,中间48维只按"行号差"旋转,后48维只按"列号差"旋转------三组旋转互不干涉,各自独立作用在各自的子空间上

七、"支持任意长度"的真相

7.1 为什么说RoPE支持任意长度

传统的可学习位置向量是"查表":

复制代码
位置513 → 表里没有 → 直接失效

RoPE是"算公式":

复制代码
位置m=513 → 直接用ωi × 513算出角度 → 永远有定义,因为cos/sin对任意实数都成立

更重要的是,因为点积只依赖相对位置差 (前面证明过),只要模型训练时见过"位置差为3"这种情况(无论是位置5和2,还是位置500和497),推理时遇到位置差同样是3的更远的token对(比如位置49998和49995),模型可以直接复用已经学会的规律,不需要重新学习。

7.2 但这不代表实际效果完美

理论上公式对任意位置都有定义,但实际泛化能力受训练时见过的"位置差范围"限制

复制代码
训练时序列长度都在0~2000之间 → 位置差(m-n)的取值范围基本在0~2000
→ 极大的位置差(比如差10000)模型压根没见过对应的"旋转效果"该怎么解读
→ 实际推理长度远超训练长度时,效果会显著下降(外推能力差)

所以工业界还有一堆"打补丁"技术,如NTK-aware scaling、位置插值(Position Interpolation),专门用来缓解RoPE在远超训练长度时效果变差的问题。"支持无限长"更多是理论上的公式优势,不是说随便多长效果都一样好。

八、实际应用扩展案例:PoCo的SideInfo-RoPE

理解了以上所有内容后,就能完全看懂PoCo这篇论文做的事情------它本质上是给"手表"加了一个新的轴。

8.1 问题背景

多镜头视频生成中,模型需要区分"这个token属于哪个参考角色"。传统3D-RoPE只有t/h/w三个轴,没有任何机制去表达"角色归属"这个信息,导致长得相似的角色容易被attention搞混。

8.2 解决方案:新增第4个轴(side info轴)

复制代码
总维度D=128不变
第1步(人为设计):
  从时间轴Dt=32里,拿走4维分给新的side info轴
  Dt_new = 28
  Ds = 4(对应K=2个角色,每个角色占2维/1个旋转平面)
  Dh = 48(不变)
  Dw = 48(不变)

为什么专挑时间轴,而不是h/w轴?

  • side info(角色归属)本质上是"这个token所在的镜头段"这种粗粒度、跨越较大范围的属性,跟时间轴(尤其是低频时间通道)原本负责的"粗粒度长程时序结构"性质接近
  • 抢h/w轴会直接破坏单帧内部的空间结构建模(比如人脸五官的相对位置),损伤更明显
  • 抢时间轴的低频部分(本身对相邻帧差异不敏感,只负责跨大范围的粗粒度时序关系)替换代价最小;实验也验证了抢高频通道会导致运动伪影

8.3 side info轴的旋转设计(与t/h/w不同)

因为side info是离散、候选值很少 的信息(K个角色,只有"匹配/不匹配"两种状态),不需要像连续空间坐标那样用"多频率兼顾远近"的机制,而是给每个角色分配一个固定的相位常数

ϕi=2πi−πK \phi_i = \frac{2\pi i - \pi}{K} ϕi=K2πi−π

定义side info距离:

Δm,ns=∣s(xm)−s(xn)∣∈{0,1}K \Delta_{m,n}^{s} = |s(x_m) - s(x_n)| \in \{0,1\}^K Δm,ns=∣s(xm)−s(xn)∣∈{0,1}K

旋转角度:

θ=ϕi⋅Δm,ns(i) \theta = \phi_i \cdot \Delta_{m,n}^{s(i)} θ=ϕi⋅Δm,ns(i)

效果

  • 两个token属于同一角色(Δs=0\Delta^s=0Δs=0)→ 旋转角度为0 → 不旋转 → attention点积完整保留(不受影响)
  • 两个token属于不同角色(Δs=1\Delta^s=1Δs=1)→ 旋转固定的ϕi\phi_iϕi角度 → attention点积被结构性压制

这就像给每个角色发一张"身份证",用固定的旋转相位差来"惩罚"跨角色的attention连接,而不需要额外的memory或计算开销------纯粹通过重新定义"位置差怎么算"来实现。

8.4 为什么改了公式还要微调模型

RoPE本身无参数,但Q/K的线性投影权重是训练出来的,它们是围绕"旧的位置定义方式"学出来的。换了SideInfo-RoPE后,同一个子空间里的旋转角度含义从"时间差多远"变成了"角色是否匹配",模型需要重新学习如何解读这个子空间里的旋转信号------这就是为什么PoCo仍需要用小学习率(1e-5)在预训练VACE-14B基础上做微调,而不能直接换公式就用。

九、全篇核心直觉总结

概念 直觉类比 数学本质
位置编码的作用 让模型"感觉到"顺序 把位置信息注入Q/K的点积运算
RoPE的操作 把箭头绕圆心转个角度 2D旋转矩阵 R(θ)R(\theta)R(θ)
相对位置性质 只关心"隔多远",不关心"在哪" 点积化简后只剩cos⁡(α−β)\cos(\alpha-\beta)cos(α−β),α−β=(m−n)ω\alpha-\beta=(m-n)\omegaα−β=(m−n)ω
单一频率的缺陷 只有秒针,转一圈后无法区分第60秒和第120秒 周期性导致大位置差撞车
调小ω的代价 只有时针,分不清1点01分和1点02分 分辨率与覆盖范围互相矛盾,无法兼顾
多频率设计 时针+分针+秒针协同工作 64组不同ωi\omega_iωi,从高频到低频叠加
高频/低频的定义 秒针转得快,时针转得慢 ωi=θ−2i/D\omega_i=\theta^{-2i/D}ωi=θ−2i/D,iii小则ωi\omega_iωi大(高频)
多轴设计 戴三块独立的手表(时间表、楼层表、位置表) 总维度D按物理属性种类切块,每块内部独立做多频率旋转
SideInfo-RoPE 给手表加一根"角色指针" 新增离散轴,用固定相位差抑制跨角色attention
相关推荐
nVisual1 小时前
nVisual:AI驱动的智能排障,平均响应时间缩短40%
android·人工智能·缓存
白日做梦Q1 小时前
PyTorch从零手写CNN实现NEU钢材表面缺陷检测(完整实战·单篇完结)
人工智能·pytorch·cnn
星马梦缘1 小时前
机器学习与模式识别 第十一章 优化于梯度下降 考点压缩
人工智能·机器学习·梯度下降·hessian·条件数
想会飞的蒲公英1 小时前
TF-IDF + 随机森林中文文本分类全链路实战:从训练脚本到 Flask API + Streamlit 前端
人工智能·pytorch·python·随机森林·分类·flask·tf-idf
AI服务老曹1 小时前
摄像机安装AI视频分析参数配置说明:POC现场交付全流程指南
人工智能·音视频
FriendshipT1 小时前
Ultralytics:解读C3模块
人工智能·pytorch·python·深度学习·目标检测
极光代码工作室1 小时前
基于深度学习的异常行为检测系统
人工智能·python·深度学习·神经网络·机器学习
阿拉斯攀登1 小时前
RAG 性能优化:缓存、批量与并发
人工智能·缓存·性能优化·embedding·agent·loop·rag
次旅行的库1 小时前
解决ValueError: too many values to unpack (expected 2)
linux·人工智能·深度学习·机器学习·推荐算法