Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第11章:可控生成与条件扩散

第11章:可控生成与条件扩散

11.1 条件扩散模型的原理与实现

理论原理

条件扩散模型(Conditional Diffusion Models)通过引入外部信息(如类别标签、文本描述或其他模态数据)作为生成过程的控制条件,扩展了标准扩散模型的生成能力。其核心思想是将条件信息 yyy 融入扩散过程的正向和逆向阶段:

  1. 条件正向过程
    给定数据 x0x_0x0​ 和条件 yyy,噪声化过程定义为:

    q(xt∣xt−1,y)=N(xt;1−βtxt−1,βtI)q(x_t|x_{t-1}, y) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_t\mathbf{I}) q(xt​∣xt−1​,y)=N(xt​;1−βt​​xt−1​,βt​I)

    与无条件扩散不同,条件信息通过交叉注意力或拼接方式注入模型。

  2. 条件逆向过程
    去噪网络 ϵθ\epsilon_\thetaϵθ​ 被扩展为 ϵθ(xt,t,y)\epsilon_\theta(x_t, t, y)ϵθ​(xt​,t,y),学习预测噪声时同时考虑条件信息:

    pθ(xt−1∣xt,y)=N(xt−1;μθ(xt,t,y),Σθ(xt,t,y))p_\theta(x_{t-1}|x_t, y) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t,t,y), \Sigma_\theta(x_t,t,y)) pθ​(xt−1​∣xt​,y)=N(xt−1​;μθ​(xt​,t,y),Σθ​(xt​,t,y))

  3. 损失函数
    条件扩散的损失函数在标准ELBO基础上增加条件依赖:

    L=Et,x0,y,ϵ[∥ϵ−ϵθ(xt,t,y)∥2]\mathcal{L} = \mathbb{E}_{t,x_0,y,\epsilon}\left[\|\epsilon - \epsilon_\theta(x_t,t,y)\|^2\right] L=Et,x0​,y,ϵ​[∥ϵ−ϵθ​(xt​,t,y)∥2]

实现方法

1. 条件注入机制

  • 拼接(Concatenation)
    将条件 yyy 的嵌入向量直接拼接到输入数据或时间步编码中:

    # 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为例,其实现流程包括:

  1. 文本编码:使用CLIP的文本编码器将提示词转换为77×768的嵌入向量
  2. U-Net条件化:通过交叉注意力将文本嵌入注入U-Net的每一层
  3. 潜在空间扩散:在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)可表示为:

log⁡pθ(x∣y)≥Eq[log⁡pθ(x0:T∣y)q(x1:T∣x0,y)]\log p_\theta(x|y) \geq \mathbb{E}_q\left[\log \frac{p_\theta(x_{0:T}|y)}{q(x_{1:T}|x_0,y)}\right] logpθ​(x∣y)≥Eq​[logq(x1:T​∣x0​,y)pθ​(x0:T​∣y)​]

其中逆向过程的转移概率定义为:

pθ(xt−1∣xt,y)=q(xt−1∣xt,x0=x^θ(xt,t,y))p_\theta(x_{t-1}|x_t,y) = q(x_{t-1}|x_t, x_0=\hat{x}_\theta(x_t,t,y)) pθ​(xt−1​∣xt​,y)=q(xt−1​∣xt​,x0​=x^θ​(xt​,t,y))

图示建议

  1. 条件扩散模型的架构图(对比无条件模型)
  2. 交叉注意力机制的可视化说明
  3. 不同条件输入生成的对比示例(如改变文本提示词的效果)
Last Updated:: 5/28/25, 11:37 PM