引言:一场从噪声中「雕刻」图像的革命

2022年10月,一家初创公司 StabilityAI 开源了 Stable Diffusion 模型。一夜之间,任何拥有普通 GPU 的人都能从随机噪声中「雕刻」出足以乱真的图像。这项技术的核心——Diffusion Model(扩散模型),在短短两年内便从学术实验室席卷整个 AI 产业,成为支撑 Midjourney、DALL-E 3、Sora 等产品的底层引擎。而这背后,是一套令人着迷的数学原理:先学会摧毁数据,再学会从混沌中恢复秩序。

本文将从最基础的物理直觉出发,循序渐进地推导 Diffusion Model 的数学体系,剖析 DDPM、Score Matching、Classifier-Free Guidance 等关键变体,最终抵达工业级部署的工程实践。读完本文你将掌握:扩散模型的完整数学推导链路、训练与采样的代码实现、加速采样技巧,以及从研究到生产的路径。

一、核心思想:学习逆转时间的方向

想象一杯清水中滴入一滴墨水。在时间的自然流逝下,墨水会逐渐扩散(diffuse),最终均匀分布在整杯水中——这是一个不可逆的热力学过程。扩散模型的洞见在于:虽然我们无法直接逆转这个过程,但可以学习如何逆转它。如果我们能训练一个神经网络,让它从任意浓度的墨水分布中恢复出最初那滴墨水的精确位置和形状,那我们就拥有了一个强大的生成器。

用机器学习语言描述:前向过程(forward process)逐步将真实数据 x0 破坏为高斯噪声 xT;神经网络学习逆向过程(reverse process),从纯噪声 xT ~ N(0, I) 出发,逐步还原出真实数据样本。

1.1 前向过程:马尔可夫链上的高斯扩散

前向过程是一个固定的马尔可夫链,每一步向数据中添加少量高斯噪声:

q(xt | xt-1) = N(xt; sqrt(1 - beta_t) * xt-1, beta_t * I)

其中 beta_t 是预定义的噪声调度(noise schedule),通常从 beta_1 = 10^-4 线性增长到 beta_T = 0.02。关键的技巧是:利用高斯分布的可加性,我们可以直接从 x0 采样任意时刻 t 的噪声版本:

q(xt | x0) = N(xt; sqrt(alpha_bar_t) * x0, (1 - alpha_bar_t) * I)

其中 alpha_t = 1 - beta_t,alpha_bar_t = prod(alpha_s, s=1..t)。这意味着我们可以在 O(1) 时间内跳转到任意时间步,无需逐步迭代——这极大加速了训练。

1.2 逆向过程:神经网络的去噪学习

逆向过程同样是马尔可夫链,但每一步由神经网络参数化:

p_theta(xt-1 | xt) = N(xt-1; mu_theta(xt, t), Sigma_theta(xt, t))

核心挑战在于设计正确的训练目标。DDPM(Ho et al., 2020)证明了一个惊人的结论:模型的最终效果几乎只取决于对噪声 epsilon 的预测能力。简化后的损失函数极其简洁:

L_simple = E[ ||epsilon - epsilon_theta(sqrt(alpha_bar_t) * x0 + sqrt(1-alpha_bar_t) * epsilon, t)||^2 ]

直觉是:给定一张加了噪声的图片,网络只需预测加入的噪声是多少。在采样时,一步减去预测的噪声,就能逐步还原清晰图像。

二、数学深化:变分推断与得分匹配的统一视角

2.1 变分下界(ELBO)的完整推导

DDPM 的训练目标可以从最大化数据的对数似然 log p_theta(x0) 出发,通过变分推断严格推导得到。关键步骤是对下界进行分解:

L = D_KL(q(xT|x0) || p(xT)) + sum D_KL(q(xt-1|xt,x0) || p_theta(xt-1|xt)) - log p_theta(x0|x1)

每一项都是两个高斯分布之间的 KL 散度,有闭式解。注意到 q(xt-1 | xt, x0) 的均值为:

mu_tilde(xt, x0) = [sqrt(alpha_bar_{t-1}) * beta_t / (1 - alpha_bar_t)] * x0 + [sqrt(alpha_t) * (1 - alpha_bar_{t-1}) / (1 - alpha_bar_t)] * xt

因为我们无法直接获得 x0,模型通过预测噪声 epsilon 间接估计:x0_hat = (xt - sqrt(1 - alpha_bar_t) * epsilon_theta(xt, t)) / sqrt(alpha_bar_t)。

2.2 得分函数与随机微分方程

Song et al. (2021) 的 Score Matching 框架将扩散模型推广到连续时间,使用随机微分方程(SDE)描述:

dx = f(x, t) dt + g(t) dw

其对应的逆向 SDE 为:

