LLM 高效推理与对齐完全指南

面向 NLP 研究生的深度教材 · 改编自 Stanford CS224N Winter 2026 Lecture 13 (Yejin Choi)
覆盖:推测解码 · Off-Policy Drift · 长上下文 · 推理时扩展 · 对齐算法 · 工程图谱
版本 1.0 · 2026 春 · Reasoning Part 2 · 含完整数学推导与近 3 年前沿对照

前言:本讲义在 LLM 知识图谱中的位置

2024 年 9 月 OpenAI o1 发布之后,整个 LLM 社区进入了"推理为王"的时代。 但"推理"这件事并不是一个孤立的算法升级,它牵动了从训练(RL)推理(Inference)上下文(Context)测试时算力(Test-time compute)的所有系统问题。 本讲义试图把 CS224N 2026 第 13 讲所覆盖的四个看似独立的主题串成一条逻辑线。

0.1 四个主题为什么放在一起?

从工程视角看,训练一个强推理模型意味着 4 件事必须同时成立:

  1. 能用便宜的算力生成长推理链(chain-of-thought)——这是推测解码要解决的, 即"用一个小模型猜,用大模型核"。
  2. 能用大规模 RL 持续提升推理能力,而不被工程优化反噬——这是 Off-Policy Drift 与 On-Policy 蒸馏要解决的, 即"为什么我把生成和训练拆到不同集群之后,PPO 就开始炸 KL"。
  3. 能在数万 token 的推理链里保持指针稳定——这是 长上下文外推要解决的, 即"RoPE 在 4K 训过、能不能在 128K 上跑"。
  4. 能在推理时把"想得更久"换成"想得更准"——这是 推理时扩展要解决的, 即"Best-of-N、Beam-Search-with-PRM 到底何时比直接扩大模型更划算"。
主线提示: 这四件事之间存在一个潜在的"守恒律"—— 你在某一环偷的工,往往会在另一环还回来。 比如推测解码加速了生成(省钱),但要求 draft / target 词表对齐(限制了模型选择); 异步 RL 加快了梯度迭代,但引入了 off-policy drift(限制了梯度无偏性); 长上下文外推让模型读懂 100k token,但每次注意力都要付二次方代价(限制了吞吐); test-time scaling 让小模型逼近大模型,但要求一个高质量 verifier(限制了任务可扩展性)。

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 老师在课上给出的核心直觉是:

不是所有 token 都同样难。 "Once upon a __" 这种续写连一个 1B 小模型都能 100% 答对 "time"。 但"The proof of Fermat's last theorem requires __" 才需要大模型的思考能力。 既然简单 token 占了绝大多数,为什么要让 100B 模型逐字推理?
Step 1 · Autoregressive Draft (M_p) Step 2 · Parallel Verify (M_q) once draft draft draft draft upon a time there 逐 token 串行生成 upon a time there Target Model (one forward) upon a time there 一次 forward 同时算 K+1 个分布
Figure 1.1 · 推测解码总览。Step 1:draft 模型 $M_p$ 自回归生成 K=4 个 token(左:每个 token 依赖前一个); Step 2:target 模型 $M_q$ 把整段 prefix 拼好后一次 forward,并行得到 4 个位置的 next-token 分布, 据此独立验证每一个 token。本例中前三个被接受、第四个被拒绝。

1.2 算法核心:把生成问题转化成拒绝采样问题

步骤 A · Draft:小模型给出 K 步草稿

给定上下文 $x$,先用小模型 $M_p$ 自回归采样长度为 $K$ 的草稿:

$$y_1 \sim p(\cdot \mid x),\quad y_2 \sim p(\cdot \mid x, y_1),\quad \cdots,\quad y_K \sim p(\cdot \mid x, y_1,\dots,y_{K-1})$$

步骤 B · Verify:大模型一次 forward 给出 K+1 个分布

关键的工程优化在这里:因为 Transformer 的因果 attention 是下三角的, 所以把 $[x, y_1, y_2, \dots, y_K]$ 拼成完整 prefix 喂给大模型 $M_q$ 做一次 forward, 就可以同时获得 $K+1$ 个分布:

$$q(\cdot \mid x),\ q(\cdot \mid x, y_1),\ q(\cdot \mid x, y_1, y_2),\ \dots,\ q(\cdot \mid x, y_1,\dots,y_K)$$

注意这不是 $K$ 次 forward,而是1 次——这就是为什么"验证"几乎免费。 我们引入简写:

$$p_i \;\triangleq\; p(\cdot \mid x, y_{<i}), \qquad q_i \;\triangleq\; q(\cdot \mid x, y_{<i})$$
为什么是单次 forward?

训练阶段我们用 teacher-forcing 计算所有位置的 next-token 概率; 推理阶段也可以——只要我们一次性把整段 prefix 拼好。 拒绝/接受决策是在 logits 上做的,不需要再次 forward 模型。 这就是把"串行的解码"转换成"并行的验证 + 串行的决策"。

1.3 接受 / 拒绝的三种情况

对 $i = 1, 2, \dots, K$ 逐位置决策。比较 $p_i(y_i)$ 与 $q_i(y_i)$:

概率 token 词表 p (draft) q (target) Case 2/3:q<p Case 1:q≥p
Figure 1.2 · draft 分布 $p$ 与 target 分布 $q$ 的关系。 左侧重叠区域代表 $q<p$(target 不喜欢 draft 太喜欢的 token), 右侧 $q>p$ 区域代表 target 更偏好的 token。三种情况由 $q/p$ 比值决定。

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)$ 接受:

