第11章:可控生成与条件扩散
11.1 条件扩散模型的原理与实现
理论原理
条件扩散模型(Conditional Diffusion Models)通过引入外部信息(如类别标签、文本描述或其他模态数据)作为生成过程的控制条件,扩展了标准扩散模型的生成能力。其核心思想是将条件信息 融入扩散过程的正向和逆向阶段:
条件正向过程
给定数据 和条件 ,噪声化过程定义为:与无条件扩散不同,条件信息通过交叉注意力或拼接方式注入模型。
条件逆向过程
去噪网络 被扩展为 ,学习预测噪声时同时考虑条件信息:损失函数
条件扩散的损失函数在标准ELBO基础上增加条件依赖:
实现方法
1. 条件注入机制
拼接(Concatenation)
将条件 的嵌入向量直接拼接到输入数据或时间步编码中:# PyTorch示例 class ConditionalModel(nn.Module): def forward(self, x, t, y): t_emb = self.time_embed(t) # 时间步编码 y_emb = self.cond_embed(y) # 条件编码 h = torch.cat([x, t_emb, y_emb], dim=1) return self.net(h)交叉注意力(Cross-Attention)
更灵活的交互方式,常用于文本到图像生成(如Stable Diffusion):# 简化版交叉注意力层 class CrossAttention(nn.Module): def __init__(self, dim): super().__init__() self.to_q = nn.Linear(dim, dim) self.to_kv = nn.Linear(cond_dim, dim*2) def forward(self, x, y): q = self.to_q(x) k, v = self.to_kv(y).chunk(2, dim=-1) attn = (q @ k.transpose(-2,-1)) * (dim**-0.5) return attn.softmax(dim=-1) @ v
2. 条件数据类型处理
| 条件类型 | 编码方式 | 典型应用场景 |
|---|---|---|
| 类别标签 | 可学习嵌入(Embedding) | 图像分类条件生成 |
| 文本描述 | CLIP或BERT文本编码器 | Text-to-Image生成 |
| 图像 | CNN编码器 | 图像到图像转换 |
| 音频/时序数据 | 1D CNN或Transformer编码器 | 跨模态生成 |
案例研究:文本条件图像生成
以Stable Diffusion为例,其实现流程包括:
- 文本编码:使用CLIP的文本编码器将提示词转换为77×768的嵌入向量
- U-Net条件化:通过交叉注意力将文本嵌入注入U-Net的每一层
- 潜在空间扩散:在VAE的潜在空间执行扩散过程,降低计算成本
# 伪代码示例(基于Diffusers库)
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
prompt = "A realistic photo of a dragon flying over mountains"
image = pipe(prompt).images[0]
数学推导补充
条件扩散的证据下界(ELBO)可表示为:
其中逆向过程的转移概率定义为:
图示建议
- 条件扩散模型的架构图(对比无条件模型)
- 交叉注意力机制的可视化说明
- 不同条件输入生成的对比示例(如改变文本提示词的效果)
