菜单

采样方法

相关源文件

介绍

本页面记录了 Stable Diffusion 代码库中实现的采样方法。采样方法是决定如何逐步去噪潜在噪声以生成图像的算法。采样器的选择会影响图像质量和生成速度,为不同的用例提供不同的权衡。

有关扩散模型整体架构的信息,请参阅潜在扩散模型

来源:ldm/models/diffusion/ddim.py1-3 ldm/models/diffusion/dpm_solver/sampler.py1-3

采样方法概述

Stable Diffusion 实现多种采样策略,每种策略都有其独特的特性。

该存储库提供了三种主要采样器。

  1. DDIM(去噪扩散隐式模型):一种确定性采样方法,可以实现更快的采样和更少的步数。
  2. PLMS(伪线性多步):一种高阶求解器,是对 DDIM 的改进。
  3. DPM-Solver:一种具有高阶收敛速度的快速求解器,提供了最佳的速度/质量权衡。

来源:ldm/models/diffusion/ddim.py ldm/models/diffusion/dpm_solver/sampler.py

采样器结构和集成

每个采样器都遵循通用的接口模式,以集成到潜在扩散模型中。

所有采样器都遵循类似的模式。

  • 它们在初始化时将扩散模型作为输入。
  • 它们将诸如 alphas_cumprod 类的模型参数注册为缓冲区。
  • 它们实现了一个具有一致接口的 sample() 方法。
  • 它们同时处理条件和无条件引导。

来源:ldm/models/diffusion/ddim.py12-24 ldm/models/diffusion/dpm_solver/sampler.py8-19

DDIM 采样器

DDIM(去噪扩散隐式模型)采样器是一种确定性采样方法,与原始的 DDPM(去噪扩散概率模型)方法相比,它能够实现显著更少的采样步数。

关键组件

实现

DDIMSampler 在ldm/models/diffusion/ddim.py 中定义,并提供了:

  1. 调度make_schedule 方法创建采样过程的时间步长序列,在完整的扩散时间步长和缩减的子集之间进行转换,以实现更快的采样。

  2. 采样过程:

    • sample 方法是主要入口点。
    • 它准备参数并调用 ddim_sampling
    • 这会执行迭代去噪,在每个步骤调用 p_sample_ddim
  3. 单步去噪:

    • p_sample_ddim 执行单个去噪步骤。
    • 它通过 unconditional_guidance_scale 参数支持无分类器自由引导。
    • 参数 eta 控制随机性 - 当 eta=0.0 时,过程是确定性的。

关键参数

参数描述效果
步数采样步数步数越少速度越快,但可能会降低质量。
eta控制随机性。0.0 表示确定性,1.0 表示随机性。
unconditional_guidance_scale引导强度。值越高,越贴近提示词。

来源:ldm/models/diffusion/ddim.py56-111 ldm/models/diffusion/ddim.py166-204

DPM-Solver

DPM-Solver 是一种先进的快速采样器,为扩散模型提供了高阶收敛性,能够以非常少的步数获得高质量的结果。

架构

实现

DPM-Solver 由多个组件组成。

  1. DPMSolverSamplerldm/models/diffusion/dpm_solver/sampler.py8-82)

    • 与 Stable Diffusion 模型接口的类。
    • 实现了 pipeline 所需的 sample 方法。
  2. NoiseScheduleVPldm/models/diffusion/dpm_solver/dpm_solver.py6-174)

    • 处理方差保持 (VP) SDE 的噪声调度。
    • 支持离散时间和连续时间扩散模型。
    • 提供计算 alpha、sigma 和 lambda 值的函数。
  3. DPM_Solverldm/models/diffusion/dpm_solver/dpm_solver.py351-1300)

    • DPM-Solver 算法的核心实现。
    • 支持单步和多步求解器。
    • 实现了一阶、二阶和三阶方法。

主要功能

  1. 高阶求解器:

    • 一阶:等同于 DDIM。
    • 二阶:在计算开销很小的情况下提高精度。
    • 三阶:精度最高,尤其是在步数很少的情况下。
  2. 求解方法:

    • 单步:直接应用高阶方法。
    • 多步:利用先前步骤的信息以提高效率。
  3. 求解器类型:

    • dpm_solver:默认求解器类型。
    • taylor:替代实现,具有略微不同的特性。

配置选项

参数描述典型值
stepsS求解器步数。10-50(比 DDIM 少)。
skip_type时间步长间隔的方法。'time_uniform'(高分辨率默认值)。
method求解方法。'multistep' 或 'singlestep'。
order求解器的阶数。1、2 或 3。

来源:ldm/models/diffusion/dpm_solver/sampler.py21-82 ldm/models/diffusion/dpm_solver/dpm_solver.py351-450

比较和使用建议

性能比较

采样器速度质量推荐步数用例
DDIM中等良好50-100速度和质量的良好平衡。
PLMS中等更好50-70当质量比速度更重要时。
DPM-Solver优秀15-30大多数用例的最佳选择。

选择采样器

使用 Stable Diffusion 时,请根据您的优先事项选择采样器。

  1. 为了最快的生成速度:使用 15-20 步的 DPM-Solver。
  2. 为了最高的质量:使用 30-40 步的 DPM-Solver 或 70+ 步的 PLMS。
  3. 为了确定性的结果:使用 eta=0.0 的 DDIM。

脚本中的实现

在入口脚本 (txt2img.py/img2img.py) 中使用采样器时,采样器选择和配置如下:

来源:ldm/models/diffusion/dpm_solver/sampler.py21-82 ldm/models/diffusion/ddim.py56-111

高级:噪声调度

所有采样器都依赖于“噪声调度”,该调度决定了噪声在扩散过程中如何添加和移除。Stable Diffusion 支持多种噪声调度。

噪声调度在模型训练期间定义,是模型配置的一部分。对于预训练的 Stable Diffusion 模型,使用了从 alphas_cumprod 参数派生的离散调度。

来源:ldm/modules/diffusionmodules/util.py21-43 ldm/models/diffusion/dpm_solver/dpm_solver.py6-124