跳转至

Training-Free Loosely Speculative Decoding: Accepting Semantically Correct Drafts Beyond Exact Match

会议: ICLR 2026
OpenReview: https://openreview.net/forum?id=JjoTg34YiU
代码: https://github.com/AMD-AGI/FLy
领域: LLM效率
关键词: 投机解码, 宽松验证, 熵门控, 自纠正, 训练无关

一句话总结

针对标准投机解码"精确匹配"会误杀语义正确草稿的问题,FLy 用目标模型自身的熵和"自纠正"行为,无需任何训练就放行措辞不同但语义等价的 token,在保持 ≥99% 精度的同时把 Llama-3.1-70B 平均加速 2.81×、405B 加速 5.07×,且在分布外任务上比训练式的 EAGLE-3 快 1.62×。

研究背景与动机

领域现状:投机解码(Speculative Decoding, SPD)是当前给大模型推理提速的主流手段——让一个轻量草稿模型一次性顺序提出多个候选 token,再由大目标模型并行验证、接受其中与自己预测一致的部分。它在数学上能保证不改变目标模型的输出分布,又能显著提升吞吐。

现有痛点:标准 SPD 的验证规则是"精确匹配"——草稿 token 只有与目标模型在该位置的 argmax 完全相同才被接受,一旦不同就从该位置起把后面全部丢弃。这条死板规则会误杀大量"措辞不同但语义完全正确"的续写。已有研究(Bachmann et al., 2025)发现,即便是高质量草稿(如人写文本),在这套规则下接受率也很低。随着草稿模型越来越强,这种"一字不差才放行"的瓶颈越来越明显。

核心矛盾:要放宽验证,就得有办法判断"草稿与目标不一致"到底是真错还是只是换了个说法。代表性的宽松方案 JudgeDecoding 训练了一个辅助分类器来判断草稿 token 在上下文里是否有效,效果不错,但需要精心标注的训练数据,且这个有监督分类器在跨域(OOD)时泛化很差——一旦换了任务分布就容易判错。于是"宽松"与"鲁棒/低成本"之间形成了矛盾。

本文目标:在不训练任何额外模块、不收集任何数据的前提下,让验证器学会接受语义正确的不一致草稿,并且天然对分布漂移鲁棒。

切入角度:作者观察到一个关键性质——当 LLM 被喂入一个真正错误的 token 时,它在后续生成中往往会表现出"自纠正"(self-corrective)行为试图把话拉回来;而当面对的只是措辞不同但语义等价的 token 时,它会顺势继续往下写、不再发散。这个性质完全来自目标模型自己,不需要外部裁判。

核心 idea:用目标模型自身的"熵 + 后续是否自纠正"来替代外部分类器,做一个两级判定——熵门控先区分"该位置是否允许多个合理候选",延迟窗口再观察目标模型在随后几步是否继续发散,从而无训练地放行语义正确的草稿。

方法详解

整体框架

FLy 只改 SPD 的验证策略,不动草稿/目标模型本身,因此是即插即用、模型无关的。一轮 SPD 里,草稿模型提出 \(K\) 个 token,目标模型一次前向并行打分;标准 SPD 在第一个不一致位置就截断。FLy 的做法是:在每个不一致位置 \(j\) 上,先用熵门控判断这个位置是不是"本来就有多个合理候选",若是确定性位置(如算术里的某个数字)就按老规矩拒绝;若是模糊位置就进入延迟窗口,再往后看 \(W\) 个 token,用"目标模型是否继续发散"来最终裁定接受还是拒绝。由于放行了更多语义正确 token,平均接受长度 \(\tau\) 大幅上升,反过来又让草稿阶段成为新的瓶颈,于是 FLy 再叠加一个多级加速(MLA),用无参数的 PLD 把草稿生成也加速掉。

整个判定是"逐不一致位置串行过滤、取最早被拒位置"的流水线,pipeline 清晰,框架图如下:

%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
    A["草稿模型提出 K 个 token<br/>目标模型并行验证"] --> B{"出现不一致<br/>位置 j ?"}
    B -->|无不一致| G["全部接受 + bonus token"]
    B -->|有| C["熵门控<br/>算归一化熵 h_j"]
    C -->|"h_j < θ 确定性位置"| E["严格拒绝<br/>从 j 起全丢"]
    C -->|"h_j ≥ θ 模糊位置"| D["延迟窗口<br/>监控随后 W 个 token"]
    D -->|"窗口内无再发散"| F["接受 j 为语义正确续写"]
    D -->|"出现新的不一致 / 越界"| E
    F --> H["多级加速 MLA<br/>用 PLD 提速草稿阶段"]
    E --> H
    G --> H

