想象一下你在咖啡里滴入一滴牛奶,最初这滴牛奶会形成一个清晰的边界。随着时间的推移,牛奶分子开始随机运动,逐渐与咖啡混合,最终形成均匀的液体。这个自然现象完美诠释了扩散模型(Diffusion Models)的核心思想——通过逐步添加噪声破坏数据,再学习如何逆向这个过程来生成新数据。
扩散模型是近年来计算机视觉领域最重要的突破之一,它通过模拟物理扩散过程来实现高质量的图像生成。与GAN(生成对抗网络)和VAE(变分自编码器)等传统生成模型相比,扩散模型具有训练稳定、生成质量高等显著优势。2020年OpenAI发布的DALL·E 2和2022年Stable Diffusion的爆火,让这项技术走进了大众视野。
扩散模型的工作原理可以分为两个阶段:
在实际应用中,我们通常会设置数百甚至上千个扩散步骤。比如Stable Diffusion就使用了1000步的扩散过程,虽然看起来很多,但现代GPU可以高效并行处理这些计算。
理解扩散模型需要先掌握变分推断(Variational Inference)的核心思想。变分推断是解决复杂概率分布近似推断的强大工具。当我们无法直接计算后验分布p(z|x)时,就引入一个近似分布q(z)来逼近它。
证据下界(ELBO, Evidence Lower Bound)是变分推断中的关键概念。它为我们提供了一个可优化的目标函数:
ELBO = E[log p(x,z) - log q(z)]
这个公式可以分解为两项:
在扩散模型中,我们使用马尔可夫链构建了一个层次化的变分自编码器(HVAE),其中每个隐变量只依赖于前一个状态。这种结构让我们能够将复杂的生成过程分解为多个简单步骤。
扩散过程可以定义为一系列逐步加噪的步骤:
q(x_t|x_{t-1}) = N(x_t; √(1-β_t)x_{t-1}, β_tI)
其中β_t是噪声调度参数,控制每一步添加的噪声量。巧妙的是,我们可以通过重参数化技巧,直接从x_0计算任意步骤t的噪声数据:
x_t = √ᾱ_t x_0 + √(1-ᾱ_t)ε
这里ᾱ_t = ∏(1-β_i),ε是标准高斯噪声。这个性质极大简化了训练过程,因为我们不需要逐步加噪,可以直接跳到任意中间步骤。
扩散模型的核心训练目标是优化去噪匹配项:
L = E[||ε - ε_θ(x_t,t)||²]
其中ε_θ是我们的神经网络,目标是预测添加到数据中的噪声。这个简单的目标函数背后有着深厚的理论基础,它与分数匹配(Score Matching)和变分推断都有着密切联系。
实践中,我们通常采用以下训练流程:
训练完成后,采样(生成新数据)是一个渐进式的去噪过程:
这个过程类似于"雕刻"——从粗糙的噪声块开始,逐步细化细节。现代扩散模型通常需要20-1000步采样步骤,虽然看起来很多,但每步计算量不大,整体效率仍然可以接受。
最直观的理解是让网络直接预测原始图像x_0。这种情况下,网络学习的是:
x̂_θ(x_t,t) ≈ x_0
这种视角下,去噪过程可以理解为逐步修正对原始图像的估计。虽然概念简单,但在实践中往往不如预测噪声稳定。
更常用的方法是预测噪声ε。网络学习:
ε_θ(x_t,t) ≈ ε
这与第一种视角数学等价,但实践表明更稳定。DDPM(Denoising Diffusion Probabilistic Models)就采用了这种形式。预测噪声的优势在于:
第三种视角是将扩散模型视为学习数据分布的梯度(分数):
s_θ(x_t,t) ≈ ∇log p(x_t)
这种分数匹配视角揭示了扩散模型与能量模型(Energy-Based Models)的深刻联系。分数函数告诉我们数据空间中哪些区域概率更高,引导采样过程向高概率区域移动。
分类器指导(Classifier Guidance)是最早的条件扩散模型技术之一。它通过组合无条件分数和分类器梯度来实现条件生成:
∇log p(x_t|y) = ∇log p(x_t) + γ∇log p(y|x_t)
其中γ控制条件强度。这种方法需要额外训练一个噪声鲁棒的分类器,增加了实现复杂度。
无分类器指导(Classifier-Free Guidance)是更优雅的解决方案。它通过联合训练条件和无条件扩散模型,避免了单独分类器:
∇log p(x_t|y) = (1+γ)∇log p(x_t|y) - γ∇log p(x_t)
这种方法现在被广泛采用(如Stable Diffusion),因为它:
实际应用中,γ=7.5是常见的选择,在样本质量和多样性间取得良好平衡。
噪声调度(β_t)的设计对模型性能至关重要。常见策略包括:
不同的调度会影响:
UNet是扩散模型最常用的主干网络,因为它:
现代扩散模型通常还会加入:
虽然扩散模型生成质量高,但多步采样可能很耗时。现有加速技术包括:
这些技术可以将采样步骤从1000+减少到50甚至更少,极大提升了实用性。
扩散模型已经展现出惊人的创造力,应用包括但不限于:
未来可能的发展方向:
我在实际项目中发现,扩散模型对超参数相当敏感,特别是学习率和噪声调度。建议初学者从现成实现(如HuggingFace Diffusers)开始,再逐步深入底层细节。另一个实用建议是使用混合精度训练,可以显著减少显存占用而不损失精度。