$$\text{Accept} \quad \text{with prob } \min\!\left(1, \frac{q_i(y_i)}{p_i(y_i)}\right)$$

这里 $\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 \sim \frac{(q_i - p_i)_+}{\sum_v (q_i(v) - p_i(v))_+}, \qquad (x)_+ \triangleq \max(x, 0)$$

然后丢弃 $y_{i+1}, \dots, y_K$(因为它们的 condition 已经变了),回到下一轮 draft。

为什么不是别的修正分布,偏偏是 $(q-p)_+$? 后面 1.4 节会给出形式证明。直观上:$(q-p)_+$ 恰好"补足"那些 $q$ 看好而 $p$ 不看好的 token 的额外质量。

1.4 分布等价性的完整证明

这一节我们证明:推测解码输出的每一个 token,其边缘分布严格等于直接从 $q$ 采样。 也就是说,加速不会改变模型的 "behavioral identity"——这是它能被 vLLM、TRT-LLM 默认开启的根本原因。

引理:单步等价

固定上下文,记 draft 分布为 $p$、target 分布为 $q$(省略下标 $i$)。 推测解码在每一步实际产生的 token $Y$ 的分布为:

$$\Pr[Y = v] = \underbrace{p(v)\cdot \min\!\left(1,\frac{q(v)}{p(v)}\right)}_{\text{从 draft 抽 }v\text{ 且被接受}} \;+\; \underbrace{P_{\text{reject}} \cdot \frac{(q(v)-p(v))_+}{Z}}_{\text{从修正分布抽 }v}$$

其中归一化常数 $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)$。
结论: 在任意 token 上,$\Pr[Y=v] = q(v)$。 $\blacksquare$
也就是说,从工程视角是用小模型采样,从统计视角等价于从大模型采样。 Chen et al. 2023 的 Appendix I 给出了同样形式的证明,但本教材的展开方式更"代数直白"。

多步扩展

由于每一步等价于从 $q$ 采样,下一步又会用最新接受的 token 作为 prefix, 所以多步组合仍是从 $q$ 的自回归分布采样。需要注意的一个细节: 若在第 $i$ 步发生拒绝,那么 $y_{i+1}, \dots, y_K$ 必须被丢弃, 因为它们是在条件被改变前的 prefix 下生成的。

1.5 实际加速效果

Wall-clock 时间对照 (越短越快) Base (标准解码) 12 步串行 γ=3 (推测解码) ~4 轮 ⇒ 12 token γ=7 (更长 draft) ~2 轮 ⇒ 12 token M_p encoder M_p decoder M_q decoder (单次 forward) → 时间轴
Figure 1.3 · T5-small (60M, draft) + T5-XXL (11B, target) 的 wall-clock 时序图。 基线(上)需 12 步串行执行 target 模型;γ=3(中)每轮 draft 3 个 token、一次 target 验证; γ=7(下)每轮 draft 7 个 token。实测取得 2~3× 加速, 且输出与基线完全分布等价(参 §1.4 证明)。

加速因子的理论上界

设单步接受率为 $\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$),则加速比近似为:

$$\text{Speedup} \approx \frac{\mathbb{E}[\text{accepted}]}{1 + cK}$$

这是一个关于 $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 模型"读心"

EAGLE-1 EAGLE-2 EAGLE-3 Target LLM Top Layer Features Target LLM Draft Head (Single Layer) Linear Prediction 线性序列草稿 Target LLM Top Layer Features Target LLM Draft Head (Single Layer) ··· Speculation Tree 动态分支 (context-aware) Target LLM High Layer Middle Layer Low Layer Fused Draft Head (Multi-Layer Fusion) Candidate Branches
Figure 1.4 · EAGLE 三代演化。 EAGLE-1:draft head 不预测 token 分布,而预测 target 的顶层 hidden state, 再借 target 的 LM head 解码——"特征级"投机; EAGLE-2:把线性草稿换成上下文感知的动态草稿树,按置信度剪枝; EAGLE-3:进一步融合多层特征(高/中/低),让 draft head 看到不只是顶层抽象。
Speedup Vicuna 13B 1.0 1.9 2.1 3.1 4.1 5.6 LLaMA-Instruct 3.1 8B 1.0 3.6 3.2 4.4 LLaMA-Instruct 3.3 70B 1.0 2.8 4.1 DeepSeek R1 LLaMA 8B 1.0 3.4 5.0 Vanilla Spec. Medusa HASS EAGLE EAGLE-2 EAGLE-3
Figure 1.5 · EAGLE-3 在 4 个模型上取得 4.1× ~ 5.6× 加速(temperature=0)。 注意最右栏 DeepSeek-R1-Distill-LLaMA-8B 这种推理模型也能直接受益—— 推理链中大量 token(如 "Let me think about this", "So we have")是高度可预测的。 Vicuna 13B 评估于 MT-Bench,推理模型评估于 GSM8K。

1.6.4 Suffix Decoding:极致 model-free 路线

Ongoing Inference 8 5 4 8 5 Previous Outputs … 历史语料 … Index Suffix Trees 4 8 5 5 5 8 3 1 2 Expansion Speculation Tree Candidates 3 6 4 8 5 1 2 3 Scoring Speculation Tree 1 3 2 Verify (LLM) Verification & Generation 8 5 4 8 5 1 3
Figure 1.6 · Suffix Decoding (Oliaro et al., 2025)。 两棵后缀树分别索引当前推理 prefix(上)和历史输出语料(下), 按尾段模式匹配生成多个候选树,按频率打分得到最优 speculation tree(中→右), 送大模型一次性验证(绿色为被接受的新 token)。 完全无需训练任何 draft 模型,仅靠数据结构即可在重复性高的任务(SQL、Agent loop、RAG) 上取得 5.2~5.3× 加速。

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 工业级推理引擎支持矩阵

