阶段 8 · 前沿范式

扩散语言模型:文本能不能
不一个字一个字地写

阶段 4 的扩散模型把「生成一张图」拆成了一千次「去掉一点噪声」。 那文本呢?文本是离散的——你没法给「猫」这个字加上 0.3 个噪声。 这一章讲清楚:这个障碍怎么绕过去,以及绕过去之后值不值。

1

自回归有两个天生的毛病

今天所有主流语言模型都是自回归的:从左到右,一次一个 token, 每个新 token 都基于前面所有已生成的 token。

毛病具体表现
① 严格串行 生成 1000 个 token 就要跑 1000 次前向。 即使有 KV cache 让每次前向很便宜,次数本身是省不掉的—— 因为第 501 个 token 必须等第 500 个算完
② 写出去就收不回 一旦某个 token 采样错了,这个错误永久留在上下文里, 后面所有内容都要基于它继续往下编。 这就是「一句错话带崩一整段」的机制

扩散是迭代式的,正好卡在这两条上:每一步能同时填很多个位置(并行), 后面的步骤也能把前面填错的位置改回来(可修正)——因为没有任何东西被"定死"。

🎯 类比

自回归像用钢笔写字,不能涂改:一个字写错,只能将错就错写下去。
扩散像用铅笔先打草稿:先潦草地铺一层大形,然后一遍遍地擦掉重画, 从模糊到清晰。你可以回头改任何一笔。
代价是:打草稿本身要花时间——画得慢,但画得可以改。
这个类比管到「能不能回头改」为止:真实的每一步都是按整句的上下文算概率,不是随手乱涂; 而且有些错字它也擦不掉(第 4 节)。

演示 · 写 27 个字,两种范式各要等多久

演示 · 一个字写错,后面会怎样

2

怎么给离散的文本「加噪声」

这是整件事的技术核心,也是最反直觉的一步。 图像加噪声是 xt = √ᾱ·x₀ + √(1−ᾱ)·ε(t 是噪声进度,x₀ 是原图, ᾱ 是「还剩多少原图」,ε 是随机抽出来的噪声——详见《扩散模型》),像素值连续,可以插值。 文本做不到——「猫」和「狗」之间没有中间值。

一张图看懂为什么难 · 像素能插值,字不能

方案 A · 吸收式扩散(掩码扩散) 噪声 = 把 token 换成 [MASK]。 加噪就是在越来越多的位置上盖住答案。
训练目标:预测被遮住的 token。
它其实和 BERT 的预训练任务——掩码语言建模(Masked Language Modeling,MLM, 也就是「把句子里的词遮住,让模型猜」)——是近亲——区别只是: BERT 遮一次就完事,扩散是按一个噪声调度(每一步遮多少词的安排:余弦是先慢后快,线性是匀速)逐步地遮。
训练时学的是「看着被遮的版本,把原句补回来」;生成时就把这件事反过来用—— 从整句全遮开始,一轮轮往清晰走(第 3 节)。
方案 B · 均匀扩散 噪声 = 把 token 随机换成词表里的另一个 token。
加噪就是越来越多的位置变成随机词,最后变成一串纯随机词。
理论上更优雅——它更像图像的连续扩散, 每个时刻都能从任意状态转移回任意状态。
实践中更难——因为随机替换掉的 token 仍然"看起来像词", 模型更难判断哪些位置是噪声、哪些是信号。

互动 · 亲手把这句话加一遍噪(拖下面的横条)

💡 为什么吸收式(掩码)赢了

因为 [MASK] 是一个明确的信号:「这里还没写,需要你填」。
而均匀扩散里,一个被随机替换成"的"的位置, 和原本就是"的"的位置长得一模一样——模型没法区分, 也就不知道该在哪里做修正。
这就是为什么今天几乎所有能跑的扩散语言模型都用掩码方案。

3

生成顺序:两种范式的根本差别

下面把两种生成过程放在一起跑。每一步都是真实的采样逻辑—— 自回归严格从左往右定死,扩散从全掩码开始逐步揭开。

互动 · 同一个句子,两种生成顺序

自回归(一次一个,从左到右)

掩码扩散(一次一批,顺序不固定)

把鼠标停在公式里的 τ 上——那根「采样温度」滑杆会亮;停在 T 上,推进步数的那两个按钮会亮。

🎯 核心大图 · 填字顺序不是从左往右

你会看到它先在一些分散的位置上落子——有点像先搭骨架、再填细节。 这个顺序不是固定的,取决于每一步哪些位置的置信度(模型对「这里该填什么」的把握)够高。 所以同一个提示词跑两次,填充顺序可能不同,最终答案也可能不同——这一点和自回归很像,但机制完全不一样。

同一批位置互相冲突怎么办?——按置信度分批:够稳的先落定, 两个位置互相矛盾的,就都留到下一步再算(第 4 节那个互动里能看到什么叫「互相锁死」)。

4

把写错的地方改回来

这是扩散相对自回归唯一的结构性优势,也是它值得存在的理由。

