☰
扩散模型全解析:从原理到应用的生成式AI技术演进
2026/10/3 4:34:06 网站建设 项目流程

1. 从热力学倒推出来的生成模型:扩散思想的起点

聊扩散模型(Diffusion Models)之前,我想先纠正一个常见误解:很多人以为扩散模型是2020年左右才突然冒出来的,因为DDPM那篇论文实在太出名了。但实际上,扩散模型的思想源头可以追溯到更早的热力学和统计物理,甚至可以说,它的底层逻辑跟"咖啡机磨豆子"差不多——先把完整的咖啡豆磨成粉,再想办法从粉末里把豆子拼回来。

这个类比其实很贴近扩散模型的核心。想象一下,你往一杯清水里滴一滴墨水,墨水会慢慢扩散,最后整杯水变成均匀的淡蓝色。这个过程在物理上叫"不可逆扩散",它是熵增的、趋于混乱的。扩散模型的思路是反着来的:我不关心墨水怎么扩散,我想学一个"把淡蓝色水变回清水"的过程——也就是从噪声里恢复原始信号。更直白地说,训练阶段是我故意往数据里加噪声,直到它变成纯高斯噪声;生成阶段则是从一个纯噪声出发,让模型一步步去掉噪声,最终还原出一张图、一段音频或者一个三维场景。

这个想法在正式进入深度学习圈之前,其实有两条独立的数学线索。一条来自热力学和随机过程。1980年代,物理学家和统计学家就在研究随机微分方程(SDE),描述粒子在介质中的扩散行为,其中包含正向过程(从有序到无序)和反向过程(从无序到有序)。在特定条件下,反向过程是被正向过程唯一定义的——这意味着,如果你知道正向加噪的规律,理论上你就能学会反向去噪。这个理论框架后来被Sohl-Dickstein等人在2015年的论文里借用,第一次提出了"非平衡热力学视角下的生成模型",但当时效果很差,基本只能处理极小的图像,比如MNIST上的简单数字,分辨率也低得可怜,很快就被人忽略了。

另一条线索是高维数据分析里的"score matching",也就是分数匹配。它不直接学习数据的概率密度,而是学习概率密度对数的梯度,也就是"分数"。这个梯度告诉你在数据空间中,每个点应该往哪个方向移动才能更接近高密度区域。Score matching的优雅之处在于,你不需要计算归一化常数——那玩意儿在高维空间里根本算不出来,但它又足以指导采样过程。Hyvärinen在2005年奠定了分数匹配的理论基础,后来Song等人把score matching和扩散过程的SDE视角统一起来,才让这两条线真正合流,也为后续的加速采样、可控生成铺平了道路。

我从自己的角度说一句:这个领域在2015年到2019年之间其实比较冷清,顶会论文也不多,很多人觉得扩散模型"只是物理学家自嗨的玩具"。我当时去听相关报告,台上讲的都是朗之万动力学、随机微分方程这类东西,台下的反应基本是礼貌性的点头,但会后没人真的去跑实验。因为那时的方案训练不稳定、采样速度极慢,随便跑一个实验都要几天,效果还比不上最普通的VAE。真正的转机,是2020年DDPM把整个训练目标、网络结构和采样过程重新设计了一遍,扩散模型才从"数学上很漂亮"变成了"实际能出图"。

2. 2015—2020年的奠基时刻:DDPM把扩散模型带进深度学习主流

2.1 DDPM为什么是里程碑

2020年,Ho等人发表《Denoising Diffusion Probabilistic Models》,也就是大家常说的DDPM,这篇论文的影响力怎么强调都不为过。它做的事情可以简化为三步:定义一个固定的、简单的加噪过程,让网络学习每一步的去噪结果,然后用这个网络从噪声里一步步生成图像。

DDPM最大的贡献不是提出一个全新的思路,而是把已有的杂七杂八的设计统一成一个极其简洁、稳定的框架。它定义了一个前向过程:从干净图像 (x_0) 出发,每一步都加入一点高斯噪声,经过足够多步(一般是1000步)之后,图像变成完全的高斯噪声。这个过程可以一次性计算出来:给定任意一步 (t),(x_t) 都可以写成 (x_0) 和一个噪声项的线性组合,系数由预先定义好的"噪声调度表"决定。训练时不需要一步一步地前向跑,只需要随机抽一个 (t),生成对应的带噪图像,然后让网络预测加进去的噪声就行。这个损失函数就是一个最简单的L2距离——网络预测的噪声和真实噪声之间的均方误差。

