← aipaipai.cloud · INDEX
DOCS // INTERACTIVE NO MATH

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

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

↓ SCROLL · 共 8 章 · 约 12 分钟 NO MATH
● Diffusion ● U-Net ● VAE ● CFG ● Sampler
DEMO · LIVE DENOISE STEP 0 / 8
ENGINE_READY BACKEND: LATENT DIFFUSION SPACE: 64×64×4 STEPS: 20 STATUS: LOCAL_ONLY

02 它做的事其实很像雕塑

米开朗琪罗那句被引滥的话的字面翻译--只不过他的"石头"是一片随机噪声。

"雕像本来就在石头里,我只是把多余的部分凿掉。"Stable Diffusion 的工作方式几乎是这句话的字面翻译--只不过它的"石头"是一片彻底随机的噪声。

类比 · 雕塑家

从一整块石头里

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

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

现实 · 扩散模型

从一片噪声里

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

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

03 交互 #1 · 先看反过来:把图变成噪声

前向扩散(Forward Diffusion)--把一张干净的图慢慢加噪到完全看不出来。拖动滑块看一只"猫"是怎么消失的。

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

04 交互 #2 · 反过来:一步一步把噪声擦回图

反向扩散(Reverse Diffusion)--SD 真正在干的事。从纯噪声出发,每步问"此刻该擦掉哪些像素",擦一点,再问,再擦。

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

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

完整的 Stable Diffusion 是三个独立训练的神经网络串在一起。点一下任意一个零件,看它在干嘛。

解释模式
01 [T]

Text Encoder

CLIP / T5

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

02 [U]

U-Net

Denoiser / DiT

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

03 [V]

VAE

Decoder

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

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

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

06 交互 #3 · "你说的话它要听多死?" --CFG

Classifier-Free Guidance 是 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 倍--所以图会"用力过猛"。

07 交互 #4 · 串起来跑一遍

按下 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
待机

08 所以--

一句话总结 + 接着读下去的地方。

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

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

深度博文 · 英文

Lilian Weng
What are Diffusion Models?

从 DDPM 到 Score-based,最权威的中文译本来自 Lilian 本人 · OpenAI

lilianweng.github.io →
可视化 · 入门

Jay Alammar
The Illustrated Stable Diffusion

本页的精神先辈。配图比这页还多。

jalammar.github.io →
动手 · 代码

Hugging Face
🤗 Diffusers Docs

三行 Python 跑起 SD:from diffusers import StableDiffusionPipeline

huggingface.co/docs →
玩具 · 节点

ComfyUI

把每个零件画成节点连起来,所见即所得。社区的工作流之王。

github.com/comfyanonymous →
论文 · 原始

High-Resolution Image Synthesis
with Latent Diffusion Models

Stable Diffusion 的亲爹论文,CVPR 2022。22 页,公式不多。

arxiv.org/abs/2112.10752 →
代码注释 · 进阶

The Annotated Diffusion Model

把 DDPM 论文的每一行公式翻译成 PyTorch 代码--边读公式边读代码的最快方式。

huggingface.co/blog →