扩散模型全解析:从DDPM到Rectified Flow的原理与工程实践
2026/9/9 22:12:11 网站建设 项目流程

1. 从图像生成说起:为什么扩散模型成了主流

先聊个直观的问题。在扩散模型火起来之前,生成模型的主流方案是GAN。GAN的思路是训练一个生成器和一个判别器互相博弈,生成器负责把随机噪声变成图片,判别器负责判断图片是真是假。这套思路在当时确实效果惊艳,尤其是人脸生成,能做到以假乱真的程度。但GAN有个让所有人都头疼的毛病——训练不稳定。生成器和判别器之间的平衡极其脆弱,稍有不慎就会模式崩溃,生成出来的图片千篇一律,或者干脆一片模糊。调参像在走钢丝,换个数据集、改个网络结构,之前调好的参数可能就全部作废。

扩散模型走了一条完全不同的路,思路朴素到有点反直觉:给图片逐步加噪声,直到完全变成纯噪声,然后训练一个神经网络学会逐步去噪,把纯噪声还原成图片。这个想法其实从2015年就有雏形,但真正让它大放异彩的是2020年Ho等人提出的DDPM(Denoising Diffusion Probabilistic Models)。

为什么这条思路能成?核心在于它把生成问题拆成了一连串简单的去噪任务,每个任务都很好学。就像你让一个人直接回答“1+2+...+100等于多少”很难,但如果分解成一步步的加法,每一步都很简单。更重要的是,扩散模型的训练目标有明确的数学依据——最大化对数似然的变分下界,这意味着训练过程极其稳定,不需要对抗博弈,不会有模式崩溃。

到了2021年、2022年,扩散模型的地位基本确立了。DDIM解决了采样速度问题,Score-Based和SDE框架统一了各种变体,LDM让扩散模型能在消费级显卡上跑起来,Classifier-Free Guidance则让文本控制生成变得简单可靠。再到后来的Rectified Flow,进一步把采样步数压到了个位数甚至一步。可以说,今天你看到的所有主流图像生成应用——Stable Diffusion、Midjourney、DALL·E,底层都是这批技术堆起来的。

这篇内容适合两类人:一类是刚接触扩散模型,想系统搞懂原理的初学者;另一类是已经跑过一些代码,但对各种变体之间的关系还比较模糊,想理清技术脉络的开发者。我会从最基础的DDPM讲起,一路串到最新的Rectified Flow,把每个方法的数学直觉、设计动机和工程实现都过一遍。

2. DDPM:一次把“加噪—去噪”讲透

2.1 前向过程:把数据搞坏的艺术

DDPM的第一步是前向扩散过程,也叫加噪过程。这个过程的设计很巧妙:给定一张干净的图片 (x_0),我们按照一个固定的方差调度,逐步往里面添加高斯噪声,生成一系列逐渐模糊、越来越嘈杂的中间状态 (x_1, x_2, ..., x_T)。

这里要特别注意,这个过程是无参数的——不需要学习任何东西,就是一个固定的马尔可夫链。每一步的转移公式为:

[ q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t \mathbf{I}) ]

其中 (\beta_t) 是预先设定的噪声方差,通常从 (10^{-4}) 线性增加到 (0.02)。意思是,每一步都把上一步的图片稍微缩小一点(乘以 (\sqrt{1 - \beta_t})),然后加上一点高斯噪声。随着步数增加,图片的“信号”越来越弱,“噪声”占比越来越大,最终 (x_T) 近似标准高斯噪声。

这个公式看着简单,但它有一个非常方便的性质——任意一步的 (x_t) 可以直接从 (x_0) 算出来,不需要一步一步迭代。用重参数化技巧,定义 (\alpha_t = 1 - \beta_t),(\bar{\alpha}t = \prod{s=1}^t \alpha_s),那么:

[ q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1 - \bar{\alpha}_t) \mathbf{I}) ]

也就是说,(x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon),其中 (\epsilon \sim \mathcal{N}(0, \mathbf{I}))。