互动 · 迭代修正是真的能改的

自回归:错了就只能错下去

扩散:后面的步骤会把它擦掉重写

这个能力在需要全局一致性的任务上特别值钱。变量名前后不一致,自回归发现时已经写完 200 行; 扩散可以在后续步骤统一改名。「写一首每行七个字的诗」,自回归字数是多了只能硬凑,扩散可以回头删。 填空和改写这类任务本来就是「给定上下文补中间」,和扩散天然契合,对自回归反而别扭。

互动 · 有些错字,是修不回来的

上面那根「修正阈值」是「多大把握才愿意改」的那条线,只控制模型什么时候敢改; 还有几个位置卡在天花板下面,怎么修都改不动。比如两个位置互相锁死——某处该填「是」,取决于后面会不会出现「吗」; 而后面那个位置又取决于前面填的是不是「是」。谁先落定都不对,这种互相依赖的地方,多修几轮也解不开。 「迭代修正」能改的是确定性高的错误,不是任意一处。

M

数学 · 三个数字:L、T、N

上面已经说完了「能并行、能改错」。但这两件事都有价格,而且价格能算出来—— 只需要三个数字:L(要写多长)、T(分几步写完)、N(模型多大)。 先说清最容易误会的一条:扩散不省参数量——LLaDA 8B 就是 80 亿参数(bf16 是 16 位浮点格式,每个数占 2 字节,约 16 GB), 和同规模的自回归模型一样,它换的是算法结构,不是规模。

演示 · 每个位置被重新算了几次

左边每个位置只被算 1 次(算完就进 KV cache 冻起来),右边每个位置被算 T 次。 所以扩散是「步数少,但每一步都要重新付钱」——前向次数少 ≠ 计算量少。

格子数16 / 128自回归 / 扩散 贵几倍×8扩散 ÷ 自回归 = T 算力2.6e112N·L,扩散再乘 T

T 怎么定?步数少了质量撑不住,多了没有速度优势——本页这套模型里 20~50 步是常见区间, 序列越长,同样的质量通常需要越多的步数。

微型图解 · 每一步揭开多少个位置,是「调度」决定的

5

从连续扩散到块扩散

互动 · 扩散语言模型进化时间轴

模型噪声类型关键点
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,又拿到一部分并行度。目前工程上最现实的路线
6

它为什么还没赢

劣势具体表现什么时候真的会痛 → 换什么
用不上 KV cache 这是最要命的一条。自回归每生成一个 token 只需要算一个新位置, 前面的都能复用。扩散每一步都要重新处理整个序列——因为每个位置的内容都在变。 所以扩散是「步数少,但每步贵」;自回归是「步数多,但每步便宜」。 序列长、要求高吞吐 → 上块扩散,块间复用 KV cache(第 7 节)
质量仍落后 SOTA(当前最好的模型) 在同等规模下,扩散模型的质量通常还是不如最好的自回归模型, 而且差距在长序列和复杂推理能力上更明显——自回归的「逐个建立依赖」在长链推理上有天然优势 任务要长链推理、精确事实 → 用自回归,别为了速度换掉质量
文本缺少「平滑性」 图像的相邻像素天然相似,所以「先画大色块再补细节」这个直觉成立。
文本没有这个结构——「的」和「猫」在语义上没有"相邻"这种关系, 图像扩散那套多尺度、从粗到细的技巧搬到文本上失去了物理依据
想照搬图像扩散的「粗到细」多尺度技巧 → 在文本上得另找依据
推理服务(inference)基础设施不兼容 整个推理服务栈(KV cache、投机解码、连续批处理、 paged attention——把 KV cache 分页存放的那套显存管理)都是围绕自回归设计的。 扩散要用,得重写一遍。这是纯粹的迁移成本,与算法好坏无关 要直接上现有推理服务栈 → 自己承担迁移成本,或等生态成熟
步数成了新超参 自回归没有「跑几步」这个问题——生成多长就是多少步。 扩散必须选步数:少了质量差,多了没速度优势,而且不同任务的最优步数不一样。 换个新任务就得重扫 T → 从 20~50 步起步(第 6 节的图)
采样参数不通用 温度、top-p、top-k 这些在自回归上被调了几年的参数, 在扩散上没有直接对应物。你得重新理解「多样性」在扩散里是怎么控制的 团队攒了几年自回归调参经验 → 在扩散上要从头建立「多样性」的旋钮

互动 · 「跑几步」为什么要变成一个超参

7

2026 年的真实状态

下面的判断截至本页写作(2026 年初)。

2026 年初的变化:扩散语言模型开始补上「复杂推理能力」这一课——其后陆续有更新, 公开测评里已经能看到它在研究生级科学问答(GPQA Diamond)上拿到接近 80% 的成绩, 同时保持每秒 1000+ token 的速度优势。 「扩散做不了复杂推理」这个判断已经过时——竞争维度从「快不快」变成了「快多少换多少能力」。

⚠️ 一个需要厘清的常见误解

