三十二:Long Context自测题答案¶
来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484388&idx=1&sn=852c16aff4a754179989c7afb00c8f97&chksm=f01eb09dc769398b7011870b2cb57a8a6d325dc4ba45e6c5d057c8b8bac29280a0ced2678857#rd
参考资料¶
-
RoPE 原始介绍:https://spaces.ac.cn/archives/8265
-
RoFormer paper:https://arxiv.org/abs/2104.09864
-
Position Interpolation paper:https://arxiv.org/abs/2306.15595
-
YaRN paper:https://arxiv.org/abs/2309.00071
-
LongRoPE paper:https://arxiv.org/abs/2402.13753
一、位置编码基础¶
1. 为什么 Transformer self-attention 需要位置编码?¶
答案: Self-attention 本身根据 token 内容做两两匹配,不天然知道顺序。如果没有位置编码,模型很难区分“我爱你”和“你爱我”。位置编码为 Transformer 提供 token 的先后、距离和相对关系信息。评分点:顺序信息、permutation equivariant、语言顺序重要。
2. 绝对位置编码、相对位置编码、RoPE、ALiBi 的核心区别是什么?¶
答案: 绝对位置编码给每个位置一个向量,通常加到 token embedding 上。相对位置编码在 attention 中显式加入距离 i-j 的偏置或表示。RoPE 对 Q/K 做位置相关旋转,让 QK 内积依赖相对距离。ALiBi 在 attention score 上加随距离变化的线性 bias。
3. RoPE 和原始 sinusoidal position encoding 有什么联系和区别?¶
答案: 二者都使用多频率正弦余弦思想。Sinusoidal position encoding 通常生成位置向量并加到 embedding 上;RoPE 使用 cos/sin 对 Q/K 做旋转,让内积天然具有相对位置性质。
4. 为什么现代 decoder-only LLM 常用 RoPE?¶
答案: RoPE 公式简洁、无需学习固定长度位置表、能在 attention score 中体现相对位置,并具有一定长上下文外推潜力。它也容易和 KV cache、自回归 decoder 结合。
5. RoPE 的位置编码是在 embedding 层相加,还是在 attention 中作用?请说明。¶
答案: RoPE 不是在 embedding 层简单相加,而是在 attention 计算前作用到 Q 和 K 上。具体说,hidden states 先投影成 q/k/v,再对 q/k 应用位置相关旋转,然后计算 QK score。
二、RoPE 数学推导¶
6. RoPE 中每两个维度构成一个二维旋转平面,这句话是什么意思?¶
答案: Head 维度 Dh 被拆成 Dh/2 对二维子空间,例如 (0,1)、(2,3) 或前半/后半配对。每一对维度按位置 m 和频率 theta_i 旋转一个角度 m theta_i。
7. 请写出二维旋转矩阵 R(m, theta)。¶
答案: 二维旋转矩阵:
R(m, theta) =
[ cos(m theta) -sin(m theta) ]
[ sin(m theta) cos(m theta) ]
8. 对向量 [x0, x1] 应用位置 m 的 RoPE 后,两个维度如何变化?¶
答案: 对 [x0, x1]:
9. RoPE 中 theta_i = base^(-2i/d) 的含义是什么?¶
答案: theta_i = base^(-2i/d) 表示第 i 个二维子空间的角频率。base 常为 10000,i 越小频率越高,i 越大频率越低。多频率共同编码不同距离尺度。
10. 高频维度和低频维度分别负责什么位置关系?¶
答案: 高频维度对局部位置变化敏感,适合表达邻近 token 的顺序;低频维度变化慢,适合表达较长距离关系。模型通过多频率组合同时感知局部和远距离。
11. 请证明或解释为什么 RoPE 使 QK 内积依赖相对位置 n-m。¶
答案: 因为旋转矩阵满足:
所以: QK 内积显式依赖n-m。评分点:写出矩阵性质和内积转换。
12. 为什么说 RoPE 既使用绝对位置,又体现相对位置?¶
答案: 生成 q/k 时使用的是各自绝对位置 m、n 的旋转角;但当它们进入内积后,矩阵乘法把绝对位置转换成相对距离 n-m。所以 RoPE 的输入形式是绝对位置,效果上有相对位置性质。
13. RoPE 是否改变 attention 的复杂度?为什么?¶
答案: RoPE 本身不改变 attention 的渐进复杂度,仍然是 QK 的 O(S^2 * Dh)。它只是在计算 attention 前对 Q/K 做逐元素 cos/sin 变换,额外开销相对较小。
14. RoPE 是否要求 head_dim 必须为偶数?如果只做 partial rotary 呢?¶
答案: 完整 RoPE 需要旋转维度为偶数,因为两个维度成对组成二维平面。若 partial rotary,只要求 rotary_dim 为偶数,且 rotary_dim <= Dh,未旋转部分直接拼回去。
三、张量形状与实现¶
15. 给定 hidden_states [B,S,D],多头 attention 中 q/k/v 的常见形状是什么?¶
答案: 常见形状:
有些框架内部使用[B,S,H,Dh],但计算 attention 前会对齐维度。
16. RoPE 通常作用在哪些张量上?为什么不作用在 V 上?¶
答案: RoPE 通常作用在 Q 和 K 上,因为 attention score 是 QK^T。V 是被 attention 权重加权汇聚的内容向量,不参与相似度匹配。把位置旋转加到 V 上通常没有必要,还可能破坏内容表示。
17. inv_freq、position_ids、freqs、cos、sin 的常见形状分别是什么?¶
答案: 常见形状:
inv_freq: [Dh/2]
position_ids: [S] 或 [B,S]
freqs: [S,Dh/2] 或 [B,S,Dh/2]
cos/sin duplicated: [S,Dh] 或 [B,S,Dh]
broadcast to q/k: [1,1,S,Dh] 或 [B,1,S,Dh]
[B,H,S,Dh] 还是 [B,S,H,Dh]。
18. rotate_half 的作用是什么?¶
答案: rotate_half 构造二维旋转中的 90 度旋转部分,使公式:
19. 前半/后半旋转和偶/奇维旋转有什么区别?为什么实现约定必须一致?¶
答案: 前半/后半旋转把向量前一半和后一半配对;偶/奇维旋转把相邻偶数维和奇数维配对。二者都是合法参数化,但权重训练时使用哪种,推理也必须使用哪种。混用会让维度语义错位。
20. 请写出 apply_rope(x, cos, sin) 的伪代码。¶
答案: 伪代码:
def rotate_half(x):
x1 = x[..., : x.shape[-1] // 2]
x2 = x[..., x.shape[-1] // 2 :]
return torch.cat((-x2, x1), dim=-1)
def apply_rope(x, cos, sin):
return x * cos + rotate_half(x) * sin
rotate_half 要换成相邻维度配对版本。
21. cos/sin cache 为什么常用 FP32 生成,再转成模型 dtype?¶
答案: 长位置下 m * theta 可能较大,低精度生成 cos/sin 会增加相位误差。很多实现用 FP32 计算频率和三角函数,再 cast 到 FP16/BF16,以兼顾数值稳定和推理效率。
22. 在 batch 内有 padding 时,position_ids 应该如何处理?¶
答案: Padding token 不应占用真实语义位置。right padding 通常较简单,真实 token position 连续递增。left padding 时,列下标包含 padding 偏移,通常要根据 attention mask 做累加得到真实 position_ids,并确保 padding 位置不会参与 attention。
四、KV cache 与推理¶
23. 自回归生成中 KV cache 的作用是什么?¶
答案: KV cache 缓存历史 token 的 K/V,decode 时只计算新 token 的 q/k/v,然后让新 q 和所有历史 k 做 attention。它避免每步重复计算完整前缀,大幅提高自回归生成效率。
24. prefill 阶段和 decode 阶段的 position_ids 有什么区别?¶
答案: Prefill 阶段一次处理 prompt,position_ids 通常是 0..S-1。Decode 阶段每次处理新 token,position_id 必须从历史 cache 长度继续,例如 past_len, past_len+1...。
25. 如果 decode 阶段每个新 token 的 position_id 都错误地设为 0,会发生什么?¶
答案: 模型会把所有新 token 当成同一位置,导致 RoPE 相位错误。表现可能是生成重复、逻辑混乱、长生成质量迅速下降,或短 prompt 还看似正常但多步 decode 异常。
26. left padding 场景下,为什么不能简单用列下标作为 position_ids?¶
答案: Left padding 时,序列列下标包括左侧 padding,但真实 token 的位置应从 0 开始连续计数。直接用列下标会让不同长度样本的位置整体偏移,破坏训练时的位置约定。
27. RoPE 与 attention mask 的关系是什么?¶
答案: RoPE 提供位置信息,attention mask 控制哪些 token 可见。二者必须一致:如果 mask 认为某些 padding 或未来 token 不可见,position_ids 也应只对真实可见 token 合理编号。自回归 mask 仍负责禁止看未来。
28. 在多轮对话增量推理中,RoPE 位置偏移最常见的 bug 是什么?¶
答案: 最常见 bug 是增量 decode 时没有把 past_key_values_length 加到新 token 的 position_ids 上。另一个常见问题是多轮对话拼接历史时,cache 长度和实际输入位置不一致。
五、长上下文扩展¶
29. RoPE 没有固定位置表,为什么仍然不能天然无限外推?¶
答案: RoPE 可以计算任意位置的三角函数,但模型训练时只见过有限长度的位置和相位组合。超过训练长度后,attention score 分布、频率组合和长距离依赖都可能超出训练分布,因此不能保证无限外推。
30. RoPE 长上下文退化和频率、相位有什么关系?¶
答案: RoPE 的角度是 m theta_i。当 m 很大时,高频维度相位快速变化,模型遇到训练中少见的相位组合;低频维度虽然更稳定,但也可能无法覆盖新的长距离模式。最终导致 attention 对远距离 token 的排序和权重异常。
31. 什么是 Position Interpolation?它如何修改位置?¶
答案: Position Interpolation 把目标长上下文位置压缩到训练长度范围。例如目标长度是训练长度的 s 倍,就用 m' = m / s 计算 RoPE。这样模型看到的位置范围更接近训练分布。
32. Position Interpolation 的优点和缺点是什么?¶
答案: 优点是简单稳定,能避免直接外推到很大的未见位置;缺点是压缩了位置分辨率,近距离 token 的相对间隔也变小,可能损伤局部能力。通常需要少量长上下文微调。
33. NTK-aware scaling 的直觉是什么?¶
答案: NTK-aware scaling 的直觉是调整 RoPE 的频率或 base,让低频维度能覆盖更长距离,同时尽量保留短距离分辨率。它不是简单压缩所有 position,而是改变 position 到 angle 的频率映射。
34. YaRN 主要想解决什么问题?¶
答案: YaRN 想在较少训练成本下扩展 RoPE 上下文,同时兼顾短距离能力和长距离能力。它对不同频率维度采用更细的缩放策略,减少简单插值带来的局部分辨率损失。
35. LongRoPE 相比简单线性插值的直觉差异是什么?¶
答案: 简单线性插值对所有位置和频率做统一缩放。LongRoPE 更关注非均匀插值和渐进扩展,认为不同维度、不同位置区间对扩展敏感度不同,因此要更细粒度地搜索或设计缩放策略。
36. 为什么不能简单把 max_position_embeddings 改大就获得可靠长上下文?¶
答案: max_position_embeddings 只是配置上允许更长位置,不能改变模型训练时的位置分布,也不能自动修复 RoPE 相位外推、注意力稀释和长距离数据不足。可靠长上下文需要 scaling、继续训练、评估和推理优化。
37. 长上下文扩展后,为什么短上下文能力也可能变差?¶
答案: 如果 scaling 把位置整体压缩,短距离 token 的相对间隔变小,局部位置分辨率下降。模型原本在短上下文中学到的模式可能被扰动,所以长上下文扩展后必须回测短上下文任务。
38. 如何评估 RoPE scaling 是否有效?¶
答案: 评估应同时看短上下文和长上下文。指标包括 perplexity、needle-in-a-haystack、长文档问答、跨段引用、多跳检索、代码长文件理解、P95 延迟和显存。还要比较不同长度桶,不能只报最大长度上的单点结果。
六、排错与综合¶
39. 如果模型短文本正常、长文本回答混乱,你会从哪些 RoPE 相关方向排查?¶
答案: 排查方向:position_ids 是否连续;KV cache offset 是否正确;left padding 是否处理;cos/sin cache 长度是否足够;rope_theta 和 rope_scaling 是否和模型配置一致;实现是前半/后半还是偶/奇维;长上下文是否发生截断;attention mask 是否正确。
40. 如果加载模型后效果明显变差,怀疑 RoPE 实现不一致,你会检查哪些细节?¶
答案: 检查 rope_theta、rope_scaling、rotary_dim、max_position_embeddings、rotate_half 配对方式、q/k 形状转置、cos/sin broadcast 维度、dtype、position 从 0 还是 1 开始、KV cache 追加逻辑,以及是否误把 RoPE 用到了 V。
41. 请用一段面试表达完整解释 RoPE。¶
答案: 示例表达:
RoPE 是旋转位置编码,它在 attention 前对 Q 和 K 做位置相关的二维旋转。每两个维度构成一个平面,位置 m 对应角度 m theta_i。因为旋转矩阵满足 R(m)^T R(n)=R(n-m),所以旋转后的 Q 和 K 做内积时,attention score 会依赖相对距离 n-m。工程上 q/k 常是 [B,H,S,Dh],先由 position_ids 和 inv_freq 生成 cos/sin,再执行 x*cos + rotate_half(x)*sin。RoPE 不作用在 V。长上下文时虽然能计算训练长度外的位置,但相位分布可能外推失败,所以需要 position interpolation、NTK scaling、YaRN 等方法并配合验证。
42. 请画出从 hidden_states 到 RoPE attention score 的计算流程。¶
答案: 计算流程:
hidden_states: [B,S,D]
-> linear projections Wq/Wk/Wv
q,k,v: [B,H,S,Dh]
-> position_ids + inv_freq
freqs: [S,Dh/2]
-> cos/sin cache: [1,1,S,Dh]
-> apply_rope to q and k
q_rot,k_rot: [B,H,S,Dh]
-> scores = q_rot @ k_rot.transpose(-1,-2) / sqrt(Dh)
scores: [B,H,S,S]
-> add causal/padding mask
-> softmax
-> attention weights @ v
预览时标签不可点
<div class="