专题研修

05|输出怎样被选中:采样、推测解码与停止条件

专题研修约 3.7 千字1 组分步图解

目标:能区分概率分布、解码算法和产品停止语义;能够推导推测解码的正确性,而不是只知道它“用小模型加速”。实验:numerics.speculative_sample。

本章目录

沿着对象与状态理解本章

采样、贪心和推测验证共享模型分数,却不共享选择规则。下图把每轮选择与下一轮输入分开。

下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。

动态图解 · F15

一次输入如何连着预测,直到结束

预测到的Token什么时候显示,什么时候成为下一轮输入?

生成像接一条未完的序列,但不是把整句想好再逐字揭幕。每一轮使用已有前缀产生下一项分布,选择一个Token,把它加入已生成序列,再进行下一轮。使用KV缓存时,程序只把尚未处理的新Token送入模型;历史并没有被丢掉,而是通过每层缓存参与计算。

Prefill处理已给定前缀;结束时即可选出第一个输出Token。
Decode处理刚选出的Token,并预测再下一个。
EOS结束Token;被选中后可停止继续生成。
贪心选择每次取最高分候选,不是概率抽样。

输入与适用条件:独立、可复算的微型模型:7项教学词表、4维表示、单层单头因果Attention、残差与tanh前馈;省略归一化和位置编码。输出头只用三条指定前缀拟合,目的是演示“学习→!→EOS”,不具有通用语言能力。完整参数与中间值随包提供。

1 / 10 · 输入是“我爱”,还没有输出

第1步,共10步

窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。

一次输入如何连着预测,直到结束:输入是“我爱”,还没有输出我ID 1爱ID 2本次待处理[1, 2]每层KV缓存长度0;尚未前向

本例教学分词得到[1,2]。这是一台极小的因果模型;下面的候选分数由程序计算,不是商业模型实测。

输入=[1,2];缓存长度=0

默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。

为什么需要

先区分已处理、已选出、待处理三种状态,才能正确实现生成与缓存。

怎样实现

循环中先前向、再选Token、判停止;未停止时只追加新Token作为下一次输入。

可能的代价与误解

把刚选出的Token算进缓存长度,会造成位置偏移、重复追加或漏算;更改模型参数还会让缓存失效。

如何判断是否做对

本图实际算出三轮选择[3,5,6],缓存长度[2,3,4];每轮与从头计算整个前缀的结果比较。

1. 概率最高的下一Token,不等于最好的完整答案

贪心选择每一步最大概率Token,不保证全序列概率最大,更不保证业务最优。语言模型概率描述条件下的续写分布;任务价值可能由外部测试决定。Beam Search维护多个部分序列探索高概率路径,但长度偏置、重复与开放式文本的目标不匹配,都需要考虑。不能因为一种方法在翻译任务中适合,就默认用于交互式编码Agent。

温度把logits除以τ,τ较小使分布更集中,较大使分布更平缓。它不是“错误率旋钮”,不会把缺少证据的答案变成事实。Top-k保留固定数量的候选;Top-p选择累计概率达到阈值的最小候选集合,再归一化。两者若同时应用,顺序和服务实现会影响实际分布,需查具体接口。

在约束输出中,解码器还可能屏蔽不符合语法的Token。这样能帮助满足结构约束,但有三层必须分开:字节能否解析、结构是否满足Schema、字段是否符合业务事实。一个合法JSON仍可以包含不存在的文件路径。[N17][N18]

2. 数值稳定与低概率事件

softmax中的减最大值避免指数溢出,却不会解决所有下溢或低精度舍入。若概率接近零,需要在对数域计算序列概率,避免直接连乘。不同算子融合、dtype和并行归约顺序可能让接近的logits排序变化,最终自回归放大成不同文本。这里不能推导出“结果不可复现,所以无需记录参数”;恰恰应记录模型/服务版本、种子支持情况、采样配置与环境。

评测多次运行时,不应把同一问题的十次回答当成十个独立业务场景。任务难度带来的相关性需要保留,第19章使用按任务配对的统计方法。单次低温成功尤其不能作为长期可靠性的充分证据。

3. 推测解码:接受与拒绝补偿

设目标分布p、草稿分布q,都在同一Token空间。先从q抽样候选x,以min(1,p(x)/q(x))接受。如果拒绝,再从归一化的max(p−q,0)残差分布采样。被接受的Token贡献概率为min(p(x),q(x));拒绝后补充恰好覆盖max(p(x)−q(x),0)。两部分相加恢复p。[N12]

