扩散模型已成为生成式人工智能的一种强大方法,在图像、音频和视频生成方面取得了最先进的成果。在这篇深入浅出的技术文章中,我们将探讨扩散模式的工作原理、主要创新点以及它们如此成功的原因。我们将介绍这项令人兴奋的新技术的数学基础、训练过程、采样算法和前沿应用。
扩散模型简介
扩散模型是一类生成模型,它通过逆转扩散过程来学习逐步去噪数据。其核心理念是从纯噪声开始,然后迭代将其细化为目标分布的高质量样本。
这种方法受到非平衡热力学的启发–特别是逆转扩散以恢复结构的过程。在机器学习中,我们可以把它看作是学会逆转数据中逐渐增加的噪音。
扩散模型的一些主要优势包括
- 最先进的图像质量,在许多情况下都超越了广域网络
- 无对抗动态的稳定训练
- 高度并行化
- 灵活的架构–可使用任何将输入映射到相同维度输出的模型
- 坚实的理论基础
让我们深入了解扩散模型的工作原理。
随机微分方程控制着扩散模型中的正向和反向过程。前向 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 计划通常选择在早期时间步较小,随着时间推移逐渐增大。常见的选择包括线性、余弦或正余弦。
反向扩散过程
扩散模型的目标是学习这一过程的反向–从纯噪声 xT 开始,逐步去噪,以恢复干净的样本 x₀。
我们将这一逆向过程模拟为
p_θ(x_{t-1} | x_t) = N(x_{t-1}; μ_θ(x_t, t), σ_θ^2(x_t, t))
其中,μ_θ 和 σ_θ^2 是以 θ 为参数的学习函数(通常是神经网络)。
关键的创新之处在于,我们不需要明确建立完整的反向分布模型。相反,我们可以根据已知的前向过程对其进行参数化。
具体来说,我们可以证明最优反向过程均值 μ* 是:
μ* = 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 风格的架构是一种流行的选择,尤其适用于图像生成任务。
典型的架构可能是这样的
class DiffusionUNet(nn.Module):
def __init__(self):
super().__init__()
# 下采样
self.down1 = UNetBlock(3, 64)
self.down2 = UNetBlock(64, 128)
self.down3 = UNetBlock(128, 256)
# 瓶颈
self.bottleneck = UNetBlock(256, 512)
# 升采样
self.up3 = UNetBlock(512, 256)
self.up2 = UNetBlock(256, 128)
self.up1 = UNetBlock(128, 64)
# 输出
self.out = nn.Conv2d(64, 3, 1)
def forward(self, x, t):
# 嵌入时间步长
t_emb = self.time_embedding(t)
# 缩小样本
d1 = self.down1(x, t_emb)
d2 = self.down2(d1, t_emb)
d3 = self.down3(d2, t_emb)
# 瓶颈
bottleneck = self.bottleneck(d3, t_emb)
# 提高采样率
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)
# 输出
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
- 截断取样:提前停止,加快生成
下面是采样算法的基本实现:
def sample(model, n_samples, device):
# 从纯噪音开始
x = torch.randn(n_samples, 3, 32, 32).to(device)
for t in reversed(range(1000)):
# 添加噪音以创建 x_t
t_batch = torch.full((n_samples,), t, device=device)
noise = torch.randn_like(x)
x_t = add_noise(x, noise, t)
# 预测并消除噪音
pred_noise = model(x_t, t_batch)
x = remove_noise(x_t, pred_noise, t)
# 为下一步添加噪音(t=0 时除外)
如果 t > 0:
noise = torch.randn_like(x)
x = add_noise(x, noise, t-1)
返回 x
扩散模型背后的数学
要真正理解扩散模型,深入研究其数学基础至关重要。让我们来详细探讨一些关键概念:
马尔可夫链和随机微分方程
扩散模型中的前向扩散过程可以看作马尔可夫链,或者在连续极限中看作随机微分方程(SDE)。SDE 公式为分析和扩展扩散模型提供了一个强大的理论框架。
正向 SDE 可以写成
dx = f(x,t)dt + g(t)dw
在哪里?
- f(x,t) 是漂移项
- g(t) 是扩散系数
- dw 是一个维纳过程(布朗运动)
对 f 和 g 的不同选择会导致不同类型的扩散过程。例如:
- 方差爆炸 (VE) SDE:dx = √(d/dt σ²(t)) dw
- Variance Preserving (VP)
SDE: dx = -0.5 β(t)xdt + √(β(t)) dw
了解了这些 SDE,我们就能推导出最佳采样策略,并将扩散模型扩展到新的领域。
得分匹配和去噪得分匹配
扩散模型与分数匹配之间的联系提供了另一个有价值的视角。得分函数被定义为对数概率密度的梯度:
s(x) = ∇x log p(x)
去噪分数匹配的目的是通过训练一个模型来估计这个分数函数,从而对轻微扰动的数据点进行去噪。这一目标等同于连续极限的扩散模型训练目标。
这种联系使我们能够利用基于分数的生成建模技术,如退火朗格文动态采样技术。
高级培训技术
重要性取样
标准扩散模型训练对时间步进行均匀采样。然而,并非所有的时间步骤对学习都同样重要。重要度抽样技术可用于将培训重点放在信息量最大的时间步上。
一种方法是在时间步上使用非均匀分布,并根据分数的预期 L2 准则进行加权:
p(t) ∝ E[||s(x_t, t)||²]
这样可以加快培训速度,提高样本质量。
渐进蒸馏
渐进式蒸馏是一种在不影响质量的前提下创建更快采样模型的技术。流程如下
- 用许多时间步(如 1000 步)训练基础扩散模型
- 创建一个时间步数较少(如 100 步)的学生模型
- 训练学生匹配基础模型的去噪过程
- 重复步骤 2-3,逐步缩短时间步长
这样就能以更少的去噪步骤生成高质量的图像。
建筑创新
基于变压器的扩散模型
虽然 U-Net 架构在图像扩散模型中一直很流行,但最近的工作也在探索使用变压器架构。变压器具有多种潜在优势:
- 更好地处理远程依赖关系
- 更灵活的调节机制
- 更容易扩展到更大的模型尺寸
DiT(扩散变压器)等模式已显示出良好的效果,有可能为实现更高质量的发电提供一条途径。
分层扩散模型
分层扩散模型可生成多种尺度的数据,既可实现全局一致性,也可实现细粒度细节。这一过程通常包括
- 生成低分辨率输出
- 逐步提高采样率和精度
这种方法对于生成高分辨率图像或长格式内容尤为有效。
高级主题
无分类器引导
无分类器引导是一种提高样品质量和可控性的技术。其关键思路是训练两个扩散模型:
- An unconditional model 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 在交叉注意机制的引导下,整合来自语义图、文本和图像表征等各种调节源的信息,最终在像素空间中重建图像。这一过程对于生成具有可控结构和所需属性的高质量图像至关重要。
这样做有几个好处:
- 更快的培训和取样
- 更好地处理高分辨率图像
- 更容易加入调节功能
流程如下
- 训练自动编码器,将图像压缩至潜在空间
- 在该潜空间中训练扩散模型
- 生成时,在潜空间采样并解码为像素
这种方法非常成功,为稳定扩散等模型提供了动力。
一致性模型
一致性模型是最近的一项创新,旨在提高扩散模型的速度和质量。其关键思路是训练一个单一模型,该模型可以从任何噪声水平直接映射到最终输出,而不需要迭代去噪。
这是通过精心设计的损失函数来实现的,该函数可确保不同噪声水平下预测结果的一致性。因此,该模型能在一次前向传递中生成高质量样本,大大加快了推理速度。
训练扩散模型的实用技巧
训练高质量的扩散模型具有挑战性。以下是一些提高训练稳定性和效果的实用技巧:
- 渐变剪切使用梯度剪切来防止梯度爆炸,尤其是在训练初期。
- 模型权重的 EMA:保留模型权重的指数移动平均值(EMA)进行采样,这样可以生成更稳定、质量更高的数据。
- 数据扩充:对于图像模型,随机水平翻转等简单的增强措施可以提高泛化效果。
- 噪音调度:尝试使用不同的噪声表(线性、余弦、sigmoid),找出最适合您数据的噪声表。
- 混合精度训练:使用混合精度训练来减少内存使用并加快训练速度,尤其是对于大型模型。
- 有条件生成:即使您的最终目标是无条件生成样本,通过条件训练(如图像类)也能提高样本的整体质量。
评估扩散模型
正确评估生成模型至关重要,但也极具挑战性。以下是一些常见的衡量标准和方法:
弗雷谢特起始距离 (FID)
FID 是一种广泛使用的指标,用于评估生成图像的质量和多样性。它将生成样本的统计数据与预训练分类器(通常为 InceptionV3)特征空间中的真实数据进行比较。
FID 分数越低,说明质量越好,分布越真实。不过,FID 有其局限性,不应作为唯一的衡量标准。
初始分数 (IS)
初创得分可衡量生成图像的质量和多样性。它使用预先训练好的 Inception 网络进行计算:
IS = exp(E[KL(p(y|x) || p(y))])
其中,p(y|x) 是生成图像 x 的条件类别分布。
IS 越高,表示质量和多样性越好,但它也有已知的局限性,尤其是对于与 ImageNet 截然不同的数据集而言。
负对数似然法 (NLL)
对于扩散模型,我们可以计算保留数据的负对数似然。这可以直接衡量模型与真实数据分布的拟合程度。
不过,要对高维数据进行精确估算,NLL 的计算成本可能会很高。
人类评价
对于许多应用,尤其是创造性应用,人工评估仍然至关重要。这可能包括
- 与其他机型并排比较
- 图灵测试式评估
- 针对特定任务的评估(如文本到图像模型的图像字幕)
虽然主观性很强,但人工评估可以捕捉到自动指标所忽略的质量方面。
生产中的扩散模型
在生产环境中部署扩散模型面临着独特的挑战。以下是一些注意事项和最佳做法:
优化推理
- ONNX 出口:将模型转换为 ONNX 格式,以便在不同硬件上更快地进行推理。
- 量化:使用 INT8 量化等技术缩小模型大小,提高推理速度。
- 缓存:对于条件模型,缓存无条件模型的中间结果,以加快无分类器引导的速度。
- 批量处理:利用批处理高效利用 GPU 资源。
缩放
- 分布式推理对于高吞吐量应用,可在多个 GPU 或机器上实施分布式推理。
- 自适应采样:根据所需的质量-速度权衡,动态调整采样步数。
- 进步的一代对于大型输出(如高分辨率图像),从低分辨率到高分辨率逐步生成,以提供更快的初始结果。
安全和过滤
- 内容过滤:实施强大的内容过滤系统,防止生成有害或不适当的内容。
- 水印考虑在生成的内容中加入隐形水印,以实现可追溯性。
应用
扩散模型在各种生成任务中都取得了成功:
图像生成
图像生成是扩散模型首次受到重视的地方。一些著名的例子包括
- 达利 3:OpenAI 的文本到图像模型,结合了 CLIP 文本编码器和扩散图像解码器
- 稳定扩散:用于文本到图像生成的开源潜在扩散模型
- Imagen:谷歌的文本到图像扩散模型
这些模型可以根据文本描述生成高度逼真和富有创意的图像,其性能优于以往基于 GAN 的方法。
视频生成
扩散模型也被应用于视频生成:
- 视频扩散模型将时间作为扩散过程中的额外维度来生成视频
- 制作视频Meta 的文本到视频扩散模型
- Imagen Video:谷歌的文本到视频传播模型
这些模型可以根据文字描述生成视频短片,为内容创作提供了新的可能性。
三维生成
最近的工作已将扩散模型扩展到三维生成:
- 梦想融合利用二维扩散模型生成文本到三维图像
- E点OpenAI 用于生成 3D 物体的点云扩散模型
这些方法可以根据文字描述创建 3D 资产,应用于游戏、VR/AR 和产品设计。
挑战与未来方向
虽然传播模型已取得了显著的成功,但仍存在一些挑战和未来研究的领域:
计算效率
扩散模型的迭代采样过程可能很慢,尤其是在高分辨率输出时。潜在扩散和一致性模型等方法旨在解决这一问题,但进一步提高效率是一个活跃的研究领域。
可控性
虽然无分类器引导等技术提高了可控性,但在对生成的输出进行更精细的控制方面仍有许多工作要做。这对创意应用尤为重要。
多模式生成
当前的扩散模型擅长于单一模式生成(如图像或音频)。开发能够无缝生成跨模态的真正多模态扩散模型是未来工作的一个令人兴奋的方向。
理论认识
虽然扩散模型有很强的实证结果,但我们仍需进一步了解它们为何如此有效。加深对理论的理解,可以进一步改进工作和开发新的应用。
结论:
扩散模型是生成式人工智能的一大进步,可在各种模式下提供高质量的结果。通过学习逆转噪声添加过程,它们提供了一种灵活的、有理论依据的生成方法。
从创意工具到科学模拟,生成复杂、高维数据的能力有可能改变许多领域。不过,重要的是要深思熟虑地对待这些强大的技术,既要考虑到它们的巨大潜力,也要考虑到它们带来的伦理挑战。