Applied Scientist Intern · ML Breadth

Amazon LLM:RoPE 公式为什么让 Q·K 含相对位置?

二维旋转块、频率与坐标布局,核对KV cache位置偏移和长上下文外推边界。

题目重点:二维旋转块、频率与坐标布局,核对KV cache位置偏移和长上下文外推边界。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 单head维d为正偶数,按相邻坐标对(0,1),(2,3)…旋转;base10000为训练示例,不声称所有模型同基数。
  • 频率θ_j=base^(−2j/d),绝对position p形成角pθ_j;Q/K投影后旋转,V不旋转。半半配对是另一布局,须同训练实现一致。

解题路线

  1. 每对(a,b)旋转得(a cosφ−b sinφ,a sinφ+b cosφ)。拼接d/2个独立rotation blocks;因为各块正交,单向量范数不变。
  2. Q_m=R_m q、K_n=R_n k,则点积qᵀR_mᵀR_n k=qᵀR_(n−m)k。相对位置进入相位;q/k本身仍由内容与上下文决定,不说最终score只依赖距离。
  3. 先固定adjacent或split-half坐标约定,再核theta在对应对索引的映射。copy另一实现的rotate_half但保留不同cos/sin布局,会shape正确而语义错,必须与预训练checkpoint一致。
  4. KV cache要用真实绝对position p=prefixLength+t,不能每个decode chunk从0重置。已旋转历史K无需反复旋转,重复应用会把相位加两次。
  5. 外推长上下文不由相对位置形式自动保证,base/scaling/训练长度与任务需验证;改频率或位置缩放会改变既有cached K,跨配置不能直接共用同一缓存。
  6. 示例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按本文明确合同。
✓已复制微信号!