算法vLLMTRT-LLMHF TGIHF TransformersSGLang
EAGLE-3✅ Native✅ Opt⚠ 手动 head
SuffixDecoding✅ Arctic✅ Beta
Medusa✅ SOTA✅ Pipeline
Draft-Target✅ Universal
DFlash (2026)⚠ Fork✅ Custom⚠ Fork
选型建议(2026 年):
  • 追求最简易部署: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
能否与环境交互 → Online (Offline) ← 只能用预录数据 训练数据来自当前 π → On-policy (Off-policy) ← 任意策略可 Offline Off-Policy 从静态数据集学 不能交互、不限来源 CQL · IQL · BCQ Online Off-Policy ★ 交互 + Replay Buffer 异步 RLHF / PPO drift DQN · SAC · IMPALA Offline On-Policy 几乎自相矛盾 ✗ 不能交互又要 on-policy (BC 偶尔宽泛归此) Online On-Policy ★ 每步用最新策略采样 梯度无偏 / 慢 / 重 REINFORCE · PPO · GRPO RL 四象限
Figure 2.1 · Online vs Offline 关心的是"能不能采新数据"; On-policy vs Off-policy 关心的是"训练数据是不是当前 policy 产的"。 这是两个完全独立的轴。右下角的 Online Off-Policy 是 LLM 大规模 RL 时代最关键的一格, 因为 RL infra 优化(双引擎、replay)几乎注定让看似 on-policy 的 PPO 滑入 off-policy。

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) 对硬件的需求完全不同

Rollout Generator vLLM / SGLang 集群 FP16/INT8 推理优化 大 batch、长生成 输入:当前 π_θ 输出:(x, y, log π_θ_old) Learner Megatron / FSDP BF16 训练,梯度优化 小 batch、反向传播 输入:rollout batch 输出:π_{θ+1} rollouts weight transfer (慢)
Figure 2.2 · 双引擎架构。 Rollout Generator 和 Learner 各自集群优化方向不同,强行用同一份硬件做两件事会浪费 50% 以上吞吐。 但权重同步会引入延迟,于是当 Learner 跑了 N 步梯度后,Generator 仍在用N 步前的权重生成—— 这就是 off-policy drift 的物理来源。

off-policy drift 的 5 个真实成因

  1. 刻意异步 RL(async RLHF):为节省 GPU,把生成和训练完全解耦
  2. 每批 rollout 多次梯度更新(如 PPO num_epochs > 1):第 2、3 次更新时数据已经不再是 on-policy
  3. 大 replay buffer:经验存留时间越长越偏离
  4. 独立生成/训练集群:权重传输需要走 NCCL/NIC,分钟级延迟
  5. 大 batch + 长生成:生成一个 2k token 的 CoT 可能需要 30 秒,期间 learner 已更新数次

2.3 Asynchronous RLHF(Noukhovitch et al., 2024)

Slow Generation (同步) θ_t(x)→y_t θ_{t+1}(x)→y_{t+1} θ_{t+2}(x)→y_{t+2} GPU 1 GPU 2 On-Policy Training ∇_θ_t r(x, y_t) ∇_θ_{t+1} r(x, y_{t+1}) ∇_θ_{t+2} r(x, y_{t+2}) Fast Generation (异步) θ_t(x)→y_t θ_{t+1}(x)→y_{t+1} θ_{t+2}(x)→y_{t+2} GPU 1 GPU 2 Off-Policy Training ∇_θ_{t+1} r(x, y_t) ∇_θ_{t+2} r(x, y_{t+1}) ∇_θ_{t+3} r(x, y_{t+2}) 生成时的 θ_t ≠ 计算梯度时的 θ_{t+1} ⇒ off-policy drift Generation Training
Figure 2.3 · 上:经典同步 RLHF——GPU 大部分时间被慢生成阻塞,训练只能等待; 梯度 $\nabla_{\theta_t} r(x,y_t)$ 中策略与数据同步,保持 on-policy。 下:异步方案让 Generation(GPU 1)和 Training(GPU 2)并行重叠,吞吐显著提高, 但梯度变成 $\nabla_{\theta_{t+1}} r(x, y_t)$——参数 $\theta_{t+1}$ 与生成数据时的 $\theta_t$ 不同步, 天然off-policy

形式上,普通 PPO 的策略梯度为:

$$\nabla_\theta J(\theta) = \mathbb{E}_{(x,y)\sim \pi_\theta}\left[\nabla_\theta \log \pi_\theta(y|x)\cdot A(x,y)\right]$$

异步版本把它变成了:

$$\nabla_{\theta_{t+1}} J = \mathbb{E}_{(x,y)\sim \pi_{\theta_t}}\left[\nabla_{\theta_{t+1}} \log \pi_{\theta_{t+1}}(y|x)\cdot A(x,y)\right] \quad \text{(已经 off-policy!)}$$

2.4 PipelineRL:In-Flight 权重更新(Piché et al., 2025)

