AI为什么总是一个字一个字往外蹦?AI-lab学习笔记
我们已经习惯看 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 式扩散生成秩序:双向看带噪序列


