ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

扩散模型全解析:从DDPM到Rectified Flow的原理与工程实践

扩散模型全解析:从DDPM到Rectified Flow的原理与工程实践 1. 从图像生成说起为什么扩散模型成了主流先聊个直观的问题。在扩散模型火起来之前生成模型的主流方案是GAN。GAN的思路是训练一个生成器和一个判别器互相博弈生成器负责把随机噪声变成图片判别器负责判断图片是真是假。这套思路在当时确实效果惊艳尤其是人脸生成能做到以假乱真的程度。但GAN有个让所有人都头疼的毛病——训练不稳定。生成器和判别器之间的平衡极其脆弱稍有不慎就会模式崩溃生成出来的图片千篇一律或者干脆一片模糊。调参像在走钢丝换个数据集、改个网络结构之前调好的参数可能就全部作废。扩散模型走了一条完全不同的路思路朴素到有点反直觉给图片逐步加噪声直到完全变成纯噪声然后训练一个神经网络学会逐步去噪把纯噪声还原成图片。这个想法其实从2015年就有雏形但真正让它大放异彩的是2020年Ho等人提出的DDPMDenoising Diffusion Probabilistic Models。为什么这条思路能成核心在于它把生成问题拆成了一连串简单的去噪任务每个任务都很好学。就像你让一个人直接回答“12...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{s1}^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压到503.1 非马尔可夫前向过程DDPM最让人头疼的问题是什么采样太慢。生成一张图需要1000次神经网络前向传播动辄几十秒。DDIMDenoising 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_{t1} 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-SDEVariance Exploding SDE噪声方差随时间单调增大到很大值。公式中 (g(t)) 很大前向过程中样本的方差不断爆炸。早期的Score-Based模型采用这种方案采样时能够覆盖较大的数据空间但对噪声调度比较敏感。VP-SDEVariance Preserving SDE噪声方差始终有限因为数据在加噪的同时被不断缩小。这正是DDPM采用的策略前向过程中 (\bar{\alpha}_t) 控制了方差所以DDPM是VP-SDE的一个特例。这两者的选择直接影响训练和采样的稳定性。从业界的实践来看VP-SDE是更主流的方案Stable Diffusion系列模型也延续了这一思路。5. 从像素空间到潜在空间LDM为什么让扩散模型“飞入寻常百姓家”5.1 为什么不能在原始像素上硬扛扩散模型想在像素空间直接生成高清图像计算代价太惊人了。以1024x1024的RGB图为例就直接有300多万维的数据。U-Net在每一层都要对这些高维特征做卷积和注意力运算训练和推理的内存开销和耗时都不现实。这也是早期扩散模型只能跑在64x64小图上的原因。那么问题来了能不能把图像压缩到一个更低维的空间在这个空间里做扩散再解码回高分辨率图像这就是LDMLatent 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)”的实验——(f4) 时即图像缩小4倍质量与像素空间扩散基本持平但计算量大幅下降(f16) 时速度更快但细节损失明显。我自己测试时Stable Diffusion v1系列用的就是 (f8) 的编码器在“质量—速度”之间取了一个比较稳的平衡点。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 GuidanceCFG一举解决了上面的问题。它的核心思想非常有意思用同一个扩散模型同时学习“有条件生成”和“无条件生成”。训练时以一定概率常见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) 不是越大越好。我试过 (w15) 以上图像会出现过度饱和、细节过锐的问题就像被“用力过猛”了一样。另外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的解法是先走一条可用的曲线路径再从这个路径中学习一条更直的路径迭代“矫正”。具体流程大致是这样的从数据分布 (\pi_1) 中采样 (x_1)从噪声分布 (\pi_0) 中采样 (x_0)。定义线性插值路径(x_t t x_1 (1 - t) x_0)其中 (t \in [0, 1])。训练一个神经网络 (v_\theta(x_t, t)) 来拟合该插值路径的“速度场” (\dot{x}_t x_1 - x_0)。训练完成后用训练好的模型重新生成一批“噪声—数据”配对这些配对生成的轨迹会比原来的轨迹更直。重复上述流程逐步矫正路径的弯曲程度。这里的直觉可以这样理解如果一条路径上某个时刻的预测方向与真实端点方向不一致就说明路径在拐弯。矫正过程会让下一轮配对的轨迹尽量沿着“预测方向就能直达端点”的方向走从而逐渐逼近直线。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的大源码按照下面的顺序走一遍先手动实现一遍DDPM的训练在MNIST或CIFAR-10上跑通。重点理解前向过程的 (x_t \sqrt{\bar{\alpha}_t} x_0 \sqrt{1 - \bar{\alpha}t} \epsilon) 和损失函数 (L{\text{simple}})。这一步能让你建立最直观的“去噪生成”概念。把DDPM训练好的模型接到DDIM采样器上体会采样步数减少对质量的影响。你会发现代码改动非常小但速度提升明显。读一遍SDE框架的推导把DDPM和Score-Based的身份关系理清。不要被公式吓到核心就是一句话所有加噪过程都可以写成 (dx fdt gdW)反向过程就是沿着分数走。实现一个简化版LDM在低分辨率数据集上体验潜在空间压缩带来的加速。重点理解感知自编码器的重建质量与潜在空间平滑度之间的权衡。在已有模型上跑CFG采样调整 (w) 观察生成质量与多样性的变化。这一步能让你对“引导强度”有非常直观的体会。最后看Rectified Flow理解“直线化”的意义。这一步对理解最新模型架构很有帮助但不需要从零实现。8.3 我踩过的坑最后分享几个实操中容易踩的坑都是我自己亲身经历过的。第一个坑是训练时忘记对输入做归一化。扩散模型的输入需要归一化到 ([-1, 1]) 区间否则加噪公式中的方差调度完全不对训练发散得莫名其妙。很多人第一版代码跑不出来十有八九是这个原因。第二个坑是时间嵌入的位置。U-Net里的时间步嵌入如果放在比较靠后的层或者只有一部分层接收训练效果会显著恶化。经验做法是每层都注入或者至少在每个block的输入处注入。第三个坑是采样时CFG的输入不一致。做CFG时条件和无条件的输入必须保持同一个 (x_t)只是条件输入不同。有些实现为了省事把两次前向放在不同的batch里虽然 (x_t) 相同但BN层如果有的统计量会不一致导致效果变差。现在的主流实现基本都用GroupNorm这个坑已经很少见了但换到老代码时还是要留意。第四个坑是关于FID评估的采样用的随机种子和采样步数会显著影响FID结果。评估时不要只用一两个种子至少用几十个种子跑均值。否则你辛苦调的参数可能在某个种子上表现得很好换一个种子就露馅了。这个领域这几年变化极快从DDPM到Rectified Flow感觉每半年就有一轮大更新。但核心的底层逻辑一直没变设计一个前向破坏过程、训练一个反向恢复过程、想办法让恢复过程更快更准。把这几个要点理解扎实无论后续冒出什么新方法你都能快速抓住它到底改动了哪一环。
返回列表