(a) Conventional RL inference batch size 递减 → GPU 闲置 GPUs Time → Optim step 0 Optim step 1 (b) PipelineRL · in-flight 权重更新 batch size 恒定 · 生成与训练并发 Time → Optim 0 Optim 1 Optim 2 Optim 3 权重新鲜度色阶 → 越新 GPU 闲置 一条 sequence 前段 = 旧权重生成、后段 = 新权重生成 ⇒ "混合策略"序列
Figure 2.4 · PipelineRL 把"权重同步"从一次性阻塞操作改成飞行中更新: 生成引擎在中途接收新权重、短暂暂停、加载、继续生成 in-progress sequence。 左 (a):传统方案中每轮"生成→优化"交替,inference batch 因 EoS 早结束而 drain, GPU 出现大块闲置(斜线区域);右 (b):PipelineRL 让生成与训练完全并发, inference batch size 始终饱和,权重新鲜度随时间渐进更新(色阶变深)。 代价:一条 sequence 的前后段由不同 policy 生成, 计算重要性比时必须逐 token记录对应版本的 old log-prob。

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 真正的危害

三大危害:
  1. 梯度有偏:理论上 $\nabla J$ 的期望已不再是真实策略梯度
  2. 重要性权重爆炸:当 $\pi_\theta$ 与 $\pi_{\theta_{\text{old}}}$ 差异变大时,比值 $r_t(\theta)$ 可以非常大或非常小,导致梯度方差爆炸
  3. Reward Hacking 放大:模型有更多机会沿"奖励作弊路径"漂移,因为旧策略给了一个相对宽松的搜索范围

PPO 的核心保护机制——clipped surrogate——正是针对第 2 点设计的:

$$L^{\text{CLIP}}(\theta) = \hat{\mathbb{E}}_t\left[\min\Big(r_t(\theta)\,\hat{A}_t,\ \mathrm{clip}\big(r_t(\theta), 1-\epsilon, 1+\epsilon\big)\,\hat{A}_t\Big)\right]$$

其中 $r_t(\theta) = \dfrac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}$, $\epsilon$ 一般取 0.1~0.2。

为什么 min + clip 而不是只 clip?

因为 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-updatePiché 2025

2.7 On-Policy Distillation:教师-学生范式的反转

On-policy 蒸馏由 Gu et al. 2023(MiniLLM)和 Agarwal et al. 2023(GKD)几乎同时提出, 2024 年被 Qwen3 技术报告大规模实证,2025 年被 ThinkingMachines 博客推上潮流。

Sequence-Level KD (Kim & Rush 2016) Teacher Prompt x Student y ~ p (Teacher) Forward KLD L(θ) = KL[p ‖ q_θ] ∇L(θ) ✗ exposure bias:测试时 y 来自学生本身 MiniLLM / GKD (Gu 2023, Agarwal 2023) Teacher p Prompt x Student y ~ q_θ (Student) Reverse KLD L(θ) = KL[q_θ ‖ p] ∇L(θ) ✓ On-Policy:训练数据就是学生自己产
Figure 2.5 · 左:经典 Sequence-Level KD(Kim & Rush 2016)让学生记住教师生成的序列, context $y$ 来自教师 → 学生在测试时遇到自己生成的 $y$ 容易崩溃(exposure bias)。 右:MiniLLM / GKD 让学生先自己生成 $y \sim q_\theta$,再用教师 $p$ 给反馈, loss 变为 reverse KL $\mathrm{KL}(q_\theta\|p)$—— 这个换序的意义在 §2.8 节会详细分析。

三种蒸馏的统一表达

三种知识蒸馏目标的形式对照 loss = forward KL off-policy ① Knowledge Distillation (Hinton et al., 2015)
$$\mathcal{L}_{\text{KD}} = -\sum_{t=1}^{T}\sum_{v\in\mathcal V} p_T^{(\tau)}(v|y^*_{<t},x)\,\log p_\theta^{(\tau)}(v|y^*_{<t},x)$$
loss = NLL off-policy ② Sequential KD (Kim & Rush, 2016)
$$\mathcal{L}_{\text{SeqKD}} = -\sum_{t=1}^{T}\log p_\theta(\hat y_t|\hat y_{<t},x),\quad \hat y \sim p_T(\cdot|x)$$
loss = reverse KL on-policy ③ On-Policy KD (GKD) (Gu 2023, Agarwal 2023)
$$\mathcal{L}_{\text{GKD}} = \sum_{t=1}^{T}\sum_{v\in\mathcal V} p_\theta(v|\tilde y_{<t},x)\big[\log p_\theta(v|\tilde y_{<t},x)-\log p_T(v|\tilde y_{<t},x)\big]$$
where $\tilde y \sim p_\theta(\cdot|x)$ — context 由学生自己采样
Figure 2.6 · 三种蒸馏目标的形式对照。 标签 off-policy 表示 context 来自非学生分布(ground-truth 或 teacher); on-policy 表示 context 来自学生自己采样。 注意 ③ 中 $\tilde y \sim p_\theta(\cdot|x)$——这是它能解决 exposure bias 的核心。
方法损失Context 来源Hard vs Soft学习风格
SFTNLL on goldGround-truthHard label
KD (Hinton 2015)Forward KLGround-truthSoft distMass-covering
SeqKD (Kim & Rush 2016)NLL on teacher outputTeacher-generatedHardMass-covering
GKD (Agarwal 2023)Reverse KLStudent-generatedSoftMode-seeking

2.8 Forward vs Reverse KL:mass-covering vs mode-seeking

理解 on-policy 蒸馏的关键是理解 KL 散度的不对称性

Forward KL(mean-seeking / mass-covering)

$$\mathrm{KL}(p\|q) = \sum_x p(x)\log\frac{p(x)}{q(x)}$$
  • 权重由 P(x) 决定:惩罚那些 P 有质量但 Q 没有的位置
  • 结果:Q 覆盖所有 P 的 mode,倾向"宁滥勿缺"
  • 用于:变分推断 (ELBO),标准 KD

Reverse KL(mode-seeking)

