前言:本讲义在 LLM 知识图谱中的位置
2024 年 9 月 OpenAI o1 发布之后,整个 LLM 社区进入了"推理为王"的时代。 但"推理"这件事并不是一个孤立的算法升级,它牵动了从训练(RL)、推理(Inference)、 上下文(Context)到测试时算力(Test-time compute)的所有系统问题。 本讲义试图把 CS224N 2026 第 13 讲所覆盖的四个看似独立的主题串成一条逻辑线。
0.1 四个主题为什么放在一起?
从工程视角看,训练一个强推理模型意味着 4 件事必须同时成立:
- 能用便宜的算力生成长推理链(chain-of-thought)——这是推测解码要解决的, 即"用一个小模型猜,用大模型核"。
- 能用大规模 RL 持续提升推理能力,而不被工程优化反噬——这是 Off-Policy Drift 与 On-Policy 蒸馏要解决的, 即"为什么我把生成和训练拆到不同集群之后,PPO 就开始炸 KL"。
- 能在数万 token 的推理链里保持指针稳定——这是 长上下文外推要解决的, 即"RoPE 在 4K 训过、能不能在 128K 上跑"。
- 能在推理时把"想得更久"换成"想得更准"——这是 推理时扩展要解决的, 即"Best-of-N、Beam-Search-with-PRM 到底何时比直接扩大模型更划算"。
0.2 本教材使用建议
- 第 1 章偏算法直觉 + 拒绝采样推导,建议配合 Leviathan 2022 / Chen 2023 论文 Appendix I 一同阅读。
- 第 2 章是本讲义信息量最大的章节,因为它把"RL 训练"和"知识蒸馏"两条 2022 年以前几乎不交集的研究线统一了起来。
- 第 3 章需要先复习 Vaswani 2017 的 Sinusoidal PE 和 Su 2021 的 RoPE。我们对 RoPE 给出了 dimension-by-dimension 的细致剖析。
- 第 4 章篇幅最短但工程价值最高——它告诉你 SFT 之后下一步要不要训 reward model,以及 PRM vs ORM 怎么选。
本讲义中:$M_p$ 表示小(draft)模型,$M_q$ 表示大(target)模型; $p_i = p(\cdot \mid x, y_{<i})$、$q_i = q(\cdot \mid x, y_{<i})$ 表示对应模型预测的下一 token 分布; $\pi_\theta$ 表示带参数 $\theta$ 的策略;$(\cdot)_+ = \max(\cdot, 0)$ 表示截断到非负的截断函数; KL 散度沿用 Murphy 2022 的写法 $\mathrm{KL}(p\|q) = \mathbb{E}_{x\sim p}[\log p(x)/q(x)]$。
第一章:推测解码(Speculative Decoding)
推测解码是 2022 年 Leviathan 等(Google Research)与 2023 年 Chen 等(DeepMind)独立提出的同一思想: 用一个小模型快速猜出未来 K 个 token,再用大模型并行验证这些猜测。 它的精妙之处不是工程加速,而是数学保证:在分布上完全等价于直接从大模型采样。 这一节我们要把这个保证从直觉推到形式证明。
1.1 为什么需要推测解码:自回归的固有瓶颈
现代 Transformer 训练时一次 forward 就并行算出所有位置的 logits(教师强制), 所以训练阶段单步计算复杂度对 batch_size×sequence_length 是友好的。 但推理不一样——自回归生成 $T$ 个 token 必须串行执行 $T$ 次 forward,每一次都受 访存带宽(memory-bandwidth bound)支配,而不是 FLOPs。换句话说: GPU 实际上大部分时间在把 100B+ 的权重从 HBM 搬到 SRAM,计算单元是闲的。
Yejin Choi 老师在课上给出的核心直觉是:
1.2 算法核心:把生成问题转化成拒绝采样问题
步骤 A · Draft:小模型给出 K 步草稿
给定上下文 $x$,先用小模型 $M_p$ 自回归采样长度为 $K$ 的草稿:
步骤 B · Verify:大模型一次 forward 给出 K+1 个分布
关键的工程优化在这里:因为 Transformer 的因果 attention 是下三角的, 所以把 $[x, y_1, y_2, \dots, y_K]$ 拼成完整 prefix 喂给大模型 $M_q$ 做一次 forward, 就可以同时获得 $K+1$ 个分布:
注意这不是 $K$ 次 forward,而是1 次——这就是为什么"验证"几乎免费。 我们引入简写:
训练阶段我们用 teacher-forcing 计算所有位置的 next-token 概率; 推理阶段也可以——只要我们一次性把整段 prefix 拼好。 拒绝/接受决策是在 logits 上做的,不需要再次 forward 模型。 这就是把"串行的解码"转换成"并行的验证 + 串行的决策"。
1.3 接受 / 拒绝的三种情况
对 $i = 1, 2, \dots, K$ 逐位置决策。比较 $p_i(y_i)$ 与 $q_i(y_i)$:
Case 1 · $q_i(y_i) \geq p_i(y_i)$ ⇒ 直接接受
大模型对这个 token 比小模型还有信心,没有任何理由拒绝它。 直接 accept,前进 1 步。
Case 2 · $q_i(y_i) < p_i(y_i)$ ⇒ 概率性接受
小模型"高估"了这个 token。我们以概率 $q_i(y_i)/p_i(y_i)$ 接受:
这里 $\min$ 实际上是冗余的,因为 Case 2 已经保证 $q_i < p_i$,比值 $<1$;写出来是为了和文献统一。
Case 3 · $q_i(y_i) \ll p_i(y_i)$ ⇒ 拒绝并重采样
被拒绝后,我们不简单退回去让 target 重新自回归(那样就退化成普通解码了)。 而是在当前位置从修正分布 $\mathrm{norm}\!\left((q_i - p_i)_+\right)$ 中重新采样一个 token:
然后丢弃 $y_{i+1}, \dots, y_K$(因为它们的 condition 已经变了),回到下一轮 draft。
1.4 分布等价性的完整证明
这一节我们证明:推测解码输出的每一个 token,其边缘分布严格等于直接从 $q$ 采样。 也就是说,加速不会改变模型的 "behavioral identity"——这是它能被 vLLM、TRT-LLM 默认开启的根本原因。
引理:单步等价
固定上下文,记 draft 分布为 $p$、target 分布为 $q$(省略下标 $i$)。 推测解码在每一步实际产生的 token $Y$ 的分布为:
其中归一化常数 $Z = \sum_v (q(v) - p(v))_+$,整体拒绝概率 $P_{\text{reject}} = \sum_v p(v)\cdot\left[1 - \min(1, q(v)/p(v))\right] = \sum_v (p(v)-q(v))_+ = Z$ (最后一步利用 $\sum_v p = \sum_v q = 1$,故 $\sum_v (p-q)_+ = \sum_v (q-p)_+$)。
分情况合并
对于一个固定 $v$:
- 若 $q(v) \geq p(v)$(Case 1):第一项 = $p(v)\cdot 1 = p(v)$;第二项 = $Z\cdot (q(v)-p(v))/Z = q(v)-p(v)$。合计 = $q(v)$。
- 若 $q(v) < p(v)$(Case 2/3):第一项 = $p(v)\cdot q(v)/p(v) = q(v)$;第二项 = $Z\cdot 0/Z = 0$。合计 = $q(v)$。
也就是说,从工程视角是用小模型采样,从统计视角等价于从大模型采样。 Chen et al. 2023 的 Appendix I 给出了同样形式的证明,但本教材的展开方式更"代数直白"。
多步扩展
由于每一步等价于从 $q$ 采样,且下一步又会用最新接受的 token 作为 prefix, 所以多步组合仍是从 $q$ 的自回归分布采样。需要注意的一个细节: 若在第 $i$ 步发生拒绝,那么 $y_{i+1}, \dots, y_K$ 必须被丢弃, 因为它们是在条件被改变前的 prefix 下生成的。
1.5 实际加速效果
加速因子的理论上界
设单步接受率为 $\alpha$(即 $\Pr[\text{accept}]$),draft 长度 $K$。 每轮平均接受的 token 数为 $\mathbb{E}[\text{accepted}] = (1-\alpha^{K+1})/(1-\alpha) \approx \min(K+1, 1/(1-\alpha))$。 设 $c$ 为 draft / target 模型的耗时比(如 $c=0.05$),则加速比近似为:
这是一个关于 $K$ 凸 → 单峰的函数:太小则浪费每轮的一次 target forward,太大则草稿后段几乎必被拒。 最优 $K^*$ 一般在 4~8 之间。
1.6 现代变体:从 EAGLE 到 Suffix Decoding
1.6.1 Dynamic Speculative Decoding
原始版本将 $K$ 设为常数,但不同上下文的"可预测度"差异极大。 Mamou et al. 2024 引入了一个轻量分类器,根据 draft 模型每步的置信度动态决定继续 draft 还是切回 target 验证。 HF blog "Dynamic Speculation Lookahead" 给出了 Llama-3 上 +35% 平均接受 token 数的实测。
1.6.2 Universal Speculative Decoding
经典推测解码要求 draft / target 词表完全相同。 Universal Assisted Generation(HF blog, 2024)通过每步重 tokenize + 对齐放宽了这一限制: 可以用任何小模型(如 Gemma-2B)去 draft 任何大模型(如 Llama-3-70B)。 代价是接受率略降,但解决了"想用 70B 但找不到匹配 draft"的工程难题。
1.6.3 EAGLE 系列:让 draft 模型"读心"
1.6.4 Suffix Decoding:极致 model-free 路线
1.6.5 Suffix Decoding vs EAGLE-3 对比
| 维度 | Suffix Decoding (2025/2026) | EAGLE-3 (2025/2026) |
|---|---|---|
| 机制 | Model-Free:后缀树缓存与匹配 | Model-Based:训练一个小 Transformer head 预测 target 的隐藏特征 |
| 计算位置 | CPU-bound:草稿在 CPU 上做,GPU 只验证 | GPU-bound:draft head 与主模型共享 VRAM |
| Drafting 速度 | ~20 μs / token(极快) | 需一次 GPU forward(较慢) |
| 最佳场景 | 高重复任务:代码、Agent loop、RAG、SQL | 开放式任务:创意写作、通用对话、未见过的推理链 |
| 训练需求 | 0(即插即用数据结构) | 需要在 target 模型的特征空间上训练一个辅助 head |
这两种方法的对比折射出一个普遍规律: 当数据有强先验(重复模式)时,简单的非参数方法常胜过参数模型。 推测解码社区里 Medusa、Lookahead Decoding、Token Recycling 等"半参数"方法 也都在尝试在两端找到甜蜜点。
1.7 工业级推理引擎支持矩阵
| 算法 | vLLM | TRT-LLM | HF TGI | HF Transformers | SGLang |
|---|---|---|---|---|---|
| EAGLE-3 | ✅ Native | ✅ Opt | ❌ | ⚠ 手动 head | ✅ |
| SuffixDecoding | ✅ Arctic | ❌ | ❌ | ❌ | ✅ Beta |
| Medusa | ✅ | ✅ | ✅ SOTA | ✅ Pipeline | ✅ |
| Draft-Target | ✅ | ✅ | ✅ | ✅ Universal | ✅ |
| DFlash (2026) | ⚠ Fork | ✅ Custom | ❌ | ❌ | ⚠ Fork |
- 追求最简易部署:vLLM + EAGLE-3(一行启动参数即可开启)
- 纯重复型 workload(Agent、SQL):vLLM + SuffixDecoding(无需训练任何 head)
- 异构 draft(不同词表):HF Transformers Universal Assisted Generation
- 追求极致性能且团队有定制能力:TRT-LLM + DFlash(FlashAttention + Draft 融合 kernel)
本章小结
推测解码的本质是一种计算(target)与 IO(draft)的解耦。 我们已经从拒绝采样推导了它的分布等价性,并梳理了从经典 draft-target → EAGLE 系列 → Suffix Decoding 的演化。 下一章我们将看到,当 RL 训练规模扩到大型集群后,"policy 漂移"会成为一个比推理加速更隐蔽却更危险的问题。
第二章:Off-Policy Drift 与 On-Policy 蒸馏
本章是整个讲义中"系统 ↔ 算法" 耦合最强的一章。 我们要回答两个表面无关、底层共通的问题: (1)为什么把 RLHF 拆成异步两个集群之后,PPO 的 clipping 突然变得至关重要? (2)为什么"on-policy 知识蒸馏"在 2023 年才真正起作用,又如何能成为 RL 的替代品? 答案都在谁生成了用于训练的 rollouts。
2.1 RL 四象限:Online/Offline × On-policy/Off-policy
这是 LLM 工程师最常混淆的两组概念。它们其实正交。
| 维度 | 定义 | 反映的问题 | 典型算法 |
|---|---|---|---|
| Online RL | 训练时 agent 可以与环境实时交互产生新数据 | 能否"主动探索" | PPO, GRPO(标准设定) |
| Offline RL(Batch RL) | 只能从预录数据集(人类日志、旧 agent)学习,不能再试新动作 | 能否补全分布 | CQL, IQL, BCQ |
| On-policy RL | 用于训练的 rollout 必须来自当前策略 $\pi_\theta$;策略更新后旧数据作废 | 梯度是否无偏 | REINFORCE, PPO 原始版, GRPO |
| Off-policy RL | 可以从任意策略(旧版本、不同 agent、人类)产生的数据学习,常配 replay buffer | 能否复用经验 | DQN, SAC, IMPALA |
Offline On-Policy 存在吗?
严格意义上几乎不存在——如果你不能交互,又要求数据来自当前策略,就出现"鸡生蛋"悖论。 Behavior Cloning 偶尔被宽泛地归在此处。
Online Off-Policy 反而最常见
DQN 是经典案例:agent 在线交互,但训练时从 replay buffer 抽样旧经验。 LLM 时代则有:Asynchronous RLHF、PipelineRL、以及看似"on-policy" 但因 RL infra 引入off-policy drift 的 PPO 训练。
2.2 LLM RL 的双引擎架构
为什么经典 LLM RL 文献会区分"on-policy / off-policy"?因为 LLM 的 RL 训练比传统强化学习多了一个工程难题: 生成 (rollout) 和反向传播 (learning) 对硬件的需求完全不同。
off-policy drift 的 5 个真实成因
- 刻意异步 RL(async RLHF):为节省 GPU,把生成和训练完全解耦
- 每批 rollout 多次梯度更新(如 PPO num_epochs > 1):第 2、3 次更新时数据已经不再是 on-policy
- 大 replay buffer:经验存留时间越长越偏离
- 独立生成/训练集群:权重传输需要走 NCCL/NIC,分钟级延迟
- 大 batch + 长生成:生成一个 2k token 的 CoT 可能需要 30 秒,期间 learner 已更新数次
2.3 Asynchronous RLHF(Noukhovitch et al., 2024)
形式上,普通 PPO 的策略梯度为:
异步版本把它变成了:
2.4 PipelineRL:In-Flight 权重更新(Piché et al., 2025)
PipelineRL 让 inference batch size 始终保持饱和(右图蓝色色阶代表"权重新鲜度"), 消除了传统方案中因优化器步骤导致的 GPU 闲置。 然而这种"序列级 off-policy"对算法提出了新挑战: sequence 前后 token 的 log-prob 实际上来自不同 policy, 计算重要性比 $\pi_\theta / \pi_{\theta_{\text{old}}}$ 时必须逐 token 用对应版本的 old log-prob。
2.5 Off-Policy 真正的危害
- 梯度有偏:理论上 $\nabla J$ 的期望已不再是真实策略梯度
- 重要性权重爆炸:当 $\pi_\theta$ 与 $\pi_{\theta_{\text{old}}}$ 差异变大时,比值 $r_t(\theta)$ 可以非常大或非常小,导致梯度方差爆炸
- Reward Hacking 放大:模型有更多机会沿"奖励作弊路径"漂移,因为旧策略给了一个相对宽松的搜索范围
PPO 的核心保护机制——clipped surrogate——正是针对第 2 点设计的:
其中 $r_t(\theta) = \dfrac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}$, $\epsilon$ 一般取 0.1~0.2。
因为 PPO 既要防止 $r_t$ 过大(避免"赌一把就 jump 走"), 也要保留负优势下的"无界惩罚"(即如果一个动作很差,即便 $r_t$ 已 clip 到 1-ε, 我们仍然鼓励梯度去远离它,所以取 min 让 worst case dominate)。
2.6 Off-Policy 缓解策略全景
| 策略 | 原理 | 典型实现 |
|---|---|---|
| PPO Clipping | 截断重要性比,抑制大梯度 | 所有 PPO 实现 |
| KL Penalty (参考策略) | 对 $\mathrm{KL}(\pi_\theta\|\pi_{\text{ref}})$ 加 $\beta$ 惩罚 | 原始 InstructGPT / DPO |
| GRPO / 无 critic 算法 | 用 group advantage 代替 critic,减少 drift 窗口 | DeepSeek-R1, Qwen3 |
| 更少 epoch | 每批 rollout 只走 1~2 次梯度,缩短偏离 | 所有现代实现 |
| vLLM/SGLang 连续 batching + weight streaming | 降低权重同步延迟 | OpenRLHF, verl |
| PipelineRL in-flight update | 把 sync 拆成 micro-update | Piché 2025 |
2.7 On-Policy Distillation:教师-学生范式的反转
On-policy 蒸馏由 Gu et al. 2023(MiniLLM)和 Agarwal et al. 2023(GKD)几乎同时提出, 2024 年被 Qwen3 技术报告大规模实证,2025 年被 ThinkingMachines 博客推上潮流。
三种蒸馏的统一表达
| 方法 | 损失 | Context 来源 | Hard vs Soft | 学习风格 |
|---|---|---|---|---|
| SFT | NLL on gold | Ground-truth | Hard label | — |
| KD (Hinton 2015) | Forward KL | Ground-truth | Soft dist | Mass-covering |
| SeqKD (Kim & Rush 2016) | NLL on teacher output | Teacher-generated | Hard | Mass-covering |
| GKD (Agarwal 2023) | Reverse KL | Student-generated | Soft | Mode-seeking |
2.8 Forward vs Reverse KL:mass-covering vs mode-seeking
理解 on-policy 蒸馏的关键是理解 KL 散度的不对称性。
Forward KL(mean-seeking / mass-covering)
- 权重由 P(x) 决定:惩罚那些 P 有质量但 Q 没有的位置
- 结果:Q 覆盖所有 P 的 mode,倾向"宁滥勿缺"
- 用于:变分推断 (ELBO),标准 KD
Reverse KL(mode-seeking)
- 权重由 Q(x) 决定:惩罚 Q 有质量但 P 没有的位置
- 结果:Q 聚焦到 P 的某个高密度 mode,倾向"精而少"
- 用于:RLHF 的 KL 惩罚,on-policy 蒸馏
2.8.1 为什么 reverse KL 隐含 "on-policy"?
从定义上看,reverse KL $\mathrm{KL}(q\|p) = \mathbb{E}_{x\sim q}[\log q/p]$ 的期望是在学生分布 $q$ 下取的。 要计算这个期望,自然需要从 $q$ 采样——也就是让学生自己生成 context。 形式上:
注意 context $\tilde{y}_{<t}$ 来自学生自己。这同时解决了两个问题: (1)exposure bias——训练时见到的 prefix 与测试时一致; (2)mode 偏好——学生只学习自己擅长的 mode。
2.9 On-Policy 蒸馏作为 RL 的替代
| Sampling | Reward Signal | GPU 需求 | |
|---|---|---|---|
| Supervised Fine-Tuning | Off-policy | Dense(每 token 都有 label) | 轻 |
| Reinforcement Learning | On-policy | Sparse(只在序列末尾给奖励) | 重(reward model + critic + rollout) |
| On-Policy Distillation | On-policy | Dense(教师每 token 给分布) | 轻(教师只需 forward) |
Qwen3-8B 实证(Lecture 13 第 33 页)
| 方法 | AIME'24 | AIME'25 | MATH500 | LiveCodeBench v5 | MMLU-Redux | GPQA-Diamond | GPU 小时 |
|---|---|---|---|---|---|---|---|
| Off-policy Distillation | 55.0 (90.0) | 42.8 (83.3) | 92.4 | 42.0 | 86.4 | 55.6 | — |
| + Reinforcement Learning | 67.6 (90.0) | 55.5 (83.3) | 94.8 | 52.9 | 86.9 | 61.3 | 17,920 |
| + On-policy Distillation | 74.4 (93.3) | 65.5 (86.7) | 97.0 | 60.3 | 88.3 | 63.3 | 1,800 |
注意右下角的对比:on-policy 蒸馏只用了 RL 1/10 的 GPU 小时, 却在每一项指标上都超过了 RL。这是 2025 年下半年最受关注的一组结果。
2.10 应用:领域特定中训(mid-training)的灾难性遗忘修复
一个最实用的工程场景:你拿到开源 post-trained 模型(如 Qwen3-8B)后, 想在公司内部文档上继续中训以获得领域知识。 但直接中训会毁掉原来的指令跟随能力。 On-policy 蒸馏给出了一个优雅的解决方案:
| 方案 | Internal QA (Knowledge) | IF-eval (Chat) |
|---|---|---|
| 原始 Qwen3-8B | 18% | 85% |
| + Midtrain (100% 领域语料) | 43% | 45% ⬇⬇ |
| + Midtrain (70%) + 指令数据 (30%) | 36% | 79% |
| + Midtrain (70%) + On-Policy Distill | 41% | 83% |
本章小结
RL 基础设施带来的 off-policy drift 已经成为大规模 RLHF 的核心难题; PPO clipping、KL penalty、GRPO 等手段从算法侧缓解,PipelineRL 等从系统侧重构同步语义。 而 on-policy 蒸馏给出了一种跳出 RL 框架的方案:用教师的密集 logits 替代稀疏 reward, 同时保留 on-policy 性质,从而以 1/10 算力达到甚至超越 RL 的效果。 这是 2026 年 LLM post-training 范式的真正转向。
第三章:长上下文外推
"模型能处理 128K token"和"模型在 128K 上确实有效"是两件完全不同的事。 当 reasoning 模型在 AIME 题目上展开万 token 思维链、当 Cursor 把整个 monorepo 灌给 Claude, 我们对位置外推(length extrapolation)的需求第一次超过了对 token 表达力本身的需求。 本章从 Sinusoidal PE 出发,重点解剖 RoPE 的频谱结构, 然后系统化地呈现 PI / NTK / YaRN 三大缩放方案。
3.1 长上下文的真实需求
课程讲义列举了四类必须 100K~2M token 的应用:
- 软件工程:理解整个 repo 才能合理 refactor
- 法律分析:跨数百页合同找冲突条款
- 个性化对话:在数月对话历史上继续聊天
- 挑战级数学:需要长链 trial-and-error
所有这些都隐含一个事实:scaling reasoning ⇔ scaling long context。 推理模型的"思考"本身就是把上下文窗口耗光的过程。
3.2 三大挑战
| 挑战 | 本质 | 对策 |
|---|---|---|
| 数据限制 | 互联网上的文档大多很短,缺乏天然的长依赖训练样本 | Books、ArXiv 等长尾上采样;合成 long-context 任务 |
| 算力/内存限制 | 标准 attention 是 $O(n^2)$ 时间和内存 | FlashAttention、Sliding Window、GQA/MQA、稀疏注意力 |
| 位置编码泛化 | 训练时见到的位置编码模式,远处推断时不再有意义 | RoPE 频率重缩放(PI/NTK/YaRN) |
互联网文档长度分布(讲义第 38 页)
| 来源 | 典型 token 数 | 备注 |
|---|---|---|
| Common Crawl (Web) | 600 – 1,200 | 博客、新闻、落地页,碎片化严重 |
| Wikipedia | 500 – 1,500 | 中位条目较短 |
| arXiv 论文 | 5,000 – 10,000+ | "自然"长文档 |
| Books (Project Gutenberg) | 50,000 – 100,000+ | 长依赖学习的关键长尾 |
| GitHub 代码 | 100 – 5,000 | 差异巨大 |
3.3 Sinusoidal Positional Embedding(Vaswani et al., 2017)
为什么是这个具体形式?
- 对任何位置都唯一:即使没在训练中出现,也可以确定地计算出来;
- 线性可表达相对距离:对任何 offset $k$,存在线性变换 $T_k$ 使得 $\text{PE}_{\text{pos}+k} = T_k\, \text{PE}_{\text{pos}}$(由三角恒等式推得);
- 加性集成:直接加在 token embedding 上送入第一层。
3.4 Learned Positional Embedding
BERT、GPT-2/3、RoBERTa、ALBERT、ELECTRA、BART 都用这种"随机初始化 + backprop 学习"的位置编码。 它在训练长度内表现稍好,但:
- 无法为未见位置定义嵌入(连数学上都无法),所以不能外推;
- 对 long-context 扩展几乎不可行——这是它在现代 LLM(2023 年后)被完全淘汰的根本原因。
3.5 RoPE:旋转位置编码(Su et al., 2021)
RoPE 抛弃"在 embedding 上加 PE"的传统做法,转而在每一层 attention 的 Q/K 向量上施加旋转。 这一改动让位置信息: (a)在所有层都重新出现; (b)以乘法而非加法的方式与内容耦合; (c)恰好把 attention score 中的位置依赖化为相对距离 $n - m$。
3.5.1 旋转的几何直觉
3.5.2 形式定义
对 query 向量 $q$ 中第 $i$ 对维度 $(q_{2i}, q_{2i+1})$,在位置 $m$ 上的旋转为:
其中 $\theta_i = b^{-2i/d}$,$b$ 称为base frequency(默认 10000)。 对所有 $d/2$ 对维度组合起来,可以写成块对角矩阵:
3.5.3 RoPE 在 attention 中的作用
3.5.4 神奇之处:dot product 只依赖相对距离
由旋转矩阵的性质 $R^\top(\alpha)R(\beta) = R(\beta - \alpha)$,我们有:
3.5.5 RoPE vs Sinusoidal 对照
| 特性 | Sinusoidal (2017) | RoPE (2021) |
|---|---|---|
| 集成方式 | 加性,加在第一层之前 | 乘性,作用于每层 attention 的 Q/K |
| 对 token 向量范数 | 显著改变(加了一个向量) | 保持(旋转不改变范数) |
| 相对距离 | 数学上可表达,但与内容混在一起后被冲淡 | 明确出现在 attention score 中 |
| 外推能力 | 较弱 | 可结合 PI / NTK / YaRN 大幅延长 |
3.6 RoPE 的频谱结构
理解 PI / NTK / YaRN,必须先理解 RoPE 的多频率本质。 每对维度 $i$ 对应一个角速度 $\theta_i = b^{-2i/d}$。当 $b=10000$、$d=128$ 时:
- 维度对 0:$\theta_0 = 10000^0 = 1.0$。每步旋转 1 弧度 ⇒ 完成一周需 $2\pi\approx 6.28$ 个 token。最高频率,捕捉局部细节。
- 维度对 31:$\theta_{31} = 10000^{-31/64} \approx 0.01$。每步 0.01 弧度 ⇒ 一周 ~628 个 token。中频,对应句段尺度。
- 维度对 63:$\theta_{63} = 10000^{-63/64} \approx 0.0001$。最低频率,一周 ~62832 个 token。模型在 4K 训练长度内,这一维度都没完成一个完整旋转。
3.7 长上下文外推方案:PI / NTK / YaRN
3.7.1 Position Interpolation (PI, Meta, 2023)
核心思想:训练长度 $L_{\text{train}}$、目标长度 $L_{\text{target}}$,将位置索引线性缩小:
这样模型看到的最大旋转角度仍然落在训练分布内。代价是所有频段都被同比例缩慢, 高频细节(局部信息)会被"模糊化"。需要一轮轻量 fine-tune 来重新校准。
3.7.2 NTK-aware Interpolation
NTK 的洞察:与其压缩位置索引(影响所有频段),不如改变 base frequency $b$。 具体地:
这样可以近似保留高频(局部信息),同时让低频维度有足够的旋转空间覆盖新的位置范围。 "Dynamic NTK"变体可以在推理时根据当前序列长度自适应调整 $b'$,无需任何训练。
3.7.3 YaRN (Yet another RoPE extensioN)
YaRN 是目前 LLaMA-3、Qwen2/3 等主流模型最常用的方案。它结合了:
- NTK scaling:保留高频
- Attention temperature 校正:对 softmax 加一个温度因子 $1/t$,补偿因维度缩放导致的 attention 分布扁平化
- Ramp function:把维度按"完整旋转周数"分成三段—— 高频段(已多次旋转,泛化好)直接外推, 低频段(远未完成一周)用插值, 中间段平滑过渡。
3.8 渐进式长上下文训练
实践中 LongLLaMA、LongAlign、LLaMA-3.1 通用 recipe 为:
- 从短上下文基础模型出发(如 4K-8K);
- 应用位置编码修改(PI / NTK / YaRN);
- 渐进延长继续预训练:8K → 32K → 64K → 128K,每个阶段只用相对小量数据(几十亿 token);
- 在长上下文指令数据上做最后 fine-tune。
3.9 数据工程
| 技术 | 说明 | 典型来源 |
|---|---|---|
| 长文档上采样 | 训练混合里把书、代码 repo、长 arXiv 论文等长尾上采样 | Books, ArXiv, GitHub repos |
| 合成 long-context 任务 | Needle-in-a-Haystack(在长文档中插入关键事实并提问)、multi-document QA、长文档摘要 | RULER, ∞Bench |
| LongAlign 风格指令 | 需要 spread across full context 才能完成的任务 | LongAlign (Bai 2024) |
| Self-instruct 长上下文 | 用能力强的模型自己产生长上下文 instruction/response 对 | LongCite, LongAlpaca |
因为自然长文档通常不需要跨整篇调用信息——人类很少写一本书但只在最后一页用到第一页的细节。 若不强行注入这种"跨距依赖",模型会学会捷径:只看最近几 K token, 评估 NIAH 时立刻失败。
3.10 注意力架构改造
| 技术 | 解决的问题 | 典型实现 |
|---|---|---|
| 稀疏 / 滑动窗口注意力 | 用局部窗口 + 少量全局 token 把 $O(n^2)$ 降到 $O(nw)$ | Longformer, Mistral SWA, GPT-4o-style |
| FlashAttention 1/2/3 | 在不改变 attention 数学的前提下把 HBM 访问从 $O(n^2)$ 降到 $O(n)$ | Tri Dao, 2022/2023/2024 |
| GQA / MQA | 减少 KV cache 大小,使 long context 推理可负担 | LLaMA-2/3, Mistral, Gemma |
| Linear / State-Space Attention | 把 attention 替换为线性 RNN 或 SSM,原生 $O(n)$ | Mamba, RWKV, Hyena |
GQA vs MHA vs MQA 直观对比
本章小结
长上下文不是简单"训练更长",而是位置编码 × 数据 × 注意力 × 训练阶段四者的联合优化。 RoPE 的频谱视角揭示了为什么 PI/NTK/YaRN 在数学上能工作; 渐进训练让 0.1% 增量算力解锁 32× 上下文; GQA 让 KV cache 不再爆炸。下一章我们把这些"读取长文本"的能力变现为"写出长推理"。
第四章:推理时扩展(Inference-Time Scaling)
2024 年 9 月 OpenAI o1 发布的同时给社区上了一课: 不是只有训练阶段可以 scale 算力,让模型在测试时"想得更久"也是一个 scaling 维度。 这一概念由 Google DeepMind 的 Snell et al. 2024 论文给出了系统化的实证基础, 更早的隐式版本则可以追溯到 OpenAI Lightman 等 2023 年的《Let's Verify Step by Step》。 本章讨论我们能怎样在固定模型权重下, 通过搜索 + 验证把性能再往上推一截。
4.1 一个新的 scaling 维度
4.2 计算最优分配(Snell et al., 2024)
DeepMind 这篇论文最有冲击力的论断: 对于固定的总推理算力预算,小模型 + 高 test-time compute 常常优于大模型 + 标准 decoding。
- 在 MATH-500 上,一个 14B 模型用智能 test-time 搜索可以匹配甚至超过 56B 模型(4× 大小)。
- compute-optimal 分配把预训练算力和推理算力大致平分——这与"训练为王"的传统直觉相反。
- 对于需要 refinement 与 error correction 的任务,sequential revision 策略呈现尤其强的 scaling。
- 使用 PRM 的搜索比 ORM 高效 4-8×。
4.3 五类采样与搜索策略
| 策略 | 核心思想 | 适合什么任务 |
|---|---|---|
| Best-of-N sampling | 独立采样 N 条解,verifier 选最佳 | 有可验证答案的任务(代码、数学) |
| Weighted Best-of-N | 采样温度根据预算分布优化 | 同上,更经济 |
| Sequential Revisions | 单条解上反复 self-critique / refine | 需要修正与擦除错误的任务 |
| Beam Search with PRM | 维护多个候选,按步级 reward 剪枝 | 中等难度,结构化推理 |
| Diverse Beam Search | 显式鼓励解之间的多样性 | 开放式生成、探索性问题 |
4.4 验证器:ORM、PRM 与领域验证器
| 类型 | 训练信号 | 粒度 | 典型用法 |
|---|---|---|---|
| Outcome Reward Model (ORM) | 仅最终答案对/错 | 整条解 | Best-of-N 选最高得分 |
| Process Reward Model (PRM) | 每一步对/错 | step-level | Beam search 时步级剪枝 |
| Domain-specific verifier | 无需训练,直接用执行器 | 取决任务 | 代码:sandbox 跑 unit test;数学:可计算项检查 |
4.5 不同难度下的策略权衡
- 简单:少量 Best-of-N 即可,加 PRM 反而 over-fit;
- 中等:用 PRM-guided beam search + 中等预算;
- 困难:先 sequential revision 让模型 self-critique,再合并 N 条独立解(多样性 + 修正);
- 超难:换更大模型或不同 base 模型 - 测试时算力遇到天花板。
4.6 实践要点
- 不要默认选最大模型——小模型 + 智能搜索可能更省。
- 投资 verification——高质量 reward model(特别是 PRM)极大改善 test-time scaling。
- 采用 compute-optimal 分配——按问题难度调度搜索算法与预算。
常见误区
- "Best-of-N 越大越好":错误。N 大到一定程度,verifier 自身错误率会主导,性能会反向下降(reward over-optimization)。
- "PRM 一定比 ORM 好":错误。PRM 训练数据贵,且对 out-of-distribution 推理链鲁棒性差;ORM 在没有可靠中间标注的领域仍是首选。
- "Sequential revision 一定比并行采样好":错误。前者对模型的 self-evaluation 能力有强假设;如果模型不会自我批评,会陷入相同错误。
- "在 RL 之外加 test-time scaling 等同于 free lunch":错误。RL 与 test-time compute 的收益不是完全可叠加的—— 强 RL 模型本身已经具备类 PRM 的内部 reasoning,外接 PRM 收益边际递减。
本章小结
推理时扩展把"更多模型参数"这一单一变量解耦成 "更多模型 × 更聪明的搜索 × 更好的验证"。在 reasoning 与 agentic workload 主导的 2026 年, 这种解耦才是 LLM 落地最重要的工程范式转变。
参考文献
推测解码
- Leviathan, Y., Kalman, M., & Matias, Y. (2022). Fast Inference from Transformers via Speculative Decoding. arXiv:2211.17192 (later ICML 2023).
- Chen, C., Borgeaud, S., Irving, G., Lespiau, J., Sifre, L., & Jumper, J. (2023). Accelerating Large Language Model Decoding with Speculative Sampling. arXiv:2302.01318 (DeepMind).
- Li, Y., Wei, F., Zhang, C., & Zhang, H. (2024). EAGLE / EAGLE-2 / EAGLE-3. ICML 2024 / NeurIPS 2024 / 2025.
- Cai, T., Li, Y., Geng, Z., Peng, H., Lee, J.D., Chen, D., & Dao, T. (2024). Medusa: Simple LLM Inference Acceleration with Multiple Decoding Heads.
- Oliaro, G., et al. (2025). SuffixDecoding: Extreme Speculative Decoding via Suffix Trees.
- Mamou, J., et al. (2024). Dynamic Speculation Lookahead. HuggingFace Blog.
Off-Policy / On-Policy 蒸馏
- Schulman, J., Wolski, F., Dhariwal, P., Radford, A., & Klimov, O. (2017). Proximal Policy Optimization Algorithms. arXiv:1707.06347.
- Noukhovitch, M., et al. (2024). Asynchronous RLHF: Faster and More Efficient Off-Policy RL for Language Models.
- Piché, A., et al. (2025). PipelineRL: In-Flight Weight Updates for Scalable RL.
- Hinton, G., Vinyals, O., & Dean, J. (2015). Distilling the Knowledge in a Neural Network. NIPS Deep Learning Workshop.
- Kim, Y., & Rush, A.M. (2016). Sequence-Level Knowledge Distillation. EMNLP 2016.
- Gu, Y., Dong, L., Wei, F., & Huang, M. (2023). MiniLLM: Knowledge Distillation of Large Language Models.
- Agarwal, R., et al. (2023). Generalized Knowledge Distillation (GKD) on On-Policy Data.
- Qwen Team. (2024). Qwen3 Technical Report.
- Thinking Machines. (2025). On-Policy Distillation Blog. thinkingmachines.ai/blog/on-policy-distillation/
长上下文
- Vaswani, A., et al. (2017). Attention Is All You Need. NeurIPS 2017.
- Su, J., Lu, Y., Pan, S., Wen, B., & Liu, Y. (2021). RoFormer: Enhanced Transformer with Rotary Position Embedding. arXiv:2104.09864.
- Chen, S., Wong, S., Chen, L., & Tian, Y. (2023). Extending Context Window of Large Language Models via Positional Interpolation. arXiv:2306.15595 (Meta).
- Peng, B., Quesnelle, J., Fan, H., & Shippole, E. (2023). YaRN: Efficient Context Window Extension of Large Language Models.
- bloc97. (2023). NTK-aware Scaled RoPE. Reddit r/LocalLLaMA.
- Dao, T. (2022/2023/2024). FlashAttention 1 / 2 / 3.
- Ainslie, J., et al. (2023). GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints.
- Bai, Y., et al. (2024). LongAlign: A Recipe for Long Context Alignment of LLMs.
推理时扩展
- OpenAI. (2024). Learning to Reason with LLMs (o1 announcement). openai.com.
- Snell, C., Lee, J., Xu, K., & Kumar, A. (2024). Scaling LLM Test-Time Compute Optimally can be More Effective than Scaling Model Parameters. Google DeepMind.
- Lightman, H., et al. (2023). Let's Verify Step by Step. OpenAI.
- Wang, P., et al. (2024). Math-Shepherd: Verify and Reinforce LLMs Step-by-step without Human Annotations.
- Luo, L., et al. (2024). OmegaPRM: Improve Mathematical Reasoning in Language Models by Automated Process Supervision.
附录:公式推导与代码骨架
A.1 推测解码:PyTorch 风格伪代码
def speculative_decode(prompt, M_p, M_q, K=5, max_tokens=512):
"""
M_p: small draft model
M_q: large target model
K : draft length per round
"""
tokens = prompt[:]
while len(tokens) - len(prompt) < max_tokens:
# ---- Step 1: draft K tokens from M_p ----
draft = []
p_probs = []
for _ in range(K):
p_dist = M_p(tokens + draft).softmax(-1)
y = sample(p_dist)
draft.append(y)
p_probs.append(p_dist[y])
# ---- Step 2: one forward of M_q to get K+1 distributions ----
q_dists = M_q(tokens + draft) # shape [K+1, V]
# ---- Step 3: rejection sampling decision ----
accepted = 0
for i in range(K):
r = random()
p_i = p_probs[i]
q_i = q_dists[i, draft[i]]
if r < min(1.0, q_i / p_i): # Case 1 & 2: accept
tokens.append(draft[i])
accepted += 1
else: # Case 3: reject + resample
residual = relu(q_dists[i] - p_distribution_at_i)
residual = residual / residual.sum()
tokens.append(sample(residual))
break # discard remaining drafts; their condition changed
# If all K drafts accepted, bonus token from q_dists[K]
if accepted == K:
tokens.append(sample(q_dists[K]))
return tokens
A.2 PPO Clipping 的梯度推导
记 $r_t(\theta) = \pi_\theta / \pi_{\theta_\text{old}}$,clipped objective:
关键的分情况梯度:
- $\hat A_t > 0$ 且 $r_t > 1+\epsilon$:第二项被 clip 截断,梯度为 0(阻止上调好动作太多);
- $\hat A_t < 0$ 且 $r_t < 1-\epsilon$:同理梯度为 0(阻止下调差动作太多);
- 其他情况:梯度等于 $\nabla \log\pi_\theta(a_t|s_t)\cdot \hat A_t \cdot r_t$(带重要性比的 vanilla policy gradient)。
A.3 RoPE 的复数表示
把每对维度看作复数 $z = x_{2i} + i\,x_{2i+1}$。RoPE 在位置 $m$ 的旋转即复数乘法:
于是 attention 中 $\tilde q_m \cdot \overline{\tilde k_n}$ 包含因子 $e^{i(m-n)\theta_i}$, 显式体现相对距离 $m-n$。这就是 RoPE 与"复数旋转"等价的简洁视角。
A.4 PRM 数据自动标注(Monte Carlo 思路)
def auto_label_prm_step(question, partial_solution, model, K=8):
"""
给定 partial solution(推到第 i 步),rollout K 次评估这一步是否正确
"""
success = 0
for _ in range(K):
complete = model.generate(question + partial_solution, temperature=0.7)
if is_correct(complete, ground_truth_answer):
success += 1
# MC estimate: 该 step 后能完成的概率
return success / K # 用阈值 (如 >0.5) 二值化作为 PRM label
A.5 GKD(On-Policy Distillation)训练循环
for batch in dataloader:
x = batch.prompt
with torch.no_grad():
# 关键:context 来自学生自己的采样
y_tilde = student.generate(x, max_new_tokens=512, do_sample=True)
# teacher 与 student 在 student-generated context 上的 logits
student_logits = student(x, y_tilde).logits
with torch.no_grad():
teacher_logits = teacher(x, y_tilde).logits
# reverse KL on student-generated y_tilde
p_student = F.softmax(student_logits, dim=-1)
log_p_student = F.log_softmax(student_logits, dim=-1)
log_p_teacher = F.log_softmax(teacher_logits, dim=-1)
loss = (p_student * (log_p_student - log_p_teacher)).sum(-1).mean()
loss.backward()
optimizer.step()
A.6 章节相互引用图
A.7 进一步阅读路线图(按难度)
- 入门:Yejin Choi 老师本讲 slides → Karpathy 的 nanoGPT speculative decoding 实现
- 中级:Chen et al. 2023 Appendix I(推测解码证明)→ Su 2021 RoFormer 全文 → Schulman 2017 PPO 原文
- 高级:Snell 2024(test-time scaling)→ Agarwal 2023(GKD)→ Peng 2023(YaRN)
- 前沿(2025-2026):DeepSeek-R1 技术报告 → Qwen3 技术报告 → Thinking Machines 博客 → EAGLE-3 论文 → Sutton & Silver 的 "Streaming Deep RL"