关注我们.

人工智能

理解扩散模型:深入探究生成式人工智能

mm
更新 on
理解扩散模型:深入探究生成式人工智能

扩散模型已成为生成式 AI 中的一种强大方法,在图像、音频和视频生成方面产生了最先进的结果。在这篇深入的技术文章中,我们将探讨扩散模型的工作原理、其关键创新以及它们如此成功的原因。我们将介绍这项令人兴奋的新技术的数学基础、训练过程、采样算法和前沿应用。

扩散模型简介

扩散模型 是一类生成模型,通过逆向扩散过程来学习逐步去除数据中的噪声。其核心思想是从纯噪声开始,然后迭代地将其细化为来自目标分布的高质量样本。

这种方法的灵感来自非平衡热力学——具体来说,就是逆转扩散以恢复结构的过程。在机器学习的背景下,我们可以将其视为学习逆转噪声逐渐添加到数据中的过程。

扩散模型的一些主要优点包括:

  • 最先进的图像质量,在许多情况下超越 GAN
  • 无对抗动态的稳定训练
  • 高度可并行
  • 灵活的架构——可以使用任何将输入映射到相同维度的输出的模型
  • 坚实的理论基础

让我们更深入地了解扩散模型的工作原理。

来源:Song 等人。

来源: 宋等人

随机微分方程控制扩散模型中的正向和反向过程。正向 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 调度通常选择在早期时间步较小,并随时间增加。常见的选择包括线性、余弦或 S 形调度。

逆扩散过程

扩散模型的目标是学习该过程的逆过程——从纯噪声 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__()
        
        # 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 风格架构
  • 时间嵌入以时间步长为条件
  • 灵活的深度和宽度

采样算法

一旦我们训练了噪声预测网络 ε_θ,我们就可以使用它来生成新样本。基本采样算法是:

  1. 从纯高斯噪声 xT 开始
  2. 对于 t = T 至 1:
    • 预测噪声: ε_θ(x_t, t)
    • 计算平均值: μ = 1/√(1-β_t) * (x_t - β_t/√(1-α_t) * ε_θ(x_t, t))
    • 示例: x_{t-1} ~ N(μ, σ_t^2 * I)
  3. 返回 x₀

在我们学习到的噪声预测网络的指导下,这个过程逐渐对样本进行去噪。

在实践中,有各种 抽样技术 可以提高质量或速度:

  • DDIM 采样:确定性变体,允许更少的采样步骤
  • 祖先采样:结合学习到的方差 σ_θ^2
  • 截断抽样:提前停止以加快生成速度

以下是采样算法的基本实现:

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 是维纳过程(布朗运动)

f 和 g 的不同选择会导致不同类型的扩散过程。例如:

  • 方差爆炸(VE) SDE: dx = √(d/dt σ²(t)) dw
  • 方差保持(VP) SDE: dx = -0.5 β(t)xdt + √(β(t)) dw

了解这些 SDE 使我们能够推导出最佳采样策略并将扩散模型扩展到新的领域。

得分匹配和去噪得分匹配

扩散模型和得分匹配之间的联系提供了另一个有价值的视角。得分函数定义为对数概率密度的梯度:

s(x) = ∇x log p(x)

去噪得分匹配旨在通过训练模型对轻微扰动的数据点进行去噪来估计该得分函数。该目标在连续极限下等同于扩散模型训练目标。

这种联系使我们能够利用基于分数的生成模型的技术,例如用于采样的退火朗之万动力学。

高级训练技巧

重要性抽样

标准扩散模型训练对时间步进行均匀采样。但是,并非所有时间步对学习都同样重要。重要性采样技术可用于将训练重点放在信息量最大的时间步上。

一种方法是使用时间步长上的非均匀分布,并根据分数的预期 L2 范数加权:

p(t) ∝ E[||s(x_t, t)||²]

这可以加快训练速度并提高样本质量。

渐进式蒸馏

渐进式提炼是一种在不牺牲质量的情况下创建更快采样模型的技术。该过程的工作原理如下:

  1. 训练具有多个时间步长(例如 1000)的基本扩散模型
  2. 创建一个具有较少时间步长(例如 100)的学生模型
  3. 训练学生模型以匹配基础模型的去噪过程
  4. 重复步骤 2-3,逐步减少时间步长

