扩散模型已成为生成式 AI 中的一种强大方法,可在图像、音频和视频生成方面产生最先进的结果。在这篇深入的技术文章中,我们将探讨扩散模型的工作原理、它们的关键创新以及它们如此成功的原因。我们将介绍这项令人兴奋的新技术的数学基础、训练过程、采样算法和前沿应用。
扩散模型简介
扩散模型是一类生成模型,它学习通过反转扩散过程来逐渐对数据进行降噪。核心思想是从纯噪声开始,然后迭代地将其细化为来自目标分布的高质量样本。
这种方法受到非平衡热力学的启发,具体来说,就是反转扩散以恢复结构的过程。在机器学习的背景下,我们可以将其视为学习扭转逐渐向数据中添加噪声的趋势。
扩散模型的一些主要优点包括:
最先进的图像质量,在许多情况下超过 GAN
稳定的训练,无对抗性动态
高度可并行化
灵活的架构 – 可以使用任何将输入映射到相同维度的输出的模型
强大的理论基础
让我们更深入地了解扩散模型的工作原理。
随机微分方程控制扩散模型中的正向和反向过程。正向 SDE 向数据中添加噪声,逐渐将其转换为噪声分布。反向 SDE 在学习的评分函数的引导下,逐步去除噪声,从而从随机噪声中生成逼真的图像。这种方法是在连续状态空间中实现高质量生成性能的关键
正向扩散过程
前向扩散过程从从真实数据分布中采样的数据点 x₀ 开始,然后在 T 时间步长上逐渐增加高斯噪声,以产生越来越嘈杂的 x₁、x₂、...、xT。
在每个时间步 t 处,我们根据以下公式添加少量噪声:
x_t = √(1 - β_t) * x_{t-1} + √(β_t) * ε
哪里:
β_t 是一个方差调度表,用于控制在每个步骤中添加的噪声量
ε 是随机高斯噪声
这个过程一直持续到 xT 几乎是纯高斯噪声。
在数学上,我们可以将其描述为马尔可夫链:
q(x_t | x_{t-1}) = N(x_t; √(1 - β_t) * x_{t-1}, β_t * I)
其中 N 表示高斯分布。
β_t 计划通常选择较小以用于早期时间步长,并随着时间的推移而增加。常见的选择包括线性、余弦或 sigmoid 计划。
逆向扩散过程
扩散模型的目标是学习此过程的相反过程 - 从纯噪声 xT 开始,然后逐步对其进行去噪以恢复干净的样品 x₀。
我们将这个反向过程建模为:
p_θ(x_{t-1} | x_t) = N(x_{t-1}; μ_θ(x_t, t), σ_θ^2(x_t, t))
其中 μ_θ 和 σ_θ^2 是由 θ 参数化的学习函数(通常是神经网络)。
关键的创新在于,我们不需要显式地对完全逆向分布进行建模。相反,我们可以根据我们知道的 forward 过程来参数化它。
具体来说,我们可以证明最佳逆过程均值 μ* 为:
μ* = 1/√(1 - β_t) * (x_t - β_t/√(1 - α_t) * ε_θ(x_t, t))
哪里:
α_t = 1 – β_t
ε_θ 是一个学习到的噪声预测网络
这给了我们一个简单的目标 – 训练一个神经网络 ε_θ 来预测每一步添加的噪声。
培训目标
扩散模型的训练目标可以从变分推理中得出。经过一些简化,我们得出一个简单的 L2 损失:
L = E_t,x₀,ε [ ||ε - ε_θ(x_t, t)||² ]
哪里:
t 从 1 到 T 均匀采样
X₀ 从训练数据中采样
ε 是采样的高斯噪声
x_t 是通过根据前向过程向 x₀ 添加噪声来构建的
换句话说,我们正在训练模型来预测在每个时间步长添加的噪声。
模型架构
U-Net 架构是扩散模型中去噪步骤的核心。它具有编码器-解码器结构,具有跳过连接,有助于在重建过程中保留细粒度细节。编码器在捕获高级特征时逐步对输入图像进行下采样,解码器对编码特征进行上采样以重建图像。此体系结构在需要精确定位的任务(如图像分割)中特别有效。
噪声预测网络可以使用任何将输入映射到相同维度的输出的架构。U-Net 风格的架构是一种流行的选择,尤其是对于图像生成任务。ε_θ
典型的体系结构可能如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | class DiffusionUNet(nn.Module): def __init__( self ): super ().__init__() # Downsampling self .down1 = UNetBlock( 3 , 64 ) self .down2 = UNetBlock( 64 , 128 ) self .down3 = UNetBlock( 128 , 256 ) # Bottleneck self .bottleneck = UNetBlock( 256 , 512 ) # Upsampling self .up3 = UNetBlock( 512 , 256 ) self .up2 = UNetBlock( 256 , 128 ) self .up1 = UNetBlock( 128 , 64 ) # Output self .out = nn.Conv2d( 64 , 3 , 1 ) def forward( self , x, t): # Embed timestep t_emb = self .time_embedding(t) # Downsample d1 = self .down1(x, t_emb) d2 = self .down2(d1, t_emb) d3 = self .down3(d2, t_emb) # Bottleneck bottleneck = self .bottleneck(d3, t_emb) # Upsample u3 = self .up3(torch.cat([bottleneck, d3], dim = 1 ), t_emb) u2 = self .up2(torch.cat([u3, d2], dim = 1 ), t_emb) u1 = self .up1(torch.cat([u2, d1], dim = 1 ), t_emb) # Output return self .out(u1) |
关键组件包括:
具有跳过连接的 U-Net 风格架构
时间步长上的条件
灵活的深度和宽度
采样算法
一旦我们训练了噪声预测网络 ε_θ,我们就可以使用它来生成新的样本。基本采样算法为:
从纯高斯噪声 xT 开始
对于 t = T 到 1:
预测噪声:
ε_θ(x_t, t)
计算平均值:
μ = 1/√(1-β_t) * (x_t - β_t/√(1-α_t) * ε_θ(x_t, t))
样本:
x_{t-1} ~ N(μ, σ_t^2 * I)
返回 x₀
这个过程在我们学习的噪声预测网络的指导下,逐渐对样本进行去噪。
在实践中,有多种抽样技术可以提高质量或速度:
DDIM 采样:一种确定性变体,允许更少的采样步骤
祖先采样:合并学习的方差 σ_θ^2
截断采样:提前停止以加快生成速度
以下是采样算法的基本实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | def sample(model, n_samples, device): # Start with pure noise x = torch.randn(n_samples, 3 , 32 , 32 ).to(device) for t in reversed ( range ( 1000 )): # Add noise to create x_t t_batch = torch.full((n_samples,), t, device = device) noise = torch.randn_like(x) x_t = add_noise(x, noise, t) # Predict and remove noise pred_noise = model(x_t, t_batch) x = remove_noise(x_t, pred_noise, t) # Add noise for next step (except at t=0) if t > 0 : noise = torch.randn_like(x) x = add_noise(x, noise, t - 1 ) return x |
扩散模型背后的数学原理
要真正理解扩散模型,深入研究支撑它们的数学至关重要。让我们更详细地探讨一些关键概念:
马尔可夫链和随机微分方程
扩散模型中的正向扩散过程可以看作是马尔可夫链,或者在连续极限中看作是随机微分方程 (SDE)。SDE 公式为分析和扩展扩散模型提供了强大的理论框架。
正向 SDE 可以写成:
dx = f(x,t)dt + g(t)dw
哪里:
f(x,t) 是漂移项
g(t) 是扩散系数
dw 是 Wiener 过程(布朗运动)
f 和 g 的不同选择会导致不同类型的扩散过程。例如:
方差爆炸 (VE)
SDE: dx = √(d/dt σ²(t)) dw
方差保留 (VP)
SDE: dx = -0.5 β(t)xdt + √(β(t)) dw
了解这些 SDE 使我们能够得出最佳采样策略并将扩散模型扩展到新的领域。
分数匹配和降噪分数匹配
扩散模型和分数匹配之间的联系提供了另一个有价值的视角。score 函数定义为对数概率密度的梯度:
s(x) = ∇x log p(x)
降噪分数匹配旨在通过训练模型来对略微扰动的数据点进行降噪来估计此分数函数。事实证明,这个目标相当于 continuous limit 中的扩散模型训练目标。
这种联系使我们能够利用基于分数的生成建模技术,例如退火 Langevin 动力学进行采样。
高级训练技巧
重要性采样
标准扩散模型训练对时间步长进行统一采样。但是,并非所有时间步长对于学习都同等重要。重要性采样技术可用于将训练集中在信息量最大的时间步长上。
一种方法是使用时间步长上的非均匀分布,由分数的预期 L2 范数加权:
p(t) ∝ E[||s(x_t, t)||²]
这可以加快训练速度并提高样本质量。
渐进式蒸馏
渐进式蒸馏是一种在不牺牲质量的情况下创建更快采样模型的技术。该过程的工作原理如下:
训练具有许多时间步长(例如 1000)的基本扩散模型
创建时间步长较少(例如 100 个)的学生模型
培训学生以匹配基本模型的降噪过程
重复步骤 2-3,逐渐减少时间步长
这允许以显著减少的降噪步骤实现高质量的生成。
建筑创新
基于 Transformer 的扩散模型
虽然 U-Net 架构在图像扩散模型中很受欢迎,但最近的工作探索了使用 transformer 架构。变压器具有几个潜在的优势:
更好地处理长距离依赖关系
更灵活的调节机制
更容易扩展到更大的模型大小
像 DiT (Diffusion Transformers) 这样的模型已经显示出有希望的结果,有可能为更高质量的生成提供一条途径。
分层扩散模型
分层扩散模型在多个尺度上生成数据,同时允许全局一致性和细粒度细节。该过程通常包括:
生成低分辨率输出
逐步上采样和优化
这种方法对于高分辨率图像生成或长篇内容生成特别有效。
高级主题
无分类器指南
无分类器引导是一种提高样本质量和可控性的技术。关键思想是训练两个扩散模型:
无条件模型 p(x_t)
条件模型 p(x_t | y) 其中 y 是一些条件信息(例如文本提示)
在采样过程中,我们在这些模型之间进行插值:
ε_θ = (1 + w) * ε_θ(x_t | y) - w * ε_θ(x_t)
其中 w > 0 是一个指导量表,用于控制对条件模型的强调程度。
这允许更强的调节,而无需重新训练模型。它对于 DALL-E 2 和 Stable Diffusion 等文本到图像模型的成功至关重要。
潜在扩散
潜在扩散模型 (LDM) 过程涉及将输入数据编码到发生扩散过程的潜在空间中。该模型逐渐将噪声添加到图像的潜在表示中,从而生成噪声版本,然后使用 U-Net 架构对其进行去噪。U-Net 在交叉注意力机制的引导下,集成了来自各种条件源(如语义图、文本和图像表示)的信息,最终在像素空间中重建图像。此过程对于生成具有受控结构和所需属性的高质量图像至关重要。
这提供了几个优点:
更快的训练和采样
更好地处理高分辨率图像
更容易结合调理
该过程的工作原理如下:
训练自动编码器将图像压缩到潜在空间
在这个潜在空间中训练扩散模型
对于生成,在潜在空间中采样并解码为像素
这种方法非常成功,为 Stable Diffusion 等模型提供了支持。
一致性模型
一致性模型是最近的一项创新,旨在提高扩散模型的速度和质量。关键思想是训练一个模型,该模型可以从任何噪声级别直接映射到最终输出,而不是需要迭代降噪。
这是通过精心设计的损失函数实现的,该函数强制不同噪声级别的预测之间的一致性。结果是一个可以在单次前向传递中生成高质量样本的模型,从而大大加快了推理速度。
训练扩散模型的实用技巧
训练高质量的扩散模型可能具有挑战性。以下是一些提高训练稳定性和结果的实用技巧:
梯度裁剪:使用梯度裁剪来防止梯度爆炸,尤其是在训练早期。
模型权重的 EMA:保留模型权重的指数移动平均值 (EMA) 以进行采样,这可以带来更稳定和更高质量的生成。
数据增强:对于图像模型,随机水平翻转等简单增强可以提高泛化。
噪声调度:尝试不同的噪声调度(线性、余弦、sigmoid),以找到最适合您数据的方法。
混合精度训练:使用混合精度训练来减少内存使用并加快训练速度,尤其是对于大型模型。
条件生成:即使您的最终目标是无条件生成,使用条件训练(例如在图像类上)也可以提高整体样本质量。
评估扩散模型
正确评估生成模型至关重要,但也具有挑战性。以下是一些常见的指标和方法:
Fréchet 初始距离 (FID)
FID 是评估生成图像的质量和多样性的广泛使用的指标。它将生成的样本的统计数据与预训练分类器(通常为 InceptionV3)的特征空间中的真实数据进行比较。
较低的 FID 分数表示质量越好,分布越真实。但是,FID 有局限性,不应是唯一使用的指标。
初始分数 (IS)
Inception Score 衡量生成图像的质量和多样性。它使用预先训练的 Inception 网络来计算:
IS = exp(E[KL(p(y|x) || p(y))])
其中 p(y|x) 是生成图像 x 的条件类分布。
较高的 IS 表示更好的质量和多样性,但它具有已知的局限性,尤其是对于与 ImageNet 截然不同的数据集。
负对数似然 (NLL)
对于扩散模型,我们可以计算保留数据的负对数似然。这可以直接衡量模型与真实数据分布的拟合程度。
但是,准确估计高维数据的 NLL 在计算上可能很昂贵。
人工评价
对于许多应用程序,尤其是创意应用程序,人工评估仍然至关重要。这可能涉及:
与其他模型的并排比较
图灵测试式评估
特定于任务的评估(例如,文本到图像模型的图像字幕)
虽然是主观的,但人工评估可以捕捉到自动化指标遗漏的质量方面。
生产中的扩散模型
在生产环境中部署扩散模型带来了独特的挑战。以下是一些注意事项和最佳实践:
推理优化
ONNX 导出:将模型转换为 ONNX 格式,以便在不同硬件上更快地进行推理。
量化:使用 INT8 量化等技术来减小模型大小并提高推理速度。
缓存:对于条件模型,缓存无条件模型的中间结果,以加快无分类器指导的速度。
批处理:利用批处理来有效利用 GPU 资源。
缩放
分布式推理:对于高吞吐量应用程序,请跨多个 GPU 或机器实施分布式推理。
自适应采样:根据所需的质量-速度权衡动态调整采样步骤数。
渐进式生成:对于大型输出(例如高分辨率图像),从低分辨率逐渐生成到高分辨率,以提供更快的初始结果。
安全和过滤
内容过滤:实施强大的内容过滤系统,以防止生成有害或不适当的内容。
水印:考虑将不可见的水印合并到生成的内容中以实现可追溯性。
应用
扩散模型在广泛的生成任务中取得了成功:
图像生成
图像生成是扩散模型首次受到重视的地方。一些值得注意的例子包括:
DALL-E 3:OpenAI 的文本到图像模型,将 CLIP 文本编码器与扩散图像解码器相结合
Stable Diffusion:用于生成文本到图像的开源潜在扩散模型
Imagen:Google 的文本到图像扩散模型
这些模型可以从文本描述中生成高度逼真和富有创意的图像,性能优于以前基于 GAN 的方法。
视频生成
扩散模型也已应用于视频生成:
视频扩散模型:通过将时间视为扩散过程中的附加维度来生成视频
Make-A-Video:Meta 的文本到视频扩散模型
Imagen Video:Google 的文字到视频扩散模型
这些模型可以从文本描述中生成短视频剪辑,为内容创建开辟了新的可能性。
3D 生成
最近的工作已将扩散模型扩展到 3D 生成:
DreamFusion:使用 3D 扩散模型生成文本到 2D
Point-E:OpenAI 用于 3D 对象生成的点云扩散模型
这些方法支持从文本描述创建 3D 资产,并应用于游戏、VR/AR 和产品设计。
挑战和未来方向
虽然扩散模型已经显示出显著的成功,但未来研究仍然存在一些挑战和领域:
计算效率
扩散模型的迭代采样过程可能很慢,尤其是对于高分辨率输出。潜在扩散和一致性模型等方法旨在解决这个问题,但进一步提高效率是一个活跃的研究领域。
操纵
虽然无分类器指导等技术提高了可控性,但在允许对生成的输出进行更精细的控制方面,仍有工作要做。这对于创意应用程序尤其重要。
多模态生成
当前的扩散模型擅长单模态生成(例如图像或音频)。开发可以跨模态无缝生成的真正多模态扩散模型是未来工作的一个令人兴奋的方向。
理论理解
虽然扩散模型具有很强的实证结果,但关于它们为什么如此有效,还有更多需要了解的地方。加深对理论的理解可能会带来进一步的改进和新的应用。
结论
Diffusion 模型代表了生成式 AI 向前迈出的一步,可在一系列模式中提供高质量的结果。通过学习反转噪声添加过程,他们提供了一种灵活且有理论依据的生成方法。
从创意工具到科学模拟,生成复杂、高维数据的能力有可能改变许多领域。然而,重要的是要考虑到这些强大的技术的巨大潜力和它们带来的道德挑战。