$$\mathrm{KL}(q\|p) = \sum_x q(x)\log\frac{q(x)}{p(x)}$$
  • 权重由 Q(x) 决定:惩罚 Q 有质量但 P 没有的位置
  • 结果:Q 聚焦到 P 的某个高密度 mode,倾向"精而少"
  • 用于:RLHF 的 KL 惩罚,on-policy 蒸馏
x density 0 2.5 5 7.5 10 12.5 mode 1 mode 2 mode 3 (主峰) Target Distribution Forward KLD (mass-covering) Reverse KLD (mode-seeking)
Figure 2.7 · 在一个三峰高斯混合上分别用 forward / reverse KL 拟合单高斯forward KL 把单高斯摊薄覆盖所有 mode(高熵、低锐度); reverse KL 选择最大那个 mode 精准聚焦(低熵、高锐度)。 这就是为什么 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。 形式上:

$$\mathcal{L}_{\text{GKD}} = \sum_{t=1}^{T}\sum_{v\in\mathcal{V}} p_\theta(v\mid \tilde{y}_{<t}, x)\Big[\log p_\theta(v\mid \tilde{y}_{<t}, x) - \log p_T(v\mid \tilde{y}_{<t}, x)\Big]$$ $$\text{where}\quad \tilde{y}\sim p_\theta(\cdot\mid x)$$

注意 context $\tilde{y}_{<t}$ 来自学生自己。这同时解决了两个问题: (1)exposure bias——训练时见到的 prefix 与测试时一致; (2)mode 偏好——学生只学习自己擅长的 mode。

2.9 On-Policy 蒸馏作为 RL 的替代

SamplingReward SignalGPU 需求
Supervised Fine-TuningOff-policyDense(每 token 都有 label)
Reinforcement LearningOn-policySparse(只在序列末尾给奖励)(reward model + critic + rollout)
On-Policy DistillationOn-policyDense(教师每 token 给分布)(教师只需 forward)
结论: On-Policy Distillation 拿到了 SFT 的密集监督信号和 RL 的on-policy 优势, 但避免了 RL 的稀疏奖励重 infra

Qwen3-8B 实证(Lecture 13 第 33 页)

方法AIME'24AIME'25MATH500LiveCodeBench v5MMLU-ReduxGPQA-DiamondGPU 小时
Off-policy Distillation55.0 (90.0)42.8 (83.3)92.442.086.455.6
+ Reinforcement Learning67.6 (90.0)55.5 (83.3)94.852.986.961.317,920
+ On-policy Distillation74.4 (93.3)65.5 (86.7)97.060.388.363.31,800

注意右下角的对比:on-policy 蒸馏只用了 RL 1/10 的 GPU 小时, 却在每一项指标上都超过了 RL。这是 2025 年下半年最受关注的一组结果。

XSum (Summarization) 12 15 18 21 24 ROUGE-2 T5-XL (Teacher) = 22 Small Base Large +111% WMT (Translation) 25.5 26.5 27.5 28.5 BLEU T5-XL (Teacher) = 28.1 Small Base Large +70% GSM8K (Reasoning w/ CoT) 5 10 15 20 30 Accuracy % T5-XL (Teacher) ≈ 29 Small Base Large +90% SFT Supervised KD SeqKD GKD (On-policy) Student size: T5-Small (77M) → T5-Base (250M) → T5-Large (800M)
Figure 2.8 · GKD 在 XSum 摘要、WMT 翻译、GSM8K 推理三任务上对比 SFT、Supervised KD、SeqKD。 绿色(GKD)在 T5-Small/Base/Large 三档学生上均显著领先: 相对 SFT 分别有 +111%(XSum)、+70%(WMT)、+90%(GSM8K)的提升。 灰色虚线为 T5-XL teacher 上限。

2.10 应用:领域特定中训(mid-training)的灾难性遗忘修复

一个最实用的工程场景:你拿到开源 post-trained 模型(如 Qwen3-8B)后, 想在公司内部文档上继续中训以获得领域知识。 但直接中训会毁掉原来的指令跟随能力。 On-policy 蒸馏给出了一个优雅的解决方案:

方案Internal QA (Knowledge)IF-eval (Chat)
原始 Qwen3-8B18%85%
+ Midtrain (100% 领域语料)43%45% ⬇⬇
+ Midtrain (70%) + 指令数据 (30%)36%79%
+ Midtrain (70%) + On-Policy Distill41%83%
关键洞察: 中训用 70% 领域语料让模型吸收新知识,再用 30% 配额做从原模型 self-distill 的 on-policy 蒸馏, 即可几乎完全恢复指令跟随能力(85% → 83%),同时保留绝大部分新知识(18% → 41%)。 这是 2026 年企业内部 LLM 落地的标准 recipe。

本章小结

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博客、新闻、落地页,碎片化严重
Wikipedia500 – 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)

$$\text{PE}(\text{pos}, 2i) = \sin\!\left(\frac{\text{pos}}{10000^{2i/d}}\right),\quad \text{PE}(\text{pos}, 2i+1) = \cos\!\left(\frac{\text{pos}}{10000^{2i/d}}\right)$$
Sinusoidal PE 不同维度的频率层级(d=50, base=10000) i=0 +1 −1 ~6 token / 周期 (最高频) i=1 ~60 token / 周期 i=20 ~628 token / 周期 i=49 ~62k / 周期 (最低频) position (token index) → 同一序列 0…1000
Figure 3.1 · 同一序列上不同维度 $i$ 的 sin/cos 取值。 低维($i=0$)变化极快——周期约 6 token,捕捉局部依赖; 高维($i=49$)变化极慢——周期可达数万 token,几乎是单调的"绝对位置斜率"。 这一多频率结构是 RoPE 频谱分析(§3.6)的直接前奏。