这个公式是整个DDPM训练的基石。训练时我们不需要模拟完整的前向过程,只需要随机采样一个时间步 (t),用这个公式直接计算出 (x_t),然后让网络去预测噪声 (\epsilon)。因为可以直接跳跃到任意时间步,训练效率大幅提升。

2.2 反向过程:学习“倒放”的神经网络

前向过程把图片一步步加噪破坏掉,反向过程就是把噪声一步步还原成图片。这个反向过程同样是一个马尔可夫链,但每一步的转移概率 (p_\theta(x_{t-1} | x_t)) 是未知的,需要用一个神经网络来拟合。

关键问题是:这个网络要预测什么?原论文选择预测噪声 (\epsilon_\theta(x_t, t))。为什么不直接预测 (x_{t-1})?因为计算 (p_\theta(x_{t-1} | x_t)) 时,如果每个时间步的转移分布方差 (\beta_t) 足够小,这个条件概率可以近似为一个高斯分布:

[ p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t)) ]

经过一系列推导(细节可以看原论文,这里讲直觉),最优均值 (\mu_\theta) 可以通过网络预测的噪声 (\epsilon_\theta) 来表达:

[ \mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}t}} \epsilon\theta(x_t, t) \right) ]

方差 (\Sigma_\theta) 一般不用学习,直接使用固定的 (\beta_t) 或者 (\tilde{\beta}t)。于是反向采样的过程就是:从纯噪声 (x_T \sim \mathcal{N}(0, \mathbf{I})) 出发,用这个公式逐步计算 (x{t-1}),迭代 (T) 次,最终得到 (x_0)。

训练目标则变得非常简洁——不再是复杂的变分下界推导,而是直接最小化预测噪声与真实噪声之间的均方误差:

[ L_{\text{simple}} = \mathbb{E}{t, x_0, \epsilon} \left[ | \epsilon - \epsilon\theta(x_t, t) |^2 \right] ]

这个损失函数形似去噪自编码器,但它的威力远超想象。我在实际跑实验时体会最深的一点是:这个目标函数把“图像生成”这个抽象任务,转化成了“在多个噪声尺度上做去噪”这个非常具体的任务,训练一个U-Net就能稳定收敛。

2.3 训练细节与实现要点

DDPM的网络结构通常采用U-Net,带时间嵌入。时间步 (t) 通过正弦位置编码变成一个向量,再经过几个全连接层,通过加法和注意力机制注入到网络的每一层。这是实现细节里的关键点——如果不做时间嵌入,网络无法区分不同噪声程度的图像。

训练时有一个经验值:不要在每个batch里固定同一个 (t),而是对每张图随机采样一个 (t),这样能让网络在所有时间步上都得到充分的训练。实验上,我习惯把 (T) 设成1000步。步数太少,反向过程中每一步的去噪跨度太大,高斯假设不成立;步数太多,训练和采样的计算成本都会上升,但质量提升逐渐饱和。

提示:DDPM训练是可以从零开始的,不用预训练。但训练过程中要注意监控不同时间步的损失分布。我遇到过一种情况:大噪声阶段((t) 接近 (T))的损失先下降,小噪声阶段((t) 接近0)的损失滞后,这是因为网络倾向于先学会“粗去噪”、再学“精修细节”。如果希望细节恢复得更快,可以对损失按时间步加权,但这属于实验性调优了。

3. DDIM:把采样步数从1000压到50

3.1 非马尔可夫前向过程

DDPM最让人头疼的问题是什么?采样太慢。生成一张图需要1000次神经网络前向传播,动辄几十秒。DDIM(Denoising Diffusion Implicit Models)就是在不重新训练模型的前提下,把采样步数减少到原来的1/10到1/20。

DDIM的关键洞察是:DDPM的训练目标只依赖于边缘分布 (q(x_t | x_0)),根本不依赖马尔可夫链的每一步转移。既然这样,我们可以设计一个完全不同的前向过程——不需要一步一步加噪,只要保证每个 (x_t) 都满足 (q(x_t | x_0)) 的分布就行。这相当于在固定边缘分布的情况下,把前向过程从马尔可夫链变成了一系列独立的条件分布,允许我们重新推导反向采样公式。