这样可以用明显更少的去噪步骤实现高质量的生成。

建筑创新

基于 Transformer 的扩散模型

虽然 U-Net 架构在图像扩散模型中很受欢迎,但最近的研究已经探索使用 Transformer 架构。Transformer 具有几个潜在优势:

  • 更好地处理长距离依赖关系
  • 更灵活的调节机制
  • 更容易扩展到更大的模型尺寸

模特喜欢 DiT(扩散变压器) 已经显示出令人鼓舞的结果,有可能为更高质量的产生提供途径。

层次扩散模型

分层扩散模型可生成多个尺度的数据,既能实现全局一致性,又能实现细粒度细节。该过程通常涉及:

  1. 生成低分辨率输出
  2. 逐步上采样和细化

这种方法对于高分辨率图像生成或长格式内容生成特别有效。

高级主题

无分类器指导

无分类器指导 是一种提高样本质量和可控性的技术。其关键思想是训练两个扩散模型:

  1. 无条件模型 p(x_t)
  2. 条件模型 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 整合了来自各种条件源(如语义图、文本和图像表示)的信息,最终在像素空间中重建图像。此过程对于生成具有受控结构和所需属性的高质量图像至关重要。

这有几个优点:

  • 更快的训练和采样
  • 更好地处理高分辨率图像
  • 更容易融入调理

该过程如下:

  1. 训练自动编码器将图像压缩到潜在空间
  2. 在这个潜在空间中训练扩散模型
  3. 为了生成,在潜在空间中采样并解码为像素

这种方法非常成功,为稳定扩散等模型提供了支持。

一致性模型

一致性模型是近期的一项创新,旨在提高扩散模型的速度和质量。其关键思想是训练一个单一模型,该模型可以从任何噪声水平直接映射到最终输出,而不需要迭代去噪。

这是通过精心设计的损失函数实现的,该函数可确保不同噪声水平下的预测一致性。结果是一个可以在单次前向传递中生成高质量样本的模型,从而大大加快推理速度。

训练扩散模型的实用技巧

训练高质量的扩散模型可能具有挑战性。以下是一些提高训练稳定性和结果的实用技巧:

  1. 渐变剪裁:使用梯度剪切来防止梯度爆炸,特别是在训练早期。
  2. 模型权重的 EMA:保持模型权重的指数移动平均值(EMA)进行采样,这可以实现更稳定、更高质量的生成。
  3. 资料扩充:对于图像模型,像随机水平翻转这样的简单增强可以提高泛化能力。
  4. 噪音调度:尝试不同的噪声方案(线性、余弦、S 形)来找到最适合您的数据的方案。
  5. 混合精度训练:使用混合精度训练来减少内存使用并加快训练速度,特别是对于大型模型。
  6. 条件生成:即使您的最终目标是无条件生成,通过条件训练(例如对图像类)也可以提高整体样本质量。

评估扩散模型

正确评估生成模型至关重要,但也很有挑战性。以下是一些常见的指标和方法:

弗雷谢起始距离 (FID)

FID 是评估生成图像质量和多样性的广泛使用的指标。​​它将生成的样本的统计数据与预训练分类器(通常是 InceptionV3)的特征空间中的真实数据进行比较。

FID 分数越低,表示质量越好,分布越真实。但是,FID 有局限性,不应成为唯一使用的指标。

初始分数(IS)

初始分数 测量生成图像的质量和多样性。它使用预先训练的 Inception 网络来计算:

IS = exp(E[KL(p(y|x) || p(y))])

其中 p(y|x) 是生成图像 x 的条件类分布。

更高的 IS 表示更好的质量和多样性,但它有已知的局限性,尤其是对于与 ImageNet 非常不同的数据集。

负对数似然 (中线)

对于扩散模型,我们可以计算保留数据的负对数似然。这可以直接衡量模型与真实数据分布的拟合程度。

然而,对于高维数据,准确估计 NLL 的计算成本很高。

人工评价

