本文档介绍了 Stable Diffusion 代码库中的潜在扩散模型 (LDM) 实现。LDM 是使 Stable Diffusion 能够从文本提示生成高质量图像或修改现有图像的核心架构。与在像素空间操作的传统扩散模型不同,LDM 在压缩的潜在空间中操作,显著降低了计算需求,同时保持了生成质量。
有关 LDM 使用的不同采样策略的信息,请参阅 采样方法。有关使用的 UNet 架构的详细信息,请参阅 UNet 架构。有关文本条件机制的信息,请参阅 文本条件。
来源: ldm/models/diffusion/ddpm.py424-469 Stable_Diffusion_v1_Model_Card.md9-10
LDM 结合了几个关键组件,协同工作以生成图像。
三个主要组件是:
来源: 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
这些方法使用 first_stage_model 处理像素空间和潜在空间之间的转换。
此方法使用 cond_stage_model(CLIP 文本编码器)处理文本提示。
采样过程利用 DDPM 类中的基础 p_sample_loop 方法,在潜在空间中进行操作。
来源: ldm/models/diffusion/ddpm.py825-863 ldm/models/diffusion/ddpm.py706-762 ldm/models/diffusion/ddpm.py551-562
图像生成流程遵循以下步骤:
get_learned_conditioning() 对文本提示进行编码以获得嵌入。p_sample_loop() 迭代地去噪潜在表示,并受文本嵌入的引导。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() 方法实现。
对于每个去噪步骤:
来源: ldm/models/diffusion/ddpm.py243-250 ldm/models/diffusion/ddpm.py252-272
文本条件是 LDM 的关键方面,它实现了文本到图像的生成。主要机制是文本嵌入和 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 类在训练和推理过程中使用不同的方法。
训练期间,模型:
encode_first_stage() 将真实图像编码到潜在空间。q_sample() 添加噪声。parameterization 预测噪声或干净的潜在表示。p_losses() 计算损失。推理(采样)期间,模型:
p_sample_loop() 逐步去噪。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