经过推导,DDIM得到一个更灵活的采样公式:

[ x_{t-1} = \sqrt{\bar{\alpha}{t-1}} \left( \frac{x_t - \sqrt{1 - \bar{\alpha}t} \epsilon\theta}{\sqrt{\bar{\alpha}t}} \right) + \sqrt{1 - \bar{\alpha}{t-1} - \sigma_t^2} \epsilon\theta + \sigma_t z ]

当 (\sigma_t = 0) 时,采样过程完全确定——给定初始噪声 (x_T),整条采样轨迹被唯一确定,不会引入新的随机性。这就是DDIM的确定性采样。此时整个反向过程变成了一条从噪声到数据的确定性映射,这让扩散模型在采样时有了GAN那样的可控性。

3.2 为什么“跳步”采样也可以

DDIM的另一个重要性质是它支持跳步采样。由于前向过程不再是必须逐步进行的马尔可夫链,我们可以在采样时每隔几步才计算一次,比如从 (T) 到0只取50个子序列 ({ \tau_1, \tau_2, ..., \tau_S }),然后按这个子序列做反向迭代。

采样次数降低后为什么效果还能保持?直觉上可以这样理解:DDPM把加噪过程分成了1000步,但相邻两步之间的变化其实很细微,网络每次学到的去噪量也很小。如果这个任务本质上是平滑的,那我们完全可以用更粗的粒度去采样,只要每一步的去噪跨度在网络的“舒适区”内。DDPM原始论文也提到过,采样时每5步取一次,质量几乎不降。

在工程实现上,DDIM采样不需要改变训练过程——直接加载DDPM训练好的权重,换一个采样器即可。这也是DDIM最讨喜的地方:零成本提速。

我实际测试过,在ImageNet 256x256上,DDIM用50步采样生成的FID分数与DDPM 1000步相当,而速度提升约20倍。如果进一步压到10步,图像会出现轻微的结构模糊,但整体形状仍然是可信的。

3.3 一步到位的极限在哪

DDIM的确定性采样带来了一个有意思的推论:如果整个采样过程是确定性的,那我们可以把它看成从 (x_T) 到 (x_0) 的某种隐空间变换。可是问题来了——这种变换是高度非线性的、复杂的,单步跳跃很难精确完成。在实际中,DDIM把采样步数压到10以下时,质量会明显下降。

这就引出了Rectified Flow要解决的问题:能不能让这个变换路径尽可能直线化,让大步长甚至一步采样也能保持质量?这个后文再展开。

4. Score-Based与SDE:统一背后的数学语言

4.1 从分数匹配到朗之万采样

在DDPM出现的同一时期,另一个流派也在研究扩散——Score-Based Generative Models。它的思路不是预测噪声,而是学习数据的分数函数(score function),即对数似然关于输入的梯度:(\nabla_x \log p(x))。这个梯度告诉我们:要让某个样本更符合数据分布,应该往哪个方向调整。

学习分数的目标函数是分数匹配(score matching):

[ \mathbb{E}{p(x)} \left[ | s\theta(x) - \nabla_x \log p(x) |^2 \right] ]

直接计算需要知道真实分数,但Song等人提出的去噪分数匹配(Denoising Score Matching)让这个目标变得可操作:对数据加噪后,分数函数的估计可以简化为“预测噪声”的形式——这一步让Score-Based方法和DDPM在数学上建立了深刻联系。

有了分数函数之后,怎么生成样本?经典方案是朗之万动力学采样(Langevin Dynamics):

[ x_{t+1} = x_t + \frac{\eta}{2} \nabla_x \log p(x_t) + \sqrt{\eta} z_t ]

意思是,沿着分数方向(也就是朝着数据概率增大的方向)走一步,同时加上一点随机扰动避免陷入局部最优。理论上,当步长 (\eta) 足够小、迭代次数足够多时,这个过程收敛到数据分布。

