你打开一个 AI 绘图工具,输入一句话:

一只橘猫,坐在月光下,柔和毛发,电影感光线。

屏幕上先出现的不是猫。

而是一团雪花。

然后,混乱里似乎冒出一个模糊的圆。圆的上方长出两只耳朵。接着是眼睛、鼻子、胡须、毛发、阴影。几十步之后,一只猫从噪声里浮出来。

这件事看起来像魔法。

但扩散模型最美的地方,恰恰是它把魔法拆成了一个非常朴素的问题:

这一步,哪里不像一张真实图片?

AI 并不是从虚无中画出一只猫。

它先学会一万种"猫是如何被噪声毁掉的",再学会把这个毁掉的过程一步步倒放。

从噪声中逐步显现出猫的示意动画

说明:本文配图是为了讲清原理而制作的示意图,不是真实扩散模型输出。真实模型工作在高维像素或潜空间里,不会真的画这只卡通猫。


一、生成不是画画,是修复

我们习惯把 AI 绘图想象成一个画家。

画家拿起笔,从空白画布开始:

空白画布 -> 草稿 -> 线稿 -> 上色 -> 成图

但扩散模型不是这样。

它更像一个修复师。

它拿到的不是空白画布,而是一张被严重污染的图片。它的任务不是"凭空画猫",而是判断:

如果这张图原本是一只猫,那么哪些噪声应该被去掉?

所以扩散模型的生成过程更像:

纯噪声 -> 少一点噪声 -> 再少一点噪声 -> 轮廓 -> 细节 -> 图片

它没有一次性回答"猫长什么样"。

它只是在每一步回答一个小问题:

刚才混进来的那一点噪声,大概是什么?

然后把它减掉。

再问一次。

再减掉一点。

重复几十次、几百次,直到噪声背后显出结构。

这就是扩散模型最核心的反直觉:

创造,不是从无到有。创造是连续的修复。


二、先学会破坏

要理解扩散模型,先不要看生成过程。

先看训练过程。

假设我们有一张清晰的猫图,记作 x0

训练时,模型会做一件看起来很奇怪的事:

往猫身上加噪声。

第一步,加一点点噪声,猫还很清楚。

第二步,再加一些,猫开始模糊。

第三步,继续加,轮廓逐渐消失。

最后,猫完全不见,只剩一团随机噪声。

扩散模型的正向加噪与反向去噪流程

这个过程叫正向扩散过程

写成公式,大概是这样:

$$ x_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon $$

不用被公式吓到。它只说了一句话:

第 t 步的图片 = 一部分原图 + 一部分噪声。

其中:

  • x0 是原来的清晰图片;
  • xt 是第 t 步被污染后的图片;
  • ε 是随机噪声;
  • α 控制这一刻还保留多少原图。

一开始,原图占大头,噪声很少。

越往后,原图越来越少,噪声越来越多。

到最后,原图信息几乎完全消失。

这就是"扩散"这个名字的来源。

它很像一滴墨水滴进水里:最开始墨水集中在一点,后来一点点散开,最后整个杯子都变成淡淡的颜色。局部结构消失了,随机性占据了全部。

如果用《看见物理(五):熵》的语言说:

正向扩散,就是熵增。

清晰图片是低熵状态。

纯噪声是高熵状态。

猫变成噪声,就是秩序被抹平。


三、再学会倒放

如果训练只是把猫毁掉,那模型当然不会画画。

关键在下一步。

模型会被问一个问题:

我给你一张第 t 步的带噪图片,你能猜出刚才加进去的噪声是什么吗?

也就是说,模型看到:

带噪图片 xt
时间步 t

然后输出:

预测噪声 εθ(xt, t)

训练目标很简单:

$$ \text{Loss} = |\epsilon - \epsilon_\theta(x_t, t)|^2 $$

翻译成人话:

真实噪声和模型猜的噪声,差得越远,损失越大。

模型并不是直接学习"猫是什么"。

它学习的是:

在各种污染程度下,真实图片和随机噪声之间的差别在哪里。

这件事听起来绕,但非常关键。

因为只要模型能猜出噪声,就能把噪声减掉:

更干净的图 ≈ 带噪图 - 预测噪声

扩散模型一步去噪的直觉示意

这就是扩散模型的"倒放"。

训练时,我们从清晰图片走向噪声:

