论文信息

  • 标题:Diffusion Models Beat GANs on Image Synthesis
  • 会议:arXiv 2021
  • 单位:OpenAI
  • 代码:https://github.com/openai/guided-diffusion
  • 论文:https://arxiv.org/abs/2105.05233

一、引言:GAN王朝的终结,扩散模型的封神之路

在2021年之前,图像生成领域的江湖始终由GAN(生成对抗网络)一家独大。从BigGAN到StyleGAN,GAN家族凭借极致的生成逼真度,牢牢霸占着图像合成的SOTA宝座。但GAN天生带着难以根治的顽疾:训练不稳定、极易模式崩溃(生成多样性差)、调参难度拉满。

就在2021年5月,OpenAI的这篇论文扔出了行业重磅炸弹:扩散模型在图像合成质量上,全面、彻底地超越了GAN。这篇工作不仅打破了GAN长达数年的垄断,更奠定了后续Stable Diffusion等爆款生成模型的核心技术底座,堪称扩散模型从“小众研究”走向“工业级落地”的封神之作。

在这里插入图片描述

图 1:从我们最佳的 ImageNet 512×512 模型(FID 3.85)中选取的部分样本

本文的核心突破可概括为三点:

  1. 通过海量架构消融实验,优化出了一套远超基线的扩散模型U-Net架构,无条件生成效果直接登顶;
  2. 提出分类器引导(Classifier Guidance) 技术,用极低的计算成本实现条件生成,还能自由权衡生成保真度与多样性;
  3. 解决了扩散模型“采样慢”的痛点,仅25次前向传播就能匹配BigGAN-deep的效果,同时保持了更完整的分布覆盖。

二、前置知识:5分钟搞懂扩散模型的核心逻辑

扩散模型的本质,是“先把图片拆成噪声,再把噪声还原成图片”,整个过程分为正向扩散(加噪)逆向扩散(去噪生成) 两个阶段。

2.1 正向扩散:给图片一步步加噪

正向扩散是一个无训练的确定性过程,核心是给原始清晰图像逐步添加高斯噪声,直到图像变成完全无意义的纯噪声。

核心公式:
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t} x_{t-1}, \beta_t \mathbf{I})q(xtxt1)=N(xt;1βt xt1,βtI)
公式符号全解析:

  • q(xt∣xt−1)q(x_t | x_{t-1})q(xtxt1):给定第t-1步的图像xt−1x_{t-1}xt1,生成第t步加噪图像xtx_txt的条件概率分布
  • xtx_txt:第t个时间步的加噪图像,t的范围是0~T,其中x0x_0x0是原始清晰图像,xTx_TxT是纯高斯噪声
  • xt−1x_{t-1}xt1:第t-1个时间步的中间图像
  • βt\beta_tβt:第t步的噪声方差超参数,是预先设定的schedule,随t增大从0.0001线性增长到0.02
  • N(⋅;μ,σ2I)\mathcal{N}(\cdot; \mu, \sigma^2 \mathbf{I})N(;μ,σ2I):多元高斯分布,μ\muμ为分布均值,σ2\sigma^2σ2为分布方差
  • I\mathbf{I}I:单位矩阵,保证每个像素的噪声相互独立

人话解释:就像给一杯清水,每次滴一滴墨汁,滴1000次之后清水就变成了纯黑的墨水。正向扩散就是这个“滴墨汁”的过程,每一步只加一点点噪声,最终把清晰图变成纯噪声。

为了训练提速,我们还可以用一步到位的加噪公式,直接算出任意时间步的加噪图像:
q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I)q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1-\bar{\alpha}_t) \mathbf{I})q(xtx0)=N(xt;αˉt x0,(1αˉt)I)
公式符号全解析:

  • αt=1−βt\alpha_t = 1 - \beta_tαt=1βt:每一步的原图信息保留系数
  • αˉt=∏i=1tαi\bar{\alpha}_t = \prod_{i=1}^t \alpha_iαˉt=i=1tαi:从第1步到第t步的αi\alpha_iαi连乘积
  • x0x_0x0:原始输入的清晰图像

人话解释:有了这个公式,我们不用一步步加噪,直接就能算出第100步、第500步的加噪图像,训练速度直接拉满。

2.2 逆向扩散:从噪声还原出清晰图像

逆向扩散是模型的核心训练目标,就是让神经网络学会“从噪声里擦除噪声,还原出清晰图像”。

核心公式:
pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t))pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))
公式符号全解析:

  • pθ(xt−1∣xt)p_\theta(x_{t-1} | x_t)pθ(xt1xt):模型学习的条件概率分布,给定第t步的加噪图像xtx_txt,还原出第t-1步图像的分布
  • μθ(xt,t)\mu_\theta(x_t, t)μθ(xt,t):由可训练的U-Net网络预测的高斯分布均值,θ\thetaθ是网络的可训练参数
  • Σθ(xt,t)\Sigma_\theta(x_t, t)Σθ(xt,t):由U-Net网络预测的高斯分布方差

