一句话定义:块扩散解码(Block Diffusion / 半自回归并行解码)是把输出序列切成若干固定大小的块,块内多个 token 并行“去噪”生成、块与块之间仍严格从左到右衔接的解码方式——介于逐 token 自回归和整段并行扩散之间的折中路线。
打个比方:像分组接力写稿。逐 token 自回归是“一个人一个字一个字写”;纯扩散 dLLM(diffusion language model)是“一群人同时把整篇稿子乱写一遍再一起改”。块扩散则是每组负责一段:段内几个人同时出草稿,互相看几轮、改几轮,改得差不多了就定稿封存;下一组只能看前面已封存的段,再开始写。段内可以“同时改”,段间必须“排队”。
机制上:每块开始时,块内位置先填成掩码(mask)或噪声,注意力掩码是块因果的——块内互相可见,跨块只能看见已提交的块。然后跑固定的 T 步去噪,每步按置信度把一部分位置“定稿”(unmask),其余留到下一步;块写满即提交,推进到下一块。极端情况很说明问题:块大小 B=1、步数 T=1 就退化为普通自回归;B 等于整条序列就是纯扩散。
KV 缓存怎么变:自回归每步只算一个新 token,缓存纯追加;纯扩散是双向注意力,任何位置一改,后面的缓存全部失效,缓存几乎白存。块扩散把缓存做成“按块提交”:已提交块的 KV 在所有去噪步里反复复用,只有当前块是“脏区”,每一步都要重算。于是显存里常驻的是历史块的 KV,当前块的 KV 反复刷新。
步数与速度:总前向次数约为 (序列长度 / B) × T,相对自回归的“长度”次,理论加速约 B/T。B 越大、T 越小越快,但块内并行去噪没有验证机制——这点和投机解码(speculative decoding)不同,后者是无损的——质量下滑得靠训练目标和采样策略补回来。
| 维度 | 逐 token 自回归 | 纯扩散 dLLM | 块扩散 |
|---|---|---|---|
| 生成顺序 | 严格逐字 | 全序列并行 | 块内并行、块间顺序 |
| KV 缓存 | 全复用 | 基本失效 | 历史块复用、当前块重算 |
| 前向次数 | 约 L 次 | 约 T 次(整段) | 约 (L/B)×T 次 |
| 质量风险 | 最低 | 连贯性偏弱 | 取决于 B 与 T |
对从业者的意义:这是一条调“延迟—质量”旋钮的路线。做推理服务时,要同时调块大小、每块步数、批处理策略;流式输出的粒度也变粗了,变成按块吐字,首字延迟和“出字顺滑感”都要重新评估。对普通用户而言,它不会是一个可见开关,只表现为“同类模型回答更快或更慢”。具体实现细节各家不同,以官方页面为准。