4.2 SDE视角:DDPM是SDE的一个特例

如果你对比DDPM和Score-Based,可能会觉得两套框架长得不太一样。但Song等人的里程碑论文《Score-Based Generative Modeling through Stochastic Differential Equations》指出:两者其实是同一个框架的不同实现

核心思想是:把加噪过程看成连续时间上的随机过程,用随机微分方程(SDE)来描述:

[ dx = f(x, t) dt + g(t) dW ]

这里 (f(x, t)) 是漂移项,决定数据的衰减方向;(g(t)) 是扩散系数,决定噪声的加入速率;(dW) 是维纳过程(连续时间上的随机游走)。DDPM和Score-Based的不同加噪方式,都可以写成这个SDE的形式,区别只在于 (f) 和 (g) 的具体选择。

反向过程也有一个对应的反向SDE:

[ dx = [f(x, t) - g(t)^2 \nabla_x \log p_t(x)] dt + g(t) dW ]

公式中只比前向多了一个分数项。这意味着我们只需要学习分数函数,就可以执行反向SDE,从噪声中逐步还原出数据。

这里还有一个重要的性质:反向SDE中,如果把随机项去掉,只剩确定性部分,就得到了概率流常微分方程(Probability Flow ODE)

[ dx = [f(x, t) - \frac{1}{2} g(t)^2 \nabla_x \log p_t(x)] dt ]

这个ODE和反向SDE有着相同的边缘分布,却是一个确定性过程。DDIM采样本质上就是概率流ODE的一种离散化形式。所以你看,DDIM、Score-Based、SDE,它们在这个统一视角下变得非常清晰:都是先学习“把噪声还原成数据的方向”,再用不同的离散化策略走完这条路径。

4.3 VE-SDE和VP-SDE

在实际应用中,有两个具体的SDE值得单独说,它们对应不同的噪声调度方式:

  • VE-SDE(Variance Exploding SDE):噪声方差随时间单调增大到很大值。公式中 (g(t)) 很大,前向过程中样本的方差不断爆炸。早期的Score-Based模型采用这种方案,采样时能够覆盖较大的数据空间,但对噪声调度比较敏感。

  • VP-SDE(Variance Preserving SDE):噪声方差始终有限,因为数据在加噪的同时被不断缩小。这正是DDPM采用的策略(前向过程中 (\bar{\alpha}_t) 控制了方差),所以DDPM是VP-SDE的一个特例。

这两者的选择直接影响训练和采样的稳定性。从业界的实践来看,VP-SDE是更主流的方案,Stable Diffusion系列模型也延续了这一思路。

5. 从像素空间到潜在空间:LDM为什么让扩散模型“飞入寻常百姓家”

5.1 为什么不能在原始像素上硬扛

扩散模型想在像素空间直接生成高清图像,计算代价太惊人了。以1024x1024的RGB图为例,就直接有300多万维的数据。U-Net在每一层都要对这些高维特征做卷积和注意力运算,训练和推理的内存开销和耗时都不现实。这也是早期扩散模型只能跑在64x64小图上的原因。

那么问题来了:能不能把图像压缩到一个更低维的空间,在这个空间里做扩散,再解码回高分辨率图像?这就是LDM(Latent Diffusion Models,潜在扩散模型)的核心思路。它的关键观察是:图像的“感知细节”(纹理、颜色、边缘)与“语义结构”(物体形态、布局)可以分离。我们不需要在像素空间逐点建模,只需在一个小得多的潜在空间中建模语义结构,感知细节交给一个专门的解码器去还原。

5.2 两阶段架构:自编码器 + 扩散模型

LDM的架构分两个阶段。

第一阶段是训练一个感知压缩自编码器。编码器 (\mathcal{E}) 把图像 (x) 压缩成潜在表示 (z = \mathcal{E}(x)),解码器 (\mathcal{D}) 再把 (z) 还原成图像 (\tilde{x} = \mathcal{D}(z))。这个自编码器的训练目标是让 (\tilde{x}) 在感知上和原图 (x) 不可区分,而不是逐像素完全一致。你能想象,把一张512x512的图像压缩成64x64x4的潜在空间,信息量减少了48倍,重建时人眼看不出明显区别——靠的就是感知损失和对抗损失组合。

