微信扫一扫,关注公众号

  • 科技行者

  • 算力行者

见证连接与计算的「力量」

首页 让大模型思考得更慢,答案反而更准:PreSTO如何给采样过程"抄近道"

让大模型思考得更慢,答案反而更准:PreSTO如何给采样过程"抄近道"

2026-11-10 09:31
分享至:
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-
2026-11-10 09:31 • 科技行者

你可能听说过一个说法:大模型只要多想一会儿,答案就会更靠谱。这背后有个专门的做法,叫"功率采样",原理是把模型原本的概率分布做一次"提纯",让它更倾向于说出自己最有把握的话。听起来像是免费的午餐,不用重新训练模型,只靠采样策略的调整就能让推理能力逼近专门做强化学习训练的效果。

但这顿午餐并不便宜。

执行这套功率采样的核心算法叫PowerMH,用的是统计学里历史悠久的Metropolis-Hastings方法。问题是,它慢得让人绝望。研究团队在LCB V6这个代码生成测试集上用Qwen3.5-9B模型测过,PowerMH跑一次要比普通的低温采样慢6.5到18.4倍。在MATH500数学题测试集上,它生成的token数量能达到普通采样的8.8倍。换句话说,你想要更聪明的答案,就得忍受近20倍的等待时间。

这就是本文要解决的问题:有没有办法让这个采样过程不这么磨叽,同时保证它给出的答案分布完全不变?

论文给出的答案叫PreSTO,一种预测性子树预取方法。它不改采样算法本身,也不碰模型,只是优化了"生成候选答案"这一步的调度方式。在七个数据集、五个基础模型上的测试里,PreSTO让PowerMH平均快了1.71倍,让它的两个改进版本EntropyCut和MultiTryMH分别快了1.91倍和2.33倍。

这篇论文有意思的地方不在于又造了一个更快的新算法,而在于它精确地指出了慢在哪里,然后用一种近乎"偷懒"的方式把这部分浪费找回来。

为什么MH采样天生就是个慢性子

要理解PreSTO在干什么,得先搞清楚PowerMH是怎么工作的,以及它为什么慢得这么有规律。

**功率采样的核心想法是把基础模型的概率分布做指数放大。**

基础模型分布:指大模型本身在没有任何额外调整时,对每种可能的回答所赋予的概率。记作p?。功率采样把这个分布整体提高到α次方(α大于1),得到一个新的"更尖锐"的分布,专业说法是π_α正比于p?的α次方。

直觉上这是在做什么?想象一群学生做同一道题,有人写得条理清晰、步骤严谨,有人瞎蒙乱猜。p?本身已经会给好答案更高的概率,但功率放大之后,这种差距被进一步拉大,好答案的概率被推得更高,差答案被压得更低。这跟强化学习训练追求的效果很像,所以直接从这个分布里采样,理论上不用训练也能达到接近的效果。

问题是,这个π_α没法直接采样。因为要计算一个具体答案序列的准确概率,你得知道它后面所有可能续写方式的加权和,这个计算量随着序列长度指数爆炸,完全不现实。

于是PowerMH选择用Metropolis-Hastings这种经典的马尔可夫链蒙特卡洛方法来绕过这个难题。它不需要算出π_α的精确值,只需要能算出两个候选答案之间的概率比值就行。具体做法是分块进行:先用模型生成一整段候选续写,然后反复做"改写-接受/拒绝"的循环。每一轮,随机选一个截断点,保留截断点之前的内容,从截断点之后重新生成一段新内容,构成一个新候选答案,再用MH接受规则判断是接受这个新候选还是维持原样。

这个接受规则本身写成公式挺吓人,但本质很简单:如果新候选答案在基础模型眼里"显著更像一句好话",就大概率接受;如果更差,就大概率拒绝。整个过程反复做K次,理论上序列最终会收敛到那个尖锐分布π_α上。

**问题就出在"反复做K次"这五个字上。**

每一次MH更新都依赖上一次的结果。你必须先知道这次的候选被接受了还是被拒绝了,才能确定下一轮改写是从哪个状态开始的。这意味着你没法提前并行生成多轮候选,只能老老实实一轮接一轮地调用模型。K等于100的话,就要串行调用模型100次。

