AI为什么总是一个字一个字往外蹦?AI-lab学习笔记

7/21/2026

我们已经习惯看 AI 从左往右吐字,仿佛语言只能这样生成。可 Transformer 是交换信息的计算骨架,自回归只是文字成为定稿的一种秩序。Google DiffusionGemma、LLaDA 和 NVIDIA TwoTower 正在探索另一条路:先保留一块仍可修改的画布,再同时猜、反复改。

Transformer 是位置之间交换信息的计算骨架,自回归只是文字成为定稿的一种秩序。Google DiffusionGemma、LLaDA 和 NVIDIA TwoTower 正在探索另一条路:先保留一块仍可修改的画布,再同时猜、反复改。文章真正追问的不是谁取代谁,而是语言模型能否按任务选择何时承诺。

① 一直向右走的光标 → ② 逐词承诺的代价 → ③ causal mask 与 MASK token → ④ LLaDA 怎样训练和生成 → ⑤ 另一种秩序能否规模化、加速和部署 → ⑥ 并行与 KV cache 的代价 → ⑦ token、block 与整段扩散的连续谱 → ⑧ MTP、Mamba 与 latent reasoning 改变哪一层 → ⑨ 生成顺序本身的启发

▲ 从逐 token 的单行生成,到整块画布的多轮修改

开场:那个一直向右走的光标

一个字出现。

接着是下一个字。

光标一直向右走,像一台速度很快、绝不回头的打字机。

产品界面有时会把几个字一起刷新,但对今天大多数主流大语言模型来说,背后的生成顺序通常也是从左到右:先确定前面的 token,再根据它预测下一个。token 不一定正好对应一个汉字,读起来却很像一个字一个字地往外蹦。

我们已经太熟悉这个画面,以至于很少再问:

语言模型为什么一定要从第一个词写到最后一个词?

一张图片可以从满屏噪声里逐渐显影。一段音乐可以先有和声骨架,再补旋律。人写文章时也常常先改结尾,再回头重写开头。

一句话为什么不能这样生成?

2026 年 6 月 10 日,Google 发布开放实验模型 DiffusionGemma。它在一次前向计算中并行处理 256 个 token,再通过多轮修改让整块文字共同成形。它不是孤例:一批新模型正在把语言生成从“逐词接龙”推向“整块修改”。

它们还没有取代今天的自回归大模型,却已经动摇了一个长期默认的前提:

模型说话的顺序,未必必须等于模型形成答案的顺序。

这篇文章讨论的不是“扩散模型会不会取代 Transformer”。许多扩散语言模型本身仍然使用 Transformer。Transformer 回答的是不同位置怎样通过 QKV 交换信息;自回归与扩散回答的是另一层问题:答案按什么顺序生成,又在什么时候成为不能再改的定稿。

真正被松开的,是“Transformer 必须永远从左到右、一次承诺一个 token”这层绑定。

要理解这件事,先看清那个只会向右走的光标,究竟被哪条公式推着走。

一、一行公式,把语言变成一条单行道

假设一句话由 L 个 token 组成:

x₁, x₂, x₃, ... , xL

自回归语言模型把整句话的概率拆成:

P(x₁, …, xL) = ∏ P(xᵢ | x₁, …, xᵢ₋₁)

这条公式并不神秘。它的意思是:

第一个 token 有多可能 × 已知第一个以后,第二个有多可能 × 已知前两个以后,第三个有多可能 × …… = 整句话有多可能

比如模型已经写下:

雨停以后,整座城市在积水里

它会计算下一个 token 更可能是“重新”“逐渐”“静静”,还是别的什么。选出一个以后,这个 token 又成为下一轮预测的前文。

这就是 next-token prediction。

需要说准确一点:上面的分解首先是概率论的链式法则,任何联合概率都可以这样写。真正让它变成一条单行道的,是现代自回归模型的因果注意力和解码方式——当前位置可以看见左边已经生成的内容,却不能看见右边尚未生成的答案。

这条路线能成为今天大语言模型的主流,当然有充分理由。

它可以自然生成不同长度的回答;写出一部分就能立刻流式展示;已经处理过的前文还能放进 KV cache,不必每一步都从头计算。模型只要把一个很难的问题,反复缩小成“下一步是什么”,就能从文字接龙一路长出代码、翻译、问答和推理。

但这种成功也带来一个很深的结构性约束:

已经写出的文字,像已经发生的过去。模型可以继续解释它,却不能在同一次原生生成里回去撤回它。

二、当第一步写错,后面都要替它圆场