x0 -> x1 -> x2 -> ... -> xT

生成时,我们从噪声走回图片:

xT -> xT-1 -> xT-2 -> ... -> x0

注意这里的美感:

模型不是学会了直接画猫。它学会了在任意混乱程度下,指出回到真实世界的方向。

如果梯度下降是在损失地形上找下坡方向,那么扩散模型就是在噪声海洋里找"更像真实图片"的方向。

每一步都很小。

但小步连续起来,就会出现一只猫。

这和《马尔科夫的幽灵》里讲的状态链很像:

当前状态 -> 下一步状态 -> 再下一步状态

LLM 预测下一个 token。

Agent 选择下一步行动。

扩散模型选择下一步去噪。

三者都不是一次性完成奇迹,而是在一个状态空间里,反复回答:

下一步往哪里走?


四、噪声里为什么会有猫?

这里会出现一个自然的问题:

既然一开始是纯噪声,里面根本没有猫,那猫从哪里来?

答案是:

猫不在那一团噪声里。猫在模型学到的概率分布里。

这句话很重要。

一张纯噪声图片,单独看,什么都不是。

但模型不是单独看它。模型带着训练中学到的"真实图片分布"来看它。

它见过大量猫、狗、树、脸、街道、建筑。它不记住某一张猫图,而是学到:

真实图片通常有哪些局部结构?
眼睛和鼻子的关系是什么?
毛发纹理大概如何连续?
边缘如何从背景里分离?
光影怎样才像自然世界?

所以生成时,模型做的不是"从噪声里发现一只已经存在的猫"。

它做的是:

从随机起点出发,沿着概率分布的坡度,走向一个更像真实图片的区域。

在扩散模型的理论里,这个方向常常被叫做 score

$$ \nabla_x \log p(x) $$

可以粗略理解为:

在当前这个位置,往哪里走,图片会更像训练数据?

这就是为什么同样从随机噪声开始,不同随机种子会生成不同图片。

起点不同,最终走到的山谷也不同。

但只要模型学得足够好,这些山谷都会落在"真实图片分布"附近。

它们不是训练集里的原图复印件。

它们是这个概率分布允许的一个新样本。


五、训练数据如何把文字和图像接上

上面只解释了模型怎么学会"去噪"。

但真实的 AI 绘图工具还有一个更关键的问题:

它怎么知道这一团噪声应该变成"橘猫",而不是"汽车"或"城堡"?

答案藏在训练数据里。

现代文生图模型通常不是只看孤立图片,而是看大量图文对

图片:一只橘猫坐在窗台上,背景有月光
文字:orange tabby cat sitting on a windowsill, moonlight, soft fur

这样的配对可能来自人工标注、网页 alt 文本、图片标题、图文数据集,也可能很嘈杂。训练规模越大,模型见到的组合越丰富:

"cat" 经常和耳朵、胡须、眼睛、毛发纹理一起出现
"moonlight" 经常和冷色光、暗背景、边缘高光一起出现
"cinematic lighting" 经常和强对比、景深、侧光一起出现

这里要稍微纠正一个常见直觉。

模型通常不是把原始像素字词 token直接放进同一个抽屉里。

在 Stable Diffusion 这类模型里,图片会先经过 VAE 压缩成 latent。这个 latent 仍然有空间位置,可以粗略理解成一格一格的图像 token,但它们已经不是单个像素,而是压缩后的视觉特征。

文字则走另一条路:

提示词 -> 分词 -> text tokens -> Embedding -> 文本向量

然后,图像 latent 的每个位置和文字 token 的向量通过 cross-attention 相遇:

图像位置:我现在应该看提示词里的哪个词?
文字 token:"cat"、"moonlight"、"soft fur" 分别提供方向
attention 权重:这一块图像更该听哪个词

更技术一点说:

图像 latent 特征 -> Query
文字 token 向量 -> Key / Value
Query 和 Key 的相似度 -> 决定这一块图像关注哪些词

所以,与其说"像素 token 和字词 token 被硬塞进同一个 Embedding",不如说:

图像特征和文字 token 被投到可以互相比较、互相影响的向量空间里。

训练时,模型反复看到"猫"这个词和猫的视觉结构一起出现。

