Skip to content

扩散模型原理

五层读懂一个词。这次拆的是:扩散模型(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 的对比

维度GANDiffusion
生成方式一步生成(随机噪声→图片)多步去噪(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 前向过程

逐步加噪

python
# 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):

python
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 步,慢):

python
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 加速采样(可跳过步数):

python
# 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

速度对比

方法步数一张图耗时
DDPM1000~50s (A100)
DDIM50~2.5s
DDIM20~1s
LCM4~0.2s

4.4 条件生成(Classifier-free Guidance)

核心问题:如何让扩散模型生成「一只猫」而不是随便一张图?

Classifier-free Guidance(当前主流方法):

python
# 同时训练条件模型和无条件模型
# 用同一个模型,条件 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 eps

guidance_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 面试怎么考

  1. 扩散模型的核心思想? 答:前向加噪(逐步把数据变噪声)+ 反向去噪(训练模型学会从噪声中还原)。训练目标:预测每步加的噪声 $\epsilon$。推理:从噪声逐步去噪生成图片。
  2. DDPM 的 Loss? 答:$L = E[|\epsilon - \epsilon_\theta(x_t, t)|^2]$。简单地预测噪声,L2 loss。不需要对抗训练。
  3. Classifier-free Guidance 做什么? 答:用条件和无条件预测的加权差指导生成,$\epsilon = \epsilon_{uncond} + w(\epsilon_{cond} - \epsilon_{uncond})$。w=7.5 是默认甜点。
  4. Latent Diffusion 为什么高效? 答:在 VAE 的压缩隐空间做扩散(如 64×64×4),而非像素空间(512×512×3)。计算量降低 8-48x。
  5. 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)

加速采样

方法步数速度
DDPM10001x(基线)
DDIM5020x
LCM4250x

关键参数

参数典型值作用
T1000扩散总步数
guidance_scale7.5条件强度
DDIM steps30-50推理质量 vs 速度
image size512/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 稳定扩散 -- 扩散模型的最流行实现,开源文生图的标杆。

内容采用 CC BY-SA 4.0,代码采用 MIT。