扩散模型
扩散模型(Diffusion Model)是深度生成模型(DGM)分类树中”显式密度 → 近似密度”一族的代表方法(整体框架见 生成式 AI 概览),也是当前图像生成的主流范式。本页用直觉和代码帮你理解它怎么工作。
扩散模型的灵感来自热力学——墨水滴入清水的过程:
- 前向过程(加噪):就像往清水里滴墨水,墨水慢慢扩散,最终水变得完全浑浊。这个过程是固定的、不可逆的——逐步给图像加高斯噪声,直到变成纯随机噪声。
- 反向过程(去噪):训练一个神经网络学会”逆转”这个过程——从噪声中一点一点地把清晰图像”捞”出来。
- 生成:训练完成后,你只需要采样一个纯随机噪声,然后用学到的去噪网络一步步去噪,就能生成一张全新的、从未见过的图像。
为什么有效? 因为”去噪”比”从零生成”简单得多——模型不需要一步到位地生成完美图像,只需要学会”稍微去掉一点噪声”。每一步只需要做很小的工作,但累积起来就能从噪声中恢复出清晰图像。
类比:像考古学家修复文物——不是凭空捏造一个完整陶罐,而是面对一地碎片,每次只修复一小块裂纹,修几百次后碎片变回完整的罐子。每一步都是”去掉一点损伤”的小问题,而不是”从无到有造一个罐”的大问题。
关键概念速览
Section titled “关键概念速览”后面会反复出现这几个术语,先在这里建立一个直觉:
- 去噪(Denoising):扩散模型的核心动作。给定一张”模糊的、加了噪声的”图像,让神经网络预测并减去其中的噪声,让它更清晰一点。重复几百次就从噪声得到一张清晰图像。
- 潜空间(Latent Space):真实图像(如 512×512 像素)太大了,直接在上面做扩散计算量惊人。所谓”潜空间”是用一个 VAE(变分自编码器)把图像压缩成一个很小的特征张量(如 64×64),在这个紧凑空间里做扩散再解码回去。这就是 Latent Diffusion(潜在扩散)的核心思想,也是 Stable Diffusion 能在消费级 GPU 上跑起来的根本原因。
- CLIP(Contrastive Language-Image Pre-training):OpenAI 提出的图文对齐模型,它把一段文字和一张图分别编码成向量,并让匹配的图文对在向量空间里靠近。扩散模型用 CLIP(或更晚的 T5)把用户输入的文字提示编码成向量,作为生成过程的”条件”。
- Cross-Attention(交叉注意力):Transformer 中的注意力机制的一种变体——Query 来自图像特征,Key/Value 来自文本编码。简单说就是让”图像的每个位置”都能看到”文字描述的每个词”,从而把文字的含义注入到图像生成过程中。这是文生图的关键部件。
- DDIM(Denoising Diffusion Implicit Models):DDPM 的加速采样方法。DDPM 反向去噪是随机的、需要 1000 步;DDIM 把它改造成确定性的过程,从而允许只用 20–50 步就生成图像,质量几乎不降。
- CFG(Classifier-Free Guidance,无分类器引导):一种提升生成质量的技巧——同时做一次”有文字条件”和一次”无条件”的去噪,然后把两者差值放大叠加。直觉上就是”强化模型对文字提示的响应”,代价是牺牲一点多样性。几乎所有现代文生图模型都用它。
- 自回归(Autoregressive):与扩散并列的另一大生成范式——一次生成一个 token(如 GPT 逐词生成文本)。扩散则是”一次性”给出整张图然后逐步精修,两条路线在视频/世界模型叙事下开始交汇。
前向加噪 + 反向去噪
Section titled “前向加噪 + 反向去噪”U-Net 骨干结构
Section titled “U-Net 骨干结构”扩散模型用 U-Net 作为去噪网络——它先下采样提取特征,再上采样恢复分辨率,跳跃连接(skip connection)保留细节信息:
训练目标极其简单:给网络一张加噪图像 和时间步 ,让它预测加入的噪声 是什么。损失函数就是 MSE:。训练数据不需要人工标注——任何图像都可以,随机加噪再去噪就是自动的监督信号。
文生图:条件信息是怎么注入的
Section titled “文生图:条件信息是怎么注入的”上面讲的是”无条件”扩散——生成的图像内容完全随机。要实现文生图(text-to-image),必须让去噪网络”看到”用户的文字提示。主流做法是在 U-Net 的每个分辨率块之间插入 Cross-Attention 层:
- 用户输入文字(如”a cat sitting on the moon”),用 CLIP 或 T5 文本编码器把这段话编码成一组 token 向量。
- 这些文本向量作为 Cross-Attention 的 Key 和 Value,而 U-Net 中间产生的图像特征作为 Query。
- 注意力运算让图像的每个空间位置都能”查询”文本中的相关词汇,从而把”a cat""moon”等概念逐步注入到图像生成中。
这样,同一个去噪网络既能做无条件生成(不输入文本),也能做文生图(输入文本),这正是 CFG 的前提。
采样时,CFG(无分类器引导)的公式是:
其中 是引导强度(guidance scale,通常 5–8)。 越大,输出越贴合文字提示,但细节会变僵硬、多样性下降; 太小则画面自由但可能偏离提示。理解这一点对实际调参很重要。
numpy 实现扩散噪声时间表
Section titled “numpy 实现扩散噪声时间表”扩散模型的核心是”噪声时间表”——控制每个时间步加多少噪声。以下是 DDPM 论文使用的线性时间表的 numpy 实现:
import numpy as np
T = 1000 # 总扩散步数betas = np.linspace(1e-4, 0.02, T) # β_t:噪声增加量,从 0.0001 线性增到 0.02alphas = 1.0 - betas # α_t = 1 - β_talphas_cumprod = np.cumprod(alphas) # ᾱ_t = α₁·α₂·…·α_t(累积乘积)
# 关键公式:x_t = √ᾱ_t · x₀ + √(1-ᾱ_t) · ε# 这意味着可以直接从 x₀ 跳到任意步 t,不需要逐步加噪def add_noise(x0, t, alphas_cumprod): """直接给原始图像 x0 加 t 步噪声""" sqrt_alpha = np.sqrt(alphas_cumprod[t]) sqrt_one_minus = np.sqrt(1 - alphas_cumprod[t]) noise = np.random.randn(*x0.shape) # 标准高斯噪声 ε return sqrt_alpha * x0 + sqrt_one_minus * noise # 加噪后的图像
# 演示:对一张假图像逐步加噪x0 = np.random.randn(4, 4) # 模拟一张 4x4 的图像for t in [0, 100, 500, 999]: xt = add_noise(x0, t, alphas_cumprod) print(f"t={t:4d}: 噪声占比 = {1-alphas_cumprod[t]:.2%}")# 输出: t= 0: 噪声占比 = 0.01% (几乎没噪声)# t= 100: 噪声占比 = 8.50%# t= 500: 噪声占比 = 58.20%# t= 999: 噪声占比 = ~100% (纯噪声)可视化前向加噪过程
Section titled “可视化前向加噪过程”用 matplotlib 把逐步加噪的效果画出来,直观感受噪声如何从清晰变为纯噪声:
import matplotlib.pyplot as plt
# 演示:对一张"图片"逐步加噪x0 = np.random.randn(32, 32) # 模拟一张清晰图片fig, axes = plt.subplots(1, 5, figsize=(15, 3))for i, t in enumerate([0, 100, 300, 600, 999]): noise = np.random.randn(*x0.shape) xt = add_noise(x0, t, alphas_cumprod) if t > 0 else x0 axes[i].imshow(xt, cmap="gray"); axes[i].set_title(f"t={t}"); axes[i].axis("off")plt.suptitle("前向过程:逐步加噪"); plt.tight_layout(); plt.show()
按 Goodfellow NIPS 2016 Tutorial 框架,扩散模型(Diffusion / Score-based)的演进如下:
扩散模型(Diffusion / Score-based)├── 奠基:Sohl-Dickstein 2015(非平衡热力学)├── DDPM [Ho et al. 2020] → DDIM;Score-based NCSN [2019] → Score SDE [2021]├── Latent Diffusion [2022] → Stable Diffusion [2022-08]└── 骨干演进:U-Net → DiT(Diffusion Transformer)[2022/23]扩散模型存在三种等价形式化——DDPM(马尔可夫链视角)、NCSN(score matching 视角)、SDE(随机微分方程视角)——被 Song et al. 2021 证明等价,所以”基于分数的生成模型”与”扩散模型”是同一族,不是并列两类。扩散模型可视为”固定编码器的多级 VAE”(Luo 2022 统一视角)。
早期扩散模型的骨干网络是 U-Net——它原本是生物医学图像分割架构(见 图像分割),这是 CV 架构向生成模型渗透的典型交叉点;2022/23 年起骨干逐步转向 DiT(Diffusion Transformer),即”用 Transformer 做扩散”,体现了架构与生成机制的正交性。
GAN 的本质分界
Section titled “GAN 的本质分界”GAN 是隐式密度模型,无法计算样本似然——这是它与 Flow/自回归/扩散的本质区别,也是其训练不稳定(模式崩塌)的根源;2021 年 “Diffusion Models Beat GANs”(Dhariwal & Nichol, OpenAI)后扩散取代 GAN 成为图像生成主流。
扩散 vs 流的边界正在消融
Section titled “扩散 vs 流的边界正在消融”Flow Matching/Rectified Flow(2022)在数学上连接了 normalizing flow 与扩散,Stable Diffusion 3 已改用 rectified flow。
- 采样速度是主要瓶颈:标准 DDPM 需要 1000 步去噪才能生成一张图,实际使用中常用 DDIM(只需 20–50 步)或 DPM-Solver(10 步即可),大幅加速。
- Latent Diffusion 是工程关键创新:Stable Diffusion 不在像素空间做扩散,而是先用 VAE 把图像压缩到潜空间(小 48 倍),在潜空间做扩散,再解码回像素——这使普通 GPU 也能运行。
- 噪声时间表影响很大:线性时间表简单但不是最优,cosine 时间表(Improved DDPM)在低分辨率上效果更好。
- 条件生成:要控制生成内容(如文生图),需要在 U-Net 中注入条件信息,常用方法是 Cross-Attention(文本编码后作为 K/V)或 Classifier-Free Guidance。
关于扩散模型数学原理的深入剖析已在本文完成。
- 文生图 / 图生图:Stable Diffusion 根据文字提示生成图像,或对输入图片做风格转换和局部重绘(inpainting),是开源社区最活跃的扩散模型应用。
- 艺术创作:Midjourney 用扩散模型生成高质量艺术风格图像,被设计师、插画师用于概念探索和商业交付物。
- 设计辅助:Adobe Firefly 将扩散模型集成进 Photoshop 的”生成式填充”——选中区域后用文字描述直接生成内容,无需切换到外部工具。
- 数字人与虚拟人:HeyGen 等平台用扩散模型生成逼真的人脸图像和视频,用于虚拟主播、营销视频中数字人形象的合成。
- 药物分子设计:辉瑞、Insilico Medicine 用扩散模型在化学空间中生成新的分子结构,加速药物发现阶段的候选化合物筛选。
- 文生视频:OpenAI Sora、Runway Gen-3、快手可灵等模型将扩散架构扩展到时序维度,根据文本或图片生成短视频,应用于影视预可视化和广告制作。
- 音乐与封面生成:Suno、Udio 用扩散模型生成完整歌曲,配合扩散模型的封面图生成能力,独立音乐人可一站式产出专辑封面和配乐。
- 建筑设计效果图:建筑师输入线稿或文字描述,扩散模型快速渲染出逼真的建筑效果图和室内方案,替代传统手工渲染流程。
- 游戏资产生成:游戏团队用扩散模型批量生成纹理贴图、概念设定图、3D 资产草图,缩短美术制作管线周期。
典型类库与工具
Section titled “典型类库与工具”| 类库 | 语言 | 说明 |
|---|---|---|
| HuggingFace Diffusers | Python | 扩散模型主流库,提供 Stable Diffusion/DDPM/DiT 等模型的统一接口 |
| Stable Diffusion | Python | 最具影响力的开源文生图模型,支持文生图/图生图/局部重绘 |
| PyTorch | Python | 实现扩散模型 U-Net/DiT 骨干与训练循环的通用框架 |
| ComfyUI | Python/JS | 节点式扩散模型工作流工具,灵活组合采样器/LoRA/ControlNet |
| timm | Python | 为扩散模型骨干提供 U-Net 组件与预训练层的第三方库 |
| OpenCV | C++/Python | 用于生成结果的后处理、图像拼接与预处理 |
| k-diffusion | Python | Katherine Crowson 开源的高质量采样器库(DPM2、Euler ancestral 等),是 Automatic1111 等工具的采样后端 |
| AUTOMATIC1111 | Python / JavaScript | 最流行的 Stable Diffusion Web UI,开箱即用,提供文生图、ControlNet、LoRA 训练等丰富插件生态 |
| Stability AI SDK | Python | Stable Diffusion 官方模型与训练代码,提供从训练到推理的完整参考实现 |
| 术语 | 英文 | 解释 |
|---|---|---|
| 去噪扩散概率模型 | DDPM | 逐步加噪再学习去噪的经典扩散模型形式化,训练目标为预测噪声 |
| 基于分数的模型 | Score-based Model | 通过学习数据分布梯度(分数函数)来生成的扩散模型等价形式化 |
| 噪声调度 | Noise Schedule | 控制每个扩散时间步加入多少噪声的时间表(线性/cosine 等) |
| 无分类器引导 | CFG (Classifier-Free Guidance) | 在条件与无条件生成之间插值,提升生成质量与提示词一致性的技术 |
| 潜在扩散 | Latent Diffusion | 不在像素空间而在 VAE 压缩后的潜空间做扩散,大幅降低计算量 |
| 扩散 Transformer | DiT (Diffusion Transformer) | 用 Transformer 替代 U-Net 作为去噪骨干的新一代扩散架构 |
| 采样步数 | Sampling Steps | 反向去噪生成图像所用的步数,步数越多质量越高但越慢 |
- 奠基:Sohl-Dickstein et al. 2015 “Deep Unsupervised Learning using Nonequilibrium Thermodynamics”——首次提出用非平衡热力学建模扩散过程。
- DDPM:Ho et al. 2020 “Denoising Diffusion Probabilistic Models”——简化了训练目标(预测噪声 ε),使扩散模型真正实用。DDIM(Song et al. 2020)提出了确定性采样加速。
- Score-based 统一:Song et al. 2021 “Score-Based Generative Modeling through SDEs”——用随机微分方程统一了 DDPM 和 NCSN 两种视角。
- Latent Diffusion → Stable Diffusion:Rombach et al. 2022 提出 Latent Diffusion,Stable Diffusion(2022-08 开源)使其大众化。DiT(Peebles & Xie 2022/23)将骨干替换为 Transformer。
- 与 LLM 的关系:扩散模型(迭代去噪)与自回归模型(逐词生成)是两条生成路线,在”世界模型”叙事下开始交汇。