一张图
是怎么从
一片雪花点
长出来的?

Stable Diffusion 的核心做的是一件听起来非常反直觉的事: 它先把图片揉成噪声,再学着一步一步把噪声"擦"回图。 这个页面用动画和滑块带你看懂这件事——不需要数学。

↓ SCROLL · 共 7 章 · 约 12 分钟 NO MATH
● Diffusion ● U-Net ● VAE ● CFG ● Sampler
DEMO · LIVE DENOISE STEP 0 / 8

它做的事其实很像雕塑。

米开朗琪罗有一句被引滥的话:"雕像本来就在石头里,我只是把多余的部分凿掉。" Stable Diffusion 的工作方式几乎是这句话的字面翻译——只不过它的"石头"是一片随机噪声。

类比 · 雕塑家

从一整块石头里

雕塑家盯着一块毫无意义的大理石,脑子里已经有了那个雕像。他要做的就是不停地凿、不停地磨,把不属于雕像的部分一点点去掉。

"雕像本来就在石头里。"
— 米开朗琪罗(据说)

现实 · 扩散模型

从一片噪声里

SD 盯着一片彻底随机的噪声,它的"脑子"里也有一个雕像——那是它在几十亿张图上学会的"图应该长什么样"。它一步步把不属于图的噪声擦掉

"这片噪声里藏着一只猫。我的工作是擦掉不是猫的部分。"
— SD(如果它会说话)

下一章 · 来玩点真的

先看反过来:把图变成噪声。

要让 SD 学会"擦噪声",得先教它"加噪声"是什么样。这一步叫 前向扩散(Forward Diffusion)——把一张干净的图,慢慢加噪到完全看不出来。 拖动滑块,看一只"猫"是怎么消失的。

▸ INTERACTIVE_01.PY · forward_diffusion()
x_t · 当前图像
Timestep · t 0 / 1000
信号100%
噪声0%
阶段原图
// 你看到的是什么
每一步都在原图上叠一点高斯噪声。1000 步之后,图像和纯噪声统计上无法区分——这是数学上能证明的。
// 训练阶段在干嘛
模型看到任意一个 t 时刻的带噪图,被要求猜出加进去的噪声是什么。猜得准 → 它就学会了反向擦噪。
下一章 · 反过来擦噪声

现在反过来——一步一步把噪声擦回图。

这才是 SD 真正在干的事:反向扩散(Reverse Diffusion)。 模型从纯噪声出发,每一步都问自己一个问题—— "如果这张图里藏着一只猫,那此刻应该擦掉哪些像素?" 然后擦一点点,再问,再擦。

▸ INTERACTIVE_02.PY · reverse_diffusion()
x_t · 当前带噪图
ε_θ · U-Net 猜的噪声
步数 · STEP 0 / 20
// 步骤说明 · STEP 0
还没开始。左边是从高斯分布里随便抽的一张纯噪声 x_T——任何一次"生成"都从这里启程。
// 为什么右边那张也像噪声
U-Net 输出的并不是图,而是它判断要从 x_t 里减掉的噪声。所以右边那张本来就该看起来像噪声——只不过是"有方向的噪声"。
下一章 · 拆开看里面有什么

SD 不是一个模型,是三个零件拼出来的。

第三章你看到的"加噪"和第四章的"去噪",其实只是 SD 流水线的中间一段。 完整的 Stable Diffusion 是三个独立训练的神经网络串在一起。 点一下任意一个零件,看它在干嘛。

解释模式
01 [T]

Text Encoder

CLIP / T5

把你写的文字变成一串数字(向量),这串数字代表'图里应该有什么'。

02 [U]

U-Net

Denoiser / DiT

干苦力活的。每一步都看一眼当前带噪图、读一遍文字向量,然后猜出该擦掉哪些噪声。

03 [V]

VAE

Decoder

翻译官。SD 不在原图上去噪(太贵),而是在一个'压缩版的图'里干活,最后由 VAE 把它解压回 512×512 像素。

// 点上面的盒子查看详情

每一个零件都是一篇博士论文。但你只需要知道它们的分工:文字 → 向量 → 在压缩空间里反复去噪 → 解压成图。下面那张 GIF 是 SD 1.5 一次完整生成的全过程。

下一章 · 你说的话它能听多死

"你说的话它要听多死?"——这就是 CFG。

Classifier-Free Guidance(CFG scale)是 SD 里最常被调的参数。 它控制模型对你 prompt 的"遵从程度"。 数值低 → 模型自由发挥,可能跑题;数值高 → 严格听话,但高过头会过曝、扭曲、崩坏

▸ INTERACTIVE_03.PY · classifier_free_guidance()
PROMPT (固定)
"a cute cat, yellow eyes, pink nose, sitting on a yellow floor"
CFG = 7.0 · 推荐值
CFG Scale 7.0
1
跑题
3 7
甜点
12 20
烧焦
// 当前判定
CFG=7 是大多数 SD 模型的甜点:模型既听 prompt,又保留细节合理性。
// 它到底在干嘛
SD 每一步同时跑两次:一次带 prompt、一次不带。然后把"带 prompt 的方向"放大 CFG 倍。CFG=1 等于不放大,CFG=20 等于把方向夸张 20 倍——所以图会"用力过猛"。
下一章 · 把所有零件串起来跑一遍

串起来跑一遍。

现在你已经认识了所有零件。最后一节交互——按下 GENERATE, 看一次完整的 SD 推理过程:文字进来、变成向量、在潜空间里被反复去噪、最后被 VAE 解压成图。 这不是真在跑模型(你的浏览器跑不动),但每一步的视觉变化都对应真实流程。

▸ INTERACTIVE_04.PY · pipeline.run()
Steps 20
Seed 42
01 TEXT ENCODER
待机
02 LATENT · 64×64
待机
03 U-NET LOOP
0 / 20
待机
04 VAE DECODE
待机
最后 · 一句话总结

所以——

Stable Diffusion 是一个学会了"擦噪声"的网络。 它在潜空间里反复擦, 每一步都被你的 prompt 通过 U-Net 引导着擦的方向, 最后让 VAE 把擦出来的东西翻译回像素。

就这么简单——也就这么复杂。每一个零件都还能再展开成一篇博士论文。下面是几个你可以接着读下去的地方。

// END OF FILE · EOF