你可能觉得这听起来简单得像一个平凡的回归任务,但DDPM真正厉害的地方在于训练稳定。它不需要对抗训练,不需要判别器,不需要精心调学习率来维持平衡。只要你把网络结构搭对、噪声调度表设对,它就能稳定收敛。而且生成质量在多个数据集上超过了当时的GAN模型——这在2020年之前,几乎是不可想象的。我记得当时第一次看到DDPM在CIFAR-10上生成的图像,第一反应是"这真的不是在跑ImageNet的GAN吗",因为那时候扩散模型还没有什么好用的公开代码,很多人对它的印象都来自论文里的样例图,但那些样例图已经足够震撼了。

2.2 三种等价视角:DDPM、SDE、Score Matching

有一点值得花时间讲清楚:DDPM、随机微分方程(SDE)和分数匹配(Score Matching)在数学上是等价的,但它们的表达方式和适用范围不一样。DDPM的视角是离散的,它把加噪过程拆成一个个有限步的离散步骤,每一步是一个高斯分布。SDE的视角是连续的,它把加噪过程看作一个连续时间内的随机过程,理论上可以任意细化步长,甚至改变步长的分布。Score Matching的视角则是从"学习分数"出发,直接把扩散模型的训练解释为学习数据分布的对数梯度。

这三种视角不是互相矛盾的,而是同一枚硬币的三面。我自己的经验是:DDPM适合入门,因为它的实现代码最直白,数学推导也可以一步一步地写出来;SDE适合做理论分析,比如研究不同采样器之间的联系、设计更复杂的噪声调度表,或者处理非高斯噪声;Score Matching适合理解"扩散模型到底在学什么"——它不是在学习某种固定的概率密度近似,而是在学习一个能指引你从低密度区域走向高密度区域的"导航场"。

正是这个等价性,让后来的研究者可以灵活地在不同框架之间跳转。比如Song等人在2021年提出的Score-based Generative Modeling through SDE,就是把DDPM扩展到连续时间框架,并且用同一个模型同时实现多种采样策略。你甚至可以在训练阶段用DDPM的简单目标,在采样阶段用SDE的数值积分器来做更精细的步长控制。这种混合玩法的存在,也是扩散模型后来能快速迭代的重要原因——每一篇关键的突破论文,本质上都是在拆开这三个视角之间的接口,然后找到一个新的组合方式。

但这里也有个常见误区:很多人以为DDPM的训练和采样必须使用相同的步数。其实不是的。DDPM训练时使用1000步,但在推理时可以只采样50步甚至20步,虽然质量会下降一些,但并不会完全崩溃。原因在于,网络学习的是(x_t)到(x_{t-1})的去噪规则,采样时可以跳着走。这为后面的加速采样方法(比如DDIM)留下了空间。所以你看,很多创新点并不是推翻已有的框架,而是发现框架里本来就存在可挖掘的缝隙。

3. 从慢速采样到可控生成:扩散模型真正走向实用的转折点

3.1 DDIM:采样步数从1000降到50

DDPM虽然效果好,但有一个致命短板:太慢。生成一张64x64或128x128的图,你需要按照训练时的步数(通常是1000步)依次去噪,每一步都需要一次神经网络的前向推理。相比之下,GAN只需要一次前向就能出图。这个速度差距让扩散模型在工程上几乎不可用——设想一下,你做一个滤镜App,用户按下按钮要等十几秒才能看到结果,体验直接崩盘。

DDIM(Denoising Diffusion Implicit Models)就是在这个背景下出现的。它的关键洞察是:DDPM的采样过程是从一个随机噪声逐步去噪到图像,这本质上是一条随机路径;但DDIM告诉你,你可以把它改造成一条(几乎)确定性的路径,让采样过程变成一个从噪声空间到图像空间的"确定性映射"。这样一来,你就不需要每一步都模拟随机过程,而是可以用更少的步数,跳跃式地完成去噪。DDIM在论文里展示了只需要50步甚至20步,就能得到和1000步相差无几的结果。