这就像排队买奶茶,前面的人点完单、付完钱、拿到奶茶离开之后,下一个人才能开始点单。哪怕柜台后面站着十个店员,这种严格的"一个接一个"的流程也没法让十个店员同时服务十个顾客,因为后面的人根本不知道自己该点什么,得等前面的人走了、腾出空位才能开始。如果强行让后面的人提前准备,但又不知道前面点单结果会不会影响菜单(比如某款饮料卖完了),这种提前准备就可能白费。PowerMH面临的正是这种困境:MH链的下一步依赖上一步的接受/拒绝结果,看似没法提前准备。

PreSTO要做的,就是想办法打破这种"必须等前面结果出来才能动手"的假象。

把未来的所有可能性画成一棵树

PreSTO的核心洞察其实很简单:虽然你不知道这一轮的候选会不会被接受,但你可以同时把"被接受"和"被拒绝"这两种情况下,接下来该做什么准备工作都提前做好。

论文把这个想法用一棵树来表示。想象从当前状态出发,MH接下来要做K次判断。每一次判断只有两个结果:接受新候选,或者拒绝维持原状。这些可能性连起来,正好构成一棵深度为K的二叉树。树的每个节点代表一次判断,左边的分支是接受,右边的分支是拒绝。而实际跑出来的那条链,不管结果如何,一定对应这棵树里从根到某个节点的一条路径。

PreSTO的做法是:既然未来的路径已经被这棵树完整地枚举出来了,那就提前把树里足够多的候选答案一次性批量生成出来,然后再沿着实际走出的那条路径,用原始的MH接受规则逐一判断、逐一前进。

这里有个关键的技术细节值得展开讲。前面提到MH每一步是"保留截断点之前的内容,重新生成截断点之后的内容"。那是不是意味着,如果你不知道上一轮是否被接受,你就不知道这一轮该从哪个前缀开始生成?

论文想出了一个很巧妙的办法绕过这个限制,叫条件1。

**条件1的核心逻辑是:如果新一轮的截断点比上一轮的截断点更靠前(也就是截断得更早),那么新一轮生成所需要的前缀,其实根本不依赖上一轮的结果是否被接受。**

为什么?因为不管上一轮的候选最终是接受还是被拒绝,只要新截断点在旧截断点之前,这段共同的前缀在两种情况下都是一模一样的。既然前缀一样,那这段生成就可以提前做,不需要等上一轮的判断结果出来。

这就好比两个人在同一张草稿纸上接力写作文,第一个人负责写到第五段,第二个人接着往下写。如果第二个人决定要改写的部分是从第三段开始的(比第一个人写的范围更靠前),那他根本不用关心第一个人到底有没有把第五段写完或者改没改,他直接从第三段那里动笔就行,因为第三段无论如何都在那儿,不会受后面内容变化的影响。这种"向前兼容"的特性,让PreSTO能够在不知道具体接受/拒绝结果的情况下,把一批满足条件的候选续写全部批量生成出来。

把满足条件1的请求收集起来之后,PreSTO用广度优先搜索(BFS)的方式遍历这棵树,最多收集N_pf个请求组成一批,一次性交给模型服务引擎(比如vLLM或者SGLang)生成。这些请求里有很多共享相同的前缀,现代推理引擎支持前缀缓存,相同前缀的计算结果可以复用,不用重复算。

生成完之后,PreSTO再从树根出发,沿着真实的接受/拒绝概率走一条路径,这条路径对应的就是实际发生的MH链轨迹。这里论文给出了一个数学证明,叫命题1,证明了只要每个决策点用的随机数和原始PowerMH采样时用的分布完全一致,那么PreSTO走出来的轨迹和老老实实串行跑PowerMH得到的轨迹,在概率意义上是完全等价的。

这意味着什么?意味着PreSTO不是一个近似算法,它不会让采样结果产生偏差,只是把本来要串行完成的多轮计算打包成了一次并行计算。

一次调用能顶几次用,要看树长什么样

批量生成是解决了"能不能提前准备"的问题,但还有个更实际的问题:一次批量调用里,到底能完成几轮真实的MH转移?

如果一次能完成5轮,那相当于把原本5次串行调用压缩成了1次,速度自然快。但如果平均只能完成1.5轮,那批量生成的大部分工作都白费了,反而因为每次调用变得更"重"(要同时处理多个候选),总时间说不定还更长。

论文在这里做了一个很有意思的观察。他们发现,在功率采样这个具体场景下,MH链走到一棵树深处的概率,大部分时候是极端的,要么几乎百分之百接受,要么几乎百分之百拒绝,很少停留在"五五开"的不确定状态。