为什么是这个具体形式?

  1. 对任何位置都唯一:即使没在训练中出现,也可以确定地计算出来;
  2. 线性可表达相对距离:对任何 offset $k$,存在线性变换 $T_k$ 使得 $\text{PE}_{\text{pos}+k} = T_k\, \text{PE}_{\text{pos}}$(由三角恒等式推得);
  3. 加性集成:直接加在 token embedding 上送入第一层。
关键陷阱: 虽然 sin/cos 在数学上可以为任意 pos 计算出值, 但模型从未在训练中见过远端那些值,因此线性层处理这些"陌生"嵌入仍会失败。 "能计算" ≠ "能泛化"。

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 旋转的几何直觉

单对维度的 2D 旋转 x (= q_{2i}) y (= q_{2i+1}) q (原) q' = R(mθ_i)·q θ = m·θ_i 旋转不改变向量长度(norm-preserving) 维度两两配对、独立旋转 pair 0 θ_0 = 1.0 pair 1 θ_1 ≈ 0.68 pair 31 θ_31 ≈ 0.01 pair 63 θ_63 ≈ 0.0001 θ_i = b^{−2i/d} ⇒ 不同维度对 = 不同角速度
$$\begin{pmatrix} q'_{2i} \\ q'_{2i+1} \end{pmatrix} = \begin{pmatrix} \cos m\theta_i & -\sin m\theta_i \\ \sin m\theta_i & \cos m\theta_i \end{pmatrix} \begin{pmatrix} q_{2i} \\ q_{2i+1} \end{pmatrix}$$
关键: q⊤k 内积 = q⊤R^{(n−m)}_Θ k attention score 只依赖相对距离 n−m
Figure 3.2 · 左:在 2D 平面上,"旋转"由旋转矩阵 $R(\theta) = \begin{pmatrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{pmatrix}$ 执行; 原向量 $q$ 被旋转角度 $\theta = m\theta_i$ 得到 $q'$,长度不变。 右:RoPE 把模型维度两两配对,每对独立旋转一个由位置 $m$ 和 dimension $i$ 决定的角度 $m\theta_i$。 不同 $i$ 对应不同角速度,构成"多频率"位置编码。

3.5.2 形式定义

对 query 向量 $q$ 中第 $i$ 对维度 $(q_{2i}, q_{2i+1})$,在位置 $m$ 上的旋转为:

$$\begin{pmatrix} q'_{2i} \\ q'_{2i+1} \end{pmatrix} = \begin{pmatrix} \cos(m\theta_i) & -\sin(m\theta_i) \\ \sin(m\theta_i) & \cos(m\theta_i) \end{pmatrix} \begin{pmatrix} q_{2i} \\ q_{2i+1} \end{pmatrix}$$

其中 $\theta_i = b^{-2i/d}$,$b$ 称为base frequency(默认 10000)。 对所有 $d/2$ 对维度组合起来,可以写成块对角矩阵:

$$R^d_{\Theta, m} = \begin{pmatrix} \cos m\theta_1 & -\sin m\theta_1 & 0 & 0 & \cdots & 0 & 0\\ \sin m\theta_1 & \cos m\theta_1 & 0 & 0 & \cdots & 0 & 0\\ 0 & 0 & \cos m\theta_2 & -\sin m\theta_2 & \cdots & 0 & 0\\ 0 & 0 & \sin m\theta_2 & \cos m\theta_2 & \cdots & 0 & 0\\ \vdots & & & & \ddots & \vdots & \vdots\\ 0 & 0 & 0 & 0 & \cdots & \cos m\theta_{d/2} & -\sin m\theta_{d/2}\\ 0 & 0 & 0 & 0 & \cdots & \sin m\theta_{d/2} & \cos m\theta_{d/2} \end{pmatrix}$$

3.5.3 RoPE 在 attention 中的作用

$$\tilde{q}_m = R^{(m)}_\Theta q_m,\qquad \tilde{k}_n = R^{(n)}_\Theta k_n$$ $$\text{Attention}(Q,K,V) = \mathrm{softmax}\!\left(\frac{\tilde Q\tilde K^\top}{\sqrt{d_k}}\right)V$$

3.5.4 神奇之处:dot product 只依赖相对距离

由旋转矩阵的性质 $R^\top(\alpha)R(\beta) = R(\beta - \alpha)$,我们有:

$$\tilde q_m^\top \tilde k_n = q_m^\top \big(R^{(m)}_\Theta\big)^\top R^{(n)}_\Theta k_n = q_m^\top R^{(n-m)}_\Theta k_n$$
结果: "Taylor" 在位置 10、"Swift" 在位置 11,与"Taylor" 在位置 100、"Swift" 在位置 101, 对 attention score 的贡献完全相同——只取决于相对距离 $n-m=1$。 这是 RoPE 最优雅的代数性质。

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 训练长度内,这一维度都没完成一个完整旋转
RoPE 频谱 dimension i: 0 (high-freq) ←→ 63 (low-freq) i=0 一周 ~6 token, 局部 i=31 一周 ~628 token, 段落 i=63 一周 ~62K, 全局
Figure 3.3 · RoPE 不同 dimension 对应不同的旋转频率,构成一个多尺度位置表示。 模型自动用高频维度捕捉局部依赖(如词共现),用低频维度捕捉全局结构(如段落开始)。

3.7 长上下文外推方案:PI / NTK / YaRN

3.7.1 Position Interpolation (PI, Meta, 2023)

核心思想:训练长度 $L_{\text{train}}$、目标长度 $L_{\text{target}}$,将位置索引线性缩小

$$m \mapsto \frac{L_{\text{train}}}{L_{\text{target}}}\cdot m$$

这样模型看到的最大旋转角度仍然落在训练分布内。代价是所有频段都被同比例缩慢, 高频细节(局部信息)会被"模糊化"。需要一轮轻量 fine-tune 来重新校准。

3.7.2 NTK-aware Interpolation

NTK 的洞察:与其压缩位置索引(影响所有频段),不如改变 base frequency $b$。 具体地:

$$b' = b\cdot\left(\frac{L_{\text{target}}}{L_{\text{train}}}\right)^{d/(d-2)}$$

这样可以近似保留高频(局部信息),同时让低频维度有足够的旋转空间覆盖新的位置范围。 "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:把维度按"完整旋转周数"分成三段—— 高频段(已多次旋转,泛化好)直接外推低频段(远未完成一周)用插值, 中间段平滑过渡。
YaRN 的关键 insight: 不要对所有维度做同一件事。 "高频维度本来在 4K 训练里就见过几千次完整旋转 → 见过了,放心外推"; "低频维度训练里都没转完一圈 → 没见过,必须插值"。 这是一种频率自适应的外推方案。

3.8 渐进式长上下文训练

实践中 LongLLaMA、LongAlign、LLaMA-3.1 通用 recipe 为:

  1. 从短上下文基础模型出发(如 4K-8K);
  2. 应用位置编码修改(PI / NTK / YaRN);
  3. 渐进延长继续预训练:8K → 32K → 64K → 128K,每个阶段只用相对小量数据(几十亿 token);
  4. 在长上下文指令数据上做最后 fine-tune。
关键观察: 把 8K 训练好的模型扩到 128K, 通常只需要原预训练算力的 0.1–1%。这远比从零训练 128K 模型经济。

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 直观对比

MHA (8 Q, 8 KV) Q KV GQA (8 Q, 2 KV) MQA (8 Q, 1 KV) KV cache 体积 ∝ KV head 数 ⇒ MHA 是 MQA 的 8 倍,GQA 取折中(如 LLaMA-3 用 GQA-8)。

本章小结

长上下文不是简单"训练更长",而是位置编码 × 数据 × 注意力 × 训练阶段四者的联合优化。 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 维度

o1 AIME accuracy during training pass@1 accuracy train-time compute (log scale) 0 20 40 60 80 100 o1 AIME accuracy at test time pass@1 accuracy test-time compute (log scale) 0 20 40 60 80 100 "Instead of training more, what if we let the model think more?"
Figure 4.1 · OpenAI o1 在 AIME 上的两条 scaling 曲线。 左:随训练时算力增加 pass@1 提升(这是过去 5 年我们都很熟悉的曲线); 右:在固定模型权重下,随测试时算力增加 pass@1 同样近线性提升。 这是 LLM 历史上第一次有两条独立的 scaling law 同时成立, 直接催生了 §4.3 中各种 search/verifier 策略。
口号: "Instead of training more, what if we let the model think more?"

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 s1 s2 s3 verifier 选 argmax Sequential Revisions s1 s2 s3 model self-critique 逐步修正 Beam Search w/ PRM 剪枝 PRM 给每步打分 三大主流 test-time compute 策略示意 并行(Best-of-N)↔ 串行(Sequential)↔ 树形(Beam + PRM)
策略核心思想适合什么任务
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-levelBeam search 时步级剪枝
Domain-specific verifier无需训练,直接用执行器取决任务代码:sandbox 跑 unit test;数学:可计算项检查
PRM 数据从哪来? 早期 Lightman et al. 2023 用人类标注每一步对错(PRM800K), 代价极高。2024 年后业界改用 Math-Shepherd / OmegaPRM 风格的自动标注: 从某一步开始多次 rollout,若大多数 rollout 都能达到正确答案 → 这一步正确;否则错误。 这种 Monte-Carlo 估计把 PRM 数据成本降低了两个数量级。

4.5 不同难度下的策略权衡

搜索方法对比 (PRM verifier) MATH Accuracy (%) Generation Budget (log) 10 20 30 35 38 2⁵ 2⁷ 2⁹ ⬇ over-fit Best-of-N Weighted Majority Beam M=4 Beam √N 按问题难度分桶 MATH Accuracy (%) 难度桶 (1=易, 5=难) 0 20 60 90 1 2 3 4 5 简单题:beam 过优化 中等题:beam 持续领先 最难:均失败 Majority Best-of-N Weighted Beam Search 搜索策略 ↔ 题目难度需要动态匹配;"一招打天下"反而被打天下
Figure 4.2 · 左:MATH 数据集上不同搜索方法对比。 低预算下 beam search 占优;高预算下反而被 Best-of-N 超过——典型的 reward over-optimization。 右:按问题难度分桶比较。 简单题(bin 1-2)beam search 在高预算下 over-optimize; 中等题(bin 3-4)beam search 持续领先; 最难题(bin 5)所有方法表现相近——模型本身能力不足,搜索救不了。 这一观察直接支持 §4.5 的难度感知调度策略
难度感知调度策略:
  • 简单:少量 Best-of-N 即可,加 PRM 反而 over-fit;
  • 中等:用 PRM-guided beam search + 中等预算;
  • 困难:先 sequential revision 让模型 self-critique,再合并 N 条独立解(多样性 + 修正);
  • 超难:换更大模型或不同 base 模型 - 测试时算力遇到天花板。

4.6 实践要点

三句话总结 (Snell 2024):
  1. 不要默认选最大模型——小模型 + 智能搜索可能更省。
  2. 投资 verification——高质量 reward model(特别是 PRM)极大改善 test-time scaling。
  3. 采用 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 落地最重要的工程范式转变。

参考文献

推测解码

  1. Leviathan, Y., Kalman, M., & Matias, Y. (2022). Fast Inference from Transformers via Speculative Decoding. arXiv:2211.17192 (later ICML 2023).
  2. 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).
  3. Li, Y., Wei, F., Zhang, C., & Zhang, H. (2024). EAGLE / EAGLE-2 / EAGLE-3. ICML 2024 / NeurIPS 2024 / 2025.
  4. 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.
  5. Oliaro, G., et al. (2025). SuffixDecoding: Extreme Speculative Decoding via Suffix Trees.
  6. Mamou, J., et al. (2024). Dynamic Speculation Lookahead. HuggingFace Blog.