第二阶段是在潜在空间里训练一个扩散模型。前向过程对 (z) 加噪,反向过程学习去噪。生成时从随机噪声 (z_T) 出发,经过扩散模型的去噪采样得到 (z_0),再通过解码器 (\mathcal{D}) 得到最终图像。

这里要注意,潜在空间不是完美的。如果压缩率太大,微小细节会丢失;压缩率太小,又达不到降计算的效果。LDM论文里专门提到了“降采样因子 (f)”的实验——(f=4) 时(即图像缩小4倍)质量与像素空间扩散基本持平,但计算量大幅下降;(f=16) 时速度更快但细节损失明显。我自己测试时,Stable Diffusion v1系列用的就是 (f=8) 的编码器,在“质量—速度”之间取了一个比较稳的平衡点。

5.3 条件机制:文本如何控制生成

扩散模型本身只擅长从噪声生成图片,但用户要的是“让一只穿宇航服的柯基坐在沙发上”。这就需要一个条件机制,把文本、语义等信息注入到生成的每一步。

LDM采用的方式很直接:用交叉注意力机制将文本特征嵌入到U-Net的每一层。假设文本编码器输出特征序列 (\tau_\theta(y)),那么在U-Net的注意力层里:

[ \text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^T}{\sqrt{d}} \right) V ]

其中 (Q) 来自图像特征,(K) 和 (V) 来自文本特征。这样每一层都能参考文本信息来决定“怎么去噪”——哪里画一顶宇航员头盔、哪里画一只柯基的耳朵。

文本编码器选什么也有讲究。LDM原论文用了CLIP的文本编码器,因为它把文本映射到了与图像对齐的语义空间,条件控制效果比光用语言模型好很多。如今的主流方案基本都延续了这个架构:语言模型负责理解文本语义,交叉注意力负责把语义“画”进图像。

6. Guidance:让生成结果更听话

6.1 早期探索:Classifier Guidance

在无条件的扩散模型里,生成什么内容完全由随机噪声决定——你没法控制。最早的解决方案是Classifier Guidance,思路很朴素:在采样时额外用一个图像分类器来引导。

具体来说,反向采样的每一步,除了按照去噪方向走,还要沿着分类器梯度的方向走。如果想让模型生成类别 (y),就把梯度 (\nabla_{x_t} \log p_\phi(y | x_t)) 加到采样过程中,并且用一个超参数 (s)(guidance scale)控制强度:

[ \nabla_{x_t} \log p_\theta(x_t | y) = \nabla_{x_t} \log p_\theta(x_t) + s \cdot \nabla_{x_t} \log p_\phi(y | x_t) ]

直觉是:在去噪的同时,持续把样本往“分类器认为属于类别 (y)”的方向推。(s) 越大,生成结果与类别标签的一致性越强,但多样性会下降。

老问题出在哪?必须额外训练一个分类器,而且这个分类器要在噪声图像上工作——对加噪程度不同的 (x_t) 都要分类准确,这本身就是个苦差事。更麻烦的是,分类器会带来对抗性样本式的干扰,引导过强时图像失真严重。

6.2 Classifier-Free Guidance:不用分类器的控制手段

2022年,Ho与Salimans提出了Classifier-Free Guidance(CFG),一举解决了上面的问题。它的核心思想非常有意思:用同一个扩散模型,同时学习“有条件生成”和“无条件生成”

训练时,以一定概率(常见10%~20%)随机丢弃条件输入 (y),让网络既学会 (p_\theta(x_t | y)),又学会 (p_\theta(x_t))。采样时,把两者的分数做一个外推:

[ \tilde{\epsilon}\theta(x_t, t, y) = \epsilon\theta(x_t, t) + w \cdot [\epsilon_\theta(x_t, t, y) - \epsilon_\theta(x_t, t)] ]