dx = [f(x, t) - g(t)^2 * grad_x log p_t(x)] dt + g(t) dw_bar

这里 grad_x log p_t(x) 是数据分布的得分函数(score function),它指向概率密度增长最快的方向。这个视角统一了扩散模型与基于得分的生成模型,并且引出了 ODE 采样器——将采样视为确定性的常微分方程求解,可以使用 SciPy 或 torchdiffeq 实现精确、可逆的生成过程。

三、架构设计:从 U-Net 到 DiT

3.1 U-Net 去噪器

DDPM 和早期 Stable Diffusion 使用改进版 U-Net 作为去噪网络。关键改进包括:

  • 时间步嵌入:通过 sinusoidal position embedding 或 Transformer 风格的 time embedding,让网络知道当前处于哪个去噪阶段
  • 注意力机制:在 16x16、32x32、64x64 分辨率层引入 self-attention 和 cross-attention,处理长距离依赖
  • 残差连接与 GroupNorm:保证深层网络的训练稳定性
  • 调节因子(conditioning):通过 cross-attention 注入文本、类别标签等条件信息

3.2 DiT:纯 Transformer 的扩散骨干网络

Peebles & Xie (2023) 提出的 Diffusion Transformer (DiT) 完全用 Transformer 替代了 U-Net。其核心思想是:将图像切分为 patch,经过 adaptive layer norm (adaLN-Zero) 注入时间步和类别信息,通过一系列 Transformer block 处理。

DiT 的关键发现是:随着模型增大(更多层、更多通道)和输入 token 减少(更小的 patch size),生成质量持续提升。这遵循与 LLM 类似的 scaling law,且 DiT 比 U-Net 更易于扩展。OpenAI 的 Sora 视频生成模型正是基于 DiT 架构。

四、采样加速:从数百步到个位数步

原始 DDPM 需要 1000 步才能生成高质量图像——这在生产环境中是不可接受的。研究者们提出了多种加速策略:

4.1 DDIM:确定性采样

DDPM Implicit Models (Song et al., 2021) 提出了一种非马尔可夫的确定性采样过程,允许跳过时间步。DDIM 的采样过程可以视为在概率流 ODE 上求解,仅需 10-50 步即可达到接近 1000 步的质量。

DDIM 采样公式:

x_{t-1} = sqrt(alpha_bar_{t-1}) * x0_hat + sqrt(1 - alpha_bar_{t-1} - sigma_t^2) * epsilon_theta(xt) + sigma_t * z

当 sigma_t = 0 时,采样变为确定性的——这意味着同一个噪声种子经过 DDIM 采样总是产生完全相同的输出(可复现生成)。

4.2 Classifier-Free Guidance (CFG)

Ho & Salimans (2022) 提出的 CFG 技术是文本到图像生成的关键突破。训练时以一定概率(通常 10-20%)随机丢弃文本条件;采样时计算两次预测:

epsilon_tilde = epsilon_theta(xt, empty) + w * (epsilon_theta(xt, c) - epsilon_theta(xt, empty))

其中 w 是引导强度(通常 7.5),c 是文本条件。CFG 放大了条件信号的影响,使得生成的图像更贴合文本描述,代价是牺牲了部分多样性。

4.3 DPM-Solver 与一致性模型

Lu et al. (2022) 的 DPM-Solver 将扩散采样视为 ODE 的数值求解,利用指数积分器(exponential integrator)实现了仅需 10-20 步的高质量生成。Song et al. (2023) 的 Consistency Model 更进一步——训练一个单步生成器直接将噪声映射到数据,实现了一步采样。

五、Stable Diffusion 工程实践

5.1 VAE 压缩与潜在空间

原始扩散模型在像素空间(如 512x512x3)上操作,计算代价极高。Stable Diffusion 的关键工程创新是:首先在 VAE(变分自编码器)的潜在空间(latent space)中进行扩散。图像被压缩 8 倍(512x512x3 -> 64x64x4),使得去噪 U-Net 的计算量大幅降低。生成时再用 VAE 解码器还原。

5.2 LoRA 微调

Low-Rank Adaptation (LoRA) 让普通用户能在消费级 GPU 上微调 Stable Diffusion。其核心思想是:冻结原始模型权重 W0,学习低秩分解的更新量 deltaW = BA,其中 B 是 dxr 矩阵,A 是 rxk 矩阵,r 远小于 min(d,k)。微调后只需存储几兆字节的 LoRA 权重即可实现风格/人物定制化生成。

5.3 ControlNet 精确控制

Zhang et al. (2023) 的 ControlNet 为大模型添加了空间控制能力。通过将原始模型的一半权重复制("locked copy"),另一半复制参与训练("trainable copy"),并以零卷积(zero-initialized 1x1 convolution)连接,ControlNet 可以用 Canny 边缘、深度图、姿态骨架、语义分割图等精确引导生成过程。