我自己复现DDIM的时候,最大的感受是:步数从1000降到50,推理时间直接少了20倍,而FID(Fréchet Inception Distance,图像质量评估指标)只上升了几个点,肉眼几乎无法分辨差异。这对实际项目的意义是巨大的——它让扩散模型从"实验室产物"变成了"可以放进产品里跑"的东西。与之配套的还有各种更快的数值求解器,比如DPM-Solver、DPM-Solver++、Euler采样等,它们本质上是用更高阶的数值积分方法去逼近SDE/ODE的轨迹,进一步把采样步数压到10步甚至更少。

3.2 Classifier Guidance与Classifier-Free Guidance:可控生成的关键

如果说DDIM解决了速度问题,那么可控生成就是扩散模型走向实际应用的第二道门。最开始的扩散模型只能说"生成一张真实图像",但你没法控制它生成什么内容——你很难让它生成一只戴墨镜的猫,除非你给它很多这样标注好的图片做条件训练。

Classifier Guidance的思路是:在训练好的无条件扩散模型后面加一个分类器,采样时利用分类器对中间结果的梯度来引导生成过程。它的原理可以理解为:在你从噪声走向数据的路上,每一步你都检查一下"这个东西看起来像猫吗",如果不怎么像,就顺着分类器梯度的方向微调一下,让下一步生成的结果更偏向猫。这个方法的优点是可以在不重新训练生成模型的情况下实现控制,缺点是你需要额外训练一个分类器,而且分类器必须对加噪过程中的中间结果鲁棒,这在实践中经常会出问题——分类器在强噪声图片上的表现远不如在干净图片上,导致引导信号本身是有噪声的。

Classifier-Free Guidance(无分类器引导)则提出了一个更优雅的做法,而且现在几乎成了所有大型扩散模型(包括Stable Diffusion、DALL·E 2)的标准配置。它不训练分类器,而是训练模型的时候同时学习两个条件:一个是有条件生成(输入文本或类别标签),一个是无条件生成(输入空标签),并在采样时把两个输出线性组合起来。组合的系数叫guidance scale,一般取7到12之间。这个值越大,生成结果越贴条件但多样性越低;值越小,越多样但不一定符合条件。我刚开始调这个参数时也走了弯路,直觉上觉得越大越好,结果生成出来的图全部"过拟合"到文本上——比如你要求"三个人在咖啡馆聊天",它直接给你画一张每个人都长得一模一样的图。后来把scale降到8左右,效果才自然。另一个增强条件控制的思路是CFG(Classifier-Free Guidance)配合负向提示词,在采集端广泛使用,可以让模型避开某些不希望出现的元素。

从时间线上看,Classifier Guidance在2021年出现,CFG在2021年底到2022年初被推广,而到了2022年发布的Stable Diffusion,已经全面采用CFG作为默认条件控制方式。这一个改变,让普通用户也能通过一句话就让扩散模型生成想象中几乎任何风格的图像——从商业海报到概念画,从证件照到室内设计效果图,技巧不在模型本身有多神奇,而是它在"理解语言"这件事上做到了足够好。

4. 潜在扩散模型(LDM):Stable Diffusion背后的工程化革命

4.1 为什么要在潜在空间做扩散

扩散模型真正被大众知晓,几乎绕不开Stable Diffusion。而Stable Diffusion背后的核心模型,就是潜在扩散模型(Latent Diffusion Model,简称LDM)。LDM发表于2022年,是Rombach等人在CVPR上提出的工作。它做出了一件非常工程化、也非常实用的事:不在像素空间里做扩散,而是先用一个预训练的VAE把图像压缩到一个低维潜在空间,再在潜在空间里做扩散和去噪。