人话解释:逆向扩散就是“把墨水还原成清水”的过程。我们给模型一张纯噪声,让它一步步预测每一步该擦除多少噪声,最终还原出一张清晰的图像,这个过程里的U-Net网络,就是我们要训练的核心。


三、核心创新一:碾压GAN的U-Net架构革新

扩散模型的生成效果,90%取决于U-Net骨干网络的设计。本文通过上百组消融实验,对经典DDPM的U-Net架构做了全维度优化,最终让无条件生成效果直接超越了同期的GAN模型。

3.1 核心架构优化点

本文对U-Net的优化,全部经过严格的消融验证,每一个改动都带来了实打实的效果提升:

  1. 通道数缩放:将U-Net的基础通道数从128提升至256,同时优化不同分辨率下的通道倍增系数,大幅提升网络的特征表达能力;
  2. 注意力机制优化:在16×16、32×32分辨率的特征图上加入多头自注意力层,让网络既能捕捉全局语义信息,又不会带来过多的计算开销;
  3. 残差块升级:将每个分辨率下的残差块数量从2个增加到3个,加深网络的同时避免梯度消失;
  4. 可学习方差:打破了经典DDPM固定方差的限制,让U-Net同时预测均值和方差,进一步提升去噪精度;
  5. 归一化与激活优化:采用GroupNorm组归一化稳定训练过程,配合Swish激活函数提升非线性表达能力。

3.2 架构消融实验结果与分析

表格1 U-Net架构核心消融实验结果(出处:论文表3)

架构改动 ImageNet 128×128 无条件生成FID 效果变化
DDPM基线模型 12.77 基准线
基础通道数128→256 8.52 FID大幅下降,效果显著提升
新增32×32分辨率注意力层 7.39 进一步优化全局特征建模
残差块数量2→3 6.92 小幅提升特征表达能力
加入可学习方差预测 6.22 显著提升去噪精度
全优化组合最终模型 4.59 无条件生成新SOTA

注:FID(Fréchet Inception Distance)是图像生成的核心评价指标,FID值越低,代表生成图像与真实图像的分布越接近,生成效果越好。

结果分析
从消融实验可以清晰看到,每一项架构改动都在稳步降低FID。其中通道数扩容和注意力层的加入,带来的效果增益最为显著;而可学习方差的引入,更是把模型的去噪潜力彻底释放。最终优化后的架构,仅无条件生成的FID就达到了4.59,已经超越了同期BigGAN-deep的10.48,直接打破了GAN的效果神话。

结构分析:该架构采用经典的编码器-解码器结构,下采样阶段逐步压缩特征图分辨率、提升通道数,提取高层语义信息;上采样阶段逐步恢复图像分辨率,同时通过跨层残差连接融合底层细节信息;在中低分辨率特征图上加入注意力层,强化全局语义建模能力,最终实现“语义准、细节清”的生成效果。


四、核心创新二:分类器引导——条件生成的降维打击

无条件生成已经足够能打,但工业场景中90%的需求都是条件生成(比如指定生成“一只金毛犬”“一辆红色跑车”)。本文提出的分类器引导技术,用极简的方式实现了条件生成效果的飞跃,还能自由控制生成的保真度与多样性。

4.1 分类器引导的核心逻辑

传统的条件扩散模型,需要把类别标签嵌入到网络里和扩散模型一起训练,不仅训练成本高,还很难调整保真度和多样性的平衡。而本文的分类器引导,完全不需要重新训练扩散模型,只需要一个额外训练好的分类器,就能实现精准的条件引导。

核心梯度公式:
∇xtlog⁡pϕ(y∣xt)\nabla_{x_t} \log p_\phi(y | x_t)xtlogpϕ(yxt)
公式符号全解析:

  • ∇xt\nabla_{x_t}xt:对加噪图像xtx_txt求梯度
  • pϕ(y∣xt)p_\phi(y | x_t)pϕ(yxt):预训练的分类器,输入加噪图像xtx_txt,输出该图像属于目标类别yyy的概率
  • ϕ\phiϕ:分类器的可训练参数
  • yyy:用户指定的生成目标类别标签(如ImageNet的1000类标签)

人话解释:这个梯度,本质上就是分类器给扩散模型提的“优化建议”——“你现在生成的这张图,离目标类别y还有差距,往这个梯度的方向改,就能更像目标类别”。

4.2 引导后的去噪更新公式

