菜单

模型架构

相关源文件

本页提供了 Stable Diffusion v1 模型架构的全面技术概述。Stable Diffusion 是一种潜在扩散模型,它将一个自编码器与在自编码器潜在空间中训练的扩散模型相结合,使其比像素空间扩散模型在计算上更有效,同时保持高质量的图像生成。

有关使用该模型的信息,请参阅使用指南。有关特定采样方法的详细说明,请参阅采样方法

高层架构概述

Stable Diffusion 的运作方式是将扩散过程转移到压缩的潜在空间,而不是直接处理像素。这种方法在不牺牲生成质量的情况下显著降低了计算要求。

来源: ldm/models/diffusion/ddpm.py424-470

类架构

系统遵循一个类层次结构,该结构扩展了 PyTorch Lightning 的模块系统。

来源: ldm/models/diffusion/ddpm.py44-123 ldm/models/diffusion/ddpm.py424-470

核心组件

1. DDPM 基类

DDPM 类实现了核心的去噪扩散概率模型功能。

  • register_schedule():设置噪声调度参数(betas、alphas 等)。
  • q_sample():实现前向过程(添加噪声)。
  • p_sample():实现反向过程的单步去噪。
  • p_sample_loop():执行完整的反向扩散过程。
  • p_losses():计算训练损失。

来源: ldm/models/diffusion/ddpm.py44-123 ldm/models/diffusion/ddpm.py204-250 ldm/models/diffusion/ddpm.py252-272

2. 潜在扩散模型

LatentDiffusion 类扩展了 DDPM 以在潜在空间中进行操作。

组件目的实现
first_stage_model自编码器(编码器/解码器)通常是 AutoencoderKL 实例。
cond_stage_model文本编码器通常是 CLIP ViT-L/14 模型。
scale_factor缩放潜在表示。用于标准化方差。
model(继承自)UNet 主干。主要的扩散模型。

关键方法

  • encode_first_stage():将图像转换为潜在表示。
  • decode_first_stage():将潜在表示转换为图像。
  • get_learned_conditioning():获取文本的条件嵌入。
  • apply_model():应用 UNet 模型执行去噪。

来源: ldm/models/diffusion/ddpm.py424-564 ldm/models/diffusion/ddpm.py706-824 ldm/models/diffusion/ddpm.py825-992

3. UNet 架构

UNet 被封装在一个 DiffusionWrapper 类中,是扩散模型的主干。

UNet 处理带噪的潜在表示,并根据 eps 参数化预测添加的噪声,或根据 x0 参数化预测干净的潜在表示。交叉注意力层通过允许文本嵌入影响去噪过程来实现文本条件。

来源: ldm/models/diffusion/ddpm.py86-87 ldm/models/diffusion/ddpm.py231-241 ldm/models/diffusion/ddpm.py891-992

4. 自编码器

自编码器由编码器和解码器组成。

  • 编码器:将图像压缩到具有 8 倍下采样因子的潜在空间。
  • 解码器:从潜在表示中重建图像。

对于 512×512 的图像,潜在表示的空间维度为 64×64。

来源: ldm/models/diffusion/ddpm.py502-508 ldm/models/diffusion/ddpm.py706-763 ldm/models/diffusion/ddpm.py825-863

5. 文本编码器

文本编码器是一个预训练的 CLIP ViT-L/14 模型。

来源: ldm/models/diffusion/ddpm.py509-529 ldm/models/diffusion/ddpm.py551-562

条件机制

Stable Diffusion 支持由 conditioning_key 参数控制的不同条件机制。

条件键机制内部键
'crossattn'交叉注意力条件。'c_crossattn'
'concat'连接条件。'c_concat'
无条件生成。不适用

最常见的机制是交叉注意力,文本嵌入通过交叉注意力层影响 UNet。

来源: ldm/models/diffusion/ddpm.py29-31 ldm/models/diffusion/ddpm.py442-448 ldm/models/diffusion/ddpm.py891-901

扩散过程

前向过程(训练)

在训练期间,前向扩散过程根据预定义的调度向潜在表示添加噪声。

来源: ldm/models/diffusion/ddpm.py274-278 ldm/models/diffusion/ddpm.py1012-1016

逆过程(推理)

在推理过程中,逆扩散过程将随机噪声逐渐去噪,生成清晰的潜在表示

来源: ldm/models/diffusion/ddpm.py252-265

参数化

该模型支持两种参数化模式

  1. eps 参数化(默认):UNet 预测添加的噪声
  2. x0 参数化:UNet 直接预测清晰的潜在表示

来源: ldm/models/diffusion/ddpm.py76-78 ldm/models/diffusion/ddpm.py300-305

训练配置

该模型以以下配置进行训练

  • 优化器:AdamW
  • 学习率:前 10,000 步预热至 0.0001,然后恒定
  • 批量大小:2048 (32 × 8 × 2 × 4)
  • 硬件:32 × 8 × A100 GPU
  • 损失函数:默认为 L2 (MSE) 损失

来源: Stable_Diffusion_v1_Model_Card.md91-113

生成管道

完整的图像生成流程包括

  1. 文本编码:文本提示被编码以生成文本嵌入
  2. 随机噪声初始化:从潜在空间中的随机噪声开始
  3. 迭代去噪:应用 UNet 逐步去噪潜在表示
  4. 解码:最终去噪后的潜在表示被解码以生成输出图像

迭代去噪步骤可以使用不同的采样策略,在速度和质量之间提供不同的权衡。有关详细信息,请参阅 采样方法

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

技术实现细节

噪声调度

该模型使用预定义的噪声调度,该调度决定了在前向过程中如何添加噪声

register_schedule 方法计算扩散过程中使用的各种系数,包括 alpha、beta 和后验参数。

来源: ldm/models/diffusion/ddpm.py117-169

EMA(指数移动平均)

该模型可以选择性地维护模型权重的指数移动平均(EMA),以获得更稳定的性能

来源: ldm/models/diffusion/ddpm.py88-91 ldm/models/diffusion/ddpm.py171-184

缩放因子

模型应用缩放因子来规范潜在表示的方差

这可以是一个固定值,也可以从数据中自动确定。

来源: ldm/models/diffusion/ddpm.py456-459 ldm/models/diffusion/ddpm.py477-491 ldm/models/diffusion/ddpm.py543-549

局限性

Stable Diffusion v1 模型有几个局限性

  • 与更大模型相比,照片般逼真的效果有限
  • 无法渲染清晰的文本
  • 在组合任务上表现不佳(例如,“一个红色的立方体放在一个蓝色的球体上”)
  • 人脸生成问题
  • 主要支持英文提示
  • 可能存在训练数据记忆

有关限制的完整列表,请参阅 许可证和使用限制

来源: Stable_Diffusion_v1_Model_Card.md58-71

本 wiki 页面概述了 Stable Diffusion v1 模型架构。有关各个组件的更具体详细信息,请参阅链接的 wiki 页面。