关键设计

1. 熵门控:先用目标模型的不确定性筛掉"非黑即白"的位置

直接对所有不一致都做"宽松放行"是危险的——像算术里某一位数字这种位置,只有唯一正确答案,放行错的 token 会直接污染结果。熵门控就是用来挡住这类位置的。对每个不一致位置 \(j\),FLy 用目标模型在该位置已有的 logits(softmax 后的分布 \(p_{M_T,j}\))算一个归一化熵:

\[h_j = \frac{-\sum_{v\in V} p_{M_T,j}(v)\log p_{M_T,j}(v)}{\log |V|} \in [0,1]\]

\(h_j\) 大说明此位置有多个 token 几乎可以互换(如同义代词、可替换措辞),\(h_j\) 小说明目标模型强烈偏好它的 top-1(如算术数字)。门控以阈值 \(\theta\) 二分:\(h_j < \theta\) 记为 Strict,回退到标准 SPD、从 \(j\) 起全部拒绝;\(h_j \ge \theta\) 记为 Defer,把"拒不拒"的决定推迟给延迟窗口。这一步的关键在于它只读已经算好的 logits、不增加任何前向,所以开销可忽略(实测每轮仅 0.45–0.57ms),却能把"换个说法也合理"和"只能有唯一答案"两类位置干净分开,避免在确定性位置上误放行而破坏精度。

2. 延迟窗口:用目标模型自己的"自纠正"行为裁定语义对错

熵高只说明"此处允许多个候选",但具体这个草稿 token 是不是真的语义正确,还得验证。FLy 的判据是论文最核心的观察:喂入语义错误 token 时目标模型会试图纠正、从而在随后生成里再次发散;喂入语义等价 token 时它会顺势继续、不再发散。于是在 Defer 的不一致位置 \(j\),FLy 向后看一个长度 \(W\) 的窗口,统计窗口内的不一致数 \(N_W(j)=\sum_{i=j+1}^{j+W}(1-\Delta_i)\),裁定规则为:

\[\text{DeferDecide}(j)=\begin{cases}\text{Accept}, & h_j\ge\theta,\; N_W(j)=0,\; j+W\le K\\ \text{Reject}, & \text{否则}\end{cases}\]

也就是:若往后 \(W\) 个 token 都不再发散(\(N_W(j)=0\)),说明目标模型认可了这个续写、第一个不一致 token 被判为语义正确而接受;若窗口内又冒出新的不一致,说明模型在"纠错"、于是回溯拒绝位置 \(j\) 及其之后。还有一个边界情形:\(j+W>K\) 时窗口长度不够,FLy 保守地直接拒绝该位置(只丢掉末尾少量 token,代价极小),以稳住精度、保持实现简单。整轮最终接受数 \(s_{\text{FLy}}=\min\{s_{\text{gate}}, s_{\text{defer}}\}\) 取最早被拒位置决定,多轮平均得到平均接受长度 \(\tau\)。这套机制不需要任何外部裁判模型,判据完全长在目标模型身上,因此天然不受训练数据分布的限制。

3. 多级加速(MLA):把放长草稿带来的草稿端开销也压下去

放行更多语义正确 token 让 \(\tau\) 大幅变长,意味着草稿每轮要提出更多 token(\(K\) 更大),草稿模型自回归生成的成本随之上升,反而盖过了被压缩的目标验证成本,成为新的端到端瓶颈(Table 1 显示草稿耗时数倍于目标验证)。标准 SPD 只加速目标模型,对此无能为力。MLA 的思路是:对草稿阶段再套一层投机加速。为了不破坏 FLy 的"无训练、跨域泛化"特性,作者特意选了无参数、即插即用的 Prompt Lookup Decoding(PLD,一种基于 n-gram 检索的极快草稿方法)来给草稿提速,避免引入需要训练的小模型带来的额外偏置。MLA 与验证策略正交,专门解决"草稿端变成瓶颈"这一在本方法下被放大的问题——这正是 FLy 因为能安全提出超长草稿序列而独有的副作用,在标准 SPD 里瓶颈通常在目标验证侧、并不需要它。

一个完整示例

