十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

扩散模型家族全景图:DDPM、LDM、CFG与Rectified Flow

扩散模型家族全景图:DDPM、LDM、CFG与Rectified Flow 1. 先建立直觉扩散模型到底在做什么我在刚接触扩散模型的时候被一堆术语绕得晕头转向DDPM、DDIM、Score-Based、SDE、LDM、Classifier Guidance、Rectified Flow……每个名字看起来都像一个新模型网上的文章又各讲各的越看越乱。后来自己动手跑代码、复现论文、调参踩坑才慢慢发现一个关键事实这些名字本质上是在讲同一件事的不同侧面。这个“同一件事”可以用一句话概括扩散模型在学习“把一个噪声分布慢慢变成目标数据分布”的过程。大白话讲就像你有一团揉得乱糟糟的毛线球纯噪声经过一系列有规律的操作最终理成一件完整毛衣一张图、一段音频、一个分子结构。整个扩散模型家族的研究都是在解决三个核心问题怎么做这个“从噪声到数据”的转化才稳定、可控怎么让转化的速度更快、需要的计算量更小怎么在转化过程中加入条件控制比如“给我生成一张猫的图片”而非“随便生成一张图”这三个问题分别对应了你听到的那一串名词。DDPM解决了第一问DDIM和Rectified Flow为了解决第二问LDM为了让模型能跑得动Classifier Guidance和Classifier-Free Guidance为了第三问而Score-Based和SDE则是把所有方法统一起来的数学框架。把这些关系捋顺了你再看任何一篇扩散模型的论文都不会再觉得它们是孤立的新模型只是在不同环节上的改进。这篇文章的目标读者是那些已经知道扩散模型“大概是干什么的”、但还没把整个家族串起来的人。我会尽量少堆公式多讲直觉但数学上该点透的地方也不会回避。毕竟扩散模型的核心确实是个数学框架绕过数学的讲解最后都会让你在调参和改代码时一脸懵。2. DDPM扩散模型的开山之作是怎么运作的2.1 前向过程和反向过程DDPM全称Denoising Diffusion Probabilistic Models是2020年Ho等人提出的。它的思想可以追溯到更早的非平衡热力学但真正让它在图像生成上大放异彩靠的是两个非常清晰的阶段前向过程加噪和反向过程去噪。前向过程就是你拿着一张干净图片逐步往上加高斯噪声加T步通常T1000直到图片完全变成纯噪声。这个过程在数学上写起来很简单每一步加一点噪声整条路径是一个马尔可夫链而且每一步的噪声强度是预先定好的不需要学习。你不需要训练任何东西来做加噪它就是一把固定的“噪声尺子”。反向过程才是模型真正要学的东西给定一个几乎全是噪声的图如何一步步把它还原成干净图片。模型在每一步需要预测的不是图片本身而是“刚加进去的那点噪声”。训练目标也因此非常简洁预测噪声让预测值和真实加入的噪声之间的均方误差最小。这个设计妙就妙在它绕过了直接建模复杂图像分布这个难题把一个生成问题转化成了无数次简单的去噪回归问题。2.2 方差调度的关键作用DDPM里有一个反直觉的核心细节噪声的强度和步数是怎么安排的。这个叫“方差调度”variance schedule常见的有线性调度和余弦调度。线性调度就是噪声的方差随时间线性增长余弦调度则是在中间段增长更快两头更平缓。我在实际训练中对比过这两种调度一个很深的体会是线性调度实现简单但前几步的噪声变化太慢导致模型在训练初期容易浪费算力余弦调度在中间阶段加噪更猛模型能更快地区分出不同时间步的特征收敛明显更稳。后来大家常用的一个经验判断是如果你画一下噪声强度曲线会发现理想的调度应该让前向过程在每一步“信息破坏”幅度大致均匀这样才能保证反向过程每个时间步的难度均衡。还有一个容易被新手忽略的点——反向过程的每一步其实都假设是在“上一个时刻的分布”上做条件生成所以训练时模型需要输入当前时刻t。注意这个t不只是用于告知模型“你现在在第几步”还决定了当前步噪声的强度参数。模型一般通过正弦位置编码把t映射成向量再通过添加或调整归一化层的方式注入网络。很多人一开始不理解为什么去噪网络要额外接收t其实原因很简单不同的t对应不同的噪声水平网络必须学会针对不同的噪声水平做不同力度的去噪就像医生看病得先知道病人受了多重的伤。2.3 训练和采样的完整流程整个DDPM的训练流程我用伪代码写出来直观得让人惊讶# 训练循环 for x0 in data_loader: # x0是干净图片 t randint(1, T) epsilon randn_like(x0) # 随机采样噪声 x_t sqrt(alpha_bar[t]) * x0 sqrt(1 - alpha_bar[t]) * epsilon loss MSE(model(x_t, t), epsilon) loss.backward()这里的alpha_bar[t]是由方差调度预先算好的累积参数。样本x_t不是一步一步加噪得到的而是一次性直接从x0和噪声的加权和算出来的这要感谢高斯分布的可加性。这是DDPM训练高效的基石不需要真的循环跑T步前向过程。采样时则是真正的反向循环从纯噪声x_T开始依次预测噪声、减去噪声、再加回一点随机扰动这一步是为了保持分布的多样性最终得到生成图像。这个“每一步都加回一点噪声”的细节很多人讲漏了如果每一步都完全按照预测去噪模型只会得到一个确定性的结果丢失了概率分布的多样性。所以DDPM的采样公式里除了均值之外还会有一个和噪声水平相关的随机项它保证了每次采样能得到不同的结果。3. 从Score-Based到SDE扩散模型的统一数学视角3.1 Score意味着什么如果说DDPM是从“图像像素”出发理解扩散那Score-Based Model就是从“概率密度”出发的另一种理解方式。它不直接预测噪声或图像而是去预测“对数概率密度对输入数据的梯度”也就是score函数数学上写作∇x log p(x)。这个概念初看很抽象但可以用一个地理类比概率密度分布可以想象成一片地形高概率区域是山峰低概率区域是山谷。score函数就是在这个地形上每个点的“上坡方向”。如果我们在山头附近随机扔下一个球并让它始终沿着score上坡方向滚动最终就会停留在山顶——也就是最可能的样本区域。这就是生成过程从一个随机的低密度点出发沿着score函数不断向高密度区域移动。但问题来了真实数据的概率密度我们根本不知道怎么去学它的梯度答案是用score matching技巧可以把score函数的训练目标转化为一个去噪回归问题形式上居然和DDPM的预测噪声几乎一样。这就是为什么后来大家发现DDPM和Score-Based其实是同一个硬币的两面——DDPM预测噪声εScore-Based预测的是ε的量级两者只差一个缩放系数。3.2 SDE把离散步骤变成连续过程宋飏等人在2020年发现了更漂亮的统一把DDPM和Score-Based模型都放进连续时间的框架里用随机微分方程SDE来描述。前向过程是一个持续加噪的随机过程反向过程则是把这个SDE倒着跑而score函数恰好是反向SDE里的关键项。SDE这个视角的威力在于两点。第一它让理论分析变得干净所有的离散时间模型DDPM、NCSN等都只是同一个连续SDE的不同离散化近似。第二由SDE可以推导出概率流ODEProbability Flow ODE一个和数据分布完全等价的确定性轨迹。也就是说原本随机扩散的过程可以改写成一个确定性的常微分方程。这个ODE的意义在于它保留了生成分布的准确性但采样时不再需要随机性而且可以用任意数值求解器大步长加速。从工程角度看这个发现直接催生了更快的采样方法。DDPM跑一个完整采样需要1000步使用概率流ODE后同等质量下可以把步数压到50步甚至20步。今天的很多加速采样器本质上都在这个框架里做文章。3.3 为什么统一视角这么重要我见过很多人跳过这一节直接去看LDM和CFG结果后面遇到问题就卡住了。统一视角真正的价值是当你想改进某个环节时你能精准定位自己动的是哪个变量。比如你想让采样更快你动的是反向过程的离散化方式你想让生成更稳你动的是噪声调度和模型架构你想加强条件控制你动的是引导项的形式。如果没有这张“统一地图”所有改进都像盲人摸象你会在GitHub上不断试错却不知道为什么有些代码改了有效、有些改了反而崩。我自己是在复现DDIM的时候真正体会到了统一视角的实用价值。DDIM的核心推导过程比较繁琐但当你从概率流ODE出发会发现DDIM其实就是对这个ODE的一种特殊离散化方式。理解了这一层就很容易推导出每个采样步的更新公式也能很自然地理解为什么DDIM在采样步数特别少时容易出现细节丢失。4. 加速采样与潜在空间从DDIM到LDM4.1 DDIM为什么能“跳步”DDPM慢在采样需要1000步而DDIM通过改变反向过程的随机性设计可以让采样步数大幅减少。它的关键洞察是去噪过程不一定需要严格遵循前向的马尔可夫链可以从任意两步之间直接跳。只要你构造出的“跳步路径”最终边缘分布是合理的就能用更少的步数完成采样。DDIM最特殊的地方是它设定了“采样过程无随机性”也就是说每步去噪都是确定的这正好对应了前文提到的概率流ODE的某个离散化版本。这样有两个好处一是采样步数大幅减少20到50步就能出不错的效果二是采样过程变成了确定性的映射可以做语义插值——给定两张图的噪声向量线性插值得到的中间向量生成出来的图像自然表现出平滑的内容过渡。这一点在实际应用比如图像编辑和风格混合中非常有用。我在实际使用中的体会是DDIM在步数从1000降到50时FID基本不会有太大劣化但如果继续降到10步就开始出现局部模糊、纹理丢失的问题。这不是说DDIM不够好而是任何确定性采样器在极少的步数下都难以恢复高频细节。后来的一些方法比如DPM-Solver利用高阶数值解算器把步数压到了10步以内而质量不崩原理就是在概率流ODE上用更聪明的离散化格式。4.2 LDM为什么选择在潜空间干活LDMLatent Diffusion Model是Stable Diffusion底层的核心技术。它在做一个看起来有点绕的决策不直接在像素空间做扩散而是先用一个自编码器把图像压缩到低维潜空间在潜空间里跑扩散过程最后再用解码器把潜变量还原成图像。为什么要绕这么一圈核心原因是计算量和细节学习难度。像素空间的图像动辄512×512×3要在这么大的张量上运行1000步扩散训练和推理的开销都非常大。而潜空间通常只有64×64×4或者更小计算量直接降了一个数量级。更关键的是自编码器已经学会了什么是“常见的视觉结构”潜空间里的特征不像像素那么冗余扩散模型只需要在这个紧凑但信息完整的空间里建模训练效率高得多。但我必须提醒一个反直觉的点LDM并不是纯粹的“先压缩再扩散”这么简单。它在潜空间上加了一点约束——用KL散度正则化或者向量量化让潜变量的分布不至于太松散。这个设计直接影响后续的采样质量如果潜空间分布和标准高斯差别太大扩散模型会很难学习。4.3 LDM的多条件控制架构LDM不仅改进了速度和效率还为条件生成提供了一个非常优雅的框架。它引入了一个交叉注意力机制让扩散模型可以接受文本、分割图、深度图、边缘图等各种形式的条件输入。文本被编码成一组向量序列后通过交叉注意力层与潜特征交互模型每个时间步的“注意力焦点”由条件信息引导从而生成的图像在语义上符合文本描述。这是我能理解的Stable Diffusion的工作方式它在训练时会把图像和对应的文字描述一起喂进去让模型学会从“文本条件”“当前噪声状态”逐步还原图像。这个架构最大的优势是通用——换一个条件编码器就能支持新的条件模态比如用姿态骨架控制人物姿势、用深度图控制空间布局。LDM论文在一个很大的视角下做了演示后面ControlNet等社区成果也都是在这个交叉注意力架构上生长出来的。5. 必要条件控制Classifier Guidance与Classifier-Free Guidance5.1 Classifier Guidance的核心思路与局限扩散模型本身学的是无条件分布p(x)也就是“随便生成一张图”。但我们应用时几乎总是需要条件生成比如“一只戴帽子的猫”。最早的做法是用一个额外的分类器来引导采样过程这就是Classifier Guidance。具体来说在反向采样时对于当前时刻的噪声图像除了用去噪网络调整它还要让某个预训练好的图像分类器对当前图像的分类概率达到我们想要的类别并沿着让分类概率增大的方向调整图像。这样扩散模型的每次去噪不仅追求“更像数据”还追求“更符合目标类别”。这个方法在GAN时代也被广泛使用但它有几个明显的痛点。第一你必须额外训练或找到一个可用的分类器而且这个分类器要能处理任意噪声水平的图像普通分类器在这方面效果并不好需要专门在加噪图像上做训练。第二分类器的梯度有时会过于激进把生成结果推向对抗样本式的伪像——图像看起来有人类的形状但纹理和逻辑完全错乱。第三这种引导天然只能支持离散类别比如“猫”或“狗”很难扩展到大范围的自由文本描述。5.2 Classifier-Free Guidance的简洁与强大为了绕过上述问题Classifier-Free GuidanceCFG抛弃了外部分类器把条件直接注入扩散模型本身。思想很直接训练同一个模型既学习无条件生成condition为空也学习条件生成condition为文本然后在采样时把两者的预测结果做加权外推。权重公式是epsilon_guided epsilon_uncond scale * (epsilon_cond - epsilon_uncond)。当scale1时就是纯条件生成scale1时则把“条件与无条件之间的差距”放大。实际操作时可以理解为无条件预测给出了生成内容的“基础倾向”条件预测给出了“符合描述的方向”两者之间的差值就是这个条件带来的增益。放大这个增益生成的图像就会更贴合条件但代价是多样性下降、图像容易出现过度饱和和伪影。CFG在图像生成领域如今是标配几乎所有文生图模型都用它加上一个大于1的权重常见值在3到7.5之间来提升样本与条件的对齐度。我自己的使用经验里一个值得注意的细节是CFG的最优权重和采样步数高度相关。用DDIM采样50步时scale5往往足够换成一个更激进的加速采样器比如DPM-Solver时要适当降低scale否则颜色会溢出、高光区域会发白。5.3 引导参数的实际调优观察CFG的scale并不是越大越好。当scale从3增加到7时图像的语义一致性通常明显提升但一旦超过10图像的对比度上升、边缘变硬、纹理出现油画的过度锐利感。而且条件模棱两可时高scale会放大模型对条件的错误解读把“一只猫”强行理解成“一只像猫的狗”。反过来scale过低接近1生成结果又趋向于忽略条件变成“接近无条件分布的随机生成”。在实践中我倾向于把CFG scale当作一个“内容一致性和多样性之间的旋钮”来理解scale高忠实条件但多样性和自然度下降scale低自然度高但可能跑题。这个旋钮没有一个普适的“最佳值”只能根据任务和模型版本反复试验。另外训练时如果无条件dropout的比例设置不当常见值是10%会导致无条件分支的预测不稳定CFG的效果也会明显变差。这个看似不起眼的dropout率实际上是CFG能不能work的关键超参数之一。6. 新方向Rectified Flow与直线概率路径6.1 从弯曲轨迹到直线轨迹Rectified Flow是近年来的一个新兴方向它的核心思想非常直观既然扩散模型的反向轨迹是一条从噪声到数据的复杂路径能不能把它拉直成一条直线如果轨迹是直线采样就变得极其简单——从噪声点出发沿直线走固定步数每步都是恒定的更新一步到位甚至都能出图。从数学上看扩散模型定义的概率路径一般是一条弯曲的曲线。弯曲意味着轨迹在不同阶段的速度方向不一样模型要学到每个位置该往哪里走。Rectified Flow的思路是用一个更直接的插值构造把数据点x0和噪声点x1线性插值定义一条直线路径然后训练一个网络去学习这个直线路径上的速度场。训练完毕之后采样就是从噪声点开始沿着学习到的速度场走固定几步甚至一步。由于路径基本是直线每一步几乎都指向目标方向所以采样可以非常少而不损失质量。这也是“一步生成模型”研究的重要基础。6.2 蒸馏与重流机制Rectified Flow里还有一个非常有用的“重流”reflow技巧用训练好的速度场做一次确定性生成得到一批噪声生成数据配对然后用这批配对重新训练一个更“直”的速度场模型。这个过程可以迭代每次都会让轨迹更接近直线采样步数进一步减少。我第一次读到reflow时觉得有点绕后来类比成“优秀学生的笔记”第一次训练相当于自己摸索出一条笔记路径路径可能绕来绕去把这条路走通之后再照着这条已经验证过的路走一遍记录下准确的转向点和距离下次就能不走弯路直接奔目标。反复几轮后路径越来越直教学采样效率越来越高。值得一提的是这样的框架还与模型的跨步蒸馏兼容。Rectified Flow并不限定于特定网络结构任何能够输出向量场的模型都可以套用。这也是为什么它在视频生成、音频生成等需要快速采样的场景里受到越来越多的关注。6.3 Rectified Flow、流匹配和扩散的联系严格来说Rectified Flow属于“流匹配”Flow Matching这一大类方法的代表之一。流匹配不再需要严格满足扩散模型的噪声调度和马尔可夫性质而是直接设计一个从噪声到数据的插值路径然后用回归损失学习速度场。扩散模型可以看成一种特殊的流匹配只不过它定义的路径是“逐步加噪再逐步去噪”的曲线。这种视角让整个家族的统一地图又清晰了一片DDPM走的是曲线路径DDIM是对曲线的确定性离散化LDM把路径搬到了潜空间CFG在采样时调整条件权重而Rectified Flow则主动把曲线拉直追求极致采样速度。每一个改进点都非常明确。在实际项目中Rectified Flow最适合的场景是“需要低延迟的生成服务”。比如实时交互式生成或视频流式生成用户不愿意等几十次迭代一步或几步生成就极其珍贵。但与纯质量导向的DDPM/DDIM相比它在非常复杂的分布高度多模态的高分辨率图像上一步生成的质量仍有退化需要配合蒸馏和重流迭代逐步逼近。7. 实操经验从零训练和微调扩散模型的踩坑记录7.1 关键超参数的一手经验说实话理论讲得再多真正动手训练扩散模型时第一个感受往往是“怎么这么不稳定”。下面是我在多个项目里总结出的关键参数经验虽然不是放之四海皆准但能让新人少走很多弯路。训练步数T是一个容易理解但容易被低估的参数。T越大每一步加噪幅度越小模型的任务更精细理论上生成质量更高但训练和采样的开销也同步增加。DDPM论文用1000步是在质量和速度之间找到的平衡点。在低分辨率小数据集比如32×32的CIFAR上500步也能work在256×256以上高分辨率步数太少会让反向去噪每一步的尺度失衡。学习率也需要注意扩散模型通常使用比常规分类模型更小的学习率1e-4级别附近并用Adam优化器。更关键的是如果使用EMA指数移动平均来维护一套模型参数的滑动平均生成质量通常会有明显提升。EMA的衰减系数一般取0.9999左右这会直接决定生成样本的稳定度和细节锐度。很多人只看loss大小却忽略了EMA版本和真实版本在采样上的巨大差异。还有一个冷门但很重要的参数数据归一化。扩散模型的输入和噪声都需要在固定的数值范围内建模一般会把图像像素归一化到[-1, 1]高斯噪声也在同一量级。这个细节看起来不起眼但如果不统一模型在去噪时会出现系统性偏移导致生成的图像整体偏亮或偏暗。7.2 训练不稳定与生成质量差的排查思路新手训练扩散模型最常见的失败模式是loss降了但采样出来的是全噪声或者一片糊。这个问题通常有几个原因。第一网络对时间步t的感知不足。t如果不参与条件化模型无法区分不同噪声水平自然学不到“先恢复轮廓再恢复细节”的阶梯式策略。建议检查t的编码维度是否足够至少要128维以上以及注入方式通常是加权相加进特征图是否生效。第二噪声调度的动态范围失衡。如果调度选择的累积噪声方差在后期增长过快会导致大量训练样本在“几乎全是噪声”的状态下出现模型花太多精力学习无意义的细节。建议画出alpha_bar[t]曲线检查如果在t均匀分布时信息破坏速度不均匀就需要调整。第三采样器的迭代步数过少。这些年在社区里有个很常见的毛病复现时为了快速看效果把步数调低到10步但使用的是纯DDPM采样器结果生成一片乱。要明确一点DDPM在低步数下就是质量差这不是模型没训好而是采样器本身没有做加速优化。遇到这种情况先换DDIM或DPM-Solver验证再回来评估模型。定位这类问题我建议每次实验固定一个“基准采样配置”比如DDIM 50步、CFG scale1图像分辨率用训练分辨率。先确认这个基准能否work再去做加速或调比例的实验这样能极大减少变量混淆带来的迷惑。7.3 评估指标使用的门道训练扩散模型不能只看loss。常用的评估指标是FIDFréchet Inception Distance它衡量生成图像分布和真实图像分布在Inception特征空间上的距离越低越好。但FID的计算有几个明显的坑样本数量太少少于1万时方差很大采样方式随机噪声种子不同会导致FID波动CFG scale也会大幅影响FID所以评估时必须在同一条件下对比。除了FID配合ISInception Score、CLIP Score等指标从不同角度评估必要时还要加人工主观评估。因为FID对“模式塌缩”不够敏感可能生成结果全部相同但FID仍然不错。对于条件生成CLIP Score可以作为语义对齐的参考但它也不完美——有些图像明显错乱CLIP Score反而很高。我自己踩过最大的坑是在10000张生成图上计算FID结果因为某一batch的种子采出了极端值导致FID异常差差点误判一个模型训练失败。后来我改成固定的多组种子取平均值并记录标准差才让评估变得可靠。8. 选型参考不同应用场景怎么选扩散模型家族成员面对这么多变体做项目时该怎么选很多人一开始就想“把SOTA全部用上”但实际工程里最关键的是在效果、速度和资源之间做权衡。我整理一个实操性的选择框架。如果你的目标是高质量离线生成比如做封面图、商品图、科研可视化计算资源相对充足那首选就是LDM加DDIM采样50步配合CFGscale在可接受范围内调高。这种组合兼顾了质量、稳定性和可控性。视频生成或音频生成场景也类似LDM架构在跨模态条件生成上表现得非常稳定。如果你的目标是实时或低延迟场景比如在线编辑工具、实时风格迁移那么需要重点考虑Rectified Flow或进一步蒸馏后的少步采样器。可以先训练一个标准扩散模型再用reflow迭代拉直轨迹最后蒸馏到2到4步。虽然前期训练成本更高但推理时延迟直接降低到接近GAN的水平。如果是研究原型或教学演示最推荐的还是从DDPMMNIST/CIFAR这类小数据开始跑通然后逐渐切换到DDIM、Score-Based、SDE的代码体会不同实现之间的等价性。这样做一遍之后你对所有变体的理解会是几何级提升。另外提一个很多教程没点透的细节现在开源社区有许多高质量的预训练模型Stable Diffusion系列、SDXL等绝大多数时候不需要从零训练。真正需要做的是微调finetuning或基于这些模型的推理管线做适配。这种情况下你重点要掌握的反而不再是模型训练而是采样器、CFG参数、分辨率和条件编码器的设置。不要因为看多了理论就非要自己从零训一个模型——工程上能用现成预训练模型解决就绝不要重复造轮子。9. 最后分享一点实操体会这几年来回折腾扩散模型我的一个很深的体会是理解整个家族的最好方式不是一篇篇看论文而是亲手改一改现有代码中几个关键的变量——把DDPM改成DDIM的采样公式、把普通条件生成改成CFG、把像素空间换成潜空间。每改一次你都会对“为什么论文要这么写”有新的理解。举个例子我第一次把DDPM采样换成DDIM的时候只改了几行代码却发现同样的模型、同样的t生成的图片从模糊变得清晰锐利。那一刻我才真正理解了“马尔可夫链的随机性不是必需的它只是保障分布准确性的充分条件”这句话背后的含义。如果你现在正准备进入这个领域建议选一个小数据集用一个轻量级U-Net完整跑一遍无条件生成的训练和采样。这个过程会让你把所有概念串起来。之后再往上加条件、加加速采样器、加潜空间压缩每一步都扎实落地而不是浮在概念表面。扩散模型的数学看起来门槛高但只要从直觉入手、在代码里反复验证它其实没有想象中那么遥不可及。
返回列表