自回归模型最明显的代价是串行。

第 100 个 token 依赖前 99 个,第 101 个又依赖前 100 个。即使 GPU 很擅长同时做大量计算,最朴素的生成仍要等上一轮结束,才能知道下一轮的输入是什么。

但速度只是表面。

更深的代价叫作过早承诺。

想象你要求模型写一句话:必须提到雨和城市,最后一个词必须是“星光”,还要保持语义自然。

这不是单纯决定第一个词的问题。开头怎么写,取决于结尾要落在哪里;中间的节奏,又要同时服从长度、语法和意义。整句话的各个位置互相约束,答案更像一个填字游戏,而不是一串彼此独立的珠子。

强大的自回归模型也能提前规划,并借助二次修改补救。它的结构性别扭在于:原生解码要求模型一边规划,一边把尚未完成的计划不断变成不可撤回的文字。

如果第一段把论点带偏了,后面可能只能越来越用力地圆回来。如果代码开头选择了不合适的数据结构,错误往往要到很后面才显露。如果一道证明题的结论暴露出前提有问题,最好的动作不是继续生成更多 token,而是回去改掉第一步。

人类即兴发言时也常陷入这种困境:话已经说出口,只好沿着它继续说。

可写作不是只有即兴发言这一种形态。

我们会列提纲,会留下空白,会先写最确定的段落,会因为结尾不成立而删掉开头。扩散语言模型尝试放进机器里的,正是这种“整份草稿暂时都可以改”的能力。

三、先分清两种 mask:一扇门和一个空位

如果你熟悉 Transformer,这里最容易卡住的地方,是 mask 这个词同时指两件完全不同的东西。

第一种是自回归模型里的 causal attention mask,也叫因果遮罩。

它不出现在句子里,而是加在 Q、K 的注意力分数上。对第 i 个位置来说:

sᵢⱼ = Qᵢ·Kⱼᵀ / √d + Aᵢⱼ αᵢⱼ = softmax_j(sᵢⱼ) Attentionᵢ = Σⱼ αᵢⱼ Vⱼ Aᵢⱼ = 0 当 j ≤ i,可以看 Aᵢⱼ = −∞ 当 j > i,禁止看

softmax 沿所有 key 位置 j 归一化;−∞ 对应的权重 αᵢⱼ 接近零,随后也就不会把那个位置的 V 汇入输出。于是第 3 个位置能读取前 1、2、3 个位置的 K 和 V,却看不到第 4、5 个位置。

它遮住的是视线。第 4 个词还没生成,第 3 个位置就不许偷看它。

第二种是扩散语言模型输入里的 [MASK] token。

它是词表中的一个特殊占位符,真的会出现在送进 Transformer 的序列里:

雨停 / [MASK] / 整座 / 城市 / 在 / 积水里 / 重新 / 发亮

[MASK] 也有自己的 embedding 和位置信息,也会产生 Q、K、V。它表达的不是“右边不许看”,而是“这个位置原来有内容,现在暂时不知道”。

在 LLaDA 这类 masked diffusion model 里,回答部分通常不再使用那张只许向左看的三角形 causal mask。[MASK] 位置产生的 Q,可以同时查询左边“雨停”的 K,也可以查询右边“整座城市在积水里重新发亮”的 K,再从相应的 V 中汇集信息。最后,LM head 为这个空位输出整个词表上的概率分布,猜出这里可能是“以后”。

模型当然不是透过黑块看见了答案。[MASK] 自己只说明“这里缺了一块”;答案来自左右文、位置编码,以及训练中学到的语言关系。

causal mask 是一扇不许向右看的门;[MASK] token 是句子里等待填写的一个空位。

▲ causal attention mask 与 MASK token 的区别:前者限制注意力视线,后者在输入序列中挖出空位

causal mask 改变“谁能看谁”;[MASK] token 改变“这个位置输入什么”。

被改写的不是 Transformer 本身。QKV 提供位置之间交换信息的计算骨架;causal mask、训练目标和采样算法共同决定文字按什么顺序成为定稿。自回归逐词承诺,masked diffusion 保留多个待定位置,再分批提交。

自回归生成秩序:Transformer / QKV

LLaDA 式扩散生成秩序:仍可使用 Transformer / QKV

自回归生成秩序:完整文本右移

LLaDA 式扩散生成秩序:随机挖空后的文本

Attention

自回归生成秩序:causal,只看左侧前文

LLaDA 式扩散生成秩序:双向看带噪序列

Scroll for more