HelloAI
L5 第 2 篇 🐥 难度 🕒 15 分钟

Diffusion 数学:从加噪到生成

Stable Diffusion、DALL·E 3、Sora 都基于扩散模型。这一篇讲清楚它的核心数学——用最少的公式。

阿莱
2026/7/8

Diffusion 去噪可视化 你看过那个”从噪声到图像”的动画。

这一篇打开它的数学盒子——讲清楚为什么这套看似”反直觉”的方法能工作得这么好。

一个反直觉的训练目标

生成图像 应该怎么训?

直觉做法:让模型直接学”如何画出真实图像”——但这极难。GAN 试过,训练不稳定。VAE 试过,效果不够锐利。

Diffusion 的招数完全反过来:

不教模型怎么画图,而是教它”如何把噪声逐步去除”——然后从纯噪声出发生成。

听起来怪。但这是 2020 年以来生成模型领域最重要的突破

第一站:前向过程(加噪)

定义一个”破坏”图像的过程——逐步往图像里加高斯噪声:

xt=1βtxt1+βtϵtx_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon_t
  • x0x_0:原始清晰图
  • xTx_T:完全噪声(TT 通常 1000)
  • βt\beta_t:每一步噪声强度(小数,比如 0.001 到 0.02)
  • ϵt\epsilon_t:高斯噪声 N(0,I)\mathcal{N}(0, I)

直觉:每一步把图像稍微往噪声方向”推一点”,1000 步后几乎完全是噪声。

设计 βt\beta_t 是个艺术——可以是线性、余弦、其他 schedule。Stable Diffusion 用余弦 schedule

一次跳到任意时刻

幸运地,从 x0x_0 直接跳到 xtx_t 有闭式解:

xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon

其中 αˉt=i=1t(1βi)\bar{\alpha}_t = \prod_{i=1}^{t}(1 - \beta_i)

意思:给我原图 x0x_0 和一个噪声 ϵ\epsilon,我直接给你第 tt 步的图——不用一步步算。这让训练特别快

第二站:反向过程(去噪)

如果我们能学一个网络,xtx_t 反推 xt1x_{t-1}——就能从纯噪声 xTx_T 一步步还原到清晰图 x0x_0

关键定理

如果 βt\beta_t 足够小,每一步的反向过程也近似是一个高斯分布

p(xt1xt)N(xt1;μθ(xt,t),Σθ(xt,t))p(x_{t-1} | x_t) \approx \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t))

我们的任务:让一个神经网络 θ\theta 学到 μθ\mu_\theta(方差可以固定)。

第三站:训练目标简化

经过一番数学(DDPM 论文 2020 推导),训练目标简化到一个惊人简洁的形式:

L=Et,x0,ϵ[ϵϵθ(xt,t)2]L = \mathbb{E}_{t, x_0, \epsilon}[\| \epsilon - \epsilon_\theta(x_t, t) \|^2]

翻译

训一个网络 ϵθ\epsilon_\theta,输入是”加了噪声的图 + 时间步 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 采样

经典版本,每一步:

xt1=1αt(xtβt1αˉtϵθ(xt,t))+σtzx_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon_\theta(x_t, t) \right) + \sigma_t z
  • 第一项:用预测的噪声去掉一部分噪声
  • 第二项:加一点新的随机性 zz(保证生成多样性)

TT 步(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% 概率)。

生成时把”有条件”和”无条件”的预测线性组合:

ϵguided=ϵuncond+s(ϵcondϵuncond)\epsilon_{guided} = \epsilon_{uncond} + s \cdot (\epsilon_{cond} - \epsilon_{uncond})

ss 是 guidance scale(通常 7.5)。

直觉:让生成”更服从”文本提示。s 越大越严格按照 prompt,但太大会失真。

你 Stable Diffusion 里调的 CFG 那个数字,就是 ss

第六站: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 个组件

  1. CLIP Text Encoder
  2. U-Net(去噪网络)
  3. VAE Encoder / Decoder
  4. Scheduler(DDIM 等采样算法)
  5. 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 步的离散过程,直接学一条从噪声到图像的”直线”

xt=(1t)x0+tϵx_t = (1 - t) \cdot x_0 + t \cdot \epsilon

学一个速度场把噪声”直推”到图像。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 账号登录评论
⚠️ Giscus 评论未配置 —— 在 src/components/Comments.astro 顶部填入 仓库 ID 和分类 ID(见组件注释里的配置步骤)。