看到「扩散模型每秒生成 1000 token」时,别急着下结论。 要比的是相同质量下的端到端延迟(从发问到拿到完整答案的总时间),不是峰值吞吐(硬件满负荷时每秒能吐多少 token)。
早几年的评测里经常出现:扩散模型确实更快出完, 但它在需要精确遵循格式、长链推理、或者罕见知识的任务上得分明显更低。
速度优势是真实的,但它现在换来的是"够用但不够好"。 这个交易值不值,取决于你的场景能不能容忍这个质量差。

方向 · 为什么是「块扩散」

纯扩散放弃了 KV cache,纯自回归放弃了并行——两者都在走极端。
块扩散(block diffusion)做了个很务实的拆分: 把序列切成比如 32 个 token 一块,块内部用扩散并行地填,块与块之间用自回归的方式顺序生成。
这样:
· 块间自回归 → KV cache 能用了,历史块只需要算一次
· 块内扩散 → 一次前向填 32 个位置,块间的等待步数降到纯自回归的 1/32(块内还要 T 步去噪)
它保留了两种范式的核心优势,代价是块内失去了"改到块外"的能力。
这也是为什么目前工业界的扩散文本模型大多不是"纯扩散"。

互动 · 块大小 B:从逐块(相当自回归)到整段一块

8

小结

它对应哪条线 ② 没有免费午餐 → 必须有归纳偏置—— 这一章是这条线上最直白的一次演示:「生成顺序」本身就是一个先验。 自回归把「从左到右、逐个建立依赖」硬编码进架构; 扩散把它换成「从噪声到清晰、迭代细化」。两个都不是免费的。
一句话 这一章本质上是在换一个生成先验—— 把「时间上的顺序」换成「迭代的轮数」,于是换来本来很奢侈的两样能力: 并行和能改错。
它牺牲了什么 牺牲了 KV cache(每一步整个序列都在变,「前面算过就不用再算」这件事不成立了), 也牺牲了围绕自回归建起来的一整套推理服务基础设施。 换来的并行度,就是拿这两样付的(回扣暗线 B / D)。
🎬 自己验一遍

回到第 4 节那个「迭代修正是真的能改的」互动。 先点一次 「↻ 重新随机」把错误种下去,再反复点 「✏️ 让扩散修正一轮」。

盯着右边那半边:错误位置会被擦掉、重新填上正确的 token;左边自回归那半边的错误 永远留在那里。扩散之所以能改错,不是因为它更聪明,而是因为它没把「顺序」当先验—— 既然没有「已经写定」这个概念,回头改就是自然的事。

它在暗线里站在哪

这一章是少数「换掉了一条先验」的案例。其余暗线本章没有特别的话,只留下面三行。

暗线这一章的回答
B 什么被牺牲了 牺牲了 KV cache(复用不了,最贵的一笔)、 推理服务基础设施的兼容性,以及几年攒下的自回归调参经验(温度 / top-p 在扩散上没有直接对应物)。 「生成多长就是多少步」这个自由也没了——步数变成了新超参。
D 跑在什么上 这一章把瓶颈从「带宽」换成了「算力」,而且是一次真正的交换,不是双赢。 自回归的解码(每生成一个 token 的那一步)是带宽受限的:要把全部权重读一遍, 算术强度(每读一个字节能做多少次运算)极低。 扩散没有 KV cache,每一步都是整段 [B, L] 的大矩阵乘,算术强度高得多——它是算力受限的。 算力恰好是 GPU 上更便宜的那一侧(A100 上算力与带宽的比例差着一个数量级以上)。
E 它假设了什么 假设文本也存在「从粗糙到精细」的结构——「先大致定骨架、再修细节」在离散 token 上有意义。 图像上这个假设来自像素的空间平滑性,文本没有这个物理依据,所以它比图像弱得多。 第二个假设在噪声端:假设 [MASK] 是模型能识别的明确信号。
🎯 前后钩子

它接住了前面阶段的什么:图像扩散那一章建立了 「从噪声到清晰」的整套直觉;这一章做的就是把它搬到离散 token 上—— 然后发现最难的那一步不是去噪,是定义什么叫「加噪声」。

它给后面几章留了什么:扩散换掉的是「生成顺序」这个先验。 那还有哪些先验是可以换的?把「从左到右」换成「先写草稿再验算」是 《思维链与测试时计算》; 把「一次答对」换成「允许回头」是 RLVR 那一类工作的共同主题。

一句话带走进扩散语言模型

扩散语言模型用「迭代轮数」换掉了「从左到右」这个先验——加噪就是把 token 换成 [MASK], 生成就是一轮轮揭开,于是换来本来很奢侈的两样能力:并行和能改错, 代价是用不上 KV cache、每一步都要把整段重算一遍。
所以呢:它适合全局一致性要求高、序列不长、能容忍一点质量损失的场景; 长链推理和精确事实,短期内还是自回归的地盘。

9

拓展阅读

上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。

📄 这一章的说法从哪来

💻 工业界怎么写

∑ 更严格的形式