反向传播会慢慢调整参数,让包含 "cat" 的文字向量,在去噪时更容易支持耳朵、眼睛、胡须、毛发这些结构;让包含 "moonlight" 的文字向量,更容易支持冷色光、暗背景和边缘高光。

这不是模型背下了"cat = 两只耳朵 + 胡须"这条规则。

而是大量图文对把一件事压进了参数里:

哪些文字,应该把噪声往哪些视觉结构上拉。

完整训练过程可以粗略写成这样:

1. 取一张图片和它的文字说明;
2. 用 VAE 把图片压缩成 latent z0;
3. 随机选一个时间步 t;
4. 给 z0 加噪,得到 zt;
5. 把文字说明变成 text token Embedding;
6. 让 U-Net 同时看到 zt、t、文字 Embedding;
7. 让它预测刚才加进去的噪声 ε;
8. 预测错了,就用损失函数和反向传播更新参数。

这就是为什么生成时只输入一句话,模型也能"听懂"大致方向。

因为在训练时,它已经看过无数次:

这句话附近,应该长出什么样的视觉结构。

六、文字如何控制图像

那提示词又是怎么起作用的?

为什么输入"猫",它就更容易生成猫;输入"赛博朋克城市",它就生成霓虹灯和高楼?

关键是:

文字也会先变成向量。

提示词不是直接变成像素。

它会先经过文本编码器,变成一组向量表示。然后在每一步去噪时,这组文字向量都会参与判断:

这一步去噪之后,图像是不是更像这句话?

文字提示词通过向量参与每一步去噪

没有文字条件时,模型只需要生成"像真实图片"的东西。

有文字条件时,模型要同时满足两个要求:

像真实图片
像这句话

所以提示词不是最后贴上去的标签。

它从第一步去噪就开始参与。

每一步,模型都被文字向量轻轻拉偏一点:

别只变成一张普通图片。
朝“橘猫”走。
朝“月光”走。
朝“柔和毛发”走。

真实系统里,这个"拉偏"还会被专门放大。

比如 classifier-free guidance 会让模型做两次判断:

不看提示词时,下一步该怎么去噪?
看提示词时,下一步该怎么去噪?

两者的差,就是文字提示词施加的方向。生成器再把这个方向乘上一个系数:

最终方向 = 无提示词方向 + guidance scale × 文字带来的偏移

guidance scale 越大,图片越努力贴近提示词,但也更容易过度用力,出现僵硬、失真或细节异常。

这和《万物皆向量》的主题正好接上:

文字、图像、风格、构图,最后都要在某个向量空间里相遇。

AI 绘图的底层不是"语言变成图片"。

更准确地说,是:

文字向量在每一步去噪中,改变图像向量的运动方向。


七、为什么它比 GAN 稳

在扩散模型流行之前,图像生成领域最耀眼的路线是 GAN。

GAN 的思路很戏剧化:

一个模型负责造假图。

另一个模型负责验真假。

造假者越来越会骗,鉴别者越来越会抓。两者对抗,最后造假者学会生成逼真的图片。

这个想法很漂亮,但训练很难。

因为它像让两个学生互相考试:

生成器太弱 -> 鉴别器一眼看穿 -> 生成器学不到东西
鉴别器太弱 -> 生成器随便糊弄 -> 图片质量上不去
两者不平衡 -> 训练崩掉

扩散模型的气质完全不同。

它不安排两个模型打架。

它把一个巨大问题拆成很多小问题:

第 999 步:从纯噪声里去掉一点噪声
第 998 步:再去掉一点
第 997 步:再去掉一点
...
第 1 步:修最后一点细节

每一步都不要求天才。

每一步只要求模型把方向判断得稍微准一点。

这就是扩散模型稳定的原因之一:

它不是让模型一次跳到答案,而是给模型修了一千级台阶。

台阶多,所以慢。

但台阶多,也让它稳。

早期扩散模型生成一张图需要很多步,这也是它被批评"慢"的原因。后来的 DDIM、Latent Diffusion、Consistency Models 等方向,都在努力减少步数。

但无论步数怎么压缩,核心精神仍然没变:

把生成拆成连续的、可学习的去噪过程。


八、Stable Diffusion 为什么能跑起来

如果真的在高清图片的每个像素上做扩散,成本会非常高。

一张 1024×1024 的 RGB 图片,有三百多万个数字。

每一步去噪都在这么大的空间里跑,太贵。

