菜单

潜在扩散模型

相关源文件

目的与范围

本文档介绍了 Stable Diffusion 代码库中的潜在扩散模型 (LDM) 实现。LDM 是使 Stable Diffusion 能够从文本提示生成高质量图像或修改现有图像的核心架构。与在像素空间操作的传统扩散模型不同,LDM 在压缩的潜在空间中操作,显著降低了计算需求,同时保持了生成质量。

有关 LDM 使用的不同采样策略的信息,请参阅 采样方法。有关使用的 UNet 架构的详细信息,请参阅 UNet 架构。有关文本条件机制的信息,请参阅 文本条件

来源: ldm/models/diffusion/ddpm.py424-469 Stable_Diffusion_v1_Model_Card.md9-10

核心组件与架构

LDM 结合了几个关键组件,协同工作以生成图像。

三个主要组件是:

  1. 第一阶段模型:一个自编码器(通常是 AutoencoderKL),将图像压缩到较低维度的潜在空间并进行重建。
  2. 条件阶段模型:通常是一个 CLIP 文本编码器,将文本提示转换为嵌入。
  3. 扩散模型:一个基于 UNet 的网络,在潜在空间中执行去噪扩散过程。

来源: ldm/models/diffusion/ddpm.py424-469 Stable_Diffusion_v1_Model_Card.md92-96

实现细节

LDM 通过 ddpm.py 文件中的 LatentDiffusion 类实现,该类继承自基础的 DDPM(去噪扩散概率模型)类。

关键类属性

LatentDiffusion 类维护了几个重要的属性:

  • first_stage_model:用于潜在空间操作的自编码器。
  • cond_stage_model:文本编码器(通常是 CLIP)。
  • scale_factor:控制潜在表示的缩放。
  • conditioning_key:确定条件机制("crossattn""concat")。

来源: ldm/models/diffusion/ddpm.py424-469 ldm/models/diffusion/ddpm.py502-508 ldm/models/diffusion/ddpm.py509-528

关键方法

1. 潜在空间操作

这些方法使用 first_stage_model 处理像素空间和潜在空间之间的转换。

2. 条件操作

此方法使用 cond_stage_model(CLIP 文本编码器)处理文本提示。

3. 采样与生成

采样过程利用 DDPM 类中的基础 p_sample_loop 方法,在潜在空间中进行操作。

来源: ldm/models/diffusion/ddpm.py825-863 ldm/models/diffusion/ddpm.py706-762 ldm/models/diffusion/ddpm.py551-562

生成管道

图像生成流程遵循以下步骤:

  1. 文本处理:使用 get_learned_conditioning() 对文本提示进行编码以获得嵌入。
  2. 初始化:过程从潜在空间中的随机噪声开始。
  3. 去噪:模型通过 p_sample_loop() 迭代地去噪潜在表示,并受文本嵌入的引导。
  4. 解码:通过 decode_first_stage() 将最终去噪的潜在表示转换回图像。

来源: ldm/models/diffusion/ddpm.py252-272 ldm/models/diffusion/ddpm.py706-762

扩散过程

扩散过程包括两部分:

前向过程(添加噪声)

前向扩散过程根据预定的时间表向干净的潜在表示添加噪声。这在训练期间使用,并通过 q_sample() 方法实现。

来源: ldm/models/diffusion/ddpm.py274-277

反向过程(去除噪声)

反向扩散过程逐渐去除从纯噪声开始的噪声,并受条件引导。这在生成期间使用,并通过 p_sample()p_sample_loop() 方法实现。

对于每个去噪步骤:

  1. UNet 预测当前潜在表示中的噪声。
  2. 模型使用此预测计算下一个(噪声较少的)潜在表示。
  3. 该过程重复进行,直到达到干净的潜在表示(t=0)。

来源: ldm/models/diffusion/ddpm.py243-250 ldm/models/diffusion/ddpm.py252-272

文本条件

文本条件是 LDM 的关键方面,它实现了文本到图像的生成。主要机制是文本嵌入和 UNet 中间表示之间的交叉注意力。

交叉注意力机制的工作原理如下:

  1. 文本嵌入在注意力机制中充当“键”和“值”。
  2. UNet 特征充当“查询”。
  3. 这使得 UNet 在去噪过程中能够选择性地关注文本嵌入的相关部分。

条件类型由 conditioning_key 参数确定,对于文本到图像生成,通常设置为 "crossattn"

来源: ldm/modules/encoders/modules.py137-162 ldm/modules/x_transformer.py215-267

缩放因子与潜在表示

LDM 使用缩放因子来标准化潜在空间的表示。

这种缩放可以提高训练稳定性,并确保潜在空间具有适当的统计特性。缩放因子是预先设定的,或者根据编码图像的标准偏差自动确定的。

来源: ldm/models/diffusion/ddpm.py542-549 ldm/models/diffusion/ddpm.py706-714

训练与推理

LatentDiffusion 类在训练和推理过程中使用不同的方法。

训练

训练期间,模型:

  1. 使用 encode_first_stage() 将真实图像编码到潜在空间。
  2. 通过 q_sample() 添加噪声。
  3. 根据 parameterization 预测噪声或干净的潜在表示。
  4. 使用 p_losses() 计算损失。

推理

推理(采样)期间,模型:

  1. 从潜在空间中的随机噪声开始。
  2. 通过 p_sample_loop() 逐步去噪。
  3. 使用 decode_first_stage() 解码最终的干净潜在表示。

来源: ldm/models/diffusion/ddpm.py293-321 ldm/models/diffusion/ddpm.py252-272

结论

潜在扩散模型是一个复杂的架构,它在压缩的潜在空间中操作,从而实现高效的高质量图像生成。通过结合自编码器、扩散模型和文本条件,它构成了 Stable Diffusion 文本到图像功能的核心。此存储库中的实现为训练和使用 LDM 进行各种生成任务提供了完整的框架。

来源: ldm/models/diffusion/ddpm.py424-469 Stable_Diffusion_v1_Model_Card.md9-10