扩散模型原理

87 阅读4分钟

扩散模型原理

扩散模型(Diffusion Models)是近年来最成功的生成模型之一,在图像生成、文本到图像、图像编辑等任务上取得了突破性进展。从 DALL·E 2、Midjourney 到 Stable Diffusion,这些令人惊艳的 AI 生成工具都基于扩散模型。

什么是扩散模型:扩散模型的核心思想是学习如何"逆转"一个逐步添加噪声的过程。训练时,模型学习从噪声中恢复原始数据;生成时,模型从纯噪声开始,逐步去噪,最终生成高质量的数据样本。

本文内容:本文深入解析扩散模型的工作原理,包括:

  • 前向扩散过程:如何通过逐步加噪将数据转换为纯噪声
  • 反向扩散过程:如何训练网络学习去噪,实现数据生成
  • DDPM:经典的扩散模型实现,包括完整的数学公式和算法
  • 数学框架:扩散模型的概率论和热力学基础
  • 潜在空间优化:如何在低维空间中进行扩散以提高效率

适用对象:本文适合希望深入理解扩散模型原理的读者,假设读者具备基础的机器学习和概率论知识。


前向扩散过程

前向扩散过程是扩散模型的基石,通过一系列增量噪声添加系统地破坏输入数据。该过程通过迭代应用具有预定义调度的高斯噪声,将原始数据分布转换为简单的高斯分布。在数学上,前向过程被建模为马尔可夫链,其中每一步 tt都会对数据引入小的扰动。噪声调度通常由方差参数序列 βt\beta_t定义,确保数据在 TT步中变得越来越嘈杂,直到达到接近不可逆的纯高斯噪声状态。这种确定性退化通常使用时间相关的向量场来实现,如基于流的扩散模型中所描述的,其中前向过程由将数据演化向先验分布的常微分方程(ODE)控制。前向过程的简单性是一个关键优势,因为它不需要训练,可以高效执行,即使对于高维数据也是如此。

直观理解:前向扩散过程可以类比为将一张清晰的图像逐步添加噪声,使其慢慢"变得像噪声"。输入一张真实图像 x0x_0,逐步添加高斯噪声,得到 x1,x2,...,xTx_1, x_2, ..., x_T,到最后 xTx_T基本是纯噪声。这是一个马尔可夫过程,每一步只依赖前一步的状态。数学上,这个过程可以表示为:

zt=αtz0+1αtϵ,ϵN(0,1)z_t = \sqrt{\alpha_t} z_0 + \sqrt{1 - \alpha_t} \epsilon, \quad \epsilon \sim \mathcal{N}(0, 1)

其中 tt越大,噪声越多(越模糊),最终达到接近纯高斯噪声的状态。

前向扩散的本质:前向扩散是一个固定的、手工定义的随机过程,具有以下关键特征:

  • 噪声是人为加的:噪声 ϵ\epsilon是从标准高斯分布中随机采样的

  • 噪声调度是预先设定的αt\alpha_tβt\beta_t 是预先设定好的 schedule,不随训练改变

  • 没有神经网络参与:前向扩散过程不涉及任何可学习的参数

  • 没有梯度、没有优化:它只是一个数据生成器,用来构造训练样本

前向扩散与训练的关系:前向扩散不是"学习参数"的过程,但它只在训练阶段被用到,是训练流程的一部分。训练时,我们有真实数据 x0x_0,可以随机加噪声来构造训练样本;生成时,我们没有 x0x_0,只有纯噪声,只能依靠学到的反向去噪能力。因此:

  • 前向扩散 = 教学用具(训练时用来构造样本)

  • 反向去噪 = 真正学到的能力(生成时用来创造图像)

训练时的一次完整流程