接受质量 Ax = q(x) × min(1,p(x)/q(x)) = min(p(x),q(x))
总拒绝概率 R = Σx max(p(x)−q(x),0)
拒绝分支给x的质量 = R × max(p(x)−q(x),0)/R
两分支之和 = p(x)

这个一Token推导是本书实验验证的对象。完整多Token推测会先生成一段草稿,再用目标模型并行评估这些位置,顺序接受到第一次拒绝并补偿;若全部接受,可再生成一个目标Token。实现还要正确处理cache回退、截断、位置和批次,不能仅复制上述几行就称为完整高性能服务。

“保持分布”有条件:p与q必须是实际解码规则下的归一化分布,接受/残差计算正确。若目标使用Top-p而验证时用未截断的softmax,就不再是同一个p。草稿太差,拒绝过多,增加的计算可能超过节省。它提高的是计算调度效率,不是凭空让目标模型更聪明。

4. 实验读数与能证明的范围

speculative_sample用小词表、固定p/q和大量抽样,比较经验频率与目标概率。统计误差不应要求逐项完全相等;代码使用明确容差并固定随机种子便于复查。还应分别测试q=p、支持集边界、强错配分布。若永远直接接受草稿,经验频率应偏向q,构成负对照。

这次实验没有GPU,没有服务端批处理,更没有商业模型加速测量。因此只能证明接受/拒绝机制的教学实现与分布一致性,不能声称“推理速度提高几倍”。性能验证需要固定模型、硬件、序列分布、batch与端到端计时,并同时检查输出分布/质量。

5. 文本停止、响应完成与业务完成

生成停止可能因为EOS、停止字符串、最大输出Token、取消、网络中断、服务错误或工具调用交接。它们不是同一种“完成”。在API层,应读取响应状态、错误和输出项类型;在Agent层,应检查是否仍有待执行工具或未完成验收。[N17][N19]

例如模型返回finish_reason或相应状态表明因长度停止,最后几行看起来像总结,也不能视为任务成功。工具参数可能只生成一半,不能执行。网络流关闭也不证明服务已结束,因为客户端可能只收到了前缀。第07章给出截断SSE的真实解析测试。

一个稳健停止器需要同时满足:没有未决操作、验收结果对应当前工件版本、预算未迫使错误退出、用户目标已达到或限制明确报告。模型一句“完成了”只是一个声明;确定性程序至少应核验可验证部分。

6. 最佳实践不是固定采样参数

创意构思、精确配置生成、长链工具执行需要不同的候选多样性与验证方式。与其设一个永远适用的温度,不如先确定成功标准与失败代价,再在真实任务集上选择。允许小模型生成候选、大模型或测试挑选,必须计算完整候选成本,不能只统计最终一个回答。

对工具动作尤其要区分“生成多样性”与“副作用多样性”。可以生成多个方案并比较,但不能让每个方案都向生产数据库执行一次。候选探索应尽量发生在无副作用环境,真正提交前做授权与状态检查。

运行示例 · S05

同一概率表,核采样与贪心的可选集合不同

输入与条件。概率从高到低为[0.5,0.3,0.15,0.05],不做其他过滤。

步骤与对象内部动作中间结果 / 新状态
1贪心始终选第1项概率表并未转成文本,仍需查Token。
2Top-k=2保留前两项归一化后[0.625,0.375]。
3Top-p=0.9累计到第3项才达到0.95通常保留前三项并重归一化。
4核内概率除以0.95约[0.526316,0.315789,0.157895]。
5边界若实现先top-k再top-p候选集与顺序不同,需要记录生成配置。

把过程连起来。采样选项改变可选集合或概率,不是模型已经生成一句话以后再删字。

边界与反例。具体等于阈值的保留规则与最少保留项数依实现;本例声明累计越过阈值仍保留越过项。

依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。

7. 验收题与参考解答

为什么推测解码拒绝后不能直接从p重新采样?因为接受分支已经贡献了min(p,q),再按整个p补充会重复分配一些质量;正确补偿是正残差分布。证明应写出两条分支对每个Token的总概率,而不是用“看起来差不多”回答。

为什么JSON解析成功后仍要验证工具参数?因为解析只说明字符构成合法对象;路径是否越界、目标对象是否存在、权限是否允许、请求是否陈旧,都不由语法保证。解码与执行是不同可信边界。

记录保存在本机浏览器。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。