当 (w = 0) 时就是无条件生成;(w > 1) 时,网络被强制放大“有条件和无条件之间的差异”,也就是更严格地按照条件来生成。实际使用中,(w) 取7~8效果通常最好,结果在“忠于提示词”和“图像自然度”之间比较平衡。

CFG最大的优势是不需要额外的分类器,训练、部署都简单得多。它也因此成为几乎所有现代文生图模型(包括Stable Diffusion全系列)标配的采样策略。

实操注意:CFG的强度 (w) 不是越大越好。我试过 (w=15) 以上,图像会出现过度饱和、细节过锐的问题,就像被“用力过猛”了一样。另外,CFG会增加采样时间,因为每个采样步需要跑两次网络(一次带条件、一次不带条件)。在实时推理场景下,这是一个不可忽视的开销。

7. Rectified Flow:把弯弯绕绕的生成路径拉直

7.1 为什么生成路径越直越好

让我们回到DDIM确定性采样的图景:从初始噪声 (x_0)(这里的0指初始时间)到最终图像 (x_1),模型要走一条从噪声分布到数据分布的路。这条路径由概率流ODE决定,它往往是弯曲的、非线性的。

路径弯曲有什么坏处?ODE数值求解时,步长越大步长误差越大。路径越弯,需要的离散步数越多,否则就会“抄近道”产生误差。想象一下,你要从北京开车到上海,如果走直线高速公路,中间只用几个服务区就能到达;如果弯弯绕绕走山路,每隔几百米就得重新看地图、调整方向。

所以一个很自然的想法浮出水面:如果能把生成过程的路径设计成直线,那采样时用大步长甚至单步跳过去,误差也会很小。Rectified Flow正是沿着这个思路展开的。

7.2 直线路径的构建方式

Rectified Flow的理想方案是找到一个从噪声分布 (\pi_0) 到数据分布 (\pi_1) 的确定性映射,并且这个映射对应一条直线轨迹

问题在于:噪声分布到数据分布之间,可以有无数种配对方式。随机采样一个噪声和一个数据,它们之间连一条线——但这样连出来的轨迹是交叉的、杂乱无章的,并不适合做生成。Rectified Flow的解法是:先走一条可用的曲线路径,再从这个路径中学习一条更直的路径,迭代“矫正”

具体流程大致是这样的:

  1. 从数据分布 (\pi_1) 中采样 (x_1),从噪声分布 (\pi_0) 中采样 (x_0)。
  2. 定义线性插值路径:(x_t = t x_1 + (1 - t) x_0),其中 (t \in [0, 1])。
  3. 训练一个神经网络 (v_\theta(x_t, t)) 来拟合该插值路径的“速度场” (\dot{x}_t = x_1 - x_0)。
  4. 训练完成后,用训练好的模型重新生成一批“噪声—数据”配对,这些配对生成的轨迹会比原来的轨迹更直。
  5. 重复上述流程,逐步矫正路径的弯曲程度。

这里的直觉可以这样理解:如果一条路径上,某个时刻的预测方向与真实端点方向不一致,就说明路径在拐弯。矫正过程会让下一轮配对的轨迹尽量沿着“预测方向就能直达端点”的方向走,从而逐渐逼近直线。

7.3 Rectified Flow与蒸馏的关系

如果你之前了解过扩散模型的蒸馏技术(比如Progressive Distillation、Consistency Models),可能会发现Rectified Flow和它们在目标上非常相似——都是为了减少采样步数。但它们路线不同:蒸馏是在训练好的扩散模型上做“知识转移”,把多步采样的能力浓缩到少步采样上,而Rectified Flow是从数据配对的源头调整路径几何,让模型本身学习一条“容易采样”的路径。

实际应用中,两者经常结合使用。先训练一个Rectified Flow模型得到较直的轨迹,再做一轮蒸馏把两到四步的采样能力进一步压缩到一步。业界主流的新生代图像模型(如Stable Diffusion 3背后的MMDiT架构)已经在广泛采用这类思路。