对于许多应用,尤其是创造性应用,人工评估仍然至关重要。这可能涉及:

  • 与其他模型的并排比较
  • 图灵测试风格的评估
  • 特定任务的评估(例如,文本到图像模型的图像字幕)

尽管主观,但人工评估可以捕捉到自动化指标所遗漏的质量方面。

生产中的扩散模型

在生产环境中部署扩散模型面临着独特的挑战。以下是一些注意事项和最佳实践:

推理优化

  1. ONNX 导出:将模型转换为 ONNX 格式,以便在不同硬件之间进行更快的推理。
  2. 量化:使用 INT8 量化等技术来减小模型尺寸并提高推理速度。
  3. 高速缓存:对于条件模型,缓存非条件模型的中间结果,以加快无分类器指导。
  4. 批量处理:利用批处理有效利用 GPU 资源。

缩放

  1. 分布式推理:对于高吞吐量应用程序,跨多个 GPU 或机器实现分布式推理。
  2. 自适应采样:根据所需的质量和速度权衡动态调整采样步数。
  3. 进步的一代:对于较大的输出(例如高分辨率图像),从低分辨率到高分辨率逐步生成以提供更快的初始结果。

安全和过滤

  1. 内容过滤:实施强大的内容过滤系统,以防止产生有害或不适当的内容。
  2. 水印:考虑将不可见的水印合并到生成的内容中以实现可追溯性。

应用

扩散模型已在广泛的生成任务中取得了成功:

影像产生

图像生成是扩散模型首次受到关注的领域。一些值得注意的例子包括:

  • 达尔-E 3:OpenAI 的文本转图像模型,结合了 CLIP 文本编码器和扩散图像解码器
  • 稳定扩散:用于文本到图像生成的开源潜在扩散模型
  • 图像:Google 的文本到图像传播模型

这些模型可以根据文本描述生成高度逼真和富有创意的图像,其表现优于以前基于 GAN 的方法。

视频生成

扩散模型也已应用于视频生成:

  • 视频传播模型:通过将时间作为扩散过程中的附加维度来生成视频
  • 制作一段视频:Meta 的文本到视频传播模型
  • 影像视频:谷歌的文本到视频传播模型

这些模型可以根据文本描述生成短视频片段,为内容创作开辟了新的可能性。

3D 生成

最近的研究将扩散模型扩展到 3D 生成:

  • 梦幻融合:使用 3D 扩散模型进行文本到 2D 生成
  • 观点:OpenAI 用于 3D 对象生成的点云扩散模型

这些方法可以根据文本描述创建 3D 资产,并可应用于游戏、VR/AR 和产品设计。

挑战和未来方向

虽然扩散模型已显示出显著的成功,但仍存在一些挑战和有待未来研究的领域:

计算效率

扩散模型的迭代采样过程可能很慢,尤其是对于高分辨率输出。潜在扩散和一致性模型等方法旨在解决这一问题,但进一步提高效率是一个活跃的研究领域。

可控性

虽然无分类器引导等技术提高了可控性,但仍有工作要做,以便对生成的输出进行更细粒度的控制。这对于创意应用尤其重要。

多模态生成

当前的扩散模型擅长单模态生成(例如图像或音频)。开发能够跨模态无缝生成的真正多模态扩散模型是未来工作的一个令人兴奋的方向。

理论理解

虽然扩散模型具有很强的实证结果,但关于它们为何如此有效,我们还需要做更多的了解。更深层次的理论理解可以带来进一步的改进和新的应用。

结语

扩散模型代表了生成式人工智能的一大进步,可在多种模式下提供高质量的结果。通过学习逆转噪声添加过程,它们提供了一种灵活且理论扎实的生成方法。

从创意工具到科学模拟,生成复杂高维数据的能力有可能改变许多领域。然而,重要的是要慎重对待这些强大的技术,既要考虑它们的巨大潜力,也要考虑它们所带来的道德挑战。

在过去的五年里,我一直沉浸在机器学习和深度学习的迷人世界中。 我的热情和专业知识使我为 50 多个不同的软件工程项目做出了贡献,特别关注人工智能/机器学习。 我持续的好奇心也吸引了我对自然语言处理的兴趣,这是我渴望进一步探索的领域。