为什么要绕这么一圈?核心原因是计算量。扩散模型在像素空间里做1000步迭代,每一步的处理对象是1024x1024的RGB图像,这需要的算力和显存是天文数字。但用VAE把图像压缩成比如64x64的潜在张量后,整个计算量缩小了几个数量级,生成速度也随之大幅提升。潜在空间还有一个额外的好处:它可以复用在一个大数据库上学到的通用视觉特征,让模型对不同的图像分布有更好的泛化能力,而不需要每次换一个数据集就把网络推倒重来。

我在实际部署LDM时体会最深的,是它把"图像生成"的流程拆成了两个可组合的模块:VAE负责图像和潜在空间的往返,UNet负责在潜在空间内的去噪。这意味着,你可以单独替换或微调其中一个模块。比如你想生成某种特定风格的建筑图,你不需要重新训练整套扩散模型,只需要在少量风格图片上微调UNet的叠加层,其他部分全部冻结。这种模块化设计,是Stable Diffusion生态能如此繁荣的基层。

4.2 LDM的架构拆解与训练流程

我从实现角度拆一下LDM的主要组成部分:

  • VAE编码器:把图像(x)映射成潜在向量(z)。训练目标包括重建损失(图像从(z)还原后必须尽量接近原图)和一个正则项,保证潜在空间的分布足够规整。
  • 变分正则化:LDM论文里用到了两种正则化方式:Kullback-Leibler(KL)正则化和向量量化(VQ)正则化,分别对应KL-VAE和VQ-VAE的潜在空间。KL版本更平滑,适合做连续空间的扩散;VQ版本有离散码本,但后续扩展不太常用。
  • UNet去噪网络:这是扩散过程的主体。它接收潜在张量(z_t)和时间步(t)作为输入,输出每一步预测的噪声。UNet本身有残差连接、自注意力层和交叉注意力层,其中交叉注意力层是让模型读取文本条件的接口。
  • 文本条件编码:Stable Diffusion用的是CLIP文本编码器(或者其他类似的text encoder),把输入文本转换成一组向量序列,然后在UNet的交叉注意力层中,通过计算文本向量与图像潜在特征之间的注意力权重,把文本信息注入生成过程。

训练流程可以归结成一句话:给定一张真实图像,先用VAE得到潜在表示(z_0),然后随机采样一个时间步(t)和噪声(\epsilon),用加噪公式得到(z_t),再用UNet预测噪声,计算MSE损失并进行反向传播。这个过程和DDPM几乎一样,只不过操作对象从像素图变成了潜在向量。

实际操作中还有一个很重要的细节:VAE是否冻结。LDM论文建议在训练扩散模型时冻结VAE参数,但如果目标域和预训练VAE的数据域差异很大,冻结可能会限制生成质量。我自己在小规模实验时发现,在特定风格素材上微调VAE会有一些收益,但风险是潜在空间的分布会偏移,导致扩散模型需要重新适应。所以一个保守做法是:先冻结VAE训练扩散模块,跑通整个流程后,再决定是否要对VAE做小规模微调,并时刻监控重建损失和生成质量的平衡。

如果在Win/Mac上跑过本地Stable Diffusion,你会发现显存的瓶颈大多不在VAE编码,而在UNet的交叉注意力层。因为每张图潜在空间虽然变小了,但自注意力机制的计算复杂度是空间大小的平方级。这也是为什么mini-batch稍微大一点就会爆显存的原因。想要更快的推理速度,可以尝试蒸馏知识或者使用TensorRT的推理加速,但这些已经属于部署层面的优化了,不是模型本身的结构问题。

5. 扩散模型的扩展应用:从图像生成到新视角合成

5.1 文本到图像与多模态对齐

扩散模型的一波大规模落地,是文本到图像(Text-to-Image)的形态。Stable Diffusion、DALL·E 2、Imagen等模型都在这个方向上发力,而其中最核心的问题是如何让模型真正理解自然语言描述,而不是机械地把词和视觉特征硬拼。这里的"理解",在工程上的体现就是跨模态对齐的质量。CLIP模型的提出解决了很多问题——它把图像和文本映射到了同一个语义空间,训练时用对比学习让匹配的图像-文本对在向量空间里靠近。在扩散模型里,CLIP文本编码器提供了稳定的语义起点,而UNet中的交叉注意力层,则负责在生成过程中不断把文本语义和视觉特征对齐。