Off-Policy / On-Policy 蒸馏

  1. Schulman, J., Wolski, F., Dhariwal, P., Radford, A., & Klimov, O. (2017). Proximal Policy Optimization Algorithms. arXiv:1707.06347.
  2. Noukhovitch, M., et al. (2024). Asynchronous RLHF: Faster and More Efficient Off-Policy RL for Language Models.
  3. Piché, A., et al. (2025). PipelineRL: In-Flight Weight Updates for Scalable RL.
  4. Hinton, G., Vinyals, O., & Dean, J. (2015). Distilling the Knowledge in a Neural Network. NIPS Deep Learning Workshop.
  5. Kim, Y., & Rush, A.M. (2016). Sequence-Level Knowledge Distillation. EMNLP 2016.
  6. Gu, Y., Dong, L., Wei, F., & Huang, M. (2023). MiniLLM: Knowledge Distillation of Large Language Models.
  7. Agarwal, R., et al. (2023). Generalized Knowledge Distillation (GKD) on On-Policy Data.
  8. Qwen Team. (2024). Qwen3 Technical Report.
  9. Thinking Machines. (2025). On-Policy Distillation Blog. thinkingmachines.ai/blog/on-policy-distillation/

长上下文

  1. Vaswani, A., et al. (2017). Attention Is All You Need. NeurIPS 2017.
  2. Su, J., Lu, Y., Pan, S., Wen, B., & Liu, Y. (2021). RoFormer: Enhanced Transformer with Rotary Position Embedding. arXiv:2104.09864.
  3. Chen, S., Wong, S., Chen, L., & Tian, Y. (2023). Extending Context Window of Large Language Models via Positional Interpolation. arXiv:2306.15595 (Meta).
  4. Peng, B., Quesnelle, J., Fan, H., & Shippole, E. (2023). YaRN: Efficient Context Window Extension of Large Language Models.
  5. bloc97. (2023). NTK-aware Scaled RoPE. Reddit r/LocalLLaMA.
  6. Dao, T. (2022/2023/2024). FlashAttention 1 / 2 / 3.
  7. Ainslie, J., et al. (2023). GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints.
  8. Bai, Y., et al. (2024). LongAlign: A Recipe for Long Context Alignment of LLMs.

