S=dkQKT
位置信息编码在 embedding 里:X=E+P。记录了绝对信息
绝对位置编码的不足:
- 训练和推理的长度不一样,token的绝对位置也不一样,外推性差
相对位置编码RoPE不修改embedding,而是通过旋转KQ:
S=dkQ~K~T
1. 计算RoPE
假设输入(不带绝对位置信息):
X=E∈R3×4
计算kqv:
Q=XWQ,K=XWK,V=XWV
Q,K,V∈R3×2
得到:
Q=q0q1q2,K=k0k1k2
每个向量都是平面上的一个点。位置 t 对应角度 θt=t⋅ω,用旋转矩阵把它转过去:
Rt=[cosθtsinθt−sinθtcosθt]
q~t=Rtqt,k~t=Rtkt
三个位置分别转:
q~0=R0q0,q~1=R1q1,q~2=R2q2
K 同样操作。V 不旋转。
然后照常打分:
S=dkQ~K~T,A=softmax(S+M),O=AV
多头时每个头各自转自己的 Qi、Ki,再代入第 2 章的 headi。
qm 转了 mω,kn 转了 nω。两点积里两个旋转合成一次,转角只剩 (n−m)ω。
2. 头宽不是 2 的时候
实际 dk 常常是 64、128。不能整段当作一个平面,就把最后一维拆成 dk/2 对,每一对按上面的二维方式转,各用一个频率:
ωi=base−2i/dk
高频对近邻敏感,低频对更远的间隔仍有区分度。计算步骤不变:先投影,再按对旋转 Q、K,再打分。
3. Prefill 与 Decode
公式与第 1 章相同,只是 Q、K 先转再进 QKT。
Prefill 三个 token 用 R0,R1,R2,一次转完再算整张 S。
Decode 第 t 步只来一个新 token,旋转用全局下标 t。prompt 长度为 3 时,第一个生成 token 用 R3,不是 R0。写入 KV Cache 的 k 已经转过,不必重算;当前 q~t 直接和缓存里的 K~≤t 打分。
4. 小结
- 位置从「加在 X 上」改成「旋转 Q、K」。
- V 和 mask 不变。
- 点积依赖相对间隔 m−n。
- Decode 按全局位置旋转;缓存中的 K 已是旋转后的结果。
下一章把多头末尾提到的 GQA 展开:Query 头多于 KV 组时,公式与 KV Cache 形状怎么变。