在AIGC浪潮席卷全球的今天,生成式AI早已从实验室走向我们的日常生活——AI绘画、图像修复、语音合成,甚至是科学研究中的分子结构生成,背后都离不开强大的生成模型支撑。而在众多生成模型中,扩散模型凭借其稳定的训练效果、超高的生成质量,逐渐取代GAN、VAE,成为当前生成式AI的核心技术底座之一。其中,2020年由Google团队提出的去噪扩散概率模型(Denoising Diffusion Probabilistic Models, DDPM),为扩散模型的发展奠定了坚实的数学与工程框架,让“从噪声中创造世界”这一看似科幻的场景,变得触手可及。

本文将以通俗化的语言,拆解DDPM的核心原理,避开复杂公式的堆砌,同时结合简单的代码示例和实际应用场景,带大家从零入门DDPM,读懂它“化繁为简”的生成逻辑。

一、先搞懂:DDPM到底在做什么?

很多人第一次听到“扩散模型”“DDPM”,都会被专业术语吓退,但其实它的核心逻辑非常简单,类比我们生活中的一个场景就能理解:把一滴墨水滴入一杯清水中,墨水会逐渐扩散,从清晰的墨滴,慢慢变得均匀,最终完全融入水中,看不见任何痕迹(这就是“扩散”);而DDPM要做的,就是让这个过程“逆过来”——让一杯均匀混合了墨水的水,通过逐步“去噪”,重新凝聚成一滴清晰的墨滴。

放在AI生成的场景中,这个过程可以对应为:

  • 正向过程(扩散):给一张清晰的图片(墨滴),逐步添加微小的高斯噪声,经过上千步的迭代,最终让图片变成一张完全随机的纯噪声图(墨水完全扩散);

  • 反向过程(去噪):训练一个神经网络,让它学会“逆转”这个扩散过程——从一张纯噪声图出发,逐步预测并去除每一步的噪声,经过上千步的迭代,最终生成一张和原始图片风格、细节一致的清晰图片(墨水重新凝聚)。

DDPM的巧妙之处在于,它没有直接去学习“从噪声生成图片”这个复杂任务,而是将其拆解成了上千个简单的“去噪小任务”——每一步只需要去除一点点噪声,难度大大降低,这也是它比GAN训练更稳定、生成质量更高的核心原因之一。

二、核心原理拆解:正向扩散与反向去噪的底层逻辑

DDPM的核心的是两个相互可逆的过程——正向扩散(Forward Process)和反向去噪(Reverse Process),再加上一个简单的训练目标。下面我们以图像为例,用“通俗解释+关键公式”的方式,拆解这两个过程,公式仅作参考,重点理解背后的逻辑。(请注意,扩散模型同样可用于语音、信号、视频合成)

2.1 正向扩散:逐步加噪,把干净样本变成噪声

正向扩散是一个“固定不变、无需学习”的过程,核心是“缓慢加噪”,确保每一步的变化都足够微小,这样后续的反向去噪才能顺利进行。它遵循两个关键假设:一是马尔可夫性(每一步的噪声只和上一步的样本有关,和更早的状态无关);二是高斯性(每一步添加的噪声都服从标准正态分布)。

我们用x_{0}表示原始清晰图片,x_{t}表示第t步加噪后的图片,T表示总步数(通常设置为1000步)。每一步的加噪公式如下:

q(x_t \mid x_{t-1}) = \mathcal{N}\left(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_t \mathbf{I}\right)

其中,\beta_t是一个很小的正数(通常在1e-4到2e-2之间),称为“噪声强度”,并且随着t的增大而递增——也就是说,越到后期,添加的噪声越多。\sqrt{1-\beta_t}是一个衰减系数,用来降低上一步样本x_{t-1}的权重,再加上一个强度为\sqrt{\beta_t}的高斯噪声,就得到了第t步的含噪样本x_{t}

通过数学推导,我们可以得到一个更实用的结论:任意时刻t的含噪样本x_{t},都可以直接由原始样本x_{0}和随机噪声生成,无需逐步计算每一步的x_{t-1},公式如下:

x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon

其中,\alpha_t = 1 - \beta_t\bar{\alpha}_t\alpha_t从1到t的乘积(累积系数),\epsilon是标准正态分布的噪声。这个公式极大地简化了正向过程的计算,也是后续训练模型的核心基础。