有了分类器的梯度,我们只需要把它加到扩散模型原本预测的均值里,就能实现引导生成:
μ~θ(xt,t,y)=μθ(xt,t)+s⋅Σθ(xt,t)⋅∇xtlog⁡pϕ(y∣xt)\tilde{\mu}_\theta(x_t, t, y) = \mu_\theta(x_t, t) + s \cdot \Sigma_\theta(x_t, t) \cdot \nabla_{x_t} \log p_\phi(y | x_t)μ~θ(xt,t,y)=μθ(xt,t)+sΣθ(xt,t)xtlogpϕ(yxt)
公式符号全解析:

  • μ~θ(xt,t,y)\tilde{\mu}_\theta(x_t, t, y)μ~θ(xt,t,y):加入分类器引导后的最终预测均值,用于每一步的去噪计算
  • μθ(xt,t)\mu_\theta(x_t, t)μθ(xt,t):扩散模型原本预测的去噪均值
  • sss:引导尺度(guidance scale)超参数,控制引导的强度:s越大,生成图像越贴合目标类别(保真度越高),多样性越低;s越小,生成多样性越高,保真度越低
  • Σθ(xt,t)\Sigma_\theta(x_t, t)Σθ(xt,t):扩散模型预测的方差,用于缩放梯度幅度,保证数值稳定性

人话解释:这个公式就是把分类器的“优化建议”,加到模型的去噪步骤里。每一步去噪的时候,模型都会朝着“更像目标类别”的方向走。最关键的是,我们只需要调整s这一个数字,就能自由切换“精准生成”和“多样生成”模式,完全不用重新训练模型,灵活性拉满。

4.3 分类器的训练细节

为了让分类器能给所有时间步的加噪图像提供梯度,本文的分类器在带噪声的图像上训练:训练时随机采样时间步t,给原始图像添加对应强度的噪声,再用加噪图像训练分类器预测类别。整个训练过程简单高效,和普通图像分类模型的训练几乎没有区别。

图片2 分类器引导的扩散生成流程示意图(出处:论文图2)

流程分析:从纯高斯噪声开始,每一步去噪时,都会用分类器计算目标类别的梯度,引导模型的去噪方向;经过T步迭代后,最终生成的图像不仅高清逼真,还能精准贴合目标类别,相比无引导的模型,类别准确率和细节精度都有质的提升。


五、进阶优化:少步数采样与上采样模型的强强联合

5.1 少步数采样:25步匹配BigGAN效果

扩散模型一直被诟病的短板,就是采样速度慢——经典DDPM需要1000步前向传播才能生成一张图,而GAN只需要1步。本文采用DDIM(Denoising Diffusion Implicit Models)采样器,完美解决了这个问题。

表格2 少步数采样与BigGAN-deep效果对比(出处:论文表4)

模型 前向传播步数 ImageNet 128×128 FID 分布覆盖能力
BigGAN-deep 1 9.6 较差(易模式崩溃)
本文引导扩散模型 25 9.6 优秀(完整覆盖真实分布)
本文引导扩散模型 100 4.59 优秀
本文引导扩散模型 1000 2.97 优秀

结果分析:本文的模型仅用25步采样,就达到了和BigGAN-deep完全相同的FID,同时还彻底解决了GAN天生的模式崩溃问题,生成的图像多样性远超GAN。这一改进,让扩散模型从实验室研究,真正具备了工业落地的可能。

5.2 上采样+分类器引导:高清生成效果再翻倍

本文还发现,分类器引导和上采样扩散模型(先生成低分辨率图像,再用扩散模型超分到高分辨率)能完美配合,实现高清生成效果的二次飞跃。

表格3 上采样+分类器引导的效果提升(出处:论文表5)

图像分辨率 模型配置 FID
256×256 基础引导扩散模型 4.59
256×256 上采样+分类器引导 3.94
512×512 基础引导扩散模型 7.72
512×512 上采样+分类器引导 3.85

结果分析:配合上采样模型后,512×512高清图像的FID直接从7.72腰斩到3.85,效果提升堪称恐怖。这一思路也成为了后续高清扩散模型的核心设计范式,如今绝大多数4K超分扩散模型,都沿用了这个“基础生成+超分上采样”的架构。


六、全维度实验结果:全面碾压GAN的SOTA战绩

本文在ImageNet数据集的多个分辨率下,和当时所有的SOTA生成模型做了全面对比,结果毫无悬念地实现了全维度碾压。

表格4 ImageNet多分辨率SOTA效果对比(出处:论文表1)

模型 128×128 FID 256×256 FID 512×512 FID
BigGAN-deep 10.48 12.25 16.98
StyleGAN2 6.91 - -
本文无条件扩散模型 4.59 - -
本文分类器引导扩散模型 2.97 4.59 7.72
本文引导+上采样模型 - 3.94 3.85

