大语言模型中的投机解码究竟是什么鬼?
今天有粉丝在 B 站私信问:大语言模型里的投机解码(Speculative Decoding)到底是怎么一回事?要把它讲清楚,得先从最基础的 Transformer 说起。
先看一个最简单的大语言模型——只有一层 Transformer、不涉及 MoE 的那种——是怎么工作的。我们输入一段提示词(prompt),第一步是 tokenization:tokenizer 把中文这类文字切成一个个 token。拿到 token 之后,还要去查 word embeddings 这张表,把每个 token 变成对应的向量。向量有了,就往下走 self attention 那一层,算出各个 token 与上下文之间的关系,接着过 FFN。顺带一提,现在常说的 MoE 其实就是在上层加一个路由、用专家池取代传统的 FFN,听不懂也不影响理解后面的内容。
FFN 出来之后还有一个 LM head。它本身很简单,就是一个线性变换:把主干 Transformer 最后输出的隐藏向量作为输入,做一次线性变换,再走一个 softmax 算出概率,判断词表里哪个 token 应该是下一个词。整条链路就是:输入 → Transformer → 隐藏向量 → LM head → 下一个 token。
那投机解码在哪一步?它并不在 Transformer 里面,而是和 Transformer 相互独立的。主干 Transformer 吐出隐藏向量后,这个向量会同时走两路:一路进 LM head,预测出下一个 token;另一路送进一串 MTP。MTP 是 Multi Token Predictor(多 Token 预测器)的缩写,你可以把它理解成一个很小很简单的大语言模型——它没有主干那样层层堆叠的 self attention,也没有复杂的注意力计算,输入就是主干给出的隐藏向量。
举个例子:原始输入是「我喜欢」,主干 Transformer 输出隐藏向量后,LM head 这边猜出的是「吃」;同一个隐藏向量再送进第一个 MTP,它预测出的下一个 token 可能是「苹」。接下来「苹」这个 token 会回到 word embeddings 表里查出对应的向量,再送进第二个 MTP,由它预测「果」;「果」再查表、再送进第三个 MTP,如此往复。
这里有个关键差别:第一个 MTP 拿到的向量是经过主干压缩、带着完整上下文信息的,所以它预测得比较准;但从第二个 MTP 开始,输入只是词表里单个 token 对应的向量,完全没有上下文信息。这意味着越往后预测越容易走歪、越容易产出无效结果。
所以这一串预测出来的 token 必须串起来送回主干做校验。比如猜出「我喜欢吃苹果和吃河马」,主干一看「和吃河马」不对,就把它丢掉,只保留「我喜欢吃苹果」,再重新走一遍完整流程继续往下预测。这就是投机解码的基本原理:一次不再只预测一个 token,而是一次预测一串——对了大部分,效率就大幅提升;错了,无非丢掉重来。







