一、为什么需要位置编码
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 |