扩散模型原理
五层读懂一个词。这次拆的是:扩散模型(Diffusion Models)--当前最强的图像/音频/视频生成范式。核心思想只有两步:前向过程(给数据逐步加噪声,直到变成纯噪声)和反向过程(训练模型学会逐步去噪,从噪声中恢复数据)。Stable Diffusion / DALL-E 3 / Sora / Midjourney 的底层都是它。GAN 的统治时代结束了,扩散模型是新的王者。
L1 · 一句话点破
扩散模型 = 学会「从噪声中还原数据」。前向过程(加噪)把一张清晰图片通过 T 步逐渐变成纯高斯噪声——这叫扩散。反向过程(去噪)训练一个神经网络预测每一步的噪声,从纯噪声一步步还原出清晰图片。推理时从随机噪声开始,T 步去噪,得到一张新图片。数学本质是学习 score function $\nabla_x \log p(x)$(数据分布的梯度),沿着梯度方向上升找到高概率区域(= 生成逼真图片)。
L2 · 通俗类比
扩散模型像一杯咖啡里滴入牛奶的过程,倒过来:
前向(加噪)= 牛奶在咖啡中扩散:
- 第 1 秒:一滴牛奶,看得清轮廓
- 第 10 秒:牛奶开始扩散,轮廓模糊
- 第 50 秒:完全混匀,变成棕色液体
- 你不可能从棕色液体倒推出初始的牛奶滴
反向(去噪)= 学会了每一帧「牛奶怎么散开的」,然后反向播放:
- 训练:看 100 万次「牛奶扩散」的过程,模型学会了「牛奶扩散每一帧的规律」
- 推理:从棕色液体开始,反着播放,恢复出初始的牛奶滴形状
关键:模型学会的不是「一张画」,而是「从噪声到画的过程」——每一步只去一点点噪声,逐步精细化,最后得到一张全新的画。
生成过程的步骤:
噪声 (纯随机) → T→...→ t+1 → t → ... → 0 (清晰图片)
每步 t: 模型预测当前噪声 → 减去部分噪声 → 更清晰一点
T 通常 = 1000,推理时可用 DDIM 缩减到 50 步和 GAN 的对比:
| 维度 | GAN | Diffusion |
|---|---|---|
| 生成方式 | 一步生成(随机噪声→图片) | 多步去噪(T 步逐步恢复) |
| 训练 | 对抗训练(不稳定) | 简单回归(稳定) |
| 多样性 | 容易 mode collapse | 多样性好 |
| 质量 | 曾经 SOTA | 当前 SOTA |
| 速度 | 快(一步) | 慢(多步) |
代价:
- 推理慢(T 步去噪,即使缩减也要 20-50 步)
- 训练贵(需要大量图像 + 多步噪声调度)
- 可控性需要额外设计(文本条件、ControlNet)
L3 · 正经定义
扩散模型(Diffusion Model):基于非平衡热力学启发的生成模型。由 Sohl-Dickstein et al. 2015 提出,Ho et al. 2020(DDPM)使其实用化。
前向过程(Forward / Diffusion Process):
在 T 个时间步中逐步向数据 $x_0$ 加高斯噪声:
$$ q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t} x_{t-1}, \beta_t I) $$
其中 $\beta_t$ 是噪声调度(noise schedule),控制每步加的噪声量。
可以直接从 $x_0$ 到任意 $x_t$(重参数化):
$$ q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1 - \bar{\alpha}_t) I) $$
其中 $\bar{\alpha}t = \prod^{t} (1-\beta_s)$。
反向过程(Reverse / Denoising Process):
从噪声 $x_T \sim \mathcal{N}(0, I)$ 开始,逐步去噪还原 $x_0$:
$$ p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t)) $$
训练目标:让模型预测每步添加的噪声 $\epsilon$:
$$ \mathcal{L}{\text{simple}} = E{t, x_0, \epsilon} \left[ | \epsilon - \epsilon_\theta(x_t, t) |^2 \right] $$
其中 $\epsilon_\theta$ 是 U-Net(或 DiT)架构的噪声预测网络。
参考资料:
- 📄 Ho et al., Denoising Diffusion Probabilistic Models (DDPM), NeurIPS 2020
- 📄 Song et al., Denoising Diffusion Implicit Models (DDIM), ICLR 2021
- 📄 Rombach et al., High-Resolution Image Synthesis with Latent Diffusion Models (Stable Diffusion), CVPR 2022
- 📄 Peebles & Xie, Scalable Diffusion Models with Transformers (DiT), ICCV 2023
- 📝 Lilian Weng Blog:What are Diffusion Models? https://lilianweng.github.io/posts/2021-07-11-diffusion-models/
L4 · 原理深挖
4.1 前向过程
逐步加噪:
# beta: noise schedule, 从 β_1=1e-4 线性增加到 β_T=0.02
# alpha = 1 - beta
# alpha_cumprod = 累积积
def forward_process(x_0, t, alpha_cumprod):
noise = torch.randn_like(x_0)
# 重参数化: x_t = sqrt(ᾱ_t) * x_0 + sqrt(1-ᾱ_t) * ε
sqrt_alpha_cumprod = alpha_cumprod[t].sqrt()
sqrt_one_minus = (1 - alpha_cumprod[t]).sqrt()
x_t = sqrt_alpha_cumprod * x_0 + sqrt_one_minus * noise
return x_t, noise # noise 是训练目标可视化:
t=0: 清晰图片(信号 100%)
t=250: 轻微噪声(信号 75%)
t=500: 明显噪声(信号 50%)
t=750: 几乎看不清(信号 25%)
t=999: 纯噪声(信号 → 0%)为什么用重参数化:
- 不需要迭代 T 步
- 任意 t 一步到位:$x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \epsilon$
- 训练时随机采样 t,高效
4.2 反向过程与训练
DDPM 的简化训练(Ho et al. 2020):
def train_step(x_0, model, alpha_cumprod):
# 1. 随机采样时间步
t = random.randint(0, T)
# 2. 加噪
noise = torch.randn_like(x_0)
x_t = sqrt(alpha_cumprod[t]) * x_0 + sqrt(1 - alpha_cumprod[t]) * noise
# 3. 模型预测噪声
predicted_noise = model(x_t, t)
# 4. L2 loss
loss = F.mse_loss(predicted_noise, noise)
return loss为什么简单有效:
- 不需要对抗训练(GAN 的不稳定性)
- 目标明确:预测加了什么噪声
- L2 loss 简单稳定
U-Net 架构:
- 编码器:逐步下采样,提取特征
- 瓶颈层:全局注意力
- 解码器:逐步上采样,还原细节
- 跳跃连接:保留高清细节
- 时间嵌入:每层注入时间步 t(让模型知道当前在哪个阶段)
4.3 推理/采样
DDPM 采样(T=1000 步,慢):
def sample(model, T):
x_t = torch.randn(3, 256, 256) # 纯噪声
for t in reversed(range(T)):
z = torch.randn_like(x_t) if t > 0 else 0
# 预测噪声 + 更新 x_t
pred_noise = model(x_t, t)
x_t = (1 / sqrt(alpha[t])) * (x_t - (beta[t] / sqrt(1 - alpha_cumprod[t])) * pred_noise)
x_t = x_t + sqrt(beta[t]) * z
return x_t # 清晰图片DDIM 加速采样(可跳过步数):
# DDIM: 非马尔可夫过程,允许跳步
# T=1000 训练,推理只需 50 步甚至 20 步
def ddim_sample(model, T, steps=50):
timesteps = np.linspace(T-1, 0, steps)
x_t = torch.randn(...)
for i in range(len(timesteps) - 1):
t = timesteps[i]
t_next = timesteps[i + 1]
pred_noise = model(x_t, t)
# DDIM 更新公式
x_t = ddim_step(x_t, pred_noise, t, t_next)
return x_t速度对比:
| 方法 | 步数 | 一张图耗时 |
|---|---|---|
| DDPM | 1000 | ~50s (A100) |
| DDIM | 50 | ~2.5s |
| DDIM | 20 | ~1s |
| LCM | 4 | ~0.2s |
4.4 条件生成(Classifier-free Guidance)
核心问题:如何让扩散模型生成「一只猫」而不是随便一张图?
Classifier-free Guidance(当前主流方法):
# 同时训练条件模型和无条件模型
# 用同一个模型,条件 dropout 10-20%
# 推理时:
def classifier_free_guidance(model, x_t, t, condition, guidance_scale=7.5):
# 条件预测
eps_cond = model(x_t, t, condition)
# 无条件预测
eps_uncond = model(x_t, t, None)
# Guidance: 推远无条件方向,加强条件方向
eps = eps_uncond + guidance_scale * (eps_cond - eps_uncond)
return epsguidance_scale:
- scale=1:普通条件生成
- scale=3-5:质量提升
- scale=7-15:严格遵守条件,但可能过饱和/不自然
- Stable Diffusion 默认 7.5
4.5 Latent Diffusion(Stable Diffusion 的原理)
问题:像素空间的扩散模型计算量巨大(256×256×3 → 高维)。
Latent Diffusion(Rombach et al. 2022):
- 不在像素空间做扩散,在 VAE 的隐空间做
- VAE Encoder:图像 → latent(压缩 4-8x,如 64×64×4)
- 在 latent 上做扩散模型的训练/推理
- VAE Decoder:latent → 图像
图像 (512×512×3) → VAE Enc → latent (64×64×4) → Diffusion → VAE Dec → 图像 (512×512×3)
↑
Text Embedding优势:
- 计算量降低 8-48x
- 训练/推理大幅加速
- 可以在消费级 GPU 上跑
4.6 DiT (Diffusion Transformer)
Peebles & Xie, 2023:用 Transformer 替代 U-Net 做扩散模型的 backbone。
- U-Net 靠卷积的归纳偏置
- DiT 证明 Transformer 也够用(Sora 用的就是 DiT)
- 配合 ViT/ViT 的 patch embedding
噪声 latent + 时间 t + 条件 → Patchify → Transformer Blocks → Unpatchify → 预测噪声DiT 的意义:扩散模型 + Transformer = 更好的 Scalability → 更强的生成能力。
4.7 扩散模型的局限
局限 1: 推理慢。需要多步去噪,即使 DDIM 50 步也比 GAN 一步慢得多。
局限 2: 训练贵。在像素空间训练扩散模型非常昂贵(Stable Diffusion 需要数百块 A100)。
局限 3: 可控性需要额外设计。文本条件、ControlNet、IP-Adapter 等都是后期添加的。
局限 4: 组合性一般。生成「一只猫和一只狗在公园」不如分两次生成好。
局限 5: 手指/文字等细节差。扩散模型在人类手指、文字等细节上仍有挑战(正在改善)。
局限 6: 无法精确复制。每次生成不同,无法做「修图」(inpainting 可以但不完美)。
局限 7: 版权/偏见。训练数据中的版权问题和偏见问题。
局限 8: 推理的随机性。相同 prompt + 相同 seed 才能复现。
L5 · 沿革与坑
5.1 沿革
- 2015:扩散模型基础理论(Sohl-Dickstein et al.)
- 2020-06:DDPM(Ho et al.),让扩散模型实用化
- 2021-01:DDIM(Song et al.),加速采样
- 2021-05:Classifier-free Guidance(Ho & Salimans)
- 2021-12:GLIDE(OpenAI),文本条件扩散模型
- 2022-04:DALL-E 2(OpenAI),扩散 + CLIP
- 2022-08:Stable Diffusion(Rombach et al.),Latent Diffusion,开源
- 2023:ControlNet、IP-Adapter、SDXL
- 2024:Sora(OpenAI)/ Stable Video Diffusion(视频生成)
- 2024-2025:DiT 架构成为主流,扩散模型统治生成领域
5.2 常见坑
坑 1: 期望一步生成。扩散模型多步很慢。要 DDIM/LCM 加速,或用蒸馏模型。
坑 2: guidance_scale 乱设。太高(>15)过饱和、不自然。太低(❤️)条件不生效。7.5 是经验甜点。
坑 3: 训练时 noise schedule 不匹配推理。训练用 linear schedule,推理用 cosine schedule 效果好。
坑 4: VAE 的 latent 维度不匹配。SD 的 VAE 是 4 通道 latent,不能和 3 通道 VAE 混用。
坑 5: 微调时忘记加 conditioning。Fine-tune 时丢掉文本条件,变成无条件生成。
坑 6: 采样步数太少质量崩。DDIM < 20 步可能产生模糊或不自然。要 30+ 步。
坑 7: 长 prompt 被截断。CLIP text encoder 的最大长度 77 token,超长 prompt 被截断。
坑 8: 忽略 negative prompt。不设负向 prompt 可能生成质量差。空字符串或「低质量、模糊」等。
坑 9: 推理用不同 scheduler。DDIM/DPM-Solver/Euler 等 scheduler 效果不同。要验证哪个最好。
坑 10: 跨模态时 latent 对齐问题。视频 latent(时间维度)、音频 latent(频谱)需要专门的 VAE。
5.3 面试怎么考
- 扩散模型的核心思想? 答:前向加噪(逐步把数据变噪声)+ 反向去噪(训练模型学会从噪声中还原)。训练目标:预测每步加的噪声 $\epsilon$。推理:从噪声逐步去噪生成图片。
- DDPM 的 Loss? 答:$L = E[|\epsilon - \epsilon_\theta(x_t, t)|^2]$。简单地预测噪声,L2 loss。不需要对抗训练。
- Classifier-free Guidance 做什么? 答:用条件和无条件预测的加权差指导生成,$\epsilon = \epsilon_{uncond} + w(\epsilon_{cond} - \epsilon_{uncond})$。w=7.5 是默认甜点。
- Latent Diffusion 为什么高效? 答:在 VAE 的压缩隐空间做扩散(如 64×64×4),而非像素空间(512×512×3)。计算量降低 8-48x。
- DDIM vs DDPM? 答:DDPM 是马尔可夫过程(T 步串行),DDIM 是非马尔可夫(可跳步)。DDIM 用 50 步达到 DDPM 1000 步的质量。
速记卡
核心公式:
前向: x_t = √(ᾱ_t)·x_0 + √(1-ᾱ_t)·ε
训练: L = ||ε - ε_θ(x_t, t)||²
采样: x_{t-1} = (1/√α_t)·(x_t - (β_t/√(1-ᾱ_t))·ε_θ) + σ_t·z
Guidance: ε = ε_uncond + w·(ε_cond - ε_uncond)三阶段:
前向: 逐步加噪(Diffusion)
训练: 学会预测噪声(Denoising)
推理: 从噪声逐步去噪(Sampling)架构进化:
DDPM (U-Net) → Latent Diffusion (VAE + U-Net) → DiT (VAE + Transformer)
2020 2022 (Stable Diffusion) 2023 (Sora)加速采样:
| 方法 | 步数 | 速度 |
|---|---|---|
| DDPM | 1000 | 1x(基线) |
| DDIM | 50 | 20x |
| LCM | 4 | 250x |
关键参数:
| 参数 | 典型值 | 作用 |
|---|---|---|
| T | 1000 | 扩散总步数 |
| guidance_scale | 7.5 | 条件强度 |
| DDIM steps | 30-50 | 推理质量 vs 速度 |
| image size | 512/768/1024 | 生成分辨率 |
一句话记忆:扩散模型 = 前向加噪(逐步破坏数据)+ 反向去噪(学预测噪声并逐步还原)。DDPM 让训练稳定(L2 回归),DDIM 让推理快(跳步),Latent Diffusion(Stable Diffusion)让它在消费级 GPU 上能跑(在 VAE 隐空间而非像素空间做扩散)。Classifier-free Guidance(w≈7.5)控制条件生成强度。是 DALL-E/Stable Diffusion/Sora 的底层原理,已取代 GAN 成为生成模型的新王者。局限:推理仍需多步、训练贵、细节(手指/文字)差。
上一篇:ViT 视觉 Transformer -- ViT 让模型看懂图,扩散模型让模型生成图。下一篇:Stable Diffusion 稳定扩散 -- 扩散模型的最流行实现,开源文生图的标杆。