推理时扩展

  1. OpenAI. (2024). Learning to Reason with LLMs (o1 announcement). openai.com.
  2. 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.
  3. Lightman, H., et al. (2023). Let's Verify Step by Step. OpenAI.
  4. Wang, P., et al. (2024). Math-Shepherd: Verify and Reinforce LLMs Step-by-step without Human Annotations.
  5. 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:

$$L^{\text{CLIP}}(\theta) = \mathbb{E}_t[\min(r_t \hat A_t, \mathrm{clip}(r_t, 1-\epsilon, 1+\epsilon)\hat A_t)]$$

关键的分情况梯度:

  • $\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$ 的旋转即复数乘法:

$$\tilde z = e^{im\theta_i}\cdot z$$

于是 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 章节相互引用图

推测解码 推理加速 On-Policy 蒸馏 替代 RL,密集监督 长上下文 RoPE / YaRN 测试时算力扩展 o1 / PRM / Best-of-N CoT 生成提速 长思维链 post-train pipeline
Figure A.1 · 四章主题之间的相互依赖关系图。 推测解码加速 CoT 生成;长上下文支撑更长推理链;on-policy 蒸馏构建出的强推理模型最终在测试时算力扩展下落地。

A.7 进一步阅读路线图(按难度)

  1. 入门:Yejin Choi 老师本讲 slides → Karpathy 的 nanoGPT speculative decoding 实现
  2. 中级:Chen et al. 2023 Appendix I(推测解码证明)→ Su 2021 RoFormer 全文 → Schulman 2017 PPO 原文
  3. 高级:Snell 2024(test-time scaling)→ Agarwal 2023(GKD)→ Peng 2023(YaRN)
  4. 前沿(2025-2026):DeepSeek-R1 技术报告 → Qwen3 技术报告 → Thinking Machines 博客 → EAGLE-3 论文 → Sutton & Silver 的 "Streaming Deep RL"
结语: 这一讲覆盖的四个主题,看上去是 4 个独立的"工程优化", 但本质上都在回答同一个问题:当模型权重已经训好之后,我们如何继续榨取它的潜能? 推测解码榨取推理 IO;on-policy 蒸馏榨取教师模型的暗知识; 长上下文外推榨取 RoPE 隐藏的频谱结构;test-time scaling 榨取一个 verifier 的判断力。 2026 年 LLM 工业落地的核心,就在于把这四件事同时做到极致。