以论文 Figure 2 的例子走一遍:prompt 问"什么是过拟合现象"。草稿模型续写到某处给出 token it,目标模型 argmax 是 ,(标点)——出现不一致。先看熵门控:此处目标模型有多个合理续法(标点或代词都通),\(h_j \ge \theta\),记 Defer,进入窗口。延迟窗口监控随后 \(W=6\) 个 token,发现草稿与目标重新对齐、不再发散,于是判定 it 是语义正确的续写、接受。换一种情形:若某不一致位置后目标模型立刻又冒出第二个不一致(模型在纠错),则该位置被回溯拒绝。最终 FLy 放行的语义有效续写明显多于标准 SPD(后者在第一个不一致就截停),\(\tau\) 从个位数升到十几。

实验关键数据

模型:草稿用 Llama-3.1-8B-Instruct,目标用 Llama-3.1-70B / 405B-Instruct;对比 EAGLE-2/3(训练式)和 SpS、REST、TokenRecycling(训练无关)。默认 \(W=6\)\(\theta=0.3\)\(K=15\)(70B)/ \(25\)(405B),跑在 AMD MI355X 上。

主实验(OOD 加速比,T=0,部分摘录)

目标模型 方法 训练 ACP-prog NIAH-multi MGSM(均) Mean Speedup Mean τ
Llama-3.3-70B EAGLE-3 1.52× 2.15× ~1.5× 1.56× 2.50
Llama-3.3-70B FLy 1.88× 3.34× ~2.5× 2.53× 11.35
Llama-3.1-70B SpS 1.69× 3.33× ~1.7× 2.04× 10.91
Llama-3.1-70B FLy 2.02× 3.57× ~2.7× 2.74× 12.41
Llama-3.1-405B FLy 2.72× 4.07× ~5× 4.80× 17.13

在 OOD 上,训练式 EAGLE-3 严重退化(ID 3.83× → OOD 1.56×),FLy 用 Llama-3.3-70B 反超 EAGLE-3 达 1.62×(T=0)/ 1.77×(T=1);优势随模型变大而扩大,405B 上达 4.80×。

ID 加速比(T=0,部分摘录)

目标模型 方法 训练 GSM8K HumanEval MBPP Mean Speedup Mean τ
Llama-3-70B EAGLE-2 2.54× 2.56× 2.61× 2.57× 3.96
Llama-3-70B FLy 2.94× 2.60× 2.53× 2.69× 11.87
Llama-3.3-70B EAGLE-3 3.72× 3.97× 3.80× 3.83× 5.61
Llama-3.1-405B FLy 4.61× 5.15× 6.26× 5.34× 17.14

ID 上 FLy 70B 平均 2.88×(含 SpS/REST 对比组),超过训练式 EAGLE-2 1.05×;略逊于重度优化的 EAGLE-3,但对一个免训练即插即用方法属合理。405B 上 5.34× 大幅领先所有 baseline,且 405B 规模下 EAGLE-3 这类训练式方法常因训练成本过高而没有官方模型可用。精度方面,FLy 在各数据集/规模上 recovery 均 >99%,与训练式宽松方法 JudgeDecoding 持平。

消融实验

配置 Speedup τ Recovery(%) 说明
W=0(窗口禁用) 3.42× 15.59 93.7 全放行,最快但掉精度
W=4 2.91× 13.27 97.9 略快、略掉精度
W=6(默认) 2.86× 12.61 100 完美恢复
W=8 2.61× 11.96 100 过严,τ 和加速都降
θ=0(门控禁用) 2.98× 12.76 97.7 全 defer,伤精度
θ=0.3(默认) 2.86× 12.61 100 强加速 + 完美恢复
θ=1 1.64× 9.89 100 全拒绝,退化为标准 SPD
w/o MLA 2.69× 仅加速目标
w/ MLA 2.86× 草稿端再提速