flowchart TD

    A["x₀(真实图片)"]
    A -->|随机采样 t| B["前向扩散(一次公式完成)"]
    B --> C["x_t(带噪图片)"]
    C --> D[&#34;ε_θ(x_t, t)<br/>(网络预测噪声)&#34;]
    D --> E[&#34;与真实噪声 ε 计算 MSE&#34;]
    E --> F[&#34;反向传播(更新网络参数 θ)&#34;]

重要注意:训练时,前向扩散只算一次公式,不是一步一步"扩散过去的"。对于任意时间步 tt,可以直接从 x0x_0计算出 xtx_t,无需逐步迭代。

反向扩散过程

反向扩散过程是学习的机制,通过迭代地从先验分布中去除噪声来重建数据。与前向过程(固定)不同,反向过程使用神经网络进行训练,以近似后验分布 q(xt1xt,x0)q(x_{t-1}|x_t, x_0)。在每一步 tt,模型预测在前向过程中添加到数据的噪声 ϵ\epsilon,并将其减去以恢复潜在表示 xt1x_{t-1}。这种逐步去噪在基于分数的模型中被形式化为反向随机微分方程(SDE),或在基于流的模型中被形式化为确定性 ODE。前向和反向过程之间的数学等价性至关重要:对于小的时间间隔,反向过程可以使用与前向过程相同的函数形式进行参数化,从而通过具有高斯转移的马尔可夫链实现高效实现。神经网络在学习反向过程中的作用是关键的,因为它必须准确建模条件概率 pθ(xt1xt)p_\theta(x_{t-1}|x_t)以确保真实的数据生成。

核心机制:反向扩散过程的关键是训练一个网络 ϵθ\epsilon_\theta来预测每一步中的噪声:

ϵθ(xt,t)noise added at step t\epsilon_\theta(x_t, t) \approx \text{noise added at step } t

也就是说,模型学会如何从噪声重建图像。生成过程从纯噪声 xTx_T开始,逐步去噪:xTxT1...x0x_T \rightarrow x_{T-1} \rightarrow ... \rightarrow x_0,每一步都使用训练好的网络预测并减去噪声,最终恢复出清晰的图像。

关键概念区分:需要明确区分三个容易混淆的概念:

  • 反向扩散:模型做一次"去噪预测"的行为,即 xtxt1x_t \rightarrow x_{t-1}的过程

  • 反向传播:用预测结果计算损失、更新参数的过程(backpropagation)

  • 反向扩散 ≠ 反向传播:反向扩散只是一次"预测行为",训练与否取决于是否有 loss 和 backward

训练目标:给定一个被加噪到第 tt步的样本 xtx_t,让网络学会把"加了什么噪声"预测出来。训练 U-Net(或其他网络):

ϵθ(xt,t,c)ϵ\epsilon_\theta(x_t, t, c) \approx \epsilon

损失函数通常是:

L=Ex0,ε,t[εϵθ(xt,t)2]L = \mathbb{E}_{x_0, \varepsilon, t}\big[\|\varepsilon - \epsilon_\theta(x_t, t)\|^2\big]

所以:

  • 前向扩散:造题(构造训练样本)

  • 反向去噪(forward):做题(预测噪声)

  • loss 计算:判题(计算预测与真实的误差)

  • 反向传播:总结错因(计算梯度)

  • 参数更新:改答案策略(更新参数)

训练与生成的关系

阶段是否发生是否更新参数
前向扩散(加噪)训练时
反向去噪(预测噪声)训练 & 生成否(只是前向推理)
反向传播(算梯度)仅训练
采样生成生成阶段

重要理解:反向去噪是一个前向计算算子,在训练和生成阶段都会被调用。仅在训练阶段,其输出会参与 loss 的计算,loss 再通过反向传播来更新模型参数。在生成阶段,该算子只被重复调用用于采样,不涉及参数更新。

因果链条:需要明确区分:

  • 反向去噪(forward):做题(产生预测)

  • loss:判题(计算误差)

  • 反向传播:总结错因(计算梯度)

  • 参数更新:改策略(更新权重)

学习参数的是 loss + backward,不是 forward 本身。反向去噪的 forward 输出被用来构造 loss,loss 再通过反向传播更新参数。

训练时一轮完整流程

flowchart TD
    A[&#34;真实图片 x₀&#34;]
    A --> B[&#34;随机选 t&#34;]
    B --> C[&#34;前向扩散&#34;]
    C --> D[&#34;神经网络 ε_θ(xₜ, t, 条件)&#34;]
    D --> E[&#34;预测噪声 ε̂&#34;]
    E --> F[&#34;损失函数<br/>L = ||ε − ε̂||²&#34;]
    F --> G[&#34;反向传播<br/>更新参数 θ&#34;] 

生成阶段发生了什么

flowchart TD
    A[纯噪声 x_T]
    A --> B[&#34;神经网络 ε_θ(x_T, T)&#34;]
    B --> C[&#34;反向去噪<br/>计算 x_{T-1}&#34;]
    C --> D[&#34;神经网络 ε_θ(x_{T-1}, T-1)&#34;]
    D --> E[&#34;…… 多步迭代去噪 ……&#34;]
    E --> F[&#34;最终生成结果 x₀&#34;]

注意生成时:

  • 反向扩散(去噪预测)

  • 没有 真实 ε(不知道真实噪声)

  • 没有 loss(没有监督信号)

  • 没有 backward(不更新参数)

所以生成 = 多次"做题",但不"改策略"

加噪过程的本质:前向扩散的"每一步加噪"本身没有"先轮廓、再线条"这种语义规律,它只是各向同性的高斯噪声,数学上完全随机。但是,反向去噪"看起来像"先轮廓、再细节,是模型在统计意义上学出来的结果,不是前向过程设计出来的。

为什么人会"看到"先轮廓后细节:这是一个非常容易产生错觉的地方。关键原因是:

  • 低频结构(轮廓)对噪声更鲁棒,高频细节更容易被淹没

  • 从频域角度看,高频信息本来幅值小,噪声一来 → 信噪比先在高频崩溃

  • 所以你看到的是:高频细节 → 先"看不见",低频轮廓 → 后"看不见"

  • 这是一种统计现象,不是规则设计

反向去噪为什么"像是有顺序":这是模型学到的最优策略,不是我们规定的。模型学的是 p(xt1xt)p(x_{t-1} \mid x_t),在噪声很大的情况下,细节根本不可靠,只能先恢复"最可能的整体结构"。所以它会自然学到:1. 先生成大致布局(低频),2. 再慢慢补充高频细节。这是概率最大化的结果

关键总结

  • 加噪:没逻辑、没语义、只有数学

  • 去噪:有结构、有语义、是模型学出来的

为什么前向加噪"蠢"但反向能学出来:这是理解扩散模型的核心问题。关键在于:

模型学的不是"反演某个样本",而是"在给定条件下,什么样的去噪方向在统计上最可能"

正因为如此:

  • 前向过程可以是完全无语义的高斯噪声

  • 反向过程却会自动呈现"先结构、再细节"的宏观行为

  • 这个顺序不是规则,而是:自然图像分布 + MSE 最优解 + 多尺度统计结构 的必然结果

反向扩散的本质:反向扩散是一个"带条件的随机过程":

  • 随机性来自噪声:每一步都有随机采样

  • 方向性来自学到的数据分布结构:模型学会了在噪声空间中,哪些方向更可能回到"有语义的数据流形"

换句话说:

去噪本质上仍然是随机采样,但随机性被真实数据分布强约束,而图像的多尺度特性,让这个过程在直觉上表现为"先轮廓、后细节"

分布意义上的反向:扩散模型不是在"找回原图",而是在"从所有可能的原图中,选一个合理的"。这是从函数思维概率思维的转换:

  • 逐样本反演:给定 xtx_t,确定唯一的 x0x_0→ 不可能(信息已丢失)

  • 分布反向:给定 xtx_t,回答"哪些 x0x_0可能?" → 可行(概率分布)

模型内部没有存储"所有相关图片的编码",而是存储了"什么样的变化是合理的"规则。概率分布不是显式存储的东西,而是"隐式存在于网络参数里"的函数行为。

为什么需要多次迭代:训练出来的模型只能预测当前噪声水平 tt的噪声成分,一次网络前向只能去掉当前噪声水平的一部分,不可能一步还原干净潜空间。因此生成阶段必须多次迭代(从 t=Tt=Tt=0t=0),每次迭代抹掉部分噪声,潜向量逐步逼近干净的 z0z_0,最终解码成清晰图像。可以打个比方:模型就像会擦一小块噪点的橡皮,每次只能擦掉一点。生成图像时,要擦完整张图,就必须多次擦。

为什么不能一次生成:如果尝试一次性从纯噪声生成完整图像,会遇到根本性问题:

  • 状态空间太大:一张 512×512×3 的图是约 78 万维连续空间,一次性预测意味着直接从高维高斯跳到数据流形,学习难度极高

  • 强非线性问题:从纯噪声到自然图像需要同时解决全局结构、物体关系、细节纹理,一次性完成相当于"又要猜结构,又要猜细节",学习难度爆炸

  • 随机性难以控制:一次生成的随机性要么太大(全乱),要么太小(模式坍缩),多步可以前期随机、后期收敛

扩散模型的策略:把"难问题"拆成"很多个容易问题"。每一步只需要回答:"在当前噪声级别下,往哪一点微调会更合理?"这是一个局部问题,非常好学。每一步网络做的不是"画出一张图",而是"告诉你:如果这是一个真实世界的图片,你现在这团噪声哪里不对?"然后只改一点点。

采样步数的设定:扩散模型的采样步数几乎都是事先硬设置好的,到了就停,没有"是否已经清晰"的自适应判断条件。这是因为:

  • "是否清晰"本身很难定义,模型在生成阶段没有 ground truth

  • 时间步 tt本身就是"噪声刻度尺",训练时模型已经学会了"在第 tt步,我该干什么程度的事"

  • 跑完整个 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 的前向过程是一个固定的马尔可夫链,逐步添加高斯噪声:

q(xtxt1)=N(xt;1βtxt1,βtI)q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t} x_{t-1}, \beta_t I)

其中 βt\beta_t 是预定义的噪声调度(noise schedule),通常满足 0<β1<β2<...<βT<10 < \beta_1 < \beta_2 < ... < \beta_T < 1

关键性质:可以直接从 x0x_0 计算任意 xtx_t,无需逐步迭代:

q(xtx0)=N(xt;αˉtx0,(1αˉt)I)q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1-\bar{\alpha}_t) I)

其中:

  • αt=1βt\alpha_t = 1 - \beta_t(保留系数)
  • αˉt=s=1tαs\bar{\alpha}_t = \prod_{s=1}^{t} \alpha_s(累积保留系数)

因此可以直接采样:

xt=αˉtx0+1αˉtϵ,ϵN(0,I)x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \epsilon, \quad \epsilon \sim \mathcal{N}(0, I)

反向过程(Reverse Process)

DDPM 的反向过程学习一个参数化的高斯分布:

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

关键简化:DDPM 假设 Σθ(xt,t)=σt2I\Sigma_\theta(x_t, t) = \sigma_t^2 I,其中 σt2\sigma_t^2 是固定的(不学习),只学习均值 μθ(xt,t)\mu_\theta(x_t, t)

均值参数化:DDPM 不直接预测 μθ\mu_\theta,而是预测噪声 ϵθ(xt,t)\epsilon_\theta(x_t, t),然后通过以下公式计算均值:

μθ(xt,t)=1αt(xtβt1αˉtϵθ(xt,t))\mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_\theta(x_t, t) \right)

训练目标

DDPM 的训练目标是预测噪声,损失函数为:

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

其中:

  • x0q(x0)x_0 \sim q(x_0)(真实数据)
  • ϵN(0,I)\epsilon \sim \mathcal{N}(0, I)(随机噪声)
  • tUniform(1,T)t \sim \text{Uniform}(1, T)(随机时间步)
  • xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \epsilon(加噪后的数据)

采样算法(生成过程)

DDPM 的采样过程从纯噪声开始,逐步去噪:

算法:DDPM 采样

  1. 采样初始噪声:xTN(0,I)x_T \sim \mathcal{N}(0, I)
  2. t=Tt = Tt=1t = 1,迭代执行:
    • 预测噪声:ϵt=ϵθ(xt,t)\epsilon_t = \epsilon_\theta(x_t, t)
    • 计算均值:μt=1αt(xtβt1αˉtϵt)\mu_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_t \right)
    • 采样下一步:xt1=μt+σtzx_{t-1} = \mu_t + \sigma_t z,其中 zN(0,I)z \sim \mathcal{N}(0, I)
  3. 返回 x0x_0

方差设置:DDPM 使用两种方差设置:

  • σt2=βt\sigma_t^2 = \beta_t(对应原始前向过程的方差)
  • σt2=β~t=1αˉt11αˉtβt\sigma_t^2 = \tilde{\beta}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t} \beta_t(对应后验分布的方差,通常效果更好)

噪声调度(Noise Schedule)

DDPM 的噪声调度 βt\beta_t 通常有两种设计:

  1. 线性调度βt=linear(t)\beta_t = \text{linear}(t),从 β1=0.0001\beta_1 = 0.0001βT=0.02\beta_T = 0.02
  2. 余弦调度αˉt=cos(πt/2T+s)1+s\bar{\alpha}_t = \frac{\cos(\pi t / 2T + s)}{1+s},其中 ss 是小偏移量,避免 αˉ0\bar{\alpha}_0 太小

余弦调度在后期(tt 接近 TT)添加噪声更慢,通常效果更好。

DDPM vs DDIM

特性DDPMDDIM
采样方式随机(Stochastic)确定性(Deterministic)
采样步数通常 1000 步可减少到 50 步甚至更少
生成质量高质量但慢质量略降但快很多
可逆性不可逆可逆(可以编码)
随机性每一步都有随机采样可以完全确定性(η=0\eta=0

DDIM 的关键改进:DDIM 将随机采样过程改为确定性过程,通过重参数化实现:

xt1=αˉt1x^0+1αˉt1ϵtx_{t-1} = \sqrt{\bar{\alpha}_{t-1}} \hat{x}_0 + \sqrt{1-\bar{\alpha}_{t-1}} \epsilon_t

其中 x^0\hat{x}_0 是从预测噪声反推的:

x^0=xt1αˉtϵθ(xt,t)αˉt\hat{x}_0 = \frac{x_t - \sqrt{1-\bar{\alpha}_t} \epsilon_\theta(x_t, t)}{\sqrt{\bar{\alpha}_t}}

这样可以在更少的步数内生成图像,且过程可逆(可以编码真实图像到潜在空间)。

数学公式化

扩散模型的数学框架整合了概率论、非平衡热力学和神经网络设计的概念。前向过程由在 TT步中添加噪声的已知 SDE 定义,而反向过程是去除噪声的学习 SDE。训练目标是最小化真实后验 q(xt1xt,x0)q(x_{t-1}|x_t, x_0)和学习后验 pθ(xt1xt)p_\theta(x_{t-1}|x_t)之间的 Kullback-Leibler(KL)散度,结合最后一步的重建损失。这种公式化确保模型学习有效地反转扩散过程。对于基于流的模型,前向和反向过程是 ODE 的确定性解,而基于分数的模型依赖于梯度上升来细化噪声样本。扩散模型的原理强调,所有三种主要方法——变分(DDPM)、基于分数(Score SDE)和基于流(Flow Matching)——都收敛于同一核心原理:学习时间相关的向量场以反转固定的前向破坏过程。这种方法的统一突出了扩散模型的数学优雅性和灵活性,使其能够适应不同的应用。

潜在空间优化

扩散模型中的一项关键创新是使用潜在空间优化来降低计算复杂度。与直接在高分辨率像素数据上操作不同,像 Stable Diffusion 这样的扩散模型在压缩的潜在空间中应用前向和反向过程。这种方法利用变分自编码器(VAE)来编码和解码数据,潜在空间捕获语义信息同时丢弃冗余细节。前向扩散过程应用于潜在表示,然后由反向过程中的神经网络去噪。通过在潜在空间中工作,模型减少了处理所需的参数数量,从而显著节省计算量。例如 Stable Diffusion 在 64×64 潜在空间上操作 768×768 像素图像,与像素空间模型相比,计算开销减少了 85-90%。这种优化对于实际应用特别重要,其中可扩展性和效率至关重要。

什么是潜在空间:潜在空间就是把原始图像映射到一个低维向量空间的表示方式。原图像 xx通常很大,例如 512×512×3(RGB),总共 786, 432 个像素点。在这个维度上直接训练扩散模型非常消耗显存和算力。潜在空间 zz把图像压缩成一个低维向量或张量,例如 64×64×4,大幅降低计算量。潜在空间可以理解为图像的高层抽象特征表示:保留内容和结构,但去掉冗余像素信息。

流程

flowchart TD
    A[&#34;真实图像 x&#34;] --> B[&#34;VAE 编码 → 潜在向量 z&#34;]
    B --> C[&#34;向 z 添加噪声&#34;]
    C --> D[&#34;扩散模型预测噪声&#34;]
    D --> E[&#34;去噪得到 z&#34;]
    E --> F[&#34;VAE 解码 → 重建图像 x_hat&#34;]

优势

  • 节省显存:原图 512×512 的像素量很大,潜在空间小得多

  • 加速训练与生成:模型处理的是压缩后的低维表示

  • 保留语义:潜在空间保留图像的结构、颜色和内容信息,噪声去除更高效

  • 可扩展:可以在潜在空间上做控制(文本条件、ControlNet)

类比理解:潜在空间就像一张地图的抽象缩影。原图像是现实世界的完整地图,潜在空间是地图的"简化版本",保留关键道路和建筑布局,但丢掉细节。扩散模型只需要学会在简化地图上导航,最后再把完整地图还原出来。

非平衡热力学框架

扩散模型的理论基础植根于非平衡热力学,特别是扩散作为熵增加的物理过程的概念。前向过程模拟数据向高熵高斯先验的扩散,而反向过程对应于受控的熵减少。这种二元性反映了不可逆和可逆过程的热力学原理,其中前向扩散类似于系统向平衡移动,而反向过程模拟恢复秩序的外力。AssemblyAI 的一篇博客 Introduction to Diffusion Models for Machine Learning 解释说,这个框架允许扩散模型通过模拟"反向扩散"来生成数据,其中模型学习抵消训练期间引入的熵增加。将热力学概念整合到机器学习中,使扩散模型能够实现稳定的训练动力学和高质量输出,从而与其他生成架构区分开来。

参考资料