论文给这个现象起了个名字,叫ε-确定性。设定一个很小的阈值ε(论文里用0.01),如果某个节点的接受概率大于等于1减ε,就说这是"ε-确定接受";如果接受概率小于等于ε,就是"ε-确定拒绝";剩下的叫"ε-不确定"。论文对七个数据集都做了统计,发现有67%到95%的决策都是ε-确定的,剩下只有一小部分是真正摇摆不定的。

这个现象背后的原因并不难理解。功率采样本身的设计目的,就是要把基础模型眼里"明显更好"的续写和"明显更差"的续写拉开差距。既然目标分布本身就追求极端化,那MH在这棵树上走的时候,自然也会呈现出极端化的接受/拒绝模式,好的候选几乎一定会被接受,差的候选几乎一定会被拒绝,真正模棱两可的情况反而是少数。

这个发现带来一个很直接的推论:**如果大部分节点的走向其实是可以提前预判的,那默认的广度优先遍历其实在浪费预算。**

因为BFS是不管三七二十一地往下展开树,不考虑某个分支到底有多大概率真的会被走到。打个比方,这就像你去一个陌生城市旅行,提前规划路线的时候,BFS式的做法是把地图上所有岔路口都标出来并且提前查好周边信息,哪怕其中九成的岔路口你这次根本不会走过去。而如果你能大致判断出哪条路是主干道、哪些是死胡同,你显然应该把精力花在主干道沿途的信息上,死胡同根本不值得查。如果不这样聪明地分配精力,你会发现自己辛辛苦苦查了一大堆用不上的资料,真正该重点关注的那条路反而因为预算耗尽没查透彻。

论文据此设计了一个预测性遍历规则,来替代默认的BFS。

这个规则的实现思路是,在真正生成候选答案之前,先用一个轻量级的三分类逻辑回归模型,根据截断点在序列中的相对位置这个简单特征,预测每个候选节点属于"确定拒绝""确定接受""不确定"这三类的概率。再把这三类概率转换成一个预测的分支概率。有了这个预测之后,PreSTO用动态规划的方式,在给定的预算下选出一组预期能完成最多MH转移次数的候选请求去生成,而不是像BFS那样机械地逐层展开。

**这里的关键权衡在于,预测不可能完全准确,但即便是一个粗糙的预测,也比完全不做预测、平均分配预算要好。**

论文给出了一个理论依据,叫做取中点估计。既然某个节点属于不确定类时,真实接受概率落在ε到1减ε之间,那么与其费力去估计具体数值,不如直接取这个区间的中点作为估计,这样在最坏情况下的误差是最小的。这是一个很朴素但很稳健的工程选择:**与其追求一个可能出错的精确预测,不如选择一个保证误差上界最小的粗糙预测。**

效果如何?论文在LCB V6配Qwen3.5-9B这个组合上专门做了对比。在五个不同的预算设置下,预测性遍历规则比默认BFS快了1.25到1.37倍,在100组提示词-预算的组合里,有98组是预测规则更快。背后的原因是,预测规则平均每次调用能多完成19%到33%的转移次数,这意味着总共需要的调用次数减少了1.19到1.33倍。

数字背后:速度提升到底从哪儿来的

读到这里,你可能会好奇,这套方法到底能带来多大的实际提升,是那种"理论上更快但实际感知不出来"的提升,还是真金白银的时间节省?

论文给出的核心数据很扎实。在105个"采样算法-基础模型-数据集"的组合测试里,PreSTO没有一次比原始方法慢。中位数意义上,它让PowerMH快了1.71倍,让EntropyCut(一种用token熵来选截断点的改进版PowerMH)快了1.91倍,让MultiTryMH(一种每轮尝试多个候选的改进版)快了2.33倍。

有一组数据特别能说明问题,是在LCB V6配Qwen3.5-9B这个具体场景下的细致拆解。原始PowerMH完成100次MH转移,平均要花539秒,调用模型100次,每次调用大概5.4秒。换成PreSTO之后,同样完成100次转移,只要375秒,调用次数降到大约20次,但每次调用变成了18.5秒左右,因为每次调用要同时处理一批候选。

这个对比揭示了一件很直观的事:**PreSTO的加速来源,几乎全部来自"减少调用次数",而不是"让单次调用变快"。**