t趋近于T(最大步数)时,\bar{\alpha}_t会趋近于0,此时x_{T}就近似服从标准正态分布——也就是说,经过上千步的加噪,原始图片最终会变成一张完全随机的纯噪声图,这就是正向扩散的终点。

2.2 反向去噪:逐步去噪,把噪声还原成样本

反向去噪是DDPM的核心,也是模型需要“学习”的部分——它的目标是逆转正向扩散过程,从纯噪声x_{T}出发,逐步还原出原始清晰样本x_{0}

和正向扩散类似,反向去噪也是一个马尔可夫链,每一步的目标是根据当前的含噪样本x_{t},预测上一步的含噪样本x_{t-1}(即去除一步噪声)。我们用一个参数化的高斯分布来表示反向过程的状态转移概率:

p_\theta(x_{t-1} \mid x_t) = \mathcal{N}\left(x_{t-1}; \mu_\theta(x_t, t), \sigma_t^2 \mathbf{I}\right)

其中,\mu_\theta是模型预测的均值,\sigma_t^2是方差(经严格公式推导后可知,方差为一个固定值),\theta是神经网络的参数。而均值\mu_\theta可以通过模型预测的噪声推导得到,核心逻辑是:模型不直接预测x_{t-1},而是预测正向过程中添加的噪声\epsilon,再通过噪声反推出x_{t-1}的均值。

这里的神经网络,通常采用U-Net结构(因为U-Net擅长捕捉图像的细节特征,适合去噪任务)。模型的输入是含噪样本x_{t}和当前的时间步t(告诉模型现在处于哪一步加噪/去噪过程),输出是对当前步骤噪声\epsilon的预测值\epsilon_\theta\left( x_t, t \right)

2.3 训练目标:简单到离谱的“噪声预测”

很多人以为DDPM的训练很复杂,但其实它的训练目标非常简单——让模型预测的噪声\epsilon_\theta\left( x_t, t \right),尽可能接近正向过程中实际添加的真实噪声\epsilon

具体来说,我们随机采样一个时间步t,随机采样一张原始图片x_{0},按照正向扩散公式生成x_{t}和真实噪声\epsilon,然后让模型根据x_{t}t预测\epsilon_\theta\left( x_t, t \right),最后通过最小化“预测噪声与真实噪声的均方误差(MSE)”来更新模型参数。

训练目标的公式如下:

L_{\text{simple}} = \mathbb{E}_{t \sim \mathcal{U}(1, T), x_0 \sim q(x_0), \epsilon \sim \mathcal{N}(0, \mathbf{I})} \left( \|\epsilon - \epsilon_\theta\left( x_t, t \right)\|^2 \right)

这个目标之所以有效,是因为:只要模型能准确预测每一步添加的噪声,就能通过反向公式逐步去除噪声,最终还原出原始样本。而且,MSE损失函数非常稳定,不会像GAN那样出现梯度消失、模式崩溃等问题,这也是DDPM训练稳定的关键原因之一。

三、实战入门:用PyTorch实现简单的DDPM正向扩散

了解了核心原理后,我们用一段简单的PyTorch代码,实现DDPM的正向扩散过程,直观感受一下“加噪”的效果。这段代码无需复杂的模型训练,仅演示如何根据原始图片生成任意步骤的含噪样本。

import torch

def linear_beta_schedule(timesteps=1000):
    """定义线性噪声调度表,beta从0.0001递增到0.02"""
    beta_start = 0.0001
    beta_end = 0.02
    return torch.linspace(beta_start, beta_end, timesteps)

def forward_diffusion_sample(x0, t, betas):
    """
    正向扩散过程:根据原始图片x0和时间步t,生成含噪样本x_t
    参数:
        x0: 原始图像,形状为 (B, C, H, W)
        t: 时间步,形状为 (B,)
        betas: 噪声调度表
    返回:
        x_t: 含噪样本
        noise: 添加的真实噪声
    """
    # 计算alpha和累积alpha
    alphas = 1. - betas
    alphas_cumprod = torch.cumprod(alphas, dim=0)  # 累积乘积,得到bar_alpha_t
    
    # 生成与x0同形状的随机噪声
    noise = torch.randn_like(x0)
    
    # 从累积alpha中获取当前时间步t对应的系数
    sqrt_alphas_cumprod_t = alphas_cumprod[t].view(-1, 1, 1, 1)
    sqrt_one_minus_alphas_cumprod_t = torch.sqrt(1. - alphas_cumprod[t]).view(-1, 1, 1, 1)
    
    # 按照正向扩散公式生成x_t
    x_t = sqrt_alphas_cumprod_t * x0 + sqrt_one_minus_alphas_cumprod_t * noise
    
    return x_t, noise