实际使用中,文本到图像应用还有一个好玩的工程点:提示词(prompt)的写法直接影响生成质量。我总结的几个常见经验是:用短语而非长句,用逗号分隔关键属性,指定风格和媒介(比如"油画风格""3D渲染""黑白摄影"),指定光照和构图(如"柔和侧光""微距特写"),必要时使用负向提示词排除不想要的元素。你写的每句话会被文本编码器解析成特征,这种写法提高了特征检索的准确性,相当于给注意力层喂了更干净的条件。换个角度想,它就是在做一项"提示引导"的文本工程。

5.2 基于扩散模型的新视角合成与3D场景

图像生成的进展,很快蔓延到了三维视觉领域,其中"基于扩散模型的新视角合成"是近两年非常热门的方向。传统三维重建通常依赖多视图几何、深度估计或者神经辐射场(NeRF),但当输入视图很少时(比如只有一张或两张图),三维几何信息严重不足,很难直接重建出干净的3D场景。扩散模型在这个场景下的作用是:用数据驱动的先验,去"想象"那些在输入视图里看不到的内容。

一个很代表性的工作是"Zero-1-to-3",它训练了一个条件扩散模型:给定一张物体图和目标的相机视角变化信息,让模型生成从另一个视角看过去的样子。这个方法在没有3D真值监督的情况下,也能生成较合理的新视角图像,而且在同一个物体的多视角生成之间保持较高的一致性。这为后续的"直接生成3D资产"铺平了路——比如把多个扩散模型生成的新视角图像输入给NeRF或3D高斯泼溅(3D Gaussian Splatting)重建模块,就能得到一个可旋转、可光照调节的三维模型。

我在跑这类流程时遇到的最明显的坑是视角一致性。扩散模型在生成不同视角时,是逐张独立采样的,如果采样时没有额外的视角对齐约束,生成的每张图都有一个"自己的版本",比如同一个物件在不同视角下长得不太一样,合在一起就会产生"闪烁"和"撕裂"。解决方向大致有三条:一是在推理时加入姿态嵌入和共注意力机制,二是直接训练多视角扩散模型(如MVDream、Zero-123++这类模型),三是用重建后的3D模型对生成图像做反投影校验,过滤不一致的视角。如果你自己搭新视角合成流程,一定要先把"一致性评估"这件事放在前面,不然box评价时很可能会自欺欺人——单张图看起来效果很好,但多视角序列拿出来看项目全貌时,一眼就露馅。

扩散模型在3D方向还有一个值得关注的分支:直接把扩散模型接在三维表征上,而不是生成2D图像后再做重建。比如用扩散模型生成三维体素、三维隐式场或者直接生成3D高斯溅泼的坐标和颜色,这种做法的好处是天然保持3D一致性,但代价是训练数据的获取难得多。目前两条路线(先生成2D再重建,还是直接生成3D)还在持续竞争,我认为短期内"2D扩散+3D重建"依然是更成熟的工程路径,因为2D扩散模型的生态和数据规模优势太明显了,而3D方向完全从头训练一个大规模模型,数据瓶颈还很难绕开。

6. 这几年我踩过的坑和给新人的建议

6.1 复现扩散模型时最常见的坑

我见过太多人在复现DDPM或LDM时卡在完全莫名其妙的地方,这里列几个我踩过或者帮别人排查过的坑,希望对你有参考价值。

第一个是噪声调度表的选择。DDPM原文用的是线性调度,从(\beta_1=0.0001)到(\beta_T=0.02),也就是噪声注入的方差从很小逐渐增大。这个调度在256x256以下的图像上表现稳定,但到了更高分辨率(比如512x512以上),线性调度的表现不一定最好,因为它给前几步注入的噪声偏大,可能会破坏细节。后来很多工作改用cosine调度或者scaled linear调度,它们的核心特点是让噪声的增长更平滑,避免最终步噪声强度过猛。实际调试时我建议先在训练集上画一条"信噪比随步数的曲线",看一下哪个区间信息损失最快,再调整调度表。

