扩散模型这几年在生成式AI圈子里几乎是绕不开的话题。不管你是做图像生成的、搞视频合成的,还是研究分子结构预测的,大概率都撞见过“Diffusion”这个词。但很多人对它的理解停留在“知道有这么个东西”,真要问它从哪来的、为什么突然就火了、和之前的GAN到底差在哪,就说不太清楚了。我自己是从2020年前后开始跟进这块内容的,从最早看DDPM论文一脸懵,到后来自己跑通训练、调参、踩坑,再到看着它一步步变成今天生成领域的主流方案,中间积累了不少体会。这篇内容我想把扩散模型的发展脉络从头到尾捋一遍,不是那种论文摘要式的罗列,而是按“为什么会出现—怎么演化的—每一步解决了什么问题”这条线来讲,把关键节点背后的逻辑拆开。适合对生成模型有基本了解、想系统搞清楚扩散模型来龙去脉的读者,也适合正在选型、想知道该用哪个变体的从业者参考。
1. 扩散模型到底在解决什么问题
1.1 从“生成”这件事的本质说起
要理解扩散模型为什么会出现,得先搞清楚生成模型到底在干什么。简单说,生成模型的目标是学会一个数据的分布,然后从这个分布里采样出新的、看起来像真实数据的东西。比如你给它看一万张猫的图片,它学完之后能自己“画”出一张不存在的猫。这件事听起来简单,做起来极难,因为真实数据(比如一张512×512的彩色图片)的维度高达几十万甚至上百万,在这个超高维空间里描述一个概率分布,计算量是天文数字。
早年间大家试过很多路子。变分自编码器(VAE)的思路是把数据压缩到一个低维的隐空间,再从隐空间解码回来,但生成的图像往往偏模糊,因为那个压缩过程会丢信息。生成对抗网络(GAN)换了个思路,用一个生成器和一个判别器互相博弈,生成器负责造假,判别器负责识破,两者对抗到平衡时生成器就能造出逼真的样本。GAN在2014年提出后确实火了好一阵,StyleGAN系列生成的人脸一度让人分不清真假。但GAN有个老大难问题:训练不稳定。生成器和判别器的博弈很容易失衡,要么生成器崩溃只输出几种样本(模式坍塌),要么判别器太强导致生成器学不动。调GAN的训练参数是很多人的噩梦,我自己就曾经在一个项目里调了两周才勉强让训练不崩。
扩散模型走的是另一条路。它不去做对抗博弈,而是把“生成”这件事拆成很多很多个微小的去噪步骤,每一步只做一点点,累积起来就从纯噪声变出了一张清晰的图。这个思路的好处是每一步的任务都很简单、很稳定,训练起来不像GAN那样容易崩。代价是生成速度慢,因为要迭代很多步。但后来的一系列改进把速度问题也逐步缓解了。可以说,扩散模型的崛起本质上是拿“生成质量”和“训练稳定性”换“生成速度”,而这个交换在大多数场景下是划算的。
1.2 热力学启发:从物理里的扩散现象借来的直觉
扩散模型这个名字直接来自物理学里的扩散现象。你往一杯清水里滴一滴墨水,墨水分子会从高浓度区域慢慢向低浓度区域散开,最终整杯水均匀变色。这个过程是自发的、不可逆的(至少宏观上不可逆),而且每一步的变化都很微小。反过来想,如果我能记录墨水扩散的每一步,然后学会把每一步倒过来,是不是就能从均匀分布的墨水恢复出最初那一滴?
这正是扩散模型的核心直觉。前向过程是把真实图像一步步加噪声,直到变成纯高斯噪声;反向过程是训练一个神经网络,学会从噪声一步步去噪,恢复出图像。前向过程是固定的、不需要学习的,就是不断加噪声;反向过程才是需要训练的部分。这个类比虽然粗糙,但它抓住了关键:把一个复杂的大问题拆成一串简单的小问题,每个小问题都好解决。
我第一次看到这个类比的时候觉得挺妙的,因为它把“生成”这个抽象概念具象化了。你不需要一步到位地从噪声变出图像,那太难了;你只需要学会“给定一张稍微有点噪声的图,把噪声去掉一点点”,这个任务简单到一个小网络就能胜任。把几百上千个这样的微小去噪步骤串起来,奇迹就发生了。
1.3 和GAN、VAE的核心差异对比
把扩散模型和它的前辈们放在一起对比,能更清楚地看到它的定位。下面这张表是我自己整理的核心差异,覆盖了几个最关键的维度:
| 维度 | GAN | VAE | 扩散模型 |
|---|---|---|---|
| 训练稳定性 | 差,易崩溃 | 较好 | 好,损失函数稳定 |
| 生成质量 | 高(但需精细调参) | 偏模糊 | 高且稳定 |
| 生成速度 | 快(单次前向) | 快 | 慢(多步迭代) |
| 模式覆盖 | 易模式坍塌 | 覆盖较好 | 覆盖好 |
| 理论框架 | 博弈论 | 变分推断 | 去噪得分匹配/随机微分方程 |
| 调参难度 | 高 | 中 | 中低 |
从表里能看出来,扩散模型最大的优势是训练稳定和模式覆盖好,最大的劣势是生成速度慢。这也解释了为什么它最早在学术界受关注,但直到2020年DDPM那篇论文出来之后才真正爆发——因为DDPM把生成质量做到了和GAN可比甚至更好的水平,同时保持了训练稳定性。而速度问题,后来靠DDIM、潜在扩散、蒸馏等一系列技术逐步解决了。
提示:如果你现在要选型,图像生成质量优先且不在乎推理成本,扩散模型基本是默认选择;如果对实时性要求极高(比如移动端实时滤镜),可能需要考虑蒸馏后的少步模型或者干脆用其他方案。
2. 前深度学习时代的铺垫:从得分匹配到去噪
2.1 得分匹配:一个被低估的数学工具
扩散模型的理论根基之一叫“得分匹配”(Score Matching),这个概念其实早在2005年就被Aapo Hyvärinen提出来了。所谓“得分”,在统计学里指的是对数概率密度函数对数据的梯度,也就是 ∇ₓ log p(x)。这个量描述的是“在数据空间里,往哪个方向走能让概率密度增大”。如果你能估计出这个得分函数,就能沿着它把随机噪声逐步移动到高概率区域,从而生成样本。
这个思路在当年很超前,但没引起太大关注,因为在高维空间里估计得分函数很难,而且当时的神经网络能力有限。但它埋下了一颗种子:生成问题可以转化为估计得分函数的问题,而估计得分函数可以用去噪的方式来做。具体来说,有一个叫“去噪得分匹配”的等价形式,它证明了你不需要知道真实的概率密度,只需要训练一个网络去预测“加噪样本里的噪声”,就能间接学到得分函数。这个等价关系是后来DDPM能成立的关键理论支撑之一。
我读这部分理论的时候花了不少时间才转过弯来。直觉上理解:如果你能准确地从一张脏图里把噪声分离出来,说明你对“干净图长什么样”有足够强的先验知识,这个先验知识本质上就是对数据分布的建模。所以“去噪”和“建模分布”是一体两面的事。
2.2 去噪自编码器与噪声估计的早期实践
在得分匹配理论发展的同时,去噪自编码器(Denoising Autoencoder)这条线也在推进。去噪自编码器的做法是:给输入加噪声,然后训练网络恢复原始输入。这本来是被当作一种正则化手段,用来让自编码器学到更鲁棒的特征表示。但后来人们发现,去噪自编码器学到的东西和得分函数有深刻联系——最优的去噪函数和得分函数之间存在解析关系。
这个发现把两条线连起来了:一条是理论上的得分匹配,一条是实践中的去噪自编码器。两者结合,就为后来的扩散模型铺好了路。2019年前后有几篇工作开始尝试用多步加噪-去噪的方式做生成,比如Sohl-Dickstein等人在2015年提出的扩散概率模型,那篇论文其实已经搭好了扩散模型的基本框架,包括前向加噪、反向去噪、变分下界损失等核心要素。但那篇论文当时没火,因为生成的图像质量还比不上GAN,而且计算成本高。
现在回头看,2015年那篇论文的框架其实相当完整,只是生不逢时。它缺的是足够的算力和更好的网络架构,以及一个把生成质量真正做上去的实现。这些条件要到2020年才凑齐。
2.3 为什么这些早期工作没有引爆
早期扩散相关工作没火起来,我觉得有几个原因。第一是算力不够。扩散模型要迭代几百上千步,每一步都要过一遍神经网络,训练和推理成本都比GAN高一个量级。2015年那会儿GPU资源远不如现在,跑不动。第二是网络架构不够强。当时主流的卷积网络容量有限,难以拟合复杂的去噪函数。第三是没有一个足够惊艳的结果来证明这条路能走通。学术界对新方法的态度往往是“你先做出个像样的结果再说”,而早期扩散模型的结果确实不够看。
这三点在2020年前后都发生了变化:GPU算力大幅提升,U-Net架构被证明非常适合去噪任务,DDPM拿出了和GAN可比的生成质量。条件齐了,爆发就是自然的事。这也提醒我,很多技术不是不好,而是生错了时代。做技术选型的时候,不能只看方法本身,还要看它依赖的外部条件是否成熟。
3. DDPM的登场:扩散模型真正进入主流视野
3.1 DDPM的核心贡献拆解
2020年Ho等人发表的DDPM(Denoising Diffusion Probabilistic Models)是扩散模型发展史上的分水岭。它的核心贡献可以拆成几块来看。第一,它把前向加噪过程定义成一个固定的马尔可夫链,每一步加一点高斯噪声,总共加T步(通常T=1000),最终图像变成标准高斯噪声。这个前向过程有闭式解,意味着你可以直接算出任意时刻t的加噪结果,不需要一步步迭代,这在训练时非常关键。
第二,它把反向去噪过程参数化为一个神经网络,训练目标是预测每一步加入的噪声。损失函数简单到就是预测噪声和真实噪声之间的均方误差。这个损失函数极其稳定,不像GAN那样需要平衡两个网络。第三,它给出了完整的变分下界推导,把训练目标简化为一个加权后的简单形式,去掉了复杂的权重项,直接用均匀权重就能训得很好。
第四,也是最关键的,它用U-Net架构加上注意力机制,在CIFAR-10和CelebA-HQ等数据集上做出了当时最好的生成质量,FID分数超过了同期的GAN。这个结果直接说服了很多人:扩散模型不只是理论优雅,实际效果也能打。
3.2 为什么DDPM的损失函数这么简单却有效
DDPM的损失函数简单到让人怀疑:就是预测噪声的MSE。为什么这么简单的目标能训出强大的生成模型?这里面有几层原因。首先,预测噪声等价于估计得分函数,而得分函数完整地刻画了数据分布。你把这个估计准了,理论上就能从噪声恢复出任意样本。其次,多步加噪把复杂的分布匹配问题拆成了一千个简单的去噪问题,每个问题都足够简单,网络容易学好。第三,均匀权重虽然理论上不是最优的,但实践中效果很好,因为它让网络在所有的噪声水平上都得到充分训练,不会偏向某个特定尺度。
我自己训DDPM的时候有个体会:损失曲线非常平滑,几乎不会出现GAN那种剧烈震荡。你设好学习率,基本就能稳定下降。这种“省心”是扩散模型对工程实践最大的友好之处。当然,代价是训练慢,一个中等规模的数据集可能要跑好几天。
3.3 采样速度:DDPM最大的痛点
DDPM最被人诟病的就是采样慢。生成一张图要跑1000步,每步都要过一遍U-Net,这在实践中很难接受。我最早跑DDPM采样的时候,一张256×256的图要几十秒,批量生成更是慢得让人抓狂。这个速度问题直接催生了后续一系列加速工作,也是扩散模型能否落地的关键瓶颈。
不过这里有个细节值得注意:DDPM的1000步其实是有冗余的。前向加噪的马尔可夫链在信息论意义上并不是每一步都携带等量信息,很多步的去噪贡献很小。这就给后来的加速方法留了空间——如果能找到一种方式跳过那些贡献小的步骤,就能大幅提速而不太损失质量。DDIM就是沿着这个思路做的。
注意:如果你现在要复现DDPM,别一上来就追求1000步采样。先用DDIM或者少步采样跑通流程,确认训练没问题,再回头做完整采样对比。这样能省大量调试时间。
4. 加速与改进:从DDIM到潜在扩散
4.1 DDIM:把随机采样变成确定性采样
DDIM(Denoising Diffusion Implicit Models)是2020年底提出的,核心贡献是把DDPM的随机采样过程改造成了确定性采样。DDPM的反向过程每一步都注入随机噪声,所以同一个初始噪声每次采样结果不同。DDIM重新设计了反向过程的方差,让它可以取0,变成确定性映射。这样一来,你可以用更少的步数(比如50步甚至20步)完成采样,质量损失很小。
DDIM的另一个好处是它支持“插值”。因为采样是确定性的,你可以在隐空间里做线性插值,得到平滑过渡的生成结果。这个特性后来在图像编辑、风格迁移等任务里被广泛使用。我第一次用DDIM做插值的时候觉得挺惊艳的,两张人脸的隐表示之间线性插值,中间过渡非常自然,没有GAN插值那种突变感。
从原理上讲,DDIM对应的是扩散过程的一个非马尔可夫变体,它保持了相同的边缘分布但改变了联合分布。这个数学构造比较绕,但结论很实用:你可以用任意子序列的步数来采样,步数越少越快,质量下降可控。
4.2 少步采样与蒸馏技术
DDIM之后,加速研究分成了两条路。一条是改进采样器,比如DPM-Solver、Heun求解器等,用数值方法在更少的步数里逼近扩散方程的解。这些方法把采样步数压到了20步左右,质量基本无损。另一条是蒸馏,训练一个学生模型直接模仿教师模型的多步采样结果,把1000步压缩到几步甚至一步。渐进式蒸馏、一致性模型都属于这一类。
蒸馏的代价是需要额外的训练,而且学生模型的多样性可能略逊于教师。但它在推理速度上的收益是巨大的,一步生成意味着扩散模型可以做到和GAN一样快。这对落地应用非常关键。我在一个实时生成的项目里用过蒸馏后的模型,延迟从秒级降到了毫秒级,体验完全不一样。
4.3 潜在扩散:把扩散搬到隐空间
潜在扩散模型(Latent Diffusion Model)是2022年的一个重要转折点,也是Stable Diffusion背后的核心技术。它的思路很直接:直接在像素空间做扩散太贵了,因为像素维度太高。那能不能先用一个自编码器把图像压缩到低维隐空间,然后在隐空间里做扩散?这样计算量能降一两个数量级,而生成质量几乎不受影响。
具体做法是:训练一个VQ-VAE或类似的自编码器,把512×512×3的图像压缩成64×64×4的隐表示,压缩率约48倍。然后在这个隐空间上训练扩散模型。采样时先在隐空间生成,再解码回像素空间。这个设计让扩散模型第一次能在消费级显卡上跑起来,直接催生了Stable Diffusion这样的开源项目,把扩散模型从学术圈推向了大众。
我自己的感受是,潜在扩散是扩散模型发展史上“工程价值”最高的一步。它没有太多理论创新,但把成本打下来了,让更多人能用上。很多时候技术的普及不靠理论突破,靠的是把成本降到大众可及的范围。
4.4 架构演进:U-Net到Transformer的迁移
扩散模型的网络架构也经历了一轮演进。早期DDPM用的是U-Net,这个架构本来就是为图像分割设计的,有编码器-解码器结构和跳跃连接,非常适合去噪任务。后来大家发现Transformer在建模长程依赖上更强,于是有了DiT(Diffusion Transformer)。DiT把U-Net换成了纯Transformer结构,在ImageNet上取得了更好的效果,而且扩展性更好——模型越大效果越好,这符合大模型时代的规律。
Sora等视频生成模型据公开信息也采用了类似DiT的架构。从U-Net到Transformer的迁移,本质上是扩散模型在跟随整个深度学习领域的架构趋势。这个趋势还在继续,未来可能会有更适合扩散任务的专用架构出现。
5. 扩散模型的能力边界与典型应用
5.1 图像生成之外的扩展
扩散模型最早在图像生成上证明自己,但它的能力远不止于此。在音频领域,它可以生成语音、音乐;在视频领域,它可以生成短视频片段;在3D领域,它可以生成点云、神经辐射场;在分子设计领域,它可以生成新的分子结构。这些应用的共同点是:数据都是高维的、连续的,而且有大量样本可供训练。
我自己接触过的一个有意思的应用是“基于扩散模型的新视角合成”。给定几张同一场景不同角度的照片,用扩散模型生成从新角度看的图像。这个任务传统上靠神经辐射场做,但扩散模型在细节和真实感上往往更好。它的做法是把视角信息作为条件注入去噪过程,让模型学会“从指定角度看这个场景应该是什么样”。
5.2 条件生成:从文本到图像
条件生成是扩散模型落地最广的方向。你给一段文字描述,模型生成对应的图像,这就是文本到图像。实现方式是在去噪过程中注入文本条件,通常用交叉注意力机制把文本嵌入融合进U-Net的中间层。Classifier-free guidance是另一个关键技术,它让模型在生成时能更好地遵循文本提示,代价是采样时要跑两次前向。
文本到图像的质量在过去两年提升得非常快,从最早的模糊、语义错乱,到现在能生成相当逼真的图像。这里面有模型规模的贡献,也有数据质量的贡献,还有训练技巧的积累。但也要清醒地看到,模型对复杂语义、空间关系、文字渲染的处理仍然有短板,离“完全可控”还有距离。
5.3 可控性与编辑能力
扩散模型在图像编辑上的能力也值得单独说。因为它的生成过程是可逆的、逐步的,你可以在中间某一步介入,修改生成方向。比如用一张参考图引导生成风格,或者用掩码控制只修改局部区域。Inpainting、Outpainting、风格迁移、图像修复这些任务,扩散模型都做得不错。
可控性的核心是“条件注入”。你可以在每一步去噪时加入额外的引导信号,比如边缘图、深度图、姿态骨架等。ControlNet就是这方面的代表作,它通过复制一份U-Net编码器来接收条件输入,实现了精细的空间控制。这个思路让扩散模型从“随机生成”变成了“按需生成”,实用性大大增强。
6. 实操中绕不开的那些坑
6.1 训练不收敛的排查思路
虽然扩散模型训练比GAN稳定,但也不是完全不会出问题。我遇到过几次训练不收敛的情况,排查下来通常是这几个原因。第一是学习率设太大,导致损失震荡。扩散模型的损失尺度比较小,学习率一般用1e-4到2e-4,太大容易发散。第二是噪声调度设计不合理,beta的线性或余弦调度对训练影响很大,余弦调度通常更稳。第三是数据预处理有问题,比如图像归一化没做好,导致输入分布和模型假设不匹配。
排查的时候我一般先看损失曲线。如果损失一开始就很大且不下降,多半是学习率或数据问题;如果损失下降后又反弹,可能是过拟合或者噪声调度问题。另外,采样几张图看看质量,比只看损失更直观。有时候损失看着正常但生成全是噪声,那可能是反向过程的参数化方式有问题。
6.2 采样质量与步数的权衡
采样步数和质量的关系不是线性的。从1000步降到100步,质量下降很小;从100步降到20步,质量开始明显下降;降到10步以下,基本就糊了。所以实践中要在速度和质量之间找平衡点。我的经验是,用DPM-Solver这类改进采样器,20到30步通常能拿到接近1000步的质量,这是性价比最高的区间。
如果非要更少步数,就得上蒸馏。但蒸馏需要额外训练,而且学生模型的多样性会打折扣。所以除非有硬性延迟要求,否则不建议一上来就蒸馏。先用改进采样器把步数压到20步左右,大多数场景够用了。
6.3 显存与批量大小的实际约束
扩散模型的显存占用主要来自两方面:模型参数和中间激活。U-Net的中间激活在训练时很大,因为要保存每一步的中间结果用于反向传播。批量大小往往受限于显存,一张24G的卡训256×256的图,批量可能只能开到8到16。想开大批量就得用梯度累积或者混合精度训练。
混合精度是我强烈建议开的,能省将近一半显存,速度也快,而且对生成质量影响很小。梯度检查点也能省显存,代价是训练慢一些。如果显存实在紧张,可以考虑先在低分辨率上训,再逐步提升分辨率,这样中间激活会小很多。
提示:训练扩散模型时,先把批量大小设小一点跑通流程,确认损失正常下降后再逐步加大。一上来就追求大批量容易因为显存不足反复重启,浪费时间。
7. 我对扩散模型发展脉络的几点个人判断
从2015年的框架雏形,到2020年DDPM引爆,再到2022年潜在扩散推动普及,扩散模型这条线走得其实挺清晰的:每一步都在解决前一步暴露的问题。DDPM解决了生成质量和训练稳定性,DDIM和蒸馏解决了速度,潜在扩散解决了成本,ControlNet解决了可控性。这个演化逻辑不是偶然的,它反映了生成模型领域的一个基本规律——先追求质量,再追求效率,最后追求控制。
我个人觉得,扩散模型接下来几个值得关注的方向,一是更高效的采样,争取做到一步生成且质量无损;二是更强的可控性,让用户能用更自然的方式(比如语言、草图)精确控制生成结果;三是和其他模态的融合,比如视频、3D、音频的统一生成框架。这些方向目前都有不少工作在推进,但离成熟还有距离。
另外想说的是,扩散模型不是万能的。它在需要精确数值计算、严格逻辑推理的任务上并不擅长,这些任务可能更适合其他方法。技术选型的时候要看清任务本质,别因为扩散模型火就硬套。我在实际项目里见过一些场景,用传统方法效果更好、成本更低,硬上扩散模型反而得不偿失。
最后分享一个我自己的习惯:跟进扩散模型这类快速演进的领域,不要试图读完所有论文,而是抓住几条主线——理论线(得分匹配、随机微分方程)、架构线(U-Net、Transformer)、加速线(DDIM、蒸馏、求解器)、应用线(条件生成、编辑、跨模态)。每条线挑几篇代表作精读,其余的了解个大概就行。这样既能跟上进展,又不会被信息淹没。