扩散模型原理
扩散模型(Diffusion Models)是近年来最成功的生成模型之一,在图像生成、文本到图像、图像编辑等任务上取得了突破性进展。从 DALL·E 2、Midjourney 到 Stable Diffusion,这些令人惊艳的 AI 生成工具都基于扩散模型。
什么是扩散模型:扩散模型的核心思想是学习如何"逆转"一个逐步添加噪声的过程。训练时,模型学习从噪声中恢复原始数据;生成时,模型从纯噪声开始,逐步去噪,最终生成高质量的数据样本。
本文内容:本文深入解析扩散模型的工作原理,包括:
- 前向扩散过程:如何通过逐步加噪将数据转换为纯噪声
- 反向扩散过程:如何训练网络学习去噪,实现数据生成
- DDPM:经典的扩散模型实现,包括完整的数学公式和算法
- 数学框架:扩散模型的概率论和热力学基础
- 潜在空间优化:如何在低维空间中进行扩散以提高效率
适用对象:本文适合希望深入理解扩散模型原理的读者,假设读者具备基础的机器学习和概率论知识。
前向扩散过程
前向扩散过程是扩散模型的基石,通过一系列增量噪声添加系统地破坏输入数据。该过程通过迭代应用具有预定义调度的高斯噪声,将原始数据分布转换为简单的高斯分布。在数学上,前向过程被建模为马尔可夫链,其中每一步 都会对数据引入小的扰动。噪声调度通常由方差参数序列 定义,确保数据在 步中变得越来越嘈杂,直到达到接近不可逆的纯高斯噪声状态。这种确定性退化通常使用时间相关的向量场来实现,如基于流的扩散模型中所描述的,其中前向过程由将数据演化向先验分布的常微分方程(ODE)控制。前向过程的简单性是一个关键优势,因为它不需要训练,可以高效执行,即使对于高维数据也是如此。
直观理解:前向扩散过程可以类比为将一张清晰的图像逐步添加噪声,使其慢慢"变得像噪声"。输入一张真实图像 ,逐步添加高斯噪声,得到 ,到最后 基本是纯噪声。这是一个马尔可夫过程,每一步只依赖前一步的状态。数学上,这个过程可以表示为:
其中 越大,噪声越多(越模糊),最终达到接近纯高斯噪声的状态。
前向扩散的本质:前向扩散是一个固定的、手工定义的随机过程,具有以下关键特征:
-
噪声是人为加的:噪声 是从标准高斯分布中随机采样的
-
噪声调度是预先设定的:、 是预先设定好的 schedule,不随训练改变
-
没有神经网络参与:前向扩散过程不涉及任何可学习的参数
-
没有梯度、没有优化:它只是一个数据生成器,用来构造训练样本
前向扩散与训练的关系:前向扩散不是"学习参数"的过程,但它只在训练阶段被用到,是训练流程的一部分。训练时,我们有真实数据 ,可以随机加噪声来构造训练样本;生成时,我们没有 ,只有纯噪声,只能依靠学到的反向去噪能力。因此:
-
前向扩散 = 教学用具(训练时用来构造样本)
-
反向去噪 = 真正学到的能力(生成时用来创造图像)
训练时的一次完整流程:
flowchart TD
A["x₀(真实图片)"]
A -->|随机采样 t| B["前向扩散(一次公式完成)"]
B --> C["x_t(带噪图片)"]
C --> D["ε_θ(x_t, t)<br/>(网络预测噪声)"]
D --> E["与真实噪声 ε 计算 MSE"]
E --> F["反向传播(更新网络参数 θ)"]
重要注意:训练时,前向扩散只算一次公式,不是一步一步"扩散过去的"。对于任意时间步 ,可以直接从 计算出 ,无需逐步迭代。
反向扩散过程
反向扩散过程是学习的机制,通过迭代地从先验分布中去除噪声来重建数据。与前向过程(固定)不同,反向过程使用神经网络进行训练,以近似后验分布 。在每一步 ,模型预测在前向过程中添加到数据的噪声 ,并将其减去以恢复潜在表示 。这种逐步去噪在基于分数的模型中被形式化为反向随机微分方程(SDE),或在基于流的模型中被形式化为确定性 ODE。前向和反向过程之间的数学等价性至关重要:对于小的时间间隔,反向过程可以使用与前向过程相同的函数形式进行参数化,从而通过具有高斯转移的马尔可夫链实现高效实现。神经网络在学习反向过程中的作用是关键的,因为它必须准确建模条件概率 以确保真实的数据生成。
核心机制:反向扩散过程的关键是训练一个网络 来预测每一步中的噪声:
也就是说,模型学会如何从噪声重建图像。生成过程从纯噪声 开始,逐步去噪:,每一步都使用训练好的网络预测并减去噪声,最终恢复出清晰的图像。
关键概念区分:需要明确区分三个容易混淆的概念:
-
反向扩散:模型做一次"去噪预测"的行为,即 的过程
-
反向传播:用预测结果计算损失、更新参数的过程(backpropagation)
-
反向扩散 ≠ 反向传播:反向扩散只是一次"预测行为",训练与否取决于是否有 loss 和 backward
训练目标:给定一个被加噪到第 步的样本 ,让网络学会把"加了什么噪声"预测出来。训练 U-Net(或其他网络):
损失函数通常是:
所以:
-
前向扩散:造题(构造训练样本)
-
反向去噪(forward):做题(预测噪声)
-
loss 计算:判题(计算预测与真实的误差)
-
反向传播:总结错因(计算梯度)
-
参数更新:改答案策略(更新参数)
训练与生成的关系:
| 阶段 | 是否发生 | 是否更新参数 |
|---|---|---|
| 前向扩散(加噪) | 训练时 | 否 |
| 反向去噪(预测噪声) | 训练 & 生成 | 否(只是前向推理) |
| 反向传播(算梯度) | 仅训练 | 是 |
| 采样生成 | 生成阶段 | 否 |
重要理解:反向去噪是一个前向计算算子,在训练和生成阶段都会被调用。仅在训练阶段,其输出会参与 loss 的计算,loss 再通过反向传播来更新模型参数。在生成阶段,该算子只被重复调用用于采样,不涉及参数更新。
因果链条:需要明确区分:
-
反向去噪(forward):做题(产生预测)
-
loss:判题(计算误差)
-
反向传播:总结错因(计算梯度)
-
参数更新:改策略(更新权重)
学习参数的是 loss + backward,不是 forward 本身。反向去噪的 forward 输出被用来构造 loss,loss 再通过反向传播更新参数。
训练时一轮完整流程:
flowchart TD
A["真实图片 x₀"]
A --> B["随机选 t"]
B --> C["前向扩散"]
C --> D["神经网络 ε_θ(xₜ, t, 条件)"]
D --> E["预测噪声 ε̂"]
E --> F["损失函数<br/>L = ||ε − ε̂||²"]
F --> G["反向传播<br/>更新参数 θ"]
生成阶段发生了什么:
flowchart TD
A[纯噪声 x_T]
A --> B["神经网络 ε_θ(x_T, T)"]
B --> C["反向去噪<br/>计算 x_{T-1}"]
C --> D["神经网络 ε_θ(x_{T-1}, T-1)"]
D --> E["…… 多步迭代去噪 ……"]
E --> F["最终生成结果 x₀"]
注意生成时:
-
有 反向扩散(去噪预测)
-
没有 真实 ε(不知道真实噪声)
-
没有 loss(没有监督信号)
-
没有 backward(不更新参数)
所以生成 = 多次"做题",但不"改策略"
加噪过程的本质:前向扩散的"每一步加噪"本身没有"先轮廓、再线条"这种语义规律,它只是各向同性的高斯噪声,数学上完全随机。但是,反向去噪"看起来像"先轮廓、再细节,是模型在统计意义上学出来的结果,不是前向过程设计出来的。
为什么人会"看到"先轮廓后细节:这是一个非常容易产生错觉的地方。关键原因是:
-
低频结构(轮廓)对噪声更鲁棒,高频细节更容易被淹没
-
从频域角度看,高频信息本来幅值小,噪声一来 → 信噪比先在高频崩溃
-
所以你看到的是:高频细节 → 先"看不见",低频轮廓 → 后"看不见"
-
这是一种统计现象,不是规则设计
反向去噪为什么"像是有顺序":这是模型学到的最优策略,不是我们规定的。模型学的是 ,在噪声很大的情况下,细节根本不可靠,只能先恢复"最可能的整体结构"。所以它会自然学到:1. 先生成大致布局(低频),2. 再慢慢补充高频细节。这是概率最大化的结果。
关键总结:
-
加噪:没逻辑、没语义、只有数学
-
去噪:有结构、有语义、是模型学出来的
为什么前向加噪"蠢"但反向能学出来:这是理解扩散模型的核心问题。关键在于:
模型学的不是"反演某个样本",而是"在给定条件下,什么样的去噪方向在统计上最可能"
正因为如此:
-
前向过程可以是完全无语义的高斯噪声
-
反向过程却会自动呈现"先结构、再细节"的宏观行为
-
这个顺序不是规则,而是:自然图像分布 + MSE 最优解 + 多尺度统计结构 的必然结果
反向扩散的本质:反向扩散是一个"带条件的随机过程":
-
随机性来自噪声:每一步都有随机采样
-
方向性来自学到的数据分布结构:模型学会了在噪声空间中,哪些方向更可能回到"有语义的数据流形"
换句话说:
去噪本质上仍然是随机采样,但随机性被真实数据分布强约束,而图像的多尺度特性,让这个过程在直觉上表现为"先轮廓、后细节"
分布意义上的反向:扩散模型不是在"找回原图",而是在"从所有可能的原图中,选一个合理的"。这是从函数思维到概率思维的转换:
-
逐样本反演:给定 ,确定唯一的 → 不可能(信息已丢失)
-
分布反向:给定 ,回答"哪些 可能?" → 可行(概率分布)
模型内部没有存储"所有相关图片的编码",而是存储了"什么样的变化是合理的"规则。概率分布不是显式存储的东西,而是"隐式存在于网络参数里"的函数行为。
为什么需要多次迭代:训练出来的模型只能预测当前噪声水平 的噪声成分,一次网络前向只能去掉当前噪声水平的一部分,不可能一步还原干净潜空间。因此生成阶段必须多次迭代(从 到 ),每次迭代抹掉部分噪声,潜向量逐步逼近干净的 ,最终解码成清晰图像。可以打个比方:模型就像会擦一小块噪点的橡皮,每次只能擦掉一点。生成图像时,要擦完整张图,就必须多次擦。
为什么不能一次生成:如果尝试一次性从纯噪声生成完整图像,会遇到根本性问题:
-
状态空间太大:一张 512×512×3 的图是约 78 万维连续空间,一次性预测意味着直接从高维高斯跳到数据流形,学习难度极高
-
强非线性问题:从纯噪声到自然图像需要同时解决全局结构、物体关系、细节纹理,一次性完成相当于"又要猜结构,又要猜细节",学习难度爆炸
-
随机性难以控制:一次生成的随机性要么太大(全乱),要么太小(模式坍缩),多步可以前期随机、后期收敛
扩散模型的策略:把"难问题"拆成"很多个容易问题"。每一步只需要回答:"在当前噪声级别下,往哪一点微调会更合理?"这是一个局部问题,非常好学。每一步网络做的不是"画出一张图",而是"告诉你:如果这是一个真实世界的图片,你现在这团噪声哪里不对?"然后只改一点点。
采样步数的设定:扩散模型的采样步数几乎都是事先硬设置好的,到了就停,没有"是否已经清晰"的自适应判断条件。这是因为:
-
"是否清晰"本身很难定义,模型在生成阶段没有 ground truth
-
时间步 本身就是"噪声刻度尺",训练时模型已经学会了"在第 步,我该干什么程度的事"
-
跑完整个 schedule 就等于把噪声从最大 → 最小,不多也不少
-
提前停下会导致残留噪声,结果通常是模糊、不自然
常见的步数设置:
-
经典 DDPM:1000 步
-
改进后(DDIM、DPM-Solver):50 步、20 步,甚至 4~8 步(质量会下降)
但本质仍然是多步,不是一次完成。
DDPM(Denoising Diffusion Probabilistic Models)
DDPM 是什么:DDPM 是扩散模型的经典实现,由 Ho 等人在 2020 年提出。它是变分扩散模型(Variational Diffusion Model)的代表,通过变分下界(ELBO)优化来训练去噪网络。
DDPM 的核心数学公式:
前向过程(Forward Process)
DDPM 的前向过程是一个固定的马尔可夫链,逐步添加高斯噪声:
其中 是预定义的噪声调度(noise schedule),通常满足 。
关键性质:可以直接从 计算任意 ,无需逐步迭代:
其中:
- (保留系数)
- (累积保留系数)
因此可以直接采样:
反向过程(Reverse Process)
DDPM 的反向过程学习一个参数化的高斯分布:
关键简化:DDPM 假设 ,其中 是固定的(不学习),只学习均值 。
均值参数化:DDPM 不直接预测 ,而是预测噪声 ,然后通过以下公式计算均值:
训练目标
DDPM 的训练目标是预测噪声,损失函数为:
其中:
- (真实数据)
- (随机噪声)
- (随机时间步)
- (加噪后的数据)
采样算法(生成过程)
DDPM 的采样过程从纯噪声开始,逐步去噪:
算法:DDPM 采样
- 采样初始噪声:
- 从 到 ,迭代执行:
- 预测噪声:
- 计算均值:
- 采样下一步:,其中
- 返回
方差设置:DDPM 使用两种方差设置:
- (对应原始前向过程的方差)
- (对应后验分布的方差,通常效果更好)
噪声调度(Noise Schedule)
DDPM 的噪声调度 通常有两种设计:
- 线性调度:,从 到
- 余弦调度:,其中 是小偏移量,避免 太小
余弦调度在后期( 接近 )添加噪声更慢,通常效果更好。
DDPM vs DDIM
| 特性 | DDPM | DDIM |
|---|---|---|
| 采样方式 | 随机(Stochastic) | 确定性(Deterministic) |
| 采样步数 | 通常 1000 步 | 可减少到 50 步甚至更少 |
| 生成质量 | 高质量但慢 | 质量略降但快很多 |
| 可逆性 | 不可逆 | 可逆(可以编码) |
| 随机性 | 每一步都有随机采样 | 可以完全确定性() |
DDIM 的关键改进:DDIM 将随机采样过程改为确定性过程,通过重参数化实现:
其中 是从预测噪声反推的:
这样可以在更少的步数内生成图像,且过程可逆(可以编码真实图像到潜在空间)。
数学公式化
扩散模型的数学框架整合了概率论、非平衡热力学和神经网络设计的概念。前向过程由在 步中添加噪声的已知 SDE 定义,而反向过程是去除噪声的学习 SDE。训练目标是最小化真实后验 和学习后验 之间的 Kullback-Leibler(KL)散度,结合最后一步的重建损失。这种公式化确保模型学习有效地反转扩散过程。对于基于流的模型,前向和反向过程是 ODE 的确定性解,而基于分数的模型依赖于梯度上升来细化噪声样本。扩散模型的原理强调,所有三种主要方法——变分(DDPM)、基于分数(Score SDE)和基于流(Flow Matching)——都收敛于同一核心原理:学习时间相关的向量场以反转固定的前向破坏过程。这种方法的统一突出了扩散模型的数学优雅性和灵活性,使其能够适应不同的应用。
潜在空间优化
扩散模型中的一项关键创新是使用潜在空间优化来降低计算复杂度。与直接在高分辨率像素数据上操作不同,像 Stable Diffusion 这样的扩散模型在压缩的潜在空间中应用前向和反向过程。这种方法利用变分自编码器(VAE)来编码和解码数据,潜在空间捕获语义信息同时丢弃冗余细节。前向扩散过程应用于潜在表示,然后由反向过程中的神经网络去噪。通过在潜在空间中工作,模型减少了处理所需的参数数量,从而显著节省计算量。例如 Stable Diffusion 在 64×64 潜在空间上操作 768×768 像素图像,与像素空间模型相比,计算开销减少了 85-90%。这种优化对于实际应用特别重要,其中可扩展性和效率至关重要。
什么是潜在空间:潜在空间就是把原始图像映射到一个低维向量空间的表示方式。原图像 通常很大,例如 512×512×3(RGB),总共 786, 432 个像素点。在这个维度上直接训练扩散模型非常消耗显存和算力。潜在空间 把图像压缩成一个低维向量或张量,例如 64×64×4,大幅降低计算量。潜在空间可以理解为图像的高层抽象特征表示:保留内容和结构,但去掉冗余像素信息。
流程:
flowchart TD
A["真实图像 x"] --> B["VAE 编码 → 潜在向量 z"]
B --> C["向 z 添加噪声"]
C --> D["扩散模型预测噪声"]
D --> E["去噪得到 z"]
E --> F["VAE 解码 → 重建图像 x_hat"]
优势:
-
节省显存:原图 512×512 的像素量很大,潜在空间小得多
-
加速训练与生成:模型处理的是压缩后的低维表示
-
保留语义:潜在空间保留图像的结构、颜色和内容信息,噪声去除更高效
-
可扩展:可以在潜在空间上做控制(文本条件、ControlNet)
类比理解:潜在空间就像一张地图的抽象缩影。原图像是现实世界的完整地图,潜在空间是地图的"简化版本",保留关键道路和建筑布局,但丢掉细节。扩散模型只需要学会在简化地图上导航,最后再把完整地图还原出来。
非平衡热力学框架
扩散模型的理论基础植根于非平衡热力学,特别是扩散作为熵增加的物理过程的概念。前向过程模拟数据向高熵高斯先验的扩散,而反向过程对应于受控的熵减少。这种二元性反映了不可逆和可逆过程的热力学原理,其中前向扩散类似于系统向平衡移动,而反向过程模拟恢复秩序的外力。AssemblyAI 的一篇博客 Introduction to Diffusion Models for Machine Learning 解释说,这个框架允许扩散模型通过模拟"反向扩散"来生成数据,其中模型学习抵消训练期间引入的熵增加。将热力学概念整合到机器学习中,使扩散模型能够实现稳定的训练动力学和高质量输出,从而与其他生成架构区分开来。