关键发现

  • 窗口与门控各管一头\(W\) 控"接受得有多激进",\(W=0\) 最快但 recovery 仅 93.7%,\(W=6\) 把 recovery 拉回 100% 且只损失少量加速;\(\theta\) 控"哪些位置允许宽松",\(\theta=1\) 时方法退化回标准 SPD(τ 9.89),说明两级机制各自不可或缺。
  • K 有甜点:τ 随 \(K\) 单调增(K=25 时 τ=18.56),但加速比先升后降——因为未被接受的 \(K-\tau\) 个草稿 token 成本会反噬;故 70B 用 K=15、验证更贵的 405B 用 K=25。
  • MLA 确有增量:2.69×→2.86×,验证"把草稿阶段也加速"在 τ 变长后是真瓶颈。
  • 草稿大小非单调:1B→8B 中 τ 单调增,但 8B 综合最优(加速 2.86×、recovery 100%),因更大草稿自身算力成本也上升。
  • 跨模型即插即用:Qwen2.5-Coder-0.5B 配 Mistral-Large、DeepSeek-R1-Distill 系列互配等三组异构组合都达 1.85×–3.54× 加速且 recovery >99%,无需重训。

亮点与洞察

  • 把"裁判"从外部模型搬回目标模型自身:JudgeDecoding 需要训练分类器,FLy 用"熵 + 自纠正"两个完全来自目标模型的信号替代,既省掉数据/训练,又因为不依赖任何训练分布而天然抗 OOD——这是它在 OOD 上反超 EAGLE-3 的根本原因。
  • 零额外前向:熵直接从已有 logits 算出,判定逻辑几乎不增加计算(每轮 <0.6ms),这让"宽松验证"几乎白拿。
  • 发现并修补了宽松验证的副作用:放行越多 → τ 越长 → 草稿端越成瓶颈,作者没有止步于验证策略,而是顺势补了 MLA(且坚持用无参 PLD 不破坏免训练特性),把这条因果链闭环。
  • 可迁移思路:"用模型后续是否自纠正来反推前面输出对错"这一信号,可迁移到草稿质量评估、幻觉检测、自一致性校验等需要"无监督判对错"的场景。

局限与展望

  • 保守边界规则\(j+W>K\) 时直接拒绝,意味着窗口越大、末尾越多位置无法享受宽松放行;窗口与 \(K\) 的耦合限制了极长草稿下的收益上限。
  • "自纠正"假设的边界:方法成立的前提是"喂错 token → 目标模型会发散纠错"。对那些被错误 token 误导后仍能"将错就错"顺畅续写的情形(模型本身不够强或上下文歧义大),延迟窗口可能误判,论文未深入分析这类失败模式。
  • 超参虽固定但仍是经验值\(W=6\)\(\theta=0.3\) 在全实验通用且无需重调是卖点,但这组值的最优性更多由 HumanEval 等少数数据集上的消融支撑,跨任务是否始终最优缺乏理论保证。
  • 精度"≥99%"非严格无损:作为宽松 SPD,输出与原目标模型不再逐 token 相同,对要求严格分布一致的场景需谨慎。

相关工作与启发

  • vs 标准 SPD(SpS 等):标准 SPD 精确匹配、可证明无损分布,但误杀语义正确草稿、τ 低;FLy 牺牲严格无损(换来 ≥99% recovery),用熵门控+延迟窗口把 τ 从个位数拉到十几,加速显著更高。
  • vs JudgeDecoding(训练式宽松 SPD):两者都想放行语义正确草稿,JudgeDecoding 训练外部分类器、需标注数据且 OOD 脆弱(去掉代码训练样本后 HumanEval recovery 从 99.4% 掉到 92.3%);FLy 免训练、判据长在目标模型上,OOD 鲁棒且即插即用。
  • vs EAGLE-2/3(训练式 SPD):EAGLE 系列训练辅助预测器,ID 上加速很强(EAGLE-3 ID 3.83×)但 OOD 严重退化(1.56×),且 405B 规模训练成本过高常无官方模型;FLy ID 略逊 EAGLE-3、却在 OOD 反超 1.62×,并能无成本支撑 405B。
  • vs 其他多级加速(基于量化/小模型的 mini-draft):以往多级加速依赖参数化 mini-draft;FLy 的 MLA 刻意选无参 PLD,保持训练无关与跨域泛化。

评分

  • 新颖性: ⭐⭐⭐⭐⭐ 用目标模型自身"熵+自纠正"无训练实现宽松验证,视角新颖且直击 OOD 痛点
  • 实验充分度: ⭐⭐⭐⭐⭐ ID/OOD、70B/405B、三组跨模型、全套超参消融齐备
  • 写作质量: ⭐⭐⭐⭐ 机制与公式清晰,图示直观;个别记号(边界情形)需对照原文
  • 价值: ⭐⭐⭐⭐⭐ 即插即用、模型无关、OOD 鲁棒,对大规模模型推理提速实用性强