1. 扩散模型基础概念解析
扩散模型(Diffusion Model)是近年来计算机视觉领域最具突破性的生成模型之一,其核心思想源于物理学中的扩散过程。想象一下将一滴墨水倒入清水中的场景——墨水分子会逐渐扩散直至均匀分布,而扩散模型则逆向模拟这个过程,从噪声中重建出清晰的图像。
1.1 前向扩散过程(Forward Process)
前向过程可以理解为对图像的"破坏"阶段:
- 从原始图像x₀开始,逐步添加高斯噪声
- 经过T个时间步长后,图像完全退化为各向同性的高斯噪声
- 每个时间步t的噪声强度由预设的方差调度表βₜ控制
数学表达为:
q(xₜ|xₜ₋₁) = N(xₜ; √(1-βₜ)xₜ₋₁, βₜI)
这个过程的巧妙之处在于,我们可以通过重参数化技巧(reparameterization trick)直接计算任意时间步t的图像状态,而不需要逐步计算:
xₜ = √(ᾱₜ)x₀ + √(1-ᾱₜ)ε,其中ᾱₜ = ∏(1-βₛ)
1.2 反向扩散过程(Reverse Process)
反向过程是模型的"创造"阶段,需要学习一个神经网络来预测和去除噪声:
- 从纯噪声x_T开始,逐步去噪
- 每个步骤预测当前图像的噪声成分
- 通过减去预测噪声来获得更清晰的图像
关键公式:
p_θ(xₜ₋₁|xₜ) = N(xₜ₋₁; μ_θ(xₜ,t), Σ_θ(xₜ,t))
实际应用中,预测噪声比直接预测去噪后的图像更稳定,这是扩散模型成功的关键设计
2. 噪声预测器的训练原理
2.1 目标函数设计
扩散模型使用变分下界(ELBO)作为训练目标,但实践中通常简化为对噪声预测的MSE损失:
L(θ) = Eₜ,x₀,ε[||ε - ε_θ(xₜ,t)||²]
其中:
- t均匀采样自[1,T]
- x₀来自真实数据分布
- ε是从标准正态分布采样的噪声
2.2 训练流程详解
-
数据准备:
- 使用LAION等大型图像数据集
- 建议分辨率至少256x256
- 预处理包括中心裁剪、归一化等
-
噪声调度选择:
- 线性调度:βₜ从β₁=1e-4到β_T=0.02线性增长
- 余弦调度:更平滑的噪声变化,通常效果更好
-
网络架构:
- 常用U-Net结构,包含下采样和上采样路径
- 加入时间步t的嵌入表示
- 使用自注意力机制处理全局依赖
python复制# 简化的训练伪代码
for x0 in dataloader:
t = uniform(1, T) # 随机采样时间步
ε = randn_like(x0) # 生成随机噪声
xt = sqrt(α_bar[t]) * x0 + sqrt(1-α_bar[t]) * ε # 加噪
ε_pred = model(xt, t) # 预测噪声
loss = mse_loss(ε, ε_pred) # 计算损失
optimizer.step(loss)
3. Stable Diffusion架构解析
3.1 文本到图像的生成流程
Stable Diffusion是扩散模型在文本生成图像任务上的突破性应用,其核心创新在于将扩散过程放在潜在空间(latent space)进行:
-
文本编码:
- 使用CLIP等预训练文本编码器
- 将提示词(prompt)转换为768维向量
- 通过交叉注意力机制注入到扩散模型
-
潜在扩散:
- 先用VAE编码器将图像压缩到潜在空间(64x64x4)
- 在潜在空间进行扩散过程
- 最后用VAE解码器重建高分辨率图像
-
条件控制:
- 分类器无关引导(CFG)技术
- 通过调节引导尺度控制生成结果与文本的匹配程度
3.2 关键组件详解
变分自编码器(VAE):
- 编码器:将256x256x3图像压缩为64x64x4潜在表示
- 解码器:将潜在表示恢复为原始分辨率
- 训练目标包含重建损失和KL散度
U-Net架构改进:
- 增加交叉注意力层处理文本条件
- 使用多头注意力机制
- 引入残差连接加速训练
文本编码器:
- 通常使用冻结的CLIP文本编码器
- 将提示词转换为语义向量
- 支持长文本输入(77token)
4. 评估指标与技术细节
4.1 FID(弗雷歇距离)评估
FID(Fréchet Inception Distance)是评估生成质量的重要指标:
- 计算真实图像和生成图像在Inception-v3特征空间的均值μ和协方差Σ
- 计算两个高斯分布之间的弗雷歇距离:
FID = ||μ₁ - μ₂||² + Tr(Σ₁ + Σ₂ - 2(Σ₁Σ₂)^(1/2))
实践中,建议使用至少5000张图像计算FID以获得稳定结果
4.2 采样加速技术
原始扩散模型需要数百步采样,效率低下。常用加速方法:
-
DDIM(Denoising Diffusion Implicit Models):
- 将扩散过程重新定义为非马尔可夫链
- 允许大步长采样而不损失太多质量
- 典型配置:20-50步即可获得不错结果
-
知识蒸馏:
- 训练学生模型直接预测多步去噪结果
- 显著减少采样步数
- 如Progressive Distillation技术
-
Latent Consistency Models:
- 最新技术,仅需1-4步采样
- 保持潜在空间的一致性
- 质量接近标准扩散模型
5. 实战经验与调优技巧
5.1 训练注意事项
-
学习率策略:
- 初始学习率建议1e-4到5e-5
- 使用warmup(约5000步)
- 余弦衰减调度效果良好
-
批量大小:
- 显存允许下尽可能增大batch size
- 典型配置:单卡batch size 16-64
- 使用梯度累积模拟更大batch
-
混合精度训练:
- 显著减少显存占用
- 可能需调整损失缩放
- 注意某些操作需要保持fp32
5.2 提示词工程技巧
-
权重控制:
- 使用"(word:weight)"语法调整关键词重要性
- 如"(sunset:1.3)"增强效果
-
负面提示:
- 指定不希望出现的元素
- 如"blurry, distorted, low quality"
-
组合提示:
- 用"|"分隔多个概念
- 如"sunset | beach | palm trees"
5.3 常见问题排查
-
生成图像模糊:
- 检查VAE解码器是否正常
- 尝试增加采样步数
- 调整CFG scale(7-12效果较好)
-
文本条件不生效:
- 验证文本编码器是否加载正确
- 检查交叉注意力层梯度
- 增加CFG scale值
-
训练不稳定:
- 检查梯度裁剪是否启用
- 降低学习率
- 添加更多的正则化
我在实际项目中发现,扩散模型对超参数相当敏感,特别是学习率和噪声调度。建议初次训练时使用预定义的余弦调度,并在小规模数据上快速验证模型收敛性后再扩展。另一个实用技巧是在训练初期固定几组随机种子,定期生成样本直观监控模型进步,这比单纯看损失曲线更能发现问题。