事实上单次调用反而变慢了,因为要批量处理多个候选,这是意料之中的代价。但只要减少调用次数带来的收益,能覆盖住单次调用变慢的代价,总时间就能降下来。论文用了一个很清晰的数学分解来说明这件事:总体加速比等于"调用次数减少的倍数"除以"单次调用变慢的倍数"。在PowerMH这边,调用次数减少的幅度(1.94到4.92倍)远远压过了单次变慢的幅度(1.90到2.42倍),所以净效果是加速的。而在EntropyCut和MultiTryMH那边,情况正好反过来,起决定作用的主要是单次调用时间的变化,因为这两个算法原本每一步本身就更昂贵(EntropyCut要算token熵,MultiTryMH要同时给多个候选打分),用PreSTO批量处理之后,单步变慢的幅度反而比较小,甚至在MultiTryMH上,批量处理后单次调用时间不升反降,因为批处理省掉了原本重复的打分开销。

这里可以做个类比,想想工厂里的流水线。原始PowerMH像是一个工人,一次只搬一箱货,走一趟搬一箱,来回跑了100趟。PreSTO像是换成了叉车,一次能装二十箱,但开叉车比空手走路慢一点,装卸也要花时间。如果叉车一次真能稳定拉二十箱走,那总时间肯定远远少于空手跑100趟;但如果叉车每次只能装两三箱就得停下(因为路上大部分箱子都堆在角落里够不着,类比预算浪费在MH很少走到的节点上),那叉车的优势就大打折扣了。这正是为什么论文要专门设计预测性遍历规则,它就是在想办法让叉车每趟都能真正多装货,而不是拉着空气来回跑。

论文还专门验证了一件很重要的事:PreSTO加速之后,生成的答案质量有没有受影响?毕竟如果为了快而牺牲了答案质量,那这个加速就没有意义。

验证方法是比较PreSTO和原始方法跑出来的最终答案,在基础模型p?打分下的"对数似然"和"置信度"这两个统计量的分布是否一致。论文用了一种叫TOST的等价性检验(Two One-Sided Tests,两次单侧检验),专门用来统计学意义上证明"两组数据的差异小到可以忽略",而不是传统假设检验那种只能证明"有没有显著差异"的思路。在38组对比里,有29组通过了等价性检验,说明绝大多数情况下PreSTO确实没有系统性地改变输出分布,这跟命题1的理论证明是吻合的。

那十几种没有通过的个例,论文也诚实地指出了,比如在AIME这个数据集上的两个统计量都没通过,MATH500上的置信度也没通过。这种坦诚挺难得,没有把所有数字都包装成完美无缺,而是老老实实地报告了哪些情况下理论上的"分布一致"在有限样本下没能严格体现出来。

和其他加速思路的对比

PreSTO不是唯一一个想让功率采样变快的尝试。论文花了不少篇幅梳理了周边的工作,大致可以分成四类。

第一类是换采样器,比如用序贯蒙特卡洛(SMC)或者副本交换这种方法替代MH本身,这类方法通常需要维护一堆并行的粒子,内存开销比较大。第二类是对目标分布做近似,减少每一步的计算量。第三类是改进候选生成的方式,比如EntropyCut用token熵来选截断点,让每次改写更有针对性。第四类是直接改目标或者改训练方式,比如把模型蒸馏成一个本身就输出尖锐分布的新模型,这样推理时就不需要额外的采样开销了,但代价是要重新训练。

PreSTO的定位很特别,它不属于这四类中的任何一个,它既不换采样器,也不改目标分布,更不碰模型本身,它改的是候选生成的调度方式。这是一种很"克制"的设计哲学:只要能证明不改变采样结果,就有空间去优化执行效率,而不需要承担近似误差或者重新训练的代价。

论文里还专门对比了一下和"测试时计算投入"相关的几个经典做法,比如低温采样(只生成一个样本)、best-of-N(生成N个样本挑最好的一个)、还有PowerSMC(用粒子滤波的思路逼近功率分布)。这几种方法在显存占用上的表现很值得玩味。best-of-N和PowerSMC因为要同时维护多个候选或多个粒子,显存占用会随着候选数或粒子数线性增长,best-of-32时显存峰值能达到池子容量的12.7%。而PreSTO因为批量大小被预取预算N_pf限制住了(论文默认用20),显存峰值稳定在2.9%到3.1%之间,跟best-of-8差不多。这说明PreSTO虽然没有把速度做到和低温采样一样快(低温采样毕竟只需要生成一次),但它在"保持MH采样理论保证"和"控制资源开销"之间找到了一个相对平衡的位置。

树是怎么长出来的:一个具体的例子