结果分析
在所有分辨率下,本文的扩散模型都实现了对BigGAN-deep的全面超越。128×128分辨率下,FID从10.48降至2.97,提升幅度超过70%;512×512高清分辨率下,FID更是从16.98降至3.85,直接把GAN的效果甩开了一个量级。这是历史上第一次,扩散模型在图像合成的核心指标上,全面、彻底地超越了GAN。

图片3 本文模型与BigGAN-deep生成效果视觉对比(出处:论文图4)

视觉分析:从生成效果可以直观看到,本文的扩散模型生成的图像,物体结构更合理、细节更丰富、边缘更清晰,完全没有GAN常见的伪影、畸变和局部模糊问题,视觉观感实现了质的提升。


七、核心代码实现:分类器引导扩散采样

以下是基于PyTorch实现的分类器引导扩散采样核心代码,完整复现了论文的核心逻辑:

import torch
import torch.nn as nn
import numpy as np

def get_beta_schedule(timesteps=1000, beta_start=0.0001, beta_end=0.02):
    """生成预定义的beta噪声schedule"""
    return np.linspace(beta_start, beta_end, timesteps)

class GuidedDiffusionSampler:
    def __init__(self, unet_model, classifier, timesteps=1000, device="cuda"):
        self.unet = unet_model  # 预训练的扩散U-Net模型
        self.classifier = classifier  # 预训练的噪声鲁棒分类器
        self.timesteps = timesteps
        self.device = device
        
        # 预计算扩散相关参数
        self.beta = get_beta_schedule(timesteps)
        self.alpha = 1 - self.beta
        self.alpha_bar = np.cumprod(self.alpha)
        self.sqrt_alpha_bar = np.sqrt(self.alpha_bar)
        self.sqrt_one_minus_alpha_bar = np.sqrt(1 - self.alpha_bar)
        
    def classifier_guidance(self, x_t, t, target_class, guidance_scale=1.0):
        """计算分类器引导的梯度"""
        x_t = x_t.detach().requires_grad_(True)
        # 分类器预测类别概率
        logits = self.classifier(x_t, t)
        # 计算目标类别的对数概率
        log_probs = torch.log_softmax(logits, dim=-1)[:, target_class]
        # 对x_t求梯度
        grad = torch.autograd.grad(log_probs.sum(), x_t)[0]
        # 按引导尺度缩放梯度
        return grad * guidance_scale
    
    @torch.no_grad()
    def sample(self, target_class, guidance_scale=3.0, image_size=128, channels=3):
        """分类器引导的图像生成采样主函数"""
        # 初始化纯高斯噪声
        x = torch.randn(1, channels, image_size, image_size).to(self.device)
        
        # 从T步逆向迭代到0步
        for t in reversed(range(self.timesteps)):
            t_tensor = torch.tensor([t]).to(self.device)
            
            # 1. U-Net预测均值和方差
            unet_out = self.unet(x, t_tensor)
            mu_pred, sigma_pred = torch.chunk(unet_out, 2, dim=1)
            
            # 2. 计算分类器引导梯度
            with torch.enable_grad():
                guidance_grad = self.classifier_guidance(x, t_tensor, target_class, guidance_scale)
            
            # 3. 加入引导,更新均值
            mu_guided = mu_pred + sigma_pred * guidance_grad
            
            # 4. 执行一步去噪
            if t > 0:
                noise = torch.randn_like(x)
                x = mu_guided + torch.sqrt(self.beta[t]) * noise
            else:
                x = mu_guided
        
        # 归一化到0-255图像范围
        x = (x.clamp(-1, 1) + 1) / 2 * 255
        return x.to(torch.uint8)

# 使用示例
if __name__ == "__main__":
    # 加载预训练模型(替换为官方权重)
    unet = UNetModel().cuda()  # 论文中的U-Net架构
    classifier = NoiseRobustClassifier().cuda()  # 预训练的噪声鲁棒分类器
    
    # 初始化采样器
    sampler = GuidedDiffusionSampler(unet, classifier)
    # 生成ImageNet第207类(金毛犬)图像,引导尺度3.0
    generated_image = sampler.sample(target_class=207, guidance_scale=3.0)

八、总结与行业影响

这篇论文的问世,直接改写了图像生成领域的发展格局。它不仅用扎实的实验证明了扩散模型在图像合成质量上可以全面超越GAN,更提出了分类器引导这一开创性技术,为后续的文本引导扩散模型奠定了核心基础——如今大火的Stable Diffusion、Midjourney等模型,其核心的CFG(Classifier-Free Guidance)技术,正是从本文的分类器引导演化而来。

除此之外,本文解决了扩散模型采样慢、高清生成效果差的核心痛点,让扩散模型从实验室的理论研究,真正走向了工业级的落地应用。可以说,没有这篇论文,就没有如今AI生成图像的爆发式发展,它当之无愧是扩散模型发展史上最具里程碑意义的工作之一。

Logo

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

更多推荐