# 示例:假设我们有一张原始图片(这里用随机张量模拟)
x0 = torch.randn(1, 3, 64, 64)  # 形状:(批量大小, 通道数, 高度, 宽度)
timesteps = 1000
betas = linear_beta_schedule(timesteps)

# 采样不同时间步,查看加噪效果
for t in [100, 300, 500, 800, 999]:
    x_t, noise = forward_diffusion_sample(x0, torch.tensor([t]), betas)
    # 这里可以添加代码,将x_t可视化,观察不同步骤的加噪效果
    print(f"时间步t={t},含噪样本形状:{x_t.shape}")

这段代码的核心是“线性噪声调度表”和“正向扩散公式”,运行后可以看到:随着时间步t的增大,x_{t}越来越接近纯噪声(随机张量),而t=0时,x_{t}就是原始图片x_{0}。如果想完整实现DDPM,只需在此基础上添加U-Net模型,训练模型预测噪声,再实现反向去噪的采样过程即可。

四、DDPM的优势、局限与应用场景

DDPM作为扩散模型的开创性工作,不仅奠定了技术基础,也在实际应用中展现出强大的能力,但它也存在一些局限,我们客观看待它的优缺点。

4.1 核心优势

  • 训练稳定:无需对抗训练,仅用简单的MSE损失,避免了GAN的梯度消失、模式崩溃等问题,入门门槛低;

  • 生成质量高:通过上千步的渐进式去噪,能够捕捉到样本的细节特征,生成的图像、语音等内容更逼真、更自然;

  • 可解释性强:“加噪-去噪”的过程符合人类“从模糊到清晰”的认知逻辑,容易理解和调试;

  • 扩展性好:可以轻松扩展到图像、语音、文本、3D、分子结构等多个领域,适配高维数据建模任务。

4.2 主要局限

  • 采样速度慢:原始DDPM需要上千步迭代才能生成一个样本,生成一张图片可能需要几分钟,难以满足实时应用需求;

  • 计算成本高:上千步的迭代过程需要大量的计算资源,对硬件要求较高。

不过,这些局限已经被后续的衍生模型逐步解决——比如潜在扩散模型(LDM,Stable Diffusion的核心)通过在低维潜在空间扩散,大幅降低了计算成本;一致性模型则将采样步数压缩到几步甚至一步,实现了快速生成。

4.3 实际应用场景

如今,DDPM及其衍生模型已经渗透到千行百业,成为生成式AI的核心技术底座,典型应用场景包括:

  • 图像生成与编辑:AI绘画(Midjourney、Stable Diffusion)、商业设计、老照片修复、图像超分辨率、图像去噪;

  • 医学影像:生成合成医学影像(缓解数据稀缺问题)、医学影像增强、模态转换(如CT到MRI);

  • 语音与音乐:文本到语音(TTS)合成、音乐生成(AudioLDM、MusicGen);

  • 科学研究:分子结构生成、蛋白质结构预测等;

  • 3D生成:从单张图片生成3D模型,应用于游戏、VR/AR资产创建。

五、总结:DDPM的意义与未来

DDPM的出现,不仅解决了传统生成模型(GAN、VAE)的痛点,更奠定了扩散模型的技术框架——它用“渐进式加噪-去噪”的简单逻辑,实现了高质量、稳定的生成,让生成式AI的应用边界得到了极大的拓展。

虽然原始DDPM存在采样速度慢的问题,但它的核心思想被后续的衍生模型不断优化,从Stable Diffusion到一致性模型,从图像生成到多模态生成,DDPM的影响无处不在。对于AI爱好者和开发者来说,理解DDPM的核心原理,不仅能帮助我们更好地使用各类扩散模型工具,更能让我们看透生成式AI的底层逻辑——所谓“从噪声中创造世界”,本质上就是对“渐进式学习”的极致运用。

如果你是AI入门者,不妨从DDPM的正向扩散、反向去噪过程入手,结合代码实战,逐步理解其原理;如果你是开发者,也可以基于DDPM的框架,探索更高效、更灵活的生成模型优化方案。毕竟,在AIGC的时代,理解扩散模型,就是掌握了未来生成式技术的核心钥匙。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