抽象的算法描述可能不够直观,论文附录里给了一个完整的树形结构日志,挺值得拿出来讲讲,因为它能让"预取子树"这个概念从公式变成一幅实际的画面。

论文展示的这棵树里,节点0代表当前状态,它的截断点在位置1024(也就是整个序列的末尾,表示还没开始截断)。节点1是节点0的接受子节点,截断点在1020,意味着几乎保留了整段序列,只改写了最后几个token。这个接受决策的对数MH比率接近0,意味着这个候选几乎百分之百会被接受,这正是前面说的ε-确定接受的典型例子。

再往下看,节点3是节点1的接受子节点,截断点在535,意味着这次改写了序列后半段将近一半的内容,对应的对数比率高达18.5,换算成接受概率几乎是百分之百。这两步连续的"确定接受",让实际采样时走出的路径正好是0到1再到3,两次转移全部命中ε-确定区域,完全符合论文统计出的那个规律:绝大多数决策点其实是可以提前预判的。

如果你把这棵树完整展开来看,会发现它一共收集了16个候选请求,但其实有20个名额的预算。少掉的4个是因为它们依附在某个"违反条件1"的节点的拒绝分支下面,也就是说,这些请求所在的位置,MH链在这一批次里根本走不到那里,所以干脆没有生成,省下了算力。

这个细节其实很说明问题:PreSTO的"预取"不是盲目地把树的所有角落都填满,它有一套明确的规则(条件1加上预算约束)来决定到底该把力气花在哪儿。这跟前面提到的那个"查地图"的类比是一致的,花精力提前查的,应该是真正有可能走到的那部分路线,而不是整张地图的每一个角落。

写在后面

读完这篇论文,有一个细节让我反复琢磨:整篇论文里最硬核的理论贡献,命题1的证明,其实只用到了MH算法两个最朴素的性质:每个决策点用的随机数独立同分布,以及接受规则本身是精确的。证明本身没有用到任何关于功率分布π_α的特殊性质。这意味着PreSTO这套预取框架,理论上可以不费力地套用到其他基于MH的文本生成方法上,不管目标分布长什么样。论文里也确实提到了这一点,这个证明思路可以直接延伸到MultiTryMH这种改用多候选提议的变体上。

另一个值得单独拿出来说的地方,是论文在附录里非常坦诚地报告了那四个没能跑通的"5个设置下加速低于1.25倍"的场景,并逐一分析了原因,比如MBPP数据集上两个Qwen3模型的加速比明显偏低,是因为每次批量调用平均只能真正完成不到3次转移。这种把"失败案例"也摆出来分析的做法,比起只展示漂亮数字的论文,更让人信得过。

还有个地方挺触动我,预测性遍历规则用的分类器极其简单,只用了一个特征(截断点在序列中的相对位置),模型是最基础的逻辑回归,测试了更复杂的多层感知机之后发现效果反而没有明显提升。这其实是个挺朴素的工程教训:不是模型越复杂越好,关键是找对那个真正起作用的信号。这个信号本身,背后的原理是功率分布的本质,越靠后截断、改动范围越小,候选越容易被接受,这是从算法机制本身推出来的强先验,一个简单模型就足够捕捉它了。

如果让我追问一个这篇论文还没完全解决的问题,那大概是:预测性遍历规则目前只在LCB V6加Qwen3.5-9B这一个组合上做了完整测试,其他六个数据集和另外四个模型上的表现如何,论文没有给出。考虑到不同任务的截断分布可能差异很大(比如代码生成和数学推理的"关键决策点"分布特征可能完全不同),这个简单的分类器能不能在所有场景下都保持稳健,是个值得继续追问的问题。

Q&A

Q1:PreSTO是什么?

A:PreSTO是一种加速大模型功率采样的方法,通过把未来可能的接受/拒绝决策提前组织成一棵树,批量生成候选答案,再沿实际路径执行MH判断,在不改变采样结果的前提下显著减少模型调用次数。

Q2:PreSTO会不会改变模型最终生成的答案质量?

A:理论上不会,论文用数学证明了PreSTO的采样轨迹和原始PowerMH完全等价,实验中38组质量对比里有29组通过了严格的等价性统计检验。

Q3:PreSTO能带来多大的速度提升?

A:在105个模型与数据集组合的测试中,PreSTO平均让PowerMH快1.71倍,让EntropyCut快1.91倍,让MultiTryMH快2.33倍,且从未出现比原方法更慢的情况。

分享至
0赞

好文章,需要你的鼓励

推荐文章
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-