阶段 4 的扩散模型把「生成一张图」拆成了一千次「去掉一点噪声」。 那文本呢?文本是离散的——你没法给「猫」这个字加上 0.3 个噪声。 这一章讲清楚:这个障碍怎么绕过去,以及绕过去之后值不值。
今天所有主流语言模型都是自回归的:从左到右,一次一个 token, 每个新 token 都基于前面所有已生成的 token。
| 毛病 | 具体表现 |
|---|---|
| ① 严格串行 | 生成 1000 个 token 就要跑 1000 次前向。 即使有 KV cache 让每次前向很便宜,次数本身是省不掉的—— 因为第 501 个 token 必须等第 500 个算完 |
| ② 写出去就收不回 | 一旦某个 token 采样错了,这个错误永久留在上下文里, 后面所有内容都要基于它继续往下编。 这就是「一句错话带崩一整段」的机制 |
扩散是迭代式的,正好卡在这两条上:每一步能同时填很多个位置(并行), 后面的步骤也能把前面填错的位置改回来(可修正)——因为没有任何东西被"定死"。
自回归像用钢笔写字,不能涂改:一个字写错,只能将错就错写下去。
扩散像用铅笔先打草稿:先潦草地铺一层大形,然后一遍遍地擦掉重画,
从模糊到清晰。你可以回头改任何一笔。
代价是:打草稿本身要花时间——画得慢,但画得可以改。
这个类比管到「能不能回头改」为止:真实的每一步都是按整句的上下文算概率,不是随手乱涂;
而且有些错字它也擦不掉(第 4 节)。
演示 · 写 27 个字,两种范式各要等多久
演示 · 一个字写错,后面会怎样
这是整件事的技术核心,也是最反直觉的一步。 图像加噪声是 xt = √ᾱ·x₀ + √(1−ᾱ)·ε(t 是噪声进度,x₀ 是原图, ᾱ 是「还剩多少原图」,ε 是随机抽出来的噪声——详见《扩散模型》),像素值连续,可以插值。 文本做不到——「猫」和「狗」之间没有中间值。
一张图看懂为什么难 · 像素能插值,字不能
[MASK]。
加噪就是在越来越多的位置上盖住答案。互动 · 亲手把这句话加一遍噪(拖下面的横条)
因为 [MASK] 是一个明确的信号:「这里还没写,需要你填」。
而均匀扩散里,一个被随机替换成"的"的位置,
和原本就是"的"的位置长得一模一样——模型没法区分,
也就不知道该在哪里做修正。
这就是为什么今天几乎所有能跑的扩散语言模型都用掩码方案。
下面把两种生成过程放在一起跑。每一步都是真实的采样逻辑—— 自回归严格从左往右定死,扩散从全掩码开始逐步揭开。
互动 · 同一个句子,两种生成顺序
自回归(一次一个,从左到右)
掩码扩散(一次一批,顺序不固定)
把鼠标停在公式里的 τ 上——那根「采样温度」滑杆会亮;停在 T 上,推进步数的那两个按钮会亮。
你会看到它先在一些分散的位置上落子——有点像先搭骨架、再填细节。 这个顺序不是固定的,取决于每一步哪些位置的置信度(模型对「这里该填什么」的把握)够高。 所以同一个提示词跑两次,填充顺序可能不同,最终答案也可能不同——这一点和自回归很像,但机制完全不一样。
同一批位置互相冲突怎么办?——按置信度分批:够稳的先落定, 两个位置互相矛盾的,就都留到下一步再算(第 4 节那个互动里能看到什么叫「互相锁死」)。
这是扩散相对自回归唯一的结构性优势,也是它值得存在的理由。
互动 · 迭代修正是真的能改的
自回归:错了就只能错下去
扩散:后面的步骤会把它擦掉重写
这个能力在需要全局一致性的任务上特别值钱。变量名前后不一致,自回归发现时已经写完 200 行; 扩散可以在后续步骤统一改名。「写一首每行七个字的诗」,自回归字数是多了只能硬凑,扩散可以回头删。 填空和改写这类任务本来就是「给定上下文补中间」,和扩散天然契合,对自回归反而别扭。
互动 · 有些错字,是修不回来的
上面那根「修正阈值」是「多大把握才愿意改」的那条线,只控制模型什么时候敢改; 还有几个位置卡在天花板下面,怎么修都改不动。比如两个位置互相锁死——某处该填「是」,取决于后面会不会出现「吗」; 而后面那个位置又取决于前面填的是不是「是」。谁先落定都不对,这种互相依赖的地方,多修几轮也解不开。 「迭代修正」能改的是确定性高的错误,不是任意一处。
上面已经说完了「能并行、能改错」。但这两件事都有价格,而且价格能算出来—— 只需要三个数字:L(要写多长)、T(分几步写完)、N(模型多大)。 先说清最容易误会的一条:扩散不省参数量——LLaDA 8B 就是 80 亿参数(bf16 是 16 位浮点格式,每个数占 2 字节,约 16 GB), 和同规模的自回归模型一样,它换的是算法结构,不是规模。
演示 · 每个位置被重新算了几次
左边每个位置只被算 1 次(算完就进 KV cache 冻起来),右边每个位置被算 T 次。 所以扩散是「步数少,但每一步都要重新付钱」——前向次数少 ≠ 计算量少。
T 怎么定?步数少了质量撑不住,多了没有速度优势——本页这套模型里 20~50 步是常见区间, 序列越长,同样的质量通常需要越多的步数。
微型图解 · 每一步揭开多少个位置,是「调度」决定的
互动 · 扩散语言模型进化时间轴
| 模型 | 噪声类型 | 关键点 |
|---|---|---|
| Diffusion-LM 2022 | 连续(在词向量空间) | 第一个把连续扩散用在文本上的工作(离散/掩码扩散的源头是 2021 年的 D3PM)。 做法是先把 token 映射成连续词向量再加噪,最后投影回词表。能跑通,但慢且效果一般 |
| SEDD 2023 | 离散(分数熵扩散) | 提出 score entropy 损失,把连续扩散里的「分数匹配」(教模型估计「数据分布往哪个方向变高」)推广到离散空间, 补上了离散扩散缺的那块拼图(框架本身 2021 年的 D3PM 已经建好) |
| Plaid 2023 | 离散 | 用 10 亿参数的 Plaid 1B,在似然(模型给真实文本打的概率,越高说明它越拟合数据)上超过了 1.2 亿参数的 GPT-2,大幅缩小了扩散与自回归的差距。 离「同规模追平」还差得远,但第一次说明这条路不是死路 |
| LLaDA 2025 | 掩码 | 8B 规模的掩码扩散语言模型,开源, 在多项任务上和同规模自回归模型可比。让这个方法真正进入了「可用」的讨论范围 |
| Mercury 2025 | 掩码 | 第一个商用级的高速扩散语言模型, 在 GPU 上跑到每秒 1000+ token,是同期自回归模型的数倍 |
| Gemini Diffusion 2025 | 未公开 | 大厂开始押注。这是这个方向最重要的信号—— 研究趣味和产品投入是两件事,大厂下场说明它被当真了 |
| 块扩散(半自回归) 2025 | 混合 | 折中方案:把序列切成块,块内并行扩散、块间自回归。 既能用上 KV cache,又拿到一部分并行度。目前工程上最现实的路线 |
| 劣势 | 具体表现 | 什么时候真的会痛 → 换什么 |
|---|---|---|
| 用不上 |
这是最要命的一条。自回归每生成一个 token 只需要算一个新位置, 前面的都能复用。扩散每一步都要重新处理整个序列——因为每个位置的内容都在变。 所以扩散是「步数少,但每步贵」;自回归是「步数多,但每步便宜」。 | 序列长、要求高吞吐 → 上块扩散,块间复用 KV cache(第 7 节) |
| 质量仍落后 SOTA(当前最好的模型) | 在同等规模下,扩散模型的质量通常还是不如最好的自回归模型, 而且差距在长序列和复杂推理能力上更明显——自回归的「逐个建立依赖」在长链推理上有天然优势 | 任务要长链推理、精确事实 → 用自回归,别为了速度换掉质量 |
| 文本缺少「平滑性」 | 图像的相邻像素天然相似,所以「先画大色块再补细节」这个直觉成立。 文本没有这个结构——「的」和「猫」在语义上没有"相邻"这种关系, 图像扩散那套多尺度、从粗到细的技巧搬到文本上失去了物理依据 |
想照搬图像扩散的「粗到细」多尺度技巧 → 在文本上得另找依据 |
| 推理服务(inference)基础设施不兼容 | 整个推理服务栈(KV cache、投机解码、连续批处理、 paged attention——把 KV cache 分页存放的那套显存管理)都是围绕自回归设计的。 扩散要用,得重写一遍。这是纯粹的迁移成本,与算法好坏无关 | 要直接上现有推理服务栈 → 自己承担迁移成本,或等生态成熟 |
| 步数成了新超参 | 自回归没有「跑几步」这个问题——生成多长就是多少步。 扩散必须选步数:少了质量差,多了没速度优势,而且不同任务的最优步数不一样。 | 换个新任务就得重扫 T → 从 20~50 步起步(第 6 节的图) |
| 采样参数不通用 | 温度、top-p、top-k 这些在自回归上被调了几年的参数, 在扩散上没有直接对应物。你得重新理解「多样性」在扩散里是怎么控制的 | 团队攒了几年自回归调参经验 → 在扩散上要从头建立「多样性」的旋钮 |
互动 · 「跑几步」为什么要变成一个超参
下面的判断截至本页写作(2026 年初)。
2026 年初的变化:扩散语言模型开始补上「复杂推理能力」这一课——其后陆续有更新, 公开测评里已经能看到它在研究生级科学问答(GPQA Diamond)上拿到接近 80% 的成绩, 同时保持每秒 1000+ token 的速度优势。 「扩散做不了复杂推理」这个判断已经过时——竞争维度从「快不快」变成了「快多少换多少能力」。
看到「扩散模型每秒生成 1000 token」时,别急着下结论。
要比的是相同质量下的端到端延迟(从发问到拿到完整答案的总时间),不是峰值吞吐(硬件满负荷时每秒能吐多少 token)。
早几年的评测里经常出现:扩散模型确实更快出完,
但它在需要精确遵循格式、长链推理、或者罕见知识的任务上得分明显更低。
速度优势是真实的,但它现在换来的是"够用但不够好"。
这个交易值不值,取决于你的场景能不能容忍这个质量差。
纯扩散放弃了 KV cache,纯自回归放弃了并行——两者都在走极端。
块扩散(block diffusion)做了个很务实的拆分:
把序列切成比如 32 个 token 一块,块内部用扩散并行地填,块与块之间用自回归的方式顺序生成。
这样:
· 块间自回归 → KV cache 能用了,历史块只需要算一次
· 块内扩散 → 一次前向填 32 个位置,块间的等待步数降到纯自回归的 1/32(块内还要 T 步去噪)
它保留了两种范式的核心优势,代价是块内失去了"改到块外"的能力。
这也是为什么目前工业界的扩散文本模型大多不是"纯扩散"。
互动 · 块大小 B:从逐块(相当自回归)到整段一块
回到第 4 节那个「迭代修正是真的能改的」互动。 先点一次 「↻ 重新随机」把错误种下去,再反复点 「✏️ 让扩散修正一轮」。
盯着右边那半边:错误位置会被擦掉、重新填上正确的 token;左边自回归那半边的错误 永远留在那里。扩散之所以能改错,不是因为它更聪明,而是因为它没把「顺序」当先验—— 既然没有「已经写定」这个概念,回头改就是自然的事。
这一章是少数「换掉了一条先验」的案例。其余暗线本章没有特别的话,只留下面三行。
| 暗线 | 这一章的回答 |
|---|---|
| B 什么被牺牲了 | 牺牲了 KV cache(复用不了,最贵的一笔)、 推理服务基础设施的兼容性,以及几年攒下的自回归调参经验(温度 / top-p 在扩散上没有直接对应物)。 「生成多长就是多少步」这个自由也没了——步数变成了新超参。 |
| D 跑在什么上 | 这一章把瓶颈从「带宽」换成了「算力」,而且是一次真正的交换,不是双赢。 自回归的解码(每生成一个 token 的那一步)是带宽受限的:要把全部权重读一遍, 算术强度(每读一个字节能做多少次运算)极低。 扩散没有 KV cache,每一步都是整段 [B, L] 的大矩阵乘,算术强度高得多——它是算力受限的。 算力恰好是 GPU 上更便宜的那一侧(A100 上算力与带宽的比例差着一个数量级以上)。 |
| E 它假设了什么 | 假设文本也存在「从粗糙到精细」的结构——「先大致定骨架、再修细节」在离散 token 上有意义。
图像上这个假设来自像素的空间平滑性,文本没有这个物理依据,所以它比图像弱得多。
第二个假设在噪声端:假设 [MASK] 是模型能识别的明确信号。 |
它接住了前面阶段的什么:图像扩散那一章建立了 「从噪声到清晰」的整套直觉;这一章做的就是把它搬到离散 token 上—— 然后发现最难的那一步不是去噪,是定义什么叫「加噪声」。
它给后面几章留了什么:扩散换掉的是「生成顺序」这个先验。 那还有哪些先验是可以换的?把「从左到右」换成「先写草稿再验算」是 《思维链与测试时计算》; 把「一次答对」换成「允许回头」是 RLVR 那一类工作的共同主题。
扩散语言模型用「迭代轮数」换掉了「从左到右」这个先验——加噪就是把 token 换成 [MASK],
生成就是一轮轮揭开,于是换来本来很奢侈的两样能力:并行和能改错,
代价是用不上 KV cache、每一步都要把整段重算一遍。
所以呢:它适合全局一致性要求高、序列不长、能容忍一点质量损失的场景;
长链推理和精确事实,短期内还是自回归的地盘。
上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。