本文档介绍了 Stable Diffusion 的扩散模型中使用的 UNet 架构。UNet 作为去噪过程的骨干,接收带噪的潜在表示,并根据时间步长和条件信息逐步去除噪声。有关文本如何编码和用于条件的信息,请参阅 文本条件。有关整体潜在扩散模型的详细信息,请参阅 潜在扩散模型。
Stable Diffusion 中的 UNet 是一个时间条件化的 U 形神经网络,它在潜在空间中运行。它在每个扩散时间步长预测添加到图像的噪声或直接预测去噪后的输出。其架构结合了一系列下采样块、一个中间块和具有跳跃连接的上采样块,同时融入了残差块和注意力机制。
来源:ldm/modules/diffusionmodules/openaimodel.py413-742
时间嵌入是使 UNet 能够根据扩散时间步长条件化其行为的关键组成部分。这使得模型能够根据噪声级别应用不同的去噪策略。
时间嵌入过程
来源:ldm/modules/diffusionmodules/openaimodel.py506-511 ldm/modules/diffusionmodules/util.py18-19
UNet 架构由几个关键的构建块组成
ResBlock 是一个基本组件,有助于梯度流动和特征传播
来源:ldm/modules/diffusionmodules/openaimodel.py163-275
注意力块允许不同的空间位置相互关注
来源:ldm/modules/diffusionmodules/openaimodel.py278-324
空间变换器通过交叉注意力实现基于文本嵌入的条件化
来源:ldm/modules/diffusionmodules/openaimodel.py557-559 ldm/modules/attention.py
下采样路径由一系列输入块组成,这些块逐渐减小空间尺寸同时增加通道深度
对于每个下采样级别
来源:ldm/modules/diffusionmodules/openaimodel.py516-587
中间块处理瓶颈表示
来源:ldm/modules/diffusionmodules/openaimodel.py597-623
上采样路径通过跳跃连接结合了来自下采样路径的特征
上采样过程镜像了下采样路径
来源:ldm/modules/diffusionmodules/openaimodel.py626-686
UNet 的前向传播将所有组件连接起来
来源:ldm/modules/diffusionmodules/openaimodel.py710-742
UNet 架构是高度可配置的。以下是关键参数
| 参数 | 描述 | 默认值 |
|---|---|---|
image_size | 输入图像的大小 | 64(潜在空间) |
in_channels | 输入通道数 | 4 |
model_channels | 基本通道数 | 320 |
out_channels | 输出通道数 | 4 |
num_res_blocks | 每个下采样级别的 ResBlocks 数量 | 2 |
attention_resolutions | 应用注意力的分辨率 | (4, 2, 1) |
dropout | Dropout 率 | 0.0 |
channel_mult | 每个级别的通道乘数 | (1, 2, 4, 8) |
conv_resample | 使用学习到的卷积进行采样 | True |
dims | 信号的维度 | 2 |
num_heads | 注意力头的数量 | 8 |
num_head_channels | 每个注意力头的通道数 | 64 |
use_scale_shift_norm | 使用 FiLM 式条件化 | True |
use_spatial_transformer | 使用交叉注意力进行文本条件化 | True |
transformer_depth | 交叉注意力 Transformer 的深度 | 1 |
context_dim | 上下文(文本)嵌入的维度 | 768 或 1024 |
来源:ldm/modules/diffusionmodules/openaimodel.py443-468
UNet 模型通过 DiffusionWrapper 类集成到扩散过程中,该类在 DDPM 类中初始化。
集成工作如下
DDPM 类创建一个包装 UNet 模型的 DiffusionWrapper 实例来源:ldm/models/diffusion/ddpm.py44-116 ldm/models/diffusion/ddpm.py231-265
UNet 支持不同的条件化机制,这些机制决定了辅助信息如何影响扩散过程
在无条件模式下,模型仅依赖时间步长,没有外部条件。
条件数据直接与输入串联
文本嵌入通过交叉注意力层对 UNet 进行条件化
来源:ldm/models/diffusion/ddpm.py29-31 ldm/modules/diffusionmodules/openaimodel.py557-559
UNet 架构包含几项优化
来源:ldm/modules/diffusionmodules/openaimodel.py315-316 ldm/modules/diffusionmodules/openaimodel.py250-252
UNet 架构与 Stable Diffusion 系统中的其他几个组件紧密协作
来源:ldm/modules/encoders/modules.py137-162 ldm/models/diffusion/ddpm.py424-469