资讯动态

分数匹配与NCSN:多噪声尺度扩散模型图像生成原理

发布时间:2026/10/27 15:10:05 来源:尧图企业网站定制
第一次翻开 NCSN 这篇工作时我盯着训练目标里的那个 $-\varepsilon/\sigma$ 看了很久心里只有一个疑问估计一个梯度为什么非得往干净图像上撒噪声后来把分数匹配的推导从头推了一遍才明白NCSN 里那些看起来反直觉的设计——多噪声尺度、$\sigma^2$ 加权、退火采样——没有一个是拍脑袋拍出来的每一步都是被前一步逼出来的。这篇就按我当时的理解路径把扩散模型在图像生成这条线上最关键的这块地基拆开讲分数匹配到底在拟合什么去噪分数匹配为什么能把不可解的目标变成可解NCSN 又为什么必须用一整个噪声序列而不是一个 $\sigma$。这篇偏理论但不会写成公式搬运。我尽量把每个式子的动机、代价和工程后果都说清楚适合已经跑过基础图像生成模型、想把底层逻辑打通的人看如果你只是想知道怎么调参最后一章也够用。前置知识其实不多懂点概率密度、懂反向传播、知道朗之万采样长什么样就行剩下的都能在正文里补齐。1. 从我们需要什么倒推分数函数与朗之万动力学1.1 归一化常数这道坎把生成模型逼到了另一条路先说清楚为什么绕开概率密度本身。任何一个生成模型要建模 $p_{data}(x)$绕不开的是把分布归一化$p_\theta(x) \frac{\exp(-E_\theta(x))}{Z(\theta)}$而 $Z(\theta) \int \exp(-E_\theta(x))dx$ 这个积分在高维空间里基本算不出来。能量模型、对比散度、各种采样近似本质上都在跟这个 $Z$ 搏斗。图像维度动辄几万到几十万这个积分没有任何解析希望数值近似的代价又高得离谱。分数函数 $s(x) \nabla_x \log p(x)$ 的好处在这里就显出来了对数把乘积变成加法$\log p_\theta(x) -E_\theta(x) - \log Z(\theta)$而 $Z$ 与 $x$ 无关求梯度时直接消失。也就是说你不需要知道分布的绝对高度只需要知道每个位置往哪个方向走密度会变大。这就像在山里找路你不需要知道每座山峰的绝对海拔只需要知道脚下哪边是上坡。这个性质让分数函数天然免疫归一化常数的困扰。我一般用这个类比跟新人解释密度函数是一张完整的等高线地图分数函数则是在地图上任意一点插一支箭头指向最近的上坡方向。你丢掉的是这里海拔多少的信息保留的是该往哪走的信息而采样这件事恰恰只需要后者。1.2 朗之万动力学只要梯度就能采样有了分数函数采样就有了一个非常朴素的算法——朗之万动力学。它的离散形式是$$x_{t1} x_t \frac{\epsilon}{2}\nabla_x \log p(x_t) \sqrt{\epsilon}, z_t, \quad z_t \sim \mathcal{N}(0, I)$$这个东西的结构值得拆开看。前一项是确定性漂移沿着密度上升的方向走把粒子往高密度区域推后一项是随机扰动防止粒子卡在局部极值里出不来同时决定了最终样本分布的温度。$\epsilon$ 趋于 0、迭代步数趋于无穷时这个过程的平稳分布就是 $p(x)$这一点有严格的结论支撑。实际用的时候当然取不到极限$\epsilon$ 就是步长步数就是迭代次数。这里有个非常重要的工程含义采样质量和步长、步数是强耦合的。步长太大粒子会在高密度区域来回跳样本精度差步长太小混合速度慢几百步下来还在原地打转。这个矛盾在 NCSN 里被退火这个设计巧妙地化解了后面第 5 章会展开讲。真正的问题在于式子里那个 $\nabla_x \log p(x_t)$ 我们并不知道。数据分布的真实分数无从获得只能用一个参数化网络 $s_\theta(x)$ 去逼近它。于是整个任务就变成了在没有真实分数标签的情况下怎么训练这个网络。这就是分数匹配要解决的事。1.3 一个容易忽略的前提流形假设在往下讲之前必须先把流形假设摆出来因为 NCSN 的多尺度设计完全是围着它转的。真实图像数据并不是均匀铺满整个像素空间的它集中在一个低维流形附近——自然图像的像素之间有极强的相关性你随机撒一堆像素点几乎必然得到一张雪花噪声图而不是猫或狗。这个事实带来一个致命后果在流形之外密度近似为 0$\log p(x)$ 趋于 $-\infty$分数函数没有良好定义。而朗之万采样的初始点通常是随机采的它大概率落在流形外。如果只有流形上的分数粒子根本得不到任何有意义的牵引方向采样直接失效。我第一次意识到这个问题是在一个二维玩具实验里数据是两条相交的细线分布极其集中。用单尺度分数匹配训出来的网络在线上附近表现完美一离开线就开始乱指采样出来的点散成一片雾。这个现象不是训练不充分而是结构性的后文第 4 章会说明 NCSN 用加噪来填平这个坑。2. Hyvärinen 恒等式把不可解的目标换成一个可算的期望2.1 朴素目标的困境没有标签最直观的训练目标是让网络输出和真实分数之间的平方误差最小$$J(\theta) \frac{1}{2}\mathbb{E}{p{data}}\left[|s_\theta(x) - \nabla_x \log p_{data}(x)|^2\right]$$问题一目了然右边那个 $\nabla_x \log p_{data}(x)$ 我们拿不到。这个目标写得出来但算不出来跟没写一样。早年做分数匹配的人走的第一条路是数值近似用有限差分去估梯度维度一高就彻底崩——每求一次梯度要 O(D) 次前向图像维度下完全不可行。有意思的是这个损失其实可以化简。把平方展开$$|s_\theta - \nabla\log p|^2 |s_\theta|^2 - 2,s_\theta^\top \nabla\log p |\nabla \log p|^2$$最后一项跟 $\theta$ 无关优化时可以扔掉。中间那一项才是关键它含有未知的 $\nabla \log p$但它是线性地出现的这就给了做分部积分的空间。2.2 分部积分把未知项转成了散度对中间项做处理$$\mathbb{E}{p}[s\theta^\top \nabla\log p] \int s_\theta^\top (\nabla p),dx -\int p,\nabla\cdot s_\theta, dx -\mathbb{E}p[\mathrm{tr}(\nabla_x s\theta(x))]$$第一步只是把 $\nabla \log p \nabla p / p$ 代进去约掉分母第二步是分部积分边界项在无穷远处消失需要密度在边界快速衰减这是个不太苛刻但必须满足的正则条件。结果非常漂亮未知的 $\nabla\log p$ 被彻底消掉了取而代之的是网络自身的雅可比矩阵的迹。于是目标函数变成$$J(\theta) \mathbb{E}{p{data}}\left[\mathrm{tr}(\nabla_x s_\theta(x)) \frac{1}{2}|s_\theta(x)|^2\right]$$这里面全是 $s_\theta$ 自己的量可以端到端训练。理论上这是完全可行的一条路Hyvärinen 在 2005 年就给出了这个结果叫显式分数匹配。2.3 迹这一项的代价决定了后面所有路线的分野问题出在 $\mathrm{tr}(\nabla_x s_\theta(x))$ 上。$\nabla_x s_\theta(x)$ 是一个 $D \times D$ 的雅可比矩阵我们只需要它的对角线元素之和。要精确算这个迹最直接的办法是做 $D$ 次反向传播每次求一个输出分量对所有输入的偏导。图像维度 $D$ 动辄三万、十二万这个代价完全不可接受训练一轮就要跑几万次反向。围绕这一项后续出现了三条路线理解它们的取舍对理解 NCSN 的定位很有帮助路线代表做法迹的估计方式主要问题显式精确计算逐维反向传播精确但 O(D) 次反传高维不可行随机投影近似随机方向向量 一次反传Hutchinson 估计无偏但方差大训练噪声大收敛慢去噪分数匹配加噪后转化为回归完全避开迹的计算学到的是平滑后分布的分数第三条路线就是 NCSN 采用的。它的思路极其聪明既然显式算迹这么贵那就换一个问题——不去拟合原始分布的分数而是拟合一个被高斯核卷积平滑过后的分布的分数。这个平滑后分布的对数密度梯度有一个简单的解析形式训练目标直接退化成一个残差回归问题不需要任何二阶信息。这里有个细节很多人跳过Hutchinson 估计虽然无偏但方差跟维度相关在图像任务上训出来的模型精度一直上不去早期的一些工作就是因为这一项卡住的。这不是理论缺陷是估计效率的问题但在工程上它就是分水岭。3. 去噪分数匹配加噪反而让问题变简单3.1 高斯核的条件分数可以手算去噪分数匹配DSM的核心操作是对每个干净样本 $x$用一个高斯核去扰动它$q_\sigma(\tilde{x}|x) \mathcal{N}(\tilde{x}; x, \sigma^2 I)$。这个条件分布的对数梯度是$$\nabla_{\tilde{x}} \log q_\sigma(\tilde{x}|x) -\frac{\tilde{x} - x}{\sigma^2} -\frac{\varepsilon}{\sigma}$$其中 $\varepsilon (\tilde{x}-x)/\sigma \sim \mathcal{N}(0,I)$就是归一化之后的噪声。这个式子干净得让人舒服条件分数本质上就是噪声方向的反向再除以噪声尺度。加了多大的噪声就往反方向推多大力。DSM 把训练目标改写为$$J_{DSM}(\theta) \frac{1}{2}\mathbb{E}{q\sigma(\tilde{x},x)}\left[\left|s_\theta(\tilde{x}) \frac{\varepsilon}{\sigma}\right|^2\right]$$这里没有任何雅可比、没有任何二阶导就是一个标准的回归问题给网络一张带噪图让它预测噪声的反向。这也是后来 DDPM 里预测噪声这个做法的直接源头。3.2 最优解学到的不是原始分布的分数必须强调一个容易被误解的点DSM 的最优解不是 $\nabla\log p_{data}$而是 $\nabla\log q_\sigma$也就是被高斯核卷积平滑之后那个分布的分数。$$q_\sigma(\tilde{x}) \int p_{data}(x),q_\sigma(\tilde{x}|x),dx$$这个差别不是小瑕疵而是整个设计的支点。平滑意味着什么意味着原本集中在低维流形上的分布被摊开了整个空间都有正密度分数处处有定义。流形外的区域不再是雷区粒子能被牵引回来。这恰好治好了 1.3 节说的那个病。代价也很明确$\sigma$ 越大平滑越狠分布被抹得越平密度里包含的细节越少。用大 $\sigma$ 训出来的网络只知道大概往哪走不知道这张脸的眼睛应该在哪个位置。所以单一尺度的方案注定两头不讨好——小 $\sigma$ 覆盖不到流形外大 $\sigma$ 学不到细节。这正是 NCSN 要用一串 $\sigma$ 的根本原因下一章展开。3.3 Tweedie 公式去噪器和分数网络是同一件事有个更本质的视角值得单独说就是 Tweedie 公式给出的后验均值$$\mathbb{E}[x|\tilde{x}] \tilde{x} \sigma^2 \nabla_{\tilde{x}} \log q_\sigma(\tilde{x})$$这个式子说明最优去噪器从带噪图估计干净图和分数函数之间只差一个 $\sigma^2$ 的缩放。换句话说降噪和求分数不是两个任务是同一个任务的不同参数化。这个结论在实际工作里非常有用。我见过不少人在实现时纠结网络应该输出预测的干净图还是预测的噪声还是直接输出分数其实三者在数学上是等价的差别只在数值量级和训练稳定性。经验上在中等 $\sigma$ 区间直接让网络输出 $-\varepsilon/\sigma$ 这种尺度归一化后的量梯度量级更稳定而在 $\sigma$ 很小的区间残差分支占了主导输出干净图的参数化反而更稳。这个选择在不同实现里会带来明显的收敛曲线差异后面第 7 章会细说。还有一点Tweedie 公式是后面一大批采样加速方法各种单步、少步采样器的理论出发点。理解了它再看那些用网络预测的 $x_0$ 加回噪声的迭代格式就不会觉得是技巧堆砌了。4. 多噪声尺度NCSN 对一个 $\sigma$ 不够用的正面回答4.1 两个方向的失败逼出了序列把前面两章的结论对齐一下就很清楚了。用太小的 $\sigma$ 训练平滑程度不够流形外区域分数依然失真朗之万粒子从随机初值出发找不回来用太大的 $\sigma$ 训练分布被抹得太平采样结果只能是模糊的平均脸细节全丢。标准做法是用条件网络 $s_\theta(x,\sigma)$让同一个网络在不同噪声尺度上给出不同的分数。训练时对每个 $\sigma_i$ 分别构造 DSM 损失。这样一来大 $\sigma$ 的样本负责把粒子从远处拉回来小 $\sigma$ 的样本负责把细节雕出来分工明确。我当时的困惑是为什么不让网络自己判断该用哪个尺度答案是这做不到——网络看到的输入是带噪图噪声大小本身就是输入的一部分不给它这个信息它没法知道当前该做粗调还是精调。所以 $\sigma$ 必须作为显式条件喂进去。4.2 $\sigma$ 序列怎么定几何级数加两个端点NCSN 用的是几何级数$$\sigma_i \sigma_1 \cdot \left(\frac{\sigma_L}{\sigma_1}\right)^{\frac{i-1}{L-1}}, \quad i 1,\dots,L$$典型配置是 $L10$$\sigma_1 1$$\sigma_L 0.01$图像归一化到 $[0,1]$ 的前提下。两个端点的取法有讲究$\sigma_1$ 应该和数据整体的尺度相当。原始工作里给的经验准则是取所有训练样本两两距离的最大值实际上直接取数据取值范围归一化后就是 1就够用。$\sigma_1$ 太小覆盖不到整个支撑集太大训练时图基本看不出原貌。$\sigma_L$ 要足够小小到能把细节恢复到人眼可辨的程度但也不能小到和像素量化噪声一个量级。$\sigma_L 0.01$ 在 $[0,1]$ 的图上大概对应两三个灰度级的扰动是个合理下限。级数用几何而不是线性是因为效果的差异在对数尺度上更均匀。从 1 到 0.01 跨了两个数量级线性分 10 档的话前几档几乎没区别1.0、0.89、0.78……后面又跳得太快。几何分配让每一档在相对意义上等距采样时每一段退火的有效工作量也更均衡。这个细节我调过一次之后就没再改回去。4.3 权重取 $\sigma^2$量纲视角的解释NCSN 的完整目标函数是$$\mathcal{L}(\theta) \frac{1}{L}\sum_{i1}^{L}\lambda(\sigma_i),\mathbb{E}\left[\left|s_\theta(\tilde{x},\sigma_i) \frac{\varepsilon}{\sigma_i}\right|^2\right]$$其中 $\lambda(\sigma) \sigma^2$。为什么要这么乘因为回归目标 $-\varepsilon/\sigma$ 的量级是 $1/\sigma$平方之后损失量级是 $1/\sigma^2$。在小 $\sigma$ 档位比如 $\sigma0.01$损失量级是 $10^4$在大 $\sigma$ 档位$\sigma1$损失量级是 1。不加权的话梯度会被小 $\sigma$ 的档位完全主导网络只顾着学细节粗尺度上啥也没学到退火采样的第一步就崩。乘上 $\sigma^2$ 之后各项量级被拉回到同一个平台。这个操作跟信号处理里的归一化是一个意思先把不同尺度上的损失换算到可比较的度量再求和。我在自己的实现里试过 $1/\sigma$ 和 $\sigma$ 两种加权前者让小 $\sigma$ 学得太慢后者让大 $\sigma$ 欠拟合都明显差于 $\sigma^2$。这个权重不是玄学是可以从量纲算出来的。4.4 条件化方式$\sigma$ 塞进网络的几种做法$\sigma$ 作为条件进入网络常见有三种做法各有取舍方式做法优点缺点通道拼接把 $\sigma$ 广播成一张常数图和输入拼通道实现最简改动小网络靠卷积间接感知效率一般条件归一化每个 $\sigma$ 对应一组仿射参数作用于归一化层效果稳原始方案需要维护参数表$\sigma$ 泛化受限嵌入 FiLM类似时间步嵌入走 MLP 得到尺度与偏移连续 $\sigma$ 也支持扩展性好实现稍复杂原始 NCSN 走的是条件归一化思路是给每个离散的 $\sigma_i$ 学一组独立的缩放和平移参数。这在 $L$ 固定时非常有效。但如果想在训练后换一个不同的 $\sigma$ 序列比如推理时加细档位条件归一化就不支持了得改用嵌入的方式。这一点在后面各种统一框架里被改成了连续嵌入感受很明显。另外顺带说一句这里用的归一化层不是 BatchNorm。原因在于不同 $\sigma$ 的输入统计量差异极大同一批里混着多种噪声水平的样本统计量会被搅乱训练极不稳定。原始实现用的是 InstanceNorm第 7 章会详细讲这个坑。5. 退火朗之万采样从雪花屏边缘慢慢往回走5.1 步长必须跟着 $\sigma$ 收缩推理时不能只用某一个 $\sigma$ 的分数而要把 $L$ 个尺度串起来从最大噪声开始逐级降到最小。核心的步长规则是$$\alpha_i \epsilon \cdot \frac{\sigma_i^2}{\sigma_L^2}$$其中 $\epsilon$ 是最小噪声尺度上的基准步长典型取 $2\times10^{-5}$。这个式子把步长和 $\sigma_i^2$ 绑在一起背后的理由很实在噪声尺度越大分数函数在空间中的变化越平缓需要走的步子越大噪声越小分数场越陡峭步子必须收小否则粒子会在细节区域来回震荡。从量纲角度看也说得通。分数项的量级是 $1/\sigma_i$乘以 $\alpha_i \propto \sigma_i^2$漂移项量级变成 $\sigma_i$随噪声尺度线性变化。而噪声项 $\sqrt{\alpha_i}$ 的量级也是 $\sigma_i$。两项比值恒定整个更新在每一档上的信噪比保持一致。这是这个设计最优雅的地方——它让不同尺度上的采样动力学形态相似退化行为可控。5.2 采样循环的逐行说明完整的退火朗之万采样长这样import torch def annealed_langevin(score_net, sigmas, x_init, T100, eps2e-5): x x_init.clone() L len(sigmas) for i in range(L): sigma_i sigmas[i] alpha_i eps * (sigma_i ** 2) / (sigmas[-1] ** 2) for t in range(T): # 网络输出的是分数项符号不要搞反 score score_net(x, sigma_i) z torch.randn_like(x) x x 0.5 * alpha_i * score (alpha_i ** 0.5) * z return x几处我踩过的细节值得单独标出来第一score的符号。训练目标是让网络拟合 $-\varepsilon/\sigma$这本身就是分数。所以在更新式里是加号加的是网络输出。如果你图省事让网络输出预测噪声 $\hat{\varepsilon}$那更新时要写成减去 $\hat{\varepsilon}/\sigma$两种写法等价但方向搞反的后果是致命的——采样结果会变成一张彻底发散的高频噪声图而且看起来还挺有纹理容易被误认为模型学到了东西。第二每一档内部的噪声是重新采的不要复用。这是马尔可夫链的独立性要求复用会让相邻两步高度相关混合变慢。第三T100是每档的迭代步数总步数是 $L \times T 1000$。这个开销对早期工作是合理的但也正是 NCSN 的采样速度硬伤后来各种少步采样努力的方向都在压缩这个数字。5.3 初值与步数实测里最费时间的两个旋钮初始点 $x_0$ 一般从均匀分布或者高斯分布采。原始方案用的是 $[0,1]$ 上的均匀分布配合 $\sigma_1 1$ 的尺度起步状态基本就是一张雪花屏。这个选择不影响最终分布的渐近性质但确实影响收敛速度我实测下高斯初值在低分辨率数据集上略快一点点差别不大。真正需要反复试的是每档的步数 $T$。理论上 $T$ 越大越接近真实采样实际里有一个明显的收益拐点。在 CIFAR-10 这种 32×32 的数据上$T$ 从 50 加到 100 提升很显著100 到 200 就边际递减了到 300 基本看不出来只是白烧算力。所以一般取 100 就够。另一个不太被提及的技巧是步长的退火节奏。固定 $\epsilon$ 意味着所有档位共用同一个基准但小 $\sigma$ 那几档往往吃掉大部分迭代步却贡献有限。有些改进方案让 $\epsilon$ 也随档位递减或者对最后几档额外多跑几步能在同等总步数下换到更低的 FID。这类调整我在复现时改过几次收益稳定但不大量级在个位数百分比属于锦上添花。这里补一个当年的实测参照原始方案在 CIFAR-10 上做到的 FID 大约 25和无条件 GAN 那批工作比是能打的但和后来的 DDPM 的 3 出头相比差距明显。差距主要来自采样环节——1000 步的退火链里累计的离散化误差相当可观而 DDPM 那套目标推导能给出更紧的变分下界采样路径的参数化也更精细。不过要说清楚NCSN 的价值不在刷指标在于它第一次把多尺度分数 退火采样这套组合拳打完整了后面的工作大多在它的骨架上做加法。6. 和 DDPM 的换算两条路走到同一个地方6.1 一步换算就能对上号DDPM 的训练目标是预测噪声 $\epsilon_\theta(x_t, t)$其中 $x_t \sqrt{\bar\alpha_t}x_0 \sqrt{1-\bar\alpha_t}\epsilon$。而分数函数的定义推下来是$$\nabla_{x_t}\log q(x_t) -\frac{\epsilon}{\sqrt{1-\bar\alpha_t}}$$对照 NCSN 的 $s_\theta -\varepsilon/\sigma$一眼就能看出对应关系DDPM 里的 $\sqrt{1-\bar\alpha_t}$ 扮演的就是 NCSN 里 $\sigma$ 的角色两者的网络输出只差一个缩放系数$$s_\theta(x_t) -\frac{\epsilon_\theta(x_t)}{\sqrt{1-\bar\alpha_t}}$$这个换算让很多看起来不同的实现瞬间统一。DDPM 的加噪调度表$\beta_t$ 展开后的累积量 $\bar\alpha_t$本质上就是一条反向的 $\sigma$ 序列——从接近 0 的噪声一路加到接近 1 的纯噪声。NCSN 用几何级数离散地铺 10 个点DDPM 用线性或余弦调度铺 1000 个点前者是粗粒度的分档退火后者可以看作连续化的极限。6.2 训练目标的对齐把两边的损失写在一起看更清楚。DSM 的损失是 $|s_\theta(\tilde{x},\sigma) \varepsilon/\sigma|^2$代入上面的换算关系等于$$\left|-\frac{\epsilon_\theta(x_t)}{\sigma_t} \frac{\varepsilon}{\sigma_t}\right|^2 \frac{1}{\sigma_t^2}|\epsilon_\theta(x_t) - \varepsilon|^2$$这正是 DDPM 的简化损失只差一个常数系数。这也解释了为什么 DDPM 论文里把损失前面的系数丢掉不影响效果——丢掉的 $\sigma_t^{-2}$ 恰好对应 NCSN 里那一项 $\lambda(\sigma)\sigma^2$只是方向相反。也就是说两个工作在损失设计上做的是同一件事把不同噪声尺度上的损失量级对齐。NCSN 显式乘了 $\sigma^2$DDPM 隐式地把 $1/\sigma^2$ 扔掉了。认识到这一点之后我再看那些某某加权策略提升效果的论文判断起来就快多了——大多数加权本质是在这个尺度归一化的框架里换一个函数形态。6.3 统一视角下的位置后来的统一框架把这两套东西都归到随机微分方程的语言里前向过程是 $dx f(x,t)dt g(t)dw$逆向过程由分数函数决定。NCSN 对应的是方差爆炸型的过程噪声尺度直接加到数据上DDPM 对应的是方差保持型噪声和数据按 $\alpha$ 混合。这个统一不是纯学术整理它直接催生了一批新的采样器因为一旦写成 SDE数值积分那一套成熟的工具就能直接搬过来用。站在今天的角度看NCSN 的位置很清楚它是把分数匹配这套理论真正推到图像生成可用水平的第一块里程碑。它的几个设计选择——多尺度、条件化、退火采样、$\sigma^2$ 加权——在后来的框架里被保留、被改写、被精炼但没有被推翻。7. 复现时最容易翻车的几个细节7.1 归一化层选错训练直接崩这是我在复现时踩得最狠的一脚。一开始图省事用了 BatchNorm训练前几百步还挺正常接着损失开始剧烈震荡最后发散。原因很直接同一个 batch 里的样本如果来自不同的 $\sigma_i$输入图像的统计量差异可以跨越好几个数量级BatchNorm 会把它们强行拉到同一尺度网络的输出随之被搅乱。正确做法是用对每个样本独立计算的归一化比如 InstanceNorm或者干脆用不依赖统计量的 GroupNorm。更稳的方案是条件归一化让每个 $\sigma_i$ 有独立的仿射参数。这个改动看起来只在实现层面但它决定了训练能不能收敛不是可选项。7.2 网络输出要不要乘 $1/\sigma$这个坑很隐蔽。如果你的网络直接输出分数 $s_\theta$在 $\sigma$ 很小的时候目标值 $-\varepsilon/\sigma$ 的量级可以到上百上千输出层的数值范围会被撑爆梯度也跟着爆炸。可行的做法有两种一种是像原始方案那样让网络直接回归整个目标但把输出层初始化得小一些配合梯度裁剪另一种是让网络输出预测噪声 $\hat\varepsilon$训练时在损失里手动除以 $\sigma$ 得到等效的分数数值上舒服得多。我没有发现哪种绝对更优但有一点是确定的两种参数化在同一个 $\sigma$ 序列下的最优学习率不一样切换的时候必须重新调。直接照搬别人实现里的学习率大概率不收敛。7.3 EMA、学习率与批次大小分数匹配的训练信号本身噪声不小因为每个样本的 $\varepsilon$ 都是新鲜采的。不加滑动平均的话采样结果里会有持续的纹理抖动看起来像没训够其实是权重在最后阶段来回晃。实践配置大致是Adam 优化器学习率 $1\times10^{-4}$ 到 $2\times10^{-4}$batch size 128 起EMA 衰减系数 0.999。这几个数字和后续扩散模型的配方差别不大说明这套动态在扩散家族里是通用的。我试过把学习率提到 $5\times10^{-4}$前期损失下降更快但采样质量反而变差判断是网络学到了高频的虚假结构。还有一个容易漏的点$\sigma$ 序列的采样要均衡。每个 batch 里对 $L$ 个尺度做均匀采样是标准做法但如果某个尺度的样本数特别少比如 batch 很小的时候那个尺度就会欠拟合退火到那一档时采样会突然变糊。7.4 采样阶段的时间分配往往比训练更值得打磨训练一次动辄几十小时采样优化看起来是小事但实际调参时它是唯一能快速迭代的环节。我的建议是先把总步数压低比如每档 20 步快速跑通端到端流程确认网络能出结构合理的图再逐步加步数看收益。一开始就用满配置每次实验等半天效率极低。另外记录一个小现象退火到 $\sigma_L$ 那一档时如果步数不足输出会有明显的椒盐噪点残留而如果在倒数第二档就提前结束图像整体会偏软边缘糊。这两个症状对应的原因不同前者是最后一档混合不充分后者是细节尺度没走到位排查方向也不同。凭这个症状基本能定位问题出在步数分配还是序列端点。最后分享一个我从这套理论里得到的、比代码更值钱的体会NCSN 的每个设计都不是孤立的技巧而是一条因果链上的必然结果——因为有流形假设所以单尺度不行因为要覆盖多个尺度所以必须有条件化因为条件化后各档损失量级不同所以必须加权因为要跨尺度串联所以步长必须随 $\sigma$ 收缩。理解这条链比记住十个超参数有用得多遇到新的扩散变体时也能快速定位改动落在链条的哪一环。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