Stable Diffusion 的关键改造是:

不要直接在像素空间里扩散。先把图片压缩到潜空间。

所谓潜空间(latent space),可以理解为图片的压缩表示。

不是每个像素都保留,而是保留对图像结构最重要的那些信息:

大致构图
物体位置
颜色关系
纹理倾向
语义结构

然后,扩散模型主要在这个更小的潜空间里工作。

Latent Diffusion 先把图片压缩到潜空间,再在潜空间里扩散和去噪

这件事有点像你不直接修改一部高清电影的每一帧,而是先写一个分镜脚本、灯光方案和角色位置,再把它还原成画面。

当然这只是直觉。

技术上,Stable Diffusion 使用的是变分自编码器(VAE)把图片压缩成 latent,再在 latent 上做扩散,最后由解码器还原成图片。

这一步让高分辨率图像生成从"实验室玩具"变成了"普通显卡能跑的工具"。

也让 AI 绘图真正走向大众。


九、从熵增到熵减

现在我们可以把整件事重新看一遍。

正向过程:

清晰图片 -> 加噪 -> 更乱 -> 纯噪声

这是熵增。

反向过程:

纯噪声 -> 去噪 -> 更有结构 -> 清晰图片

这是熵减。

看起来,扩散模型像在反抗热力学第二定律。

它把混乱变成秩序。

它从雪花里恢复出猫。

但它没有真的违反物理。

因为这个"熵减"不是免费的。

它背后有训练数据,有 GPU,有电力,有散热,有数据中心的空调。你在屏幕上看到一只猫从噪声中浮现,现实世界里有另一部分能量正在变成废热。

这正好回到《看见物理(五):熵》里的那句话:

信息不是虚无的东西。信息有物理代价。

扩散模型真正做的,是把人类图像世界中的结构压进神经网络参数里。

生成时,它再用这些结构去约束随机噪声。

所以更准确地说:

扩散模型不是让宇宙倒放,而是用已经学到的信息,局部地逆转混乱。


十、这和 LLM 是同一种思想吗?

表面上看,LLM 和扩散模型完全不同。

一个写字,一个画图。

一个每次预测下一个 token,一个每次去掉一点噪声。

但底层有一种很深的相似性:

LLM:
当前文本状态 -> 下一个 token 的概率分布 -> 采样

扩散模型:
当前噪声状态 -> 下一步更干净图像的概率分布 -> 采样

LLM 问的是:

在这段上下文后面,下一个词最合理是什么?

扩散模型问的是:

在这团噪声里面,下一步往哪里去更像真实图片?

Agent 问的是:

在当前环境状态下,下一步行动最合理是什么?

三者都在做同一件事:

在不确定中,一步步选择更合理的下一个状态。

这里可以和《马尔科夫的幽灵》接上。

马尔科夫链给了我们一个最小框架:

状态 -> 下一步

扩散模型把这个框架放进图像生成里:

噪声状态 -> 下一步去噪

LLM 把它放进语言里:

上下文状态 -> 下一个 token

Agent 把它放进行动里:

环境状态 -> 下一步动作

AI 时代很多看似不同的技术,背后都藏着这条线:

智能不是一次性抵达答案,而是在状态空间里连续修正方向。


十一、从噪声中看见世界

现在再回到开头那只猫。

它不是藏在噪声里,等 AI 把它挖出来。

也不是模型像人类画家一样,先在脑中想象一只猫,再把它画到画布上。

真正发生的是:

  1. 人类把大量图片和文字说明配对交给模型;
  2. 模型把图片压缩成 latent,把文字变成 token Embedding;
  3. 模型学会这些 latent 被噪声破坏时的规律;
  4. 模型学会在文字条件下判断"更像这句话里的真实图片"的方向;
  5. 生成时,文字提示词把去噪方向进一步拉向"猫"、“月光”、“柔和毛发”;
  6. 一步一步,随机噪声被约束成一个具体图像。

所以扩散模型的秘密不是想象力。

它的秘密是:

可逆的破坏。

它先把世界拆散,再学习如何把世界拼回来。

它先让猫消失在噪声里,再学习如何让猫重新出现。

这就是扩散模型的数学美学:

生成的本质,不是凭空创造。

生成的本质,是给噪声一个方向。


参考与延伸

本公众号延伸阅读