第二个是非常容易忽略的数据标准化。扩散模型训练时输入图像一般要归一化到[-1, 1],这跟很多传统视觉任务用的[0, 1]归一化不一样。如果你忘了做这一步,边界步加噪公式中"原图+噪声"的组合就会失真,模型训练出来生成的图像会整体偏暗或偏亮,而且很难发觉——因为画面上看只是色调不对,不是那种明显的bug。这种问题排查起来很折磨人,经常要回去仔细对比数据预处理代码。

第三个是采样时的时间步embedding范围。如果你训练时用了1000步,但在推理时直接按DDIM的步数序列去跑,中间采样到的时间步还是[0,1000]内的整数,一般没问题;但如果你用了某些自定义采样器,它可能会把时间步归一化到[0,1],这时候如果你没有把模型里的时间embedding也做相应的缩放,就会得到一个"时间错乱"的生成输出。这个问题的浪头是我当时调DPM-Solver时遇到的,最后排查出来是归一化范围对不上。总体来说,任何扩散模型的复现,第一件事不是看损失值,而是把时间步和embedding、噪声调度表这三件套的数值范围完全对齐。

6.2 数据、算力与评估:容易被低估的部分

做扩散模型实验的时候,很多人一上来就盯着网络结构和损失函数,但真正决定你工作能不能完成的是数据和算力管理。数据这边,一个普遍的误判是"我的数据量够了"。在扩散模型里,数据量和多样性比绝对数量更重要。比如你有1万张猫的图片,但全部都是同一个角度、同一个背景,模型很可能会复制背景纹理而不是理解"猫"这一概念。更好的做法是做好数据清洗和去重,让模型见到的猫覆盖多样化的姿态、光照和背景。我在做风格化生成项目时发现,数据集中约三分之一的图片是近似重复的,把它们去掉之后FID分数反而提升了不少。

算力管理上,我建议新人先从小图(如128x128或256x256)和短时训练跑通整个链路,而不是一开始就上512x512的高清图和大量batch size。一套合理的验证流程是:小网络、小分辨率、少量数据,先把loss降下去、采样出肉眼可接受的结果,再逐步放大。这能有效避免高算力投入后发现代码bug的尴尬。我在带实习生的时候,经常跟他们说:如果你在小分辨率上24小时训练不出能看的结果,那放到大分辨率上大概率也不会成功,先回头查代码和配置,而不是加机器。

评估指标也一样重要。只看FID是不足够的——FID衡量的是整体分布相似度,但同一FID下可能有完全不同的"模式坍塌"或"细节模糊"问题。我通常会用FID加几个辅助指标:LPIPS(学习感知图像块相似度,衡量结构感知质量)、IS(Inception Score,衡量类别多样性与清晰度)以及CLIP Score(衡量文本条件的一致性)。在可控生成的场景里,CLIP Score尤其关键,它能告诉我们生成结果有多符合提示词。如果CLIP Score很高但FID很差,说明模型在做"安全生成"——倾向复制训练集中的常见特征来满足文本条件,而不是真正理解并生成多样化的内容。这是扩散模型在微调场景下比较常见的病态,需要调低guidance scale或调整数据集里的类别平衡。

另外,如果你想做任何"加速采样"的新方法,我建议把评估标准固定在同一组测试集之下,用相同的时间步数和种子做对比。我见过很多论文报告了惊人的加速倍数,但仔细一看,它们的基线采样器根本没有调好,或者测试条件不一致。这种对比的公平性到最后会直接影响你自己的判断——如果一开始就被带偏了,后面很难建立正确的直觉。

扩散模型这个领域,过去五年走完了其他生成模型十年的进化路线,一个重要原因就在于,它的每个核心组件——噪声调度、网络结构、条件注入、采样器——都可以独立优化和替换。而这也是它作为新一代生成模型最迷人的地方:不是给你一个黑盒,而是给你一套可以自由拼接的积木。无论你是刚入门的学生,还是要在产品里用生成能力做事的工程师,把每一步的"为什么"都想清楚,就能少走很多弯路。我至今还记得自己第一次把DDIM从1000步压到50步时,那种"原来加速这么简单"的兴奋感——希望你也能在某个瞬间,体验到同样的东西。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询