让我用一个直观的比喻收束这一节:Rectified Flow相当于修了一条从噪声直达图像的高速公路,采样步数就是沿途的服务区数量。路修直了,服务区少几个也无所谓,一脚油门就到终点。

8. 关键对比总结与新手的训练顺序

8.1 一张表看懂各种方法的关系

方法核心思想采样特点主要优势典型应用场景
DDPM逐步加噪、逐步去噪1000步,随机采样训练稳定,原理清晰学术研究、质量优先
DDIM非马尔可夫前向,确定性采样10~50步,确定性采样快,可复现实践部署、批量生成
Score-Based学习分数函数,朗之万采样数百步数学框架统一理论推导
SDE连续时间扩散,统一DDPM与Score数百步统一视角理论研究
LDM在潜在空间做扩散50步左右计算高效,支持条件控制文生图产品
Classifier Guidance训练分类器引导数十步条件控制准确旧方案
CFG条件/无条件联合训练,采样时外推数十步简单可靠,效果稳定几乎所有文生图模型
Rectified Flow矫正轨迹为直线1~8步极少步数保持质量高速推理

8.2 给新手的推荐学习路径

如果你准备进入这个领域,我的建议是不要一上来就啃LDM的大源码,按照下面的顺序走一遍:

  1. 先手动实现一遍DDPM的训练,在MNIST或CIFAR-10上跑通。重点理解前向过程的 (x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}t} \epsilon) 和损失函数 (L{\text{simple}})。这一步能让你建立最直观的“去噪生成”概念。

  2. 把DDPM训练好的模型接到DDIM采样器上,体会采样步数减少对质量的影响。你会发现代码改动非常小,但速度提升明显。

  3. 读一遍SDE框架的推导,把DDPM和Score-Based的身份关系理清。不要被公式吓到,核心就是一句话:所有加噪过程都可以写成 (dx = fdt + gdW),反向过程就是沿着分数走。

  4. 实现一个简化版LDM,在低分辨率数据集上体验潜在空间压缩带来的加速。重点理解感知自编码器的重建质量与潜在空间平滑度之间的权衡。

  5. 在已有模型上跑CFG采样,调整 (w) 观察生成质量与多样性的变化。这一步能让你对“引导强度”有非常直观的体会。

  6. 最后看Rectified Flow,理解“直线化”的意义。这一步对理解最新模型架构很有帮助,但不需要从零实现。

8.3 我踩过的坑

最后分享几个实操中容易踩的坑,都是我自己亲身经历过的。

第一个坑是训练时忘记对输入做归一化。扩散模型的输入需要归一化到 ([-1, 1]) 区间,否则加噪公式中的方差调度完全不对,训练发散得莫名其妙。很多人第一版代码跑不出来,十有八九是这个原因。

第二个坑是时间嵌入的位置。U-Net里的时间步嵌入如果放在比较靠后的层,或者只有一部分层接收,训练效果会显著恶化。经验做法是每层都注入,或者至少在每个block的输入处注入。

第三个坑是采样时CFG的输入不一致。做CFG时,条件和无条件的输入必须保持同一个 (x_t),只是条件输入不同。有些实现为了省事把两次前向放在不同的batch里,虽然 (x_t) 相同,但BN层(如果有)的统计量会不一致,导致效果变差。现在的主流实现基本都用GroupNorm,这个坑已经很少见了,但换到老代码时还是要留意。

第四个坑是关于FID评估的:采样用的随机种子和采样步数会显著影响FID结果。评估时不要只用一两个种子,至少用几十个种子跑均值。否则你辛苦调的参数可能在某个种子上表现得很好,换一个种子就露馅了。

这个领域这几年变化极快,从DDPM到Rectified Flow,感觉每半年就有一轮大更新。但核心的底层逻辑一直没变:设计一个前向破坏过程、训练一个反向恢复过程、想办法让恢复过程更快更准。把这几个要点理解扎实,无论后续冒出什么新方法,你都能快速抓住它到底改动了哪一环。

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

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

立即咨询