ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

扩散模型全解析:从原理到应用的生成式AI技术演进

扩散模型全解析:从原理到应用的生成式AI技术演进 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降到50DDPM虽然效果好但有一个致命短板太慢。生成一张64x64或128x128的图你需要按照训练时的步数通常是1000步依次去噪每一步都需要一次神经网络的前向推理。相比之下GAN只需要一次前向就能出图。这个速度差距让扩散模型在工程上几乎不可用——设想一下你做一个滤镜App用户按下按钮要等十几秒才能看到结果体验直接崩盘。DDIMDenoising Diffusion Implicit Models就是在这个背景下出现的。它的关键洞察是DDPM的采样过程是从一个随机噪声逐步去噪到图像这本质上是一条随机路径但DDIM告诉你你可以把它改造成一条几乎确定性的路径让采样过程变成一个从噪声空间到图像空间的确定性映射。这样一来你就不需要每一步都模拟随机过程而是可以用更少的步数跳跃式地完成去噪。DDIM在论文里展示了只需要50步甚至20步就能得到和1000步相差无几的结果。我自己复现DDIM的时候最大的感受是步数从1000降到50推理时间直接少了20倍而FIDFré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左右效果才自然。另一个增强条件控制的思路是CFGClassifier-Free Guidance配合负向提示词在采集端广泛使用可以让模型避开某些不希望出现的元素。从时间线上看Classifier Guidance在2021年出现CFG在2021年底到2022年初被推广而到了2022年发布的Stable Diffusion已经全面采用CFG作为默认条件控制方式。这一个改变让普通用户也能通过一句话就让扩散模型生成想象中几乎任何风格的图像——从商业海报到概念画从证件照到室内设计效果图技巧不在模型本身有多神奇而是它在理解语言这件事上做到了足够好。4. 潜在扩散模型LDMStable 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-LeiblerKL正则化和向量量化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_10.0001)到(\beta_T0.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学习感知图像块相似度衡量结构感知质量、ISInception Score衡量类别多样性与清晰度以及CLIP Score衡量文本条件的一致性。在可控生成的场景里CLIP Score尤其关键它能告诉我们生成结果有多符合提示词。如果CLIP Score很高但FID很差说明模型在做安全生成——倾向复制训练集中的常见特征来满足文本条件而不是真正理解并生成多样化的内容。这是扩散模型在微调场景下比较常见的病态需要调低guidance scale或调整数据集里的类别平衡。另外如果你想做任何加速采样的新方法我建议把评估标准固定在同一组测试集之下用相同的时间步数和种子做对比。我见过很多论文报告了惊人的加速倍数但仔细一看它们的基线采样器根本没有调好或者测试条件不一致。这种对比的公平性到最后会直接影响你自己的判断——如果一开始就被带偏了后面很难建立正确的直觉。扩散模型这个领域过去五年走完了其他生成模型十年的进化路线一个重要原因就在于它的每个核心组件——噪声调度、网络结构、条件注入、采样器——都可以独立优化和替换。而这也是它作为新一代生成模型最迷人的地方不是给你一个黑盒而是给你一套可以自由拼接的积木。无论你是刚入门的学生还是要在产品里用生成能力做事的工程师把每一步的为什么都想清楚就能少走很多弯路。我至今还记得自己第一次把DDIM从1000步压到50步时那种原来加速这么简单的兴奋感——希望你也能在某个瞬间体验到同样的东西。
返回列表