1. 扩散模型的核心思想
扩散模型(Diffusion Model)的本质是学习从噪声到图像的逆向过程。整个流程分为两个方向:
- 前向过程:逐步给图像加噪声,最终变成纯高斯噪声
- 逆向过程:神经网络学习从噪声逐步还原图像
# 前向加噪过程
x_t = √(α̅_t) · x_0 + √(1 - α̅_t) · ε
ε ~ N(0, I)
# 训练目标:预测噪声
loss = ||ε - ε_θ(x_t, t)||²
这个看似简单的设计,实际蕴含着深刻的数学美感:通过逐步去噪,模型学到的是数据分布的得分函数(Score Function)。
2. 从DDPM到DDIM:采样加速
DDPM的瓶颈
原始DDPM需要1000步才能生成一张图像,速度慢到难以实用。
DDIM的突破
DDIM(Denoising Diffusion Implicit Models)通过非马尔可夫过程,将采样步数从1000压缩到20-50步,速度提升20-50倍:
# DDIM采样核心公式
x_{t-1} = √(α̅_{t-1}) · x_0_pred
+ √(1 - α̅_{t-1} - σ²) · ε_pred
+ σ · noise
3. Latent Diffusion:从像素空间到潜空间
直接在512×512的像素空间做扩散,计算量巨大。LDM(Latent Diffusion)的解决方案:
- 使用VAE编码器把图像压缩到64×64的潜空间
- 在潜空间做扩散(计算量降低64倍)
- 用VAE解码器还原回像素空间
这个简单的工程优化,让消费级GPU运行扩散模型成为可能,催生了Stable Diffusion的爆发。
4. SD 3.5的核心创新:DiT架构
从UNet到Transformer
SD 1.x/2.x使用UNet作为去噪网络。SD 3.5则全面拥抱DiT(Diffusion Transformer):
| 特性 | UNet | DiT |
|---|---|---|
| 归纳偏置 | 强(卷积) | 弱(注意力) |
| 扩展性 | 受限 | 线性Scaling |
| 多模态融合 | 困难 | 原生支持 |
| 生成质量 | 良好 | 优秀 |
MM-DiT:多模态扩散Transformer
SD 3.5的关键创新是MM-DiT(Multimodal DiT),它让文本和图像token在同一个Transformer中并行处理:
def mm_dit_block(x_img, x_text, time_embed):
# 图像和文本独立的MHA
x_img = mha(x_img, condition=time_embed)
x_text = mha(x_text, condition=time_embed)
# 跨模态注意力
combined = concat([x_img, x_text])
combined = self_attention(combined)
return split(combined)
5. 实战:训练自己的SD 3.5
数据准备
from datasets import load_dataset
ds = load_dataset("laion/laion2B-en", split="train")
ds = ds.filter(lambda x: x["aesthetic_score"] > 6.5)
ds = ds.map(preprocess_image_text_pair)
训练循环
for step, batch in enumerate(dataloader):
images, texts = batch["pixel_values"], batch["input_ids"]
# 编码到潜空间
latents = vae.encode(images).latent_dist.sample() * 0.18215
# 文本编码
text_emb = text_encoder(texts).last_hidden_state
# 随机时间步
t = torch.randint(0, 1000, (latents.shape[0],))
noise = torch.randn_like(latents)
noisy_latents = scheduler.add_noise(latents, noise, t)
# DiT预测噪声
pred = dit(noisy_latents, t, text_emb)
loss = F.mse_loss(pred, noise)
loss.backward()
optimizer.step()
6. 推理优化技巧
① Classifier-Free Guidance (CFG)
同时预测有条件和无条件的噪声,通过插值放大文本控制:
noise_pred = noise_uncond + cfg_scale * (noise_cond - noise_uncond)
② LoRA微调
无需训练完整模型,仅训练低秩适配器,显存需求降低90%。
③ TensorRT加速
编译后推理速度提升2-3倍,是生产部署的必选项。
7. 对比:闭源 vs 开源
在我们的测试中,SD 3.5在大部分场景下已经接近Midjourney V6的质量,特别是在文字渲染、手部细节、复杂构图上有显著提升。开源模型的春天正在到来。
结语
扩散模型的故事还远未结束。从DDPM到DiT,从UNet到MM-DiT,每一次架构演进都在打开新的可能性。理解这些原理,才能在AIGC的浪潮中真正驾驭工具,而不是被工具驾驭。