Stable Diffusion推导与理解:从文本到图像的生成革命
Stable Diffusion推导与理解:从文本到图像的生成革命
1. 引言:Stable Diffusion的诞生背景
在扩散模型的发展历程中,Stable Diffusion代表了从无条件生成到条件生成的重大突破。它巧妙地将潜空间扩散与文本条件机制结合,实现了高效、可控的文本到图像生成。
1.1 从DDPM到Stable Diffusion的演进
模型演进 | 核心突破 | 主要限制 |
---|---|---|
DDPM | 基础扩散框架 | 无条件生成,速度慢 |
DDIM | 加速采样算法 | 仍是无条件生成 |
Latent Diffusion | 潜空间压缩 | 减少计算量 |
Stable Diffusion | 文本条件+潜空间 | 高效可控生成 |
2. 核心架构:三驾马车协同工作
2.1 系统架构总览
文本输入 → CLIP文本编码器 → 条件向量
噪声图像 → 潜空间编码器 → 潜空间特征↓条件扩散模型(U-Net)↓潜空间解码器 → 生成图像
2.2 三大核心组件
2.2.1 VAE(Variational Autoencoder)
- 作用:将图像压缩到潜空间,大幅减少计算量
- 压缩比:512×512×3 → 64×64×4(约48倍压缩)
- 关键公式:
- 编码:z=Encoder(x)z = \text{Encoder}(x)z=Encoder(x)
- 解码:x^=Decoder(z)\hat{x} = \text{Decoder}(z)x^=Decoder(z)
2.2.2 CLIP文本编码器
- 作用:将文本描述转换为语义向量
- 架构:基于Transformer的文本理解模型
- 输出:77×768维的文本特征矩阵
2.2.3 条件U-Net
- 作用:在潜空间中执行条件扩散
- 输入:噪声潜空间特征 + 文本条件
- 输出:预测的噪声
3. 数学建模:条件扩散的精确推导
3.1 前向过程:带条件的马尔可夫链
3.1.1 潜空间前向过程
q(zt∣zt−1)=N(zt;1−βtzt−1,βtI)q(z_t|z_{t-1}) = \mathcal{N}(z_t; \sqrt{1-\beta_t}z_{t-1}, \beta_t I)q(zt∣zt−1)=N(zt;1−βtzt−1,βtI)
3.1.2 条件概率建模
q(zt∣z0,c)=N(zt;αˉtz0,(1−αˉt)I)q(z_t|z_0, c) = \mathcal{N}(z_t; \sqrt{\bar{\alpha}_t}z_0, (1-\bar{\alpha}_t)I)q(zt∣z0,c)=N(zt;αˉtz0,(1−αˉt)I)
其中ccc为文本条件,通过交叉注意力机制融入。
3.2 反向过程:条件去噪
3.2.1 条件反向分布
pθ(zt−1∣zt,c)=N(zt−1;μθ(zt,t,c),Σθ(zt,t,c))p_\theta(z_{t-1}|z_t, c) = \mathcal{N}(z_{t-1}; \mu_\theta(z_t, t, c), \Sigma_\theta(z_t, t, c))pθ(zt−1∣zt,c)=N(zt−1;μθ(zt,t,c),Σθ(zt,t,c))
3.2.2 简化后的反向过程
zt−1=1αt(zt−1−αt1−αˉtϵθ(zt,t,c))+σtϵz_{t-1} = \frac{1}{\sqrt{\alpha_t}}\left(z_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_\theta(z_t, t, c)\right) + \sigma_t \epsilonzt−1=αt1(zt−1−αˉt1−αtϵθ(zt,t,c))+σtϵ
3.3 损失函数:条件变分下界
3.3.1 完整ELBO
LLDM=Ex,c,ϵ∼N(0,1),t[∥ϵ−ϵθ(zt,t,c)∥2]+Lreg\mathcal{L}_{\text{LDM}} = \mathbb{E}_{x, c, \epsilon \sim \mathcal{N}(0,1), t}\left[\|\epsilon - \epsilon_\theta(z_t, t, c)\|^2\right] + \mathcal{L}_{\text{reg}}LLDM=Ex,c,ϵ∼N(0,1),t[∥ϵ−ϵθ(zt,t,c)∥2]+Lreg
3.3.2 简化的MSE损失
Lsimple=Ez0,c,ϵ,t[∥ϵ−ϵθ(αˉtz0+1−αˉtϵ,t,c)∥2]\mathcal{L}_{\text{simple}} = \mathbb{E}_{z_0, c, \epsilon, t}\left[\|\epsilon - \epsilon_\theta(\sqrt{\bar{\alpha}_t}z_0 + \sqrt{1-\bar{\alpha}_t}\epsilon, t, c)\|^2\right]Lsimple=Ez0,c,ϵ,t[∥ϵ−ϵθ(αˉtz0+1−αˉtϵ,t,c)∥2]
4. 条件机制:文本如何引导生成
4.1 交叉注意力机制详解
4.1.1 交叉注意力计算流程
# 交叉注意力的正确实现:图像特征作为查询,文本作为键值对
def cross_attention(x, context):"""x: 图像特征 [B, C, H, W] - 作为查询context: 文本特征 [B, seq_len, text_dim] - 作为键和值"""# 将图像特征reshape为序列B, C, H, W = x.shapex_seq = x.view(B, C, H*W).transpose(1, 2) # [B, H*W, C]# 计算查询、键、值q = linear_q(x_seq) # 查询来自图像 [B, H*W, d_k]k = linear_k(context) # 键来自文本 [B, seq_len, d_k]v = linear_v(context) # 值来自文本 [B, seq_len, d_v]# 计算注意力权重:图像查询与文本键的相似度scores = q @ k.transpose(-2, -1) / sqrt(d_k) # [B, H*W, seq_len]attn_weights = softmax(scores, dim=-1)# 用文本的值加权求和:图像区域从文本获取相关信息out = attn_weights @ v # [B, H*W, d_v]# 转换回空间维度return out.transpose(1, 2).view(B, d_v, H, W)# 多头交叉注意力实现
def multi_head_cross_attention(x, context, num_heads=8):"""多头版本:增强表达能力"""B, C, H, W = x.shapex_seq = x.view(B, C, H*W).transpose(1, 2)# 分割为多个头q = linear_q(x_seq).view(B, H*W, num_heads, -1).transpose(1, 2)k = linear_k(context).view(B, context.size(1), num_heads, -1).transpose(1, 2)v = linear_v(context).view(B, context.size(1), num_heads, -1).transpose(1, 2)# 计算注意力scores = (q @ k.transpose(-2, -1)) / sqrt(q.size(-1))attn = softmax(scores, dim=-1)# 合并多头out = (attn @ v).transpose(1, 2).contiguous().view(B, H*W, -1)return out.transpose(1, 2).view(B, -1, H, W)
4.1.2 条件引导强度控制:CFG的深层理解
4.1.2.1 数学原理:从噪声到条件的向量变换
Classifier-Free Guidance (CFG)的核心思想是通过向量插值来控制文本条件的影响强度:
ϵ~θ(zt,t,c)=ϵθ(zt,t,∅)⏟无条件噪声+s⏟引导强度⋅(ϵθ(zt,t,c)−ϵθ(zt,t,∅))⏟条件方向向量\tilde{\epsilon}_\theta(z_t, t, c) = \underbrace{\epsilon_\theta(z_t, t, \emptyset)}_{\text{无条件噪声}} + \underbrace{s}_{\text{引导强度}} \cdot \underbrace{\left(\epsilon_\theta(z_t, t, c) - \epsilon_\theta(z_t, t, \emptyset)\right)}_{\text{条件方向向量}}ϵ~θ(zt,t,c)=无条件噪声ϵθ(zt,t,∅)+引导强度s⋅条件方向向量(ϵθ(zt,t,c)−ϵθ(zt,t,∅))
几何解释:
- 起点:无条件噪声预测(完全随机)
- 方向:从无条件到条件的差分向量(文本语义方向)
- 缩放:通过引导强度sss控制沿该方向的移动距离
4.1.2.2 引导强度的物理意义
引导强度sss | 物理意义 | 生成效果 | 适用场景 |
---|---|---|---|
s=1.0s=1.0s=1.0 | 无引导(纯插值) | 完全遵循文本,但可能过于保守 | 需要高度准确性 |
s=7.5s=7.5s=7.5 | 标准引导(经验最优) | 平衡质量和多样性 | 大多数场景 |
s=15.0s=15.0s=15.0 | 强引导 | 文本特征过度强化 | 强调特定元素 |
s=20.0+s=20.0+s=20.0+ | 过强引导 | 图像失真、色彩过饱和 | 特殊艺术效果 |
4.1.2.3 实际效果对比分析
以"a red cat sitting on a blue sofa"为例:
# 不同引导强度的实际效果
prompt = "a red cat sitting on a blue sofa, photorealistic"# s=1.0: 过于保守,可能生成普通猫咪
# s=7.5: 完美平衡,红色猫咪+蓝色沙发清晰可见
# s=15.0: 红色过度饱和,沙发蓝色过于鲜艳
# s=20.0: 图像开始失真,出现不自然的色块
4.2 文本条件的处理流程
4.2.1 文本编码
- 分词:将文本分解为token序列
- 嵌入:将token映射为连续向量
- 位置编码:添加位置信息
- Transformer编码:生成上下文相关的文本特征
4.2.2 条件注入策略
- 时间步嵌入:将时间信息注入每个残差块
- 文本条件:通过交叉注意力注入文本信息
- 空间条件:支持额外的空间控制(如深度图、边缘图)
5. 实现细节:工程化的关键优化
5.1 潜空间扩散的数学推导
5.1.1 从像素空间到潜空间
原始问题:在像素空间直接扩散计算量巨大
- 512×512×3图像 = 786,432维
- 计算复杂度:O(n2)O(n^2)O(n2)
解决方案:
- 潜空间维度:64×64×4 = 16,384维
- 计算量减少:48倍
5.1.2 潜空间扩散的等价性证明
关键引理:潜空间扩散等价于像素空间扩散的低秩近似
p(x∣c)=∫p(x∣z)p(z∣c)dz≈pθ(x∣c)p(x|c) = \int p(x|z)p(z|c)dz \approx p_\theta(x|c)p(x∣c)=∫p(x∣z)p(z∣c)dz≈pθ(x∣c)
5.2 网络架构设计
5.2.1 条件U-Net结构
输入: z_t (64×64×4) + c (文本条件)↓
时间步嵌入 (1280维)↓
下采样路径:- 64×64×320 → 32×32×640 → 16×16×1280 → 8×8×1280↓
中间层: 8×8×1280 (带交叉注意力)↓
上采样路径:- 8×8×1280 → 16×16×1280 → 32×32×640 → 64×64×320↓
输出: 预测的噪声 ε_θ (64×64×4)
5.2.2 注意力机制配置
层级 | 自注意力 | 交叉注意力 | 头数 |
---|---|---|---|
64×64 | ✓ | ✓ | 8 |
32×32 | ✓ | ✓ | 8 |
16×16 | ✓ | ✓ | 8 |
8×8 | ✓ | ✓ | 8 |
5.3 训练策略
5.3.1 两阶段训练
- 第一阶段:训练VAE编码器-解码器
- 第二阶段:固定VAE,训练条件扩散模型
5.3.2 条件丢弃(Condition Dropout)
- 目的:支持无分类器引导
- 实现:训练时随机将文本条件替换为空文本
- 比例:通常20%的条件丢弃率
6. 采样算法:从噪声到图像
6.1 DDIM在Stable Diffusion中的应用
6.1.1 条件DDIM采样
def stable_diffusion_sample(prompt, steps=50, guidance_scale=7.5):"""Stable Diffusion采样完整流程"""# 1. 文本编码text_emb = clip_encode(prompt)# 2. 初始化噪声z_T = torch.randn(1, 4, 64, 64)# 3. 条件DDIM采样for t in reversed(range(steps)):# 预测无条件噪声eps_uncond = unet(z_t, t, text_empty)# 预测条件噪声eps_cond = unet(z_t, t, text_emb)# 分类器无关引导eps = eps_uncond + guidance_scale * (eps_cond - eps_uncond)# DDIM更新z_t = ddim_step(z_t, eps, t)# 4. 解码到像素空间image = vae_decode(z_0)return image
6.1.2 采样步数与质量权衡
步数 | 质量 | 时间 | 适用场景 |
---|---|---|---|
20步 | 可接受 | 1s | 快速原型 |
50步 | 良好 | 2.5s | 日常使用 |
100步 | 优秀 | 5s | 高质量需求 |
1000步 | 最佳 | 50s | 学术研究 |
6.2 高级采样技巧
6.2.1 负向提示(Negative Prompts)
数学表达:
ϵ~θ=ϵθ(cneg)+s(ϵθ(cpos)−ϵθ(cneg))\tilde{\epsilon}_\theta = \epsilon_\theta(c_{\text{neg}}) + s(\epsilon_\theta(c_{\text{pos}}) - \epsilon_\theta(c_{\text{neg}}))ϵ~θ=ϵθ(cneg)+s(ϵθ(cpos)−ϵθ(cneg))
6.2.2 迭代优化(Iterative Refinement)
原理:通过多次采样逐步优化结果
def iterative_refinement(prompt, num_iterations=3):images = []for i in range(num_iterations):seed = random_seed()img = generate(prompt, seed=seed)images.append(img)return select_best(images)
7. 图像条件生成:图文再生图原理
7.1 核心思想验证
图文再生图是在文本条件基础上,额外引入图像特征向量作为条件,数学形式从pθ(xt∣xt+1,ctext)p_\theta(x_t|x_{t+1}, c_{text})pθ(xt∣xt+1,ctext)扩展为pθ(xt∣xt+1,ctext,cimage)p_\theta(x_t|x_{t+1}, c_{text}, c_{image})pθ(xt∣xt+1,ctext,cimage)。
7.2 图像条件注入机制
7.2.1 数学建模
条件扩散公式扩展:
ϵθ(xt,t,ctext,cimage)=ϵθ(xt,t)+stext⋅wtext(ctext)+simage⋅wimage(cimage)\epsilon_\theta(x_t, t, c_{text}, c_{image}) = \epsilon_\theta(x_t, t) + s_{text}\cdot w_{text}(c_{text}) + s_{image}\cdot w_{image}(c_{image})ϵθ(xt,t,ctext,cimage)=ϵθ(xt,t)+stext⋅wtext(ctext)+simage⋅wimage(cimage)
7.2.2 特征融合策略对比
方法 | 数学形式 | 特点 |
---|---|---|
直接拼接 | [ctext;cimage][c_{text}; c_{image}][ctext;cimage] | 简单但耦合度高 |
交叉注意力 | CrossAttn(Q,[Ktext,Kimage])\text{CrossAttn}(Q, [K_{text}, K_{image}])CrossAttn(Q,[Ktext,Kimage]) | 灵活控制权重 |
ControlNet | ϵθ+Δϵimage\epsilon_\theta + \Delta\epsilon_{\text{image}}ϵθ+Δϵimage | 保持原模型权重 |
7.3 IP-Adapter详解(图文再生图主流方案)
7.3.1 架构设计
class IPAdapter(nn.Module):def __init__(self):self.image_encoder = CLIPVisionModel() # 图像特征提取self.adapter_layers = nn.ModuleList([CrossAttention(dim=768) for _ in range(16)])def forward(self, image_features, text_features):# 图像特征:$f_{img} = \text{CLIP}_{vision}(I)$img_feat = self.image_encoder(image)# 交叉注意力融合:$h = \text{CrossAttn}(h, [f_{text}, f_{img}])$for layer in self.adapter_layers:hidden_states = layer(hidden_states, img_feat)return hidden_states
7.3.2 数学推导
图像条件损失函数:
LIP=Ex0,ϵ,t,ctext,cimage[∥ϵ−ϵθ(xt,t,ctext,cimage)∥2]\mathcal{L}_{IP} = \mathbb{E}_{x_0, \epsilon, t, c_{text}, c_{image}}\left[\|\epsilon - \epsilon_\theta(x_t, t, c_{text}, c_{image})\|^2\right]LIP=Ex0,ϵ,t,ctext,cimage[∥ϵ−ϵθ(xt,t,ctext,cimage)∥2]
特征权重控制:
ϵ~θ=ϵθ(xt,t,ctext)+λimage⋅(ϵθ(xt,t,ctext,cimage)−ϵθ(xt,t,ctext))\tilde{\epsilon}_\theta = \epsilon_\theta(x_t, t, c_{text}) + \lambda_{image}\cdot(\epsilon_\theta(x_t, t, c_{text}, c_{image}) - \epsilon_\theta(x_t, t, c_{text}))ϵ~θ=ϵθ(xt,t,ctext)+λimage⋅(ϵθ(xt,t,ctext,cimage)−ϵθ(xt,t,ctext))
7.4 ControlNet数学原理
7.4.1 零卷积设计
F(h;Θ)=ZeroConv(h)+ControlNet(h,cimage)\mathcal{F}(h; \Theta) = \text{ZeroConv}(h) + \text{ControlNet}(h, c_{image})F(h;Θ)=ZeroConv(h)+ControlNet(h,cimage)
其中零卷积:W0=0W_0 = 0W0=0,保证初始状态不影响原模型。
7.4.2 条件控制强度
ϵ^θ=ϵθ(xt,t,ctext)+γ⋅ControlNet(xt,t,cimage)\hat{\epsilon}_\theta = \epsilon_\theta(x_t, t, c_{text}) + \gamma\cdot\text{ControlNet}(x_t, t, c_{image})ϵ^θ=ϵθ(xt,t,ctext)+γ⋅ControlNet(xt,t,cimage)
7.5 实际应用对比
7.5.1 条件类型与效果
条件类型 | 输入形式 | 控制精度 | 计算开销 |
---|---|---|---|
文本 | 描述文字 | 语义级 | 低 |
图像 | 参考图 | 风格级 | 中 |
深度图 | 深度信息 | 结构级 | 高 |
边缘图 | Canny边缘 | 轮廓级 | 高 |
姿态图 | 人体关键点 | 姿态级 | 高 |
7.5.2 代码实现示例
图文再生图完整流程:
def image_to_image_generation(prompt: str,input_image: Image,strength: float = 0.75,guidance_scale: float = 7.5
):# 1. 图像编码image_features = image_encoder(input_image)# 2. 文本编码text_features = text_encoder(prompt)# 3. 条件融合combined_conditions = {'text': text_features,'image': image_features,'strength': strength # 控制图像条件强度}# 4. 扩散采样latents = diffusion_sample(shape=(4, 64, 64),conditions=combined_conditions,guidance_scale=guidance_scale)# 5. 解码输出return vae_decoder(latents)
7.6 高级技巧
7.6.1 条件权重平衡
自适应权重策略:
λimage(t)=λbase⋅(1−tT)\lambda_{image}(t) = \lambda_{base}\cdot(1 - \frac{t}{T})λimage(t)=λbase⋅(1−Tt)
早期强化图像条件建立结构,后期放松保留细节。
7.6.2 多条件冲突解决
当文本和图像条件冲突时:
ϵfinal=α⋅ϵtext+(1−α)⋅ϵimage\epsilon_{final} = \alpha\cdot\epsilon_{text} + (1-\alpha)\cdot\epsilon_{image}ϵfinal=α⋅ϵtext+(1−α)⋅ϵimage
通过调整α\alphaα实现条件优先级控制。
8. 总结与展望
8.1 技术演进路径
- 单模态 → 多模态:从纯文本到图文联合条件
- 粗粒度 → 细粒度:从全局风格到局部细节控制
- 静态 → 动态:从静态图像到视频序列生成
8.2 选择指南
应用场景 | 推荐方案 | 关键参数 |
---|---|---|
风格迁移 | IP-Adapter | image_strength=0.8 |
结构控制 | ControlNet | control_strength=1.0 |
细节修复 | 图文联合 | text_strength=0.6 |
创意生成 | 低强度条件 | image_strength=0.3 |
8.3 未来方向
- 3D条件:深度、法线、网格控制
- 时序一致性:视频生成的帧间连贯
- 交互式编辑:实时条件调整与反馈
参考:
1、High-Resolution Image Synthesis with Latent Diffusion Models