Stable Diffusion 3.5内部原理:扩散模型与DiT架构全解

从DDPM到DiT,深度解析扩散模型的数学本质与SD 3.5的工程优化,附完整训练与推理代码实现。

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)的解决方案:

  1. 使用VAE编码器把图像压缩到64×64的潜空间
  2. 在潜空间做扩散(计算量降低64倍)
  3. 用VAE解码器还原回像素空间

这个简单的工程优化,让消费级GPU运行扩散模型成为可能,催生了Stable Diffusion的爆发。

4. SD 3.5的核心创新:DiT架构

从UNet到Transformer

SD 1.x/2.x使用UNet作为去噪网络。SD 3.5则全面拥抱DiT(Diffusion Transformer)

特性UNetDiT
归纳偏置强(卷积)弱(注意力)
扩展性受限线性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的浪潮中真正驾驭工具,而不是被工具驾驭。