题目重点:二维旋转块、频率与坐标布局,核对KV cache位置偏移和长上下文外推边界。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 单head维d为正偶数,按相邻坐标对(0,1),(2,3)…旋转;base10000为训练示例,不声称所有模型同基数。
- 频率θ_j=base^(−2j/d),绝对position p形成角pθ_j;Q/K投影后旋转,V不旋转。半半配对是另一布局,须同训练实现一致。
解题路线
- 每对(a,b)旋转得(a cosφ−b sinφ,a sinφ+b cosφ)。拼接d/2个独立rotation blocks;因为各块正交,单向量范数不变。
- Q_m=R_m q、K_n=R_n k,则点积qᵀR_mᵀR_n k=qᵀR_(n−m)k。相对位置进入相位;q/k本身仍由内容与上下文决定,不说最终score只依赖距离。
- 先固定adjacent或split-half坐标约定,再核theta在对应对索引的映射。copy另一实现的rotate_half但保留不同cos/sin布局,会shape正确而语义错,必须与预训练checkpoint一致。
- KV cache要用真实绝对position p=prefixLength+t,不能每个decode chunk从0重置。已旋转历史K无需反复旋转,重复应用会把相位加两次。
- 外推长上下文不由相对位置形式自动保证,base/scaling/训练长度与任务需验证;改频率或位置缩放会改变既有cached K,跨配置不能直接共用同一缓存。
- 示例NumPy按[T,d]且float64核公式,不宣称处理所有batch/head/padding。用复数乘法独立参考,再测norm、共同shift和相对位移等式。
手动走一遍
一对q=k=(1,0),m0/n1、θ1,score=cos1;两位置同时+7后score不变。一般内容不同,相位关系仍成立但不能简化成纯cos距离。1,000组宽度/位置/base随机案例独立检查通过。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
import numpy as np
def rope(x, positions, base=10000.0):
"""[T,D] real rows, adjacent coordinate pairs, explicit absolute positions."""
x = np.asarray(x, dtype=np.float64)
positions = np.asarray(positions, dtype=np.float64)
if x.ndim != 2 or x.shape[1] == 0 or x.shape[1] % 2:
raise ValueError("positive even width required")
if positions.shape != (len(x),) or not np.isfinite(base) or base <= 1:
raise ValueError("one position per row and finite base > 1 required")
if not np.isfinite(x).all() or not np.isfinite(positions).all():
raise ValueError("finite rows and positions required")
frequencies = base ** (-np.arange(0, x.shape[1], 2) / x.shape[1])
angles = positions[:, None] * frequencies[None, :]
c, s = np.cos(angles), np.sin(angles)
result = np.empty_like(x)
result[:, 0::2] = x[:, 0::2] * c - x[:, 1::2] * s
result[:, 1::2] = x[:, 0::2] * s + x[:, 1::2] * c
return result
复杂度
旋转O(Td)时间,缓存cos/sin约O(Td)或按需算;不改变dense attention O(T²d)算术主项。长缓存频率表和低精度角度误差需另评。
易错点与追问
容易失分的边界
- 坐标布局和checkpoint不一致。
- 频率指数用坐标而非pair索引。
- decode位置重置0。
- cached K重复旋转。
- 相对公式就说任意长度保证泛化。
继续深挖
- 只有前部分head维旋转怎样处理?
- padding position id怎样定义?
- 改变RoPE scaling后已有KV缓存怎么办?
- 大position低精度cos/sin怎样核误差?
技术参考
- RoFormer 原论文:旋转位置编码方法参考,布局和offset按本文明确合同。