六、训练代码实战

下面是一个简化的 DDPM 训练循环核心代码,展示关键步骤:

import torch
import torch.nn as nn

class SimpleUnet(nn.Module):
    """简化的 U-Net 去噪器"""
    def __init__(self, in_channels=3, time_dim=256):
        super().__init__()
        self.time_mlp = nn.Sequential(
            SinusoidalPositionEmbeddings(time_dim),
            nn.Linear(time_dim, time_dim * 4),
            nn.GELU(),
            nn.Linear(time_dim * 4, time_dim)
        )
        # 下采样块、中间块、上采样块(略)
    
    def forward(self, x, t):
        t_emb = self.time_mlp(t)
        # 通过与图像特征相加或 adaLN 注入时间步信息
        # 标准 U-Net 前向传播(略)
        return predicted_noise

def ddpm_train_step(model, x0, optimizer, T=1000):
    """单步训练"""
    # 随机采样时间步
    t = torch.randint(0, T, (x0.shape[0],), device=x0.device)
    
    # 采样噪声
    eps = torch.randn_like(x0)
    
    sqrt_alpha_bar = sqrt_alpha_bars[t].view(-1, 1, 1, 1)
    sqrt_one_minus = sqrt_one_minus_alpha_bars[t].view(-1, 1, 1, 1)
    x_t = sqrt_alpha_bar * x0 + sqrt_one_minus * eps
    
    eps_pred = model(x_t, t)
    loss = nn.functional.mse_loss(eps_pred, eps)
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    return loss.item()

@torch.no_grad()
def ddpm_sample(model, shape, T=1000, device="cuda"):
    """DDPM 采样:从噪声还原图像"""
    x = torch.randn(shape, device=device)
    
    for t in reversed(range(T)):
        t_batch = torch.full((shape[0],), t, device=device, dtype=torch.long)
        eps_pred = model(x, t_batch)
        alpha = alphas[t]
        alpha_bar = alpha_bars[t]
        beta = betas[t]
        
        coef1 = 1 / torch.sqrt(alpha)
        coef2 = beta / torch.sqrt(1 - alpha_bar)
        mean = coef1 * (x - coef2 * eps_pred)
        
        if t > 0:
            noise = torch.randn_like(x)
            sigma = torch.sqrt(beta)
            x = mean + sigma * noise
        else:
            x = mean
    
    return x

七、前沿进展与挑战

7.1 视频扩散:从 Sora 到 Open-Sora

Sora (OpenAI, 2024) 将 3D 时空 patch 嵌入与 DiT 架构结合,实现了长达 1 分钟的高质量视频生成。其关键技术包括:时空注意力(spacetime attention)、可变分辨率训练上采样、以及利用 DALL-E 3 的描述增强进行视频标注。后续的 Open-Sora 等开源项目正逐步复现和扩展这些能力。

7.2 3D 生成与 NeRF 协同

DreamFusion (Poole et al., 2022) 开创性地利用预训练 2D 扩散模型的得分函数作为 3D 表示(NeRF/网格)的优化目标——即 Score Distillation Sampling (SDS)。后续工作如 DreamGaussian、Instant3D、Shap-E 等进一步加速了 3D 资产生成。

7.3 挑战与展望

尽管取得了巨大进步,扩散模型仍面临若干挑战:

  • 采样速度:虽然已从 1000 步压缩到 4 步,但实时(30 FPS)扩散生成仍是难题
  • 保真度:手指、文字、物理逻辑等细节仍有明显瑕疵
  • 可控性:精确的空间布局、动作序列控制仍不够灵活
  • 版权与伦理:训练数据版权争议和生成内容的滥用风险
  • 计算成本:训练一个基础扩散模型需要数千 GPU 小时

未来的研究方向包括:更快的采样算法(流匹配、一致性蒸馏)、更好的条件控制(ControlNet 的泛化)、多模态统一架构(文本/图像/视频/音频的统一生成),以及与 LLM 的深度融合(LLM 作为扩散推理的"大脑")。

结语:从噪声中涌现的创造力

Diffusion Model 代表了一种新的计算范式:不是通过对抗博弈,而是通过理解数据分布的「方向场」来生成。从数学上看,它连接了热力学、随机微分方程和变分推断;从工程上看,它打通了从消费级微调到工业级部署的全链路。当我们看着一张由纯噪声逐步演化出的精美图像时,所见证的不仅是模型的计算,更是我们从混沌中学习秩序的永恒渴望。正如物理学家所说:熵增定义了时间箭头,而 Diffusion Model 教会了我们如何逆转它——哪怕只是在参数化的数学空间中。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部