Diffusion 数学:从加噪到生成
Stable Diffusion、DALL·E 3、Sora 都基于扩散模型。这一篇讲清楚它的核心数学——用最少的公式。
Diffusion 去噪可视化 你看过那个”从噪声到图像”的动画。
这一篇打开它的数学盒子——讲清楚为什么这套看似”反直觉”的方法能工作得这么好。
一个反直觉的训练目标
生成图像 应该怎么训?
直觉做法:让模型直接学”如何画出真实图像”——但这极难。GAN 试过,训练不稳定。VAE 试过,效果不够锐利。
Diffusion 的招数完全反过来:
不教模型怎么画图,而是教它”如何把噪声逐步去除”——然后从纯噪声出发生成。
听起来怪。但这是 2020 年以来生成模型领域最重要的突破。
第一站:前向过程(加噪)
定义一个”破坏”图像的过程——逐步往图像里加高斯噪声:
- :原始清晰图
- :完全噪声( 通常 1000)
- :每一步噪声强度(小数,比如 0.001 到 0.02)
- :高斯噪声
直觉:每一步把图像稍微往噪声方向”推一点”,1000 步后几乎完全是噪声。
设计 是个艺术——可以是线性、余弦、其他 schedule。Stable Diffusion 用余弦 schedule。
一次跳到任意时刻
幸运地,从 直接跳到 有闭式解:
其中 。
意思:给我原图 和一个噪声 ,我直接给你第 步的图——不用一步步算。这让训练特别快。
第二站:反向过程(去噪)
如果我们能学一个网络,从 反推 ——就能从纯噪声 一步步还原到清晰图 。
关键定理
如果 足够小,每一步的反向过程也近似是一个高斯分布:
我们的任务:让一个神经网络 学到 (方差可以固定)。
第三站:训练目标简化
经过一番数学(DDPM 论文 2020 推导),训练目标简化到一个惊人简洁的形式:
翻译:
训一个网络 ,输入是”加了噪声的图 + 时间步 t”,输出是”加进去的噪声预测”。损失就是预测噪声和真实噪声的 MSE。
就这一行。所有 diffusion 模型本质都在做这件事。
训练循环
for image in dataset:
# 1. 随机选一个时间步
t = randint(1, T)
# 2. 加噪
noise = randn_like(image)
noisy_image = sqrt(alpha_bar[t]) * image + sqrt(1 - alpha_bar[t]) * noise
# 3. 让模型预测噪声
predicted_noise = model(noisy_image, t)
# 4. MSE loss
loss = ((predicted_noise - noise) ** 2).mean()
loss.backward()
optimizer.step()
几十行代码就能跑。简单到让人怀疑。
第四站:采样(生成)
训完之后,怎么从噪声出发生成图?
DDPM 采样
经典版本,每一步:
- 第一项:用预测的噪声去掉一部分噪声
- 第二项:加一点新的随机性 (保证生成多样性)
走 步(1000 步)就能从纯噪声生成清晰图。
DDIM 采样(更快)
DDPM 要 1000 步,太慢。DDIM(2020 年改进版)能在 20-50 步内出图——它跳着算:
DDPM: x_1000 → x_999 → x_998 → ... → x_0 (1000 步)
DDIM: x_1000 → x_950 → x_900 → ... → x_0 (20-50 步)
牺牲一点点质量换 20× 速度——绝大多数应用用 DDIM 或更先进的 DPM-Solver。
第五站:让生成”听话”——条件 Diffusion
到目前为止讲的都是”无条件生成”——给你一张随机图。
实际我们要”按文本生成图”——比如”a cat sitting on a window”。
在去噪网络里加文本条件
简单做法:把文本 embedding 也喂给去噪网络:
predicted_noise = model(noisy_image, t, text_embedding)
↑ 这里加了文本条件
具体怎么”喂”——通常用 cross-attention:
- 图像 patch 作为 query
- 文本 token 作为 key/value
- attention 让图像的去噪能”听到”文本提示
这就是 Stable Diffusion 的 U-Net 内部用 cross-attention 的原因。
Classifier-Free Guidance(CFG)
一个简单但强大的技巧——训练时随机丢弃文本条件(30% 概率)。
生成时把”有条件”和”无条件”的预测线性组合:
是 guidance scale(通常 7.5)。
直觉:让生成”更服从”文本提示。s 越大越严格按照 prompt,但太大会失真。
你 Stable Diffusion 里调的 CFG 那个数字,就是 。
第六站:Latent Diffusion(Stable Diffusion 的优化)
原始 diffusion 在像素空间做——512×512 图就是 786K 维空间。计算超贵。
Stable Diffusion 的关键技巧:先把图压到”潜在空间”(latent space),在那里做 diffusion。
原图 512×512×3
↓ VAE Encoder
潜在表示 64×64×4
↓ Diffusion (在这里跑)
新潜在 64×64×4
↓ VAE Decoder
新图 512×512×3
好处:扩散过程只在 16K 维度做,比像素空间快 64 倍。
这是 Stable Diffusion 能在消费级显卡上跑的关键。OpenAI DALL·E 2 没用 latent diffusion,所以贵得多。
完整 Stable Diffusion 架构
"a cat" (文本 prompt)
↓
CLIP Text Encoder → 文本向量
↓
随机噪声 ──→ U-Net ←── 文本向量做 cross-attention
↑ ↓
└─ 反复 50 次 ↓
潜在向量
↓
VAE Decoder
↓
清晰图像
5 个组件:
- CLIP Text Encoder
- U-Net(去噪网络)
- VAE Encoder / Decoder
- Scheduler(DDIM 等采样算法)
- Tokenizer(CLIP 自带)
这就是 Stable Diffusion 完整架构——所有衍生模型(Stable Diffusion XL、Stable Diffusion 3、Flux、Midjourney 等)都基于这套范式。
视频生成(Sora 类)
把 diffusion 扩展到时间维度—— 不再是 (H, W, 3) 的图,而是 (T, H, W, 3) 的视频体。
Sora 的招数:
- 把视频切成 3D patches(同时跨空间和时间)
- 用 Transformer(不是 U-Net)做扩散
- 数据是数百万小时的视频
计算量是图像 diffusion 的几十到几百倍——所以视频生成 2024-2026 才开始成熟。
一些有意思的”涌现”
经过大规模训练,diffusion 模型涌现出意外的能力:
1. 修复(Inpainting)
Mask 掉图像一部分,让模型填回去——天然支持,因为它学的是”去噪”。
2. 风格迁移
通过 CLIP guidance 让生成的图”看起来像梵高”。
3. ControlNet(2023)
给定线稿、深度图、姿态——让生成图严格按这些”控制信号”走。
4. 图生图(Image-to-Image)
不是从纯噪声出发——从用户提供的图加一些噪声出发,去噪。可以做”风格化照片”。
一些前沿
Flow Matching / Rectified Flow
2023-2024 年的新思路——不需要 1000 步的离散过程,直接学一条从噪声到图像的”直线”:
学一个速度场把噪声”直推”到图像。Stable Diffusion 3 用了这个——少 5-10 倍步数。
Consistency Models
1 步生成图像——把多步 diffusion 蒸馏成单步模型。质量略低但极快。
Diffusion 整个领域 2020-2026 极速演化——每年都有 2-3 个大突破。
一句话总结
Diffusion = 训练一个去噪器,从噪声出发反向走。
数学简洁、训练稳定、生成质量逆天——它是 2020 年代生成模型的事实标准。
GAN 已死,VAE 退居二线,Diffusion 一统江湖。
Diffusion 去噪可视化 —— 选目标图像,看 50 步从噪声到清晰的全过程。 配合这一篇读,数学和直觉同时建立。
下一篇推荐:L5-03 ViT 或者直接跳到 L4-04 Agent 构建 —— 你的兴趣决定方向。
读到这里说明你认真在学 🎯
订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。
讨论区
· 用 GitHub 账号登录评论src/components/Comments.astro 顶部填入
仓库 ID 和分类 ID(见组件注释里的配置步骤)。