来源:Song 等,2021,arXiv:2011.13456,§2.1(SMLD / NCSN);原始出处 Song & Ermon 2019,arXiv:1907.05600。 记号:$\sigma$ 是噪声尺度(NCSN 自己选的一串数);$x$ 是干净图,$\tilde x$ 是加噪后的图,$\varepsilon\sim\mathcal N(0,I)$ 是标准高斯,$s_\theta(\tilde x,\sigma)$ 是要训练的 score 网络。 读法:§2.1 VE 的 score(就是网络要预测的目标);§2.2 训练(让网络学出它);§2.3 采样(退火 Langevin);§2.4 小结。推导、证明都在折叠框,主线只走思路。 --- ## §2.1 VE 的 score,就是网络要预测的目标 NCSN 给干净图 $x$ 直接加一团标准差为 $\sigma$ 的高斯噪声: $\tilde x = x + \sigma\varepsilon,\qquad \tilde x \sim \mathcal N(x,\ \sigma^2 I)$ 它的 score(对这个加噪核求 $\nabla_{\tilde x}\log p_\sigma$;记号怎么读、两步来历见下方折叠,完整推导在 §1.4): > [!danger] Score-SDE 论文 · VE 核的条件 score(式(1) 损失里要匹配的靶子) > $\nabla_{\tilde x}\log p_\sigma(\tilde x\mid x) = -\frac{\tilde x - x}{\sigma^2} = -\frac{\varepsilon}{\sigma}$ > 这是条件 score(给定单张干净图 $x$ 的加噪核的 score);§2.2 会把它和「边缘 score」分开。 **这一节只要记住一件事:这个 score $-\dfrac{\varepsilon}{\sigma}$,就是训练时网络要预测的目标。** > [!note]- 这条式子怎么读(记号 + 两步来历) > > 下标是哪些 > > - $\nabla$ 右下角的 $\tilde{x}$:对 $\tilde{x}$ 求梯度。 > - $p$ 右下角的 $\sigma$:参数(噪声水平)。($\sigma$ 是标准差,$\sigma^2$ 才是方差。) > > 括号 vs 下标的约定 > > - 括号里:被建模、可求导的变量($\tilde{x}$、$x$);下标里:固定参数,当常数看($\sigma$)。梯度对 $\tilde{x}$ 求,$\sigma$ 全程不变。 > > 从左到右两步(来历) > > 1. 对 $\log p_\sigma$ 求导(核是高斯 $\mathcal N(x,\sigma^2 I)$,套「score $=-($离均值$)/$方差」)→ 中间项 $-\dfrac{\tilde{x}-x}{\sigma^2}$。 > 2. 代入重参数化 $\tilde{x}-x = \sigma\varepsilon$、约一个 $\sigma$ → 最右项 $-\dfrac{\varepsilon}{\sigma}$。 > > 三式完全相等;最右的 $-\dfrac{\varepsilon}{\sigma}$ 说明 score 正比于噪声 $\varepsilon$ 的负方向,这是扩散模型让网络直接预测 $\varepsilon$ 的原因。 > > 出处:这两步就是 §1.4 那条 VE 推导换成论文记号($\bar x\to\tilde x$、$x_0\to x$);完整逐步版(对数密度怎么写、平方怎么落 2)见 §1.4「从头求一遍」折叠,一步不差。 NCSN 实际会用一串 $\sigma$,让一个网络 $s_\theta(\tilde x,\sigma)$ 把 $\sigma$ 也当输入、一次学会所有档(为什么用一串、不是一个,见 §2.2 折叠)。 --- ## §2.2 训练:让网络学出这个 score(denoising score matching) > [!tip]- 为什么让网络吐 score 而不是密度 $p$(避开配分函数 $Z$) > 任何概率密度都要「积分为 1」,所以它长这样: > $p(x)=\frac{1}{Z}\,\tilde p(x),\qquad Z=\int \tilde p(x)\,\mathrm dx$ > $\tilde p(x)$ 是没归一化的「形状」(例如 $e^{-\,\text{能量}(x)}$),$Z$ 是把总量压成 1 的除数。 > $Z$ 这个积分要把 $\tilde p$ 在整个图像空间上积一遍。一张图有 $d$ 个像素(如 $256\times256\times3\approx20$ 万),这就是在 20 万维空间里对每一张可能的图求和:没有闭式,数值上也扫不完,所以 $Z$ 是个「确实存在、却写不出也算不出」的数。 > 关键的不对称:$\tilde p(x)$ 本身也是 20 万维的函数,但对它做的事和对 $Z$ 做的事完全不同。 > > | | 指数部分 $\tilde p(x)$ | 归一化常数 $Z$ | > |---|---|---| > | 是 20 万维吗 | 是 | 是 | > | 要算什么 | 某一个 $x$ 点的值 / 梯度 | 对所有 $x$ 积分 | > | 难度 | 代入算一遍,秒出 | 遍历整个高维空间,做不完 | > > 所以想直接学密度 $p$ 走不通:$p=\tilde p/Z$ 里那个 $Z$ 算不出,既没有真值当标签、也不知道该除以多少。 > score 换了个目标,一步把 $Z$ 甩掉。取 $\log$ 把除法变减法,再对 $x$ 求梯度: > $\nabla_x\log p(x)=\nabla_x\log\tilde p(x)-\nabla_x\log Z$ > $Z$ 是个固定的数(积完就是常数、不含 $x$),$\nabla_x\log Z=0$,直接蒸发: > $\nabla_x\log p(x)=\nabla_x\log\tilde p(x)$ > 只用「某点的形状梯度」就能算。难点全在「要不要扫遍整个 20 万维空间」:求值/求梯度是查一个点(能做),归一化是扫整个空间(做不到)——这就是整条路估计 score $\nabla_x\log p$ 的原因。 难点:上面那条路有个前提:知道形状 $\tilde p$,就能对它求梯度得到 score。可网络要拟合的「真 score」是边缘 score $\nabla_{\tilde x}\log p_\sigma(\tilde x)$,它的形状 $p_\sigma$ 恰恰写不出来: $p_\sigma(\tilde x)=\int p_\sigma(\tilde x\mid x)\,p_\text{data}(x)\,\mathrm dx$ 它把每张干净图 $x$ 的加噪高斯 $p_\sigma(\tilde x\mid x)$ 按真实分布 $p_\text{data}(x)$ 加权混起来。而 $p_\text{data}$ 本身没有公式(手里只有一堆样本),这个混合连形状都写不出,更谈不上对它求梯度。所以真 score 这个目标是空的、没有标签可回归。 DSM 的把戏:别去匹配那个写不出的边缘 score,改去匹配单张图加噪的「条件 score」——就是 §2.1 那个闭式,抽一对 $(x,\varepsilon)$ 当场算得出: $\nabla_{\tilde x}\log p_\sigma(\tilde x\mid x) = -\frac{\tilde x - x}{\sigma^2} = -\frac{\varepsilon}{\sigma}$ 可以证明:**让网络在所有 $(x,\tilde x)$ 上去匹配这个条件 score,最优解恰好就是那个写不出的边缘 score。**于是「目标写不出」被换成一个能算的回归(证明见下方折叠)。 > [!note]- 证明:匹配条件 score 的最优解 = 边缘 score > 要证的事:训练时让网络去拟合好算的条件 score $-\frac{\varepsilon}{\sigma}$,练到最优,网络输出的会恰好是那个算不出来的边缘 score $\nabla_{\tilde x}\log p_\sigma(\tilde x)$。练的是能算的,拿到的是要用的。 > > 证明拆两块:(A) 平方误差练出来的最优解 = 目标的条件期望;(B) 条件 score 的条件期望 = 边缘 score。两块的右边是同一个东西,拼起来就完了。 > > **先给目标起个名字。** 训练时网络要去拟合的量是 $-\frac{\varepsilon}{\sigma}$,§2.1 说过它就是条件 score。记作 $T$: > $T\ :=\ \nabla_{\tilde x}\log p_\sigma(\tilde x\mid x)\ =\ -\frac{\varepsilon}{\sigma}\ =\ -\frac{\tilde x-x}{\sigma^2}$ > 最后那个等号:$\tilde x=x+\sigma\varepsilon$ 反解出 $\varepsilon=\frac{\tilde x-x}{\sigma}$,代进 $-\frac{\varepsilon}{\sigma}$ 得 > $-\frac{1}{\sigma}\cdot\frac{\tilde x-x}{\sigma}$ > 两个 $\sigma$ 相乘,即 > $-\frac{\tilde x-x}{\sigma^2}$ > 下面说「预测目标」「条件 score」,指的都是这个 $T$。 > > **$T$ 是随机的。** 挑定一个 $\tilde x$ 之后,这个 $\tilde x$ 是由哪张干净图 $x$ 加噪来的并不知道——好多组 $(x,\varepsilon)$ 都能加出同一个 $\tilde x$。$x$ 不确定,而 $T=-\frac{\tilde x-x}{\sigma^2}$ 里有 $x$,所以 $T$ 也不确定。$\mathbb E[\,\cdot\mid\tilde x\,]$ 读作「$\tilde x$ 已知,把所有可能的 $x$ 平均一遍」。 > > **(A) 平方误差的最优解 = 目标的条件期望** > > 网络写成 $s_\theta$,$s_\theta$ 只看得到 $\tilde x$。证明里假设 $s_\theta$ 想多强有多强:每个输入上想输出什么就输出什么,各个输入之间互不影响。 > > 从头到尾要办的只有一件事:找能让损失最小的网络输出。损失是 MSE,均方误差——每个样本算一个平方误差,再取平均。 > > 挑定一个 $\tilde x$,看落到这个 $\tilde x$ 上的那些样本。这些样本的 $x$ 各不相同,$T$ 也就各不相同;而网络只看得到 $\tilde x$,对这些样本只能拿出同一个输出 $v=s_\theta(\tilde x)$。一个 $v$ 对付一群 $T$,所以网络在这个 $\tilde x$ 上的成绩只能按平均误差算——这就是 $\mathbb E[\,\cdot\mid\tilde x\,]$ 的来历。又因为各个输入上的输出互不影响,每个 $\tilde x$ 各自压到最小,总损失自然最小。于是只看这一个 $\tilde x$: > $\min_v\ \mathbb E\big[\lVert v - T\rVert^2 \,\big|\, \tilde x\big]$ > > 难在哪:要挑的 $v$ 埋在平均里面——$v$ 裹在 $\lVert v-T\rVert^2$ 这个整体中,而这个平均是算不出来的。所以分两步:先把 $v$ 从平均里拆到外面来,再在拆出来的式子上找最低点。 > > **第一步:把 $v$ 从平均里拆出来。** 这时 $v$ 是已经拿定的值,不动;在变的只有 $x$。所以这一步看的是式子随 $x$ 怎么变。 > > 先在期望里面把平方展开($\lVert a-b\rVert^2=\lVert a\rVert^2-2\,a\cdot b+\lVert b\rVert^2$),把 $v$ 和 $T$ 分到不同的项里去: > $\mathbb E\big[\lVert v - T\rVert^2 \,\big|\, \tilde x\big]=\mathbb E\big[\lVert v\rVert^2-2\,v\cdot T+\lVert T\rVert^2 \,\big|\, \tilde x\big]$ > 期望是线性的,拆成三项,好一项一项往外挪: > $=\mathbb E\big[\lVert v\rVert^2 \,\big|\, \tilde x\big]-2\,\mathbb E\big[v\cdot T \,\big|\, \tilde x\big]+\mathbb E\big[\lVert T\rVert^2 \,\big|\, \tilde x\big]$ > $T$ 随 $x$ 变,是随机的;$v$ 不随 $x$ 变(网络只看 $\tilde x$,$\tilde x$ 又已经挑定了),对求平均来说就是个定数。三项的下场因此不一样: > - $\lVert v\rVert^2$ 整块是个定数。定数平均一遍还是原来那个数,所以 $\mathbb E\big[\lVert v\rVert^2\mid\tilde x\big]=\lVert v\rVert^2$,期望符号连着竖线一起没了。竖线是「求平均」这个记号的一半,离了 $\mathbb E$ 站不住,$\mathbb E$ 一走竖线也跟着走。$\tilde x$ 并没丢——$v$ 本身就是 $s_\theta(\tilde x)$,$\tilde x$ 在 $v$ 里面。 > - $v\cdot T$ 里只有 $T$ 随 $x$ 变。定数能从期望里提出来,所以 $\mathbb E\big[v\cdot T\mid\tilde x\big]=v\cdot\mathbb E[T\mid\tilde x]$:$v$ 出来了,期望留下,只管 $T$。 > - $\lVert T\rVert^2$ 整块都随 $x$ 变,没有能提出来的东西,原样搁着。 > > 三项合起来,$v$ 就全在平均外面了: > $=\lVert v\rVert^2 - 2\,v\cdot \mathbb E[T\mid \tilde x] + \mathbb E\big[\lVert T\rVert^2 \,\big|\, \tilde x\big]$ > $\mathbb E[T\mid\tilde x]$ 和 $\mathbb E\big[\lVert T\rVert^2\mid\tilde x\big]$ 这两个平均一个都没算,原封不动摆在那儿。本来也算不出来:这两个平均都是对未知的 $x$ 求的,要用到 $p_\text{data}$,而 $p_\text{data}$ 写不出来。但已经够用了——下一步只需要知道这两个平均不随 $v$ 变,不需要知道各等于几。 > > **第二步:在拆出来的式子上找最低点。** 上一步看的是式子随 $x$ 怎么变,这一步改看式子随 $v$ 怎么变:$v$ 从「拿定不动的值」变成了要求的未知数;两个期望括号里都没有 $v$,所以这两个平均等于多少不用管。 > > 拆完之后的式子正好是 $v$ 的二次函数,跟标准样子 $a\,t^2+b\,t+c$ 对一下:二次项是 $\lVert v\rVert^2$,前面没写数就是系数 $a=1$;一次项的系数 $b=-2\,\mathbb E[T\mid\tilde x]$;常数项 $c=\mathbb E\big[\lVert T\rVert^2\mid\tilde x\big]$。$a=1>0$,开口朝上,有唯一的最低点。 > > 对 $v$ 求导($\nabla_v$ 是对 $v$ 求导),用两条向量求导公式: > $\nabla_v\lVert v\rVert^2=2v,\qquad \nabla_v\big(v\cdot \mathbb E[T\mid\tilde x]\big)=\mathbb E[T\mid\tilde x]$ > 三项分别是:$\lVert v\rVert^2$ 求导得 $2v$;$-2\,v\cdot\mathbb E[T\mid\tilde x]$ 套第二条公式、系数 $-2$ 原样带下来,得 $-2\,\mathbb E[T\mid\tilde x]$;常数项里没有 $v$,导数是 $0$。合起来: > $\nabla_v\Big(\lVert v\rVert^2 - 2\,v\cdot \mathbb E[T\mid \tilde x] + \mathbb E\big[\lVert T\rVert^2 \,\big|\, \tilde x\big]\Big)=2v - 2\,\mathbb E[T\mid\tilde x]$ > 最低点的特征是变化速度为零,所以让上面这个导数等于零,就写出了最低点所在位置满足的方程: > $2v - 2\,\mathbb E[T\mid\tilde x] = 0$ > 剩下是解方程,目标是把 $v$ 单独留在等号一边。两边同加 $2\,\mathbb E[T\mid\tilde x]$: > $2v = 2\,\mathbb E[T\mid\tilde x]$ > 两边同除以 $2$: > $v = \mathbb E[T\mid\tilde x]$ > 每个 $\tilde x$ 上都这么算,所以最优网络(记作 $s^\star$)是 > $s^\star(\tilde x) = \mathbb E[T\mid\tilde x] = \mathbb E\big[\nabla_{\tilde x}\log p_\sigma(\tilde x\mid x)\,\big|\,\tilde x\big]$ > > **(A) 到手的是什么。** 在此之前只知道训练怎么做——拿 $T$ 当目标压平方误差——并不知道压到底会得到什么。现在有了一个明确的式子:最优网络在每个 $\tilde x$ 上的输出等于 $\mathbb E[T\mid\tilde x]$。这个结论是一路展开、求导、解方程推出来的,不是任何定义。 > > 而且这个式子的右边只剩概率里的东西,网络 $s_\theta$、参数 $\theta$、训练都不再出现,接下来可以纯用概率去处理它。至于 $\mathbb E[T\mid\tilde x]$ 究竟等于什么,(A) 从头到尾没算过,交给 (B)。 > > **(B) 条件 score 的条件期望 = 边缘 score** > > 这一块从头到尾都是对 $\tilde x$ 求导,看的是各项随 $\tilde x$ 怎么变;积分一直是对 $x$ 积的。 > > 先用 log 求导,把「$\log$ 的导数」换成两个密度相除,这样才有东西可动: > $\nabla_{\tilde x}\log p_\sigma(\tilde x) = \frac{\nabla_{\tilde x}\,p_\sigma(\tilde x)}{p_\sigma(\tilde x)}$ > 分子里的 $p_\sigma(\tilde x)$ 写不出来,但 $p_\sigma(\tilde x)$ 是一堆写得出来的高斯叠起来的,所以换成积分的写法(每张干净图加噪后叠加): > $p_\sigma(\tilde x) = \int p_\sigma(\tilde x\mid x)\,p_\text{data}(x)\,\mathrm{d}x$ > 求导时让导数钻进积分号,好让导数只落在写得出来的 $p_\sigma(\tilde x\mid x)$ 上($p_\text{data}(x)$ 里没有 $\tilde x$,对 $\nabla_{\tilde x}$ 就是个定数,导数碰不到 $p_\text{data}(x)$): > $\nabla_{\tilde x}\,p_\sigma(\tilde x) = \int \nabla_{\tilde x}\,p_\sigma(\tilde x\mid x)\,p_\text{data}(x)\,\mathrm{d}x$ > 上面第一条等式对任何密度都成立,两边乘上该密度,就得到恒等式 $\nabla p = p\,\nabla\log p$。把这条恒等式用在 $p_\sigma(\tilde x\mid x)$ 上: > $\nabla_{\tilde x}p_\sigma(\tilde x\mid x)=p_\sigma(\tilde x\mid x)\,\nabla_{\tilde x}\log p_\sigma(\tilde x\mid x)$ > 拿这个换掉积分里的导数,好让式子里冒出条件 score——(A) 的结论里要的就是这个量: > $\nabla_{\tilde x}\,p_\sigma(\tilde x) = \int p_\sigma(\tilde x\mid x)\,\nabla_{\tilde x}\log p_\sigma(\tilde x\mid x)\,p_\text{data}(x)\,\mathrm{d}x$ > 两边除以 $p_\sigma(\tilde x)$: > $\frac{\nabla_{\tilde x}\,p_\sigma(\tilde x)}{p_\sigma(\tilde x)} = \frac{1}{p_\sigma(\tilde x)}\int p_\sigma(\tilde x\mid x)\,\nabla_{\tilde x}\log p_\sigma(\tilde x\mid x)\,p_\text{data}(x)\,\mathrm{d}x$ > 左边正是最上面那条等式的右边,写回 $\nabla_{\tilde x}\log p_\sigma(\tilde x)$;右边把 $\frac{1}{p_\sigma(\tilde x)}$ 塞进积分号($p_\sigma(\tilde x)$ 里没有积分变量 $x$,对这个积分是个定数),凑出后验的样子: > $\nabla_{\tilde x}\log p_\sigma(\tilde x) = \int \frac{p_\sigma(\tilde x\mid x)\,p_\text{data}(x)}{p_\sigma(\tilde x)}\,\nabla_{\tilde x}\log p_\sigma(\tilde x\mid x)\,\mathrm{d}x$ > 那个分式就是贝叶斯后验,意思是:已知 $\tilde x$,这个 $\tilde x$ 由干净图 $x$ 加噪来的概率有多大: > $p(x\mid\tilde x) = \frac{p_\sigma(\tilde x\mid x)\,p_\text{data}(x)}{p_\sigma(\tilde x)}$ > 代进去,「按概率加权再加起来」就是求期望的定义,于是积分写成对 $x$ 的条件期望: > $\nabla_{\tilde x}\log p_\sigma(\tilde x) = \int p(x\mid\tilde x)\,\nabla_{\tilde x}\log p_\sigma(\tilde x\mid x)\,\mathrm{d}x = \mathbb E\big[\nabla_{\tilde x}\log p_\sigma(\tilde x\mid x)\,\big|\,\tilde x\big]$ > > **合起来。** (A) 说 $s^\star(\tilde x)=\mathbb E[\nabla_{\tilde x}\log p_\sigma(\tilde x\mid x)\mid\tilde x]$;(B) 说 $\nabla_{\tilde x}\log p_\sigma(\tilde x)=\mathbb E[\nabla_{\tilde x}\log p_\sigma(\tilde x\mid x)\mid\tilde x]$。两边的右手边一模一样,左手边就相等: > $s^\star(\tilde x) = \nabla_{\tilde x}\log p_\sigma(\tilde x)$ > 也就是:拿好算的条件 score $-\frac{\varepsilon}{\sigma}$ 当目标练,练到最优,网络吐出来的是算不出来的边缘 score。 > > **直觉。** 挑定一个 $\tilde x$。好多张不同的干净图加噪后都可能落到这个 $\tilde x$,每张候选的 $x$ 给出一支箭头 $-\frac{\tilde x-x}{\sigma^2}$,指着「回到我这张」,方向各不相同。网络只看得到 $\tilde x$,不知道这个 $\tilde x$ 是从哪张干净图来的,所以哪一支箭头都输出不了;平方误差逼网络输出这些箭头的平均,而且是按后验 $p(x\mid\tilde x)$(每张 $x$ 的可能性)加权的平均。(B) 证明的就是:这支加权平均的箭头正好等于边缘 score,这支箭头指着这些可能来源扎堆的方向,也就是噪声尺度 $\sigma$ 下数据密的地方。所以网络学到的是「平均来说往干净数据那边回走」的方向,这正是 score。denoising score matching 这名字就是这么来的:学的是去噪,学出来的却是 score。 > > **原始出处。** Vincent, P. (2011), *A Connection Between Score Matching and Denoising Autoencoders*, Neural Computation 23(7):1661–1674。上面这条是该文结论的标准等价讲法(「MSE 最优解 = 后验加权平均」);该文走的是另一条路:证「DSM 目标 = ESM 目标 + 一个与 $\theta$ 无关的常数」,并写明了这里略过的正则性条件(导数能钻进积分号、最优解假设网络足够强)。NCSN 和本论文都是直接引用该文,没有自己重证。 两堵墙,两个跨度:训练要跨过的是两堵不同的墙,一堵向内、一堵向外,都卡在一个做不了的高维积分上。 | | 第一堵墙 · 向内 | 第二堵墙 · 向外 | |---|---|---| | 积分的跨度 | 单张图内部,所有像素的所有取值组合(即所有可能的图) | 世界上所有真实图,按 $p_\text{data}$ 加权 | | 为什么做不了 | 维度太高,组合扫不完 | 真实图无数张,且 $p_\text{data}$ 未知、没公式 | | 怎么跨过 | 不学密度、扔掉 $Z$、改学 score(求导时 $Z$ 蒸发) | DSM:拿样本匹配写得出的条件 score | 先翻第一堵(改学 score),才露出第二堵(真 score 目标写不出),DSM 再翻过它——训练至此落地。 损失(论文式1):NCSN 用一串噪声 $\sigma_1<\cdots<\sigma_N$,每档做 denoising score matching(网络输出对条件 score 的平方差),乘上该档权重 $\sigma_i^2$,对所有档求和: > [!danger] Score-SDE 论文式(1) · NCSN 训练损失 > 论文原式(目标写成条件 score): > $\theta^\star=\arg\min_\theta\ \sum_{i=1}^{N}\ \sigma_i^2\ \mathbb E_{p_\text{data}(x)}\,\mathbb E_{p_{\sigma_i}(\tilde x\mid x)}\Big[\big\lVert\, s_\theta(\tilde x,\sigma_i) - \nabla_{\tilde x}\log p_{\sigma_i}(\tilde x\mid x)\,\big\rVert_2^2\Big]$ > §2.1 已算出条件 score $\nabla_{\tilde x}\log p_{\sigma_i}(\tilde x\mid x)=-\varepsilon/\sigma_i$($\tilde x=x+\sigma_i\varepsilon$)。代入、并把两层期望写成对 $(x,\varepsilon)$ 抽样,就是可训练的形式: > $\sum_{i=1}^{N}\ \sigma_i^2\ \mathbb E_{x,\,\varepsilon}\Big[\big\lVert\, s_\theta(\tilde x,\sigma_i) - \big(-\tfrac{\varepsilon}{\sigma_i}\big)\,\big\rVert^2\Big]$ > 权重 $\sigma_i^2$ 把大小悬殊的各档拉到同一量级(为什么正好乘 $\sigma_i^2$,见下方折叠)。 > [!tip]- 为什么用一串 σ、不是一个 > 单个 $\sigma$ 两头都崩: > - $\sigma$ 太小:数据挤在高维空间里一层很薄的流形上(流形假设,你第6单元见过)。小 $\sigma$ 只在流形附近蹭一点噪声,流形外的空旷区几乎没有加噪样本,网络在那里学不到 score;采样又要从纯噪声(哪儿都远)起步,一开始就没方向、走不动。 > - $\sigma$ 太大:到处都有信号、好走,但噪声糊掉细节,score 只指向「大概的数据团」,出不了清晰图。 > > 一串 $\sigma$ 从大到小:大 $\sigma$ 在空旷处也给方向、先把样本拽到数据大致区域,小 $\sigma$ 贴近后抠细节。一个网络 $s_\theta(\tilde x,\sigma)$ 把 $\sigma$ 当输入(这就是 NCSN 名字里 Noise Conditional 的来历),一次学会所有尺度;论文把这串 $\sigma$ 排成几何数列。采样要「退火」($\sigma$ 从大到小,§2.3)的根就在这;档数、每档步数怎么数,见 §2.3 折叠。 > [!tip]- 为什么 NCSN 损失要乘 $\sigma^2$,DDPM 不用 > 两边都是「一个网络预测一个目标、最小化平方误差」,只差预测目标不同: > > | | 预测目标 | 目标量级 | 损失 | > |---|---|---|---| > | VP / DDPM | $\varepsilon$ | $\approx 1$ | $\mathbb E\lVert \varepsilon-\varepsilon_\theta\rVert^2$ | > | VE / NCSN | $-\dfrac{\varepsilon}{\sigma}$ | $\approx\dfrac{1}{\sigma}$ | $\mathbb E\Big[\sigma^2\big\lVert s_\theta-(-\tfrac{\varepsilon}{\sigma})\big\rVert^2\Big]$ | > > 1. 两个预测目标只差一个 $\dfrac{1}{\sigma}$(外加一个不影响量级的负号)。 > 2. DDPM 预测 $\varepsilon$:不管哪档噪声,量级都 $\approx 1$,各档齐 → 损失不用加权($L_\text{simple}$ 把系数全设 $1$)。 > 3. NCSN 预测 $-\dfrac{\varepsilon}{\sigma}$:量级 $\approx\dfrac{1}{\sigma}$,$\sigma$ 越大越小,平方进损失后各档差 $\dfrac{1}{\sigma^2}$(悬殊)→ 损失前乘 $\sigma^2$ 拉平($\sigma^2\cdot\dfrac{1}{\sigma^2}=1$)。 --- ## §2.3 采样:用 score 从噪声一步步走回数据(Langevin + 退火) 这一步:训练拿到 $s_\theta$ 后,怎么用它从纯噪声生成一张图。先认识两个新词(你从 DDPM/DDIM 过来没见过): - Langevin(朗之万动力学):一个采样方法的名字,来自物理学家 Paul Langevin,原本描述「粒子在液体里一边受力、一边被分子乱撞」的运动。在这儿它就是:**拿 score 当"受力方向"、再加一点随机抖动,让一个点在分布上游走,最后采到一个样本**。全程只需要 score。 - 退火(annealing):原指冶金里「把金属加热再慢慢冷却」使其稳定;这里指**把噪声尺度 $\sigma$ 从大到小慢慢调,一步步把样本"冷却"到数据上**。 NCSN 采样 = 先用 Langevin(怎么从一个分布采样),再套上退火(从大 $\sigma$ 到小 $\sigma$)。 Langevin 一步:只知道一个分布的 score 时,反复做的就是论文式(2) 那一步: > [!danger] Score-SDE 论文式(2) · (退火)Langevin 采样 > $x_i^{m} = x_i^{m-1} + \varepsilon_i\,s_\theta(x_i^{m-1},\sigma_i) + \sqrt{2\varepsilon_i}\,z_i^{m}$ > 步长记 $\varepsilon_i$(一个小标量);上标 $m$ 是在这一档 $\sigma_i$ 上的第几步 Langevin;下标 $i$ 标第几档噪声 $\sigma_i$。 逐项读式(2): - $\varepsilon_i\,s_\theta(x_i^{m-1},\sigma_i)$:顺 score 往高密度(更像数据)走一小步,给方向。 - $\sqrt{2\varepsilon_i}\,z_i^{m}$:每步再抖一点随机噪声,给随机性(噪声前那个 $\sqrt2$ 的来历见 ①)。 - 走够多步,$x$ 就近似是该档 $\sigma_i$ 分布的一个样本。 退火藏在步长里:乍看抖动项 $\sqrt{2\varepsilon_i}\,z$ 不含 $\sigma$,好像每档都在同样狂抖——不是。$\sigma$ 藏在步长 $\varepsilon_i$ 里:NCSN 取 $\varepsilon_i\propto\sigma_i^2$,于是抖动标准差 $\sqrt{2\varepsilon_i}\propto\sigma_i$,大档抖得凶、小档抖得轻,「冷却」是真的。为什么取 $\sigma_i^2$、机制怎么运转,见下折叠。 > [!note]- 步长 $\varepsilon_i\propto\sigma_i^2$:为什么、以及退火怎么藏在里面 > 具体取法:$\varepsilon_i=\varepsilon\cdot\dfrac{\sigma_i^2}{\sigma_1^2}$。其中 $\varepsilon$ 是手选的固定小常数(角色同学习率,管绝对大小);$\dfrac{\sigma_i^2}{\sigma_1^2}$ 是按档自动缩放的倍率——代 $i=1$(最小档)倍率 $=1$,步长正好是基准 $\varepsilon$,其余档按 $\sigma^2$ 比例放大。 > > 为什么偏偏是 $\sigma_i^2$(四步推出): > 第 1 步 · 一步实际挪多远,就是式(2) 的漂移项: > $\text{一步挪的距离}=\varepsilon_i\cdot\lVert s_\theta\rVert$ > 第 2 步 · 代入 score 的大小(§2.1:score $=-\varepsilon/\sigma_i$,长度约 $1/\sigma_i$): > $\text{一步挪的距离}=\varepsilon_i\cdot\frac{1}{\sigma_i}=\frac{\varepsilon_i}{\sigma_i}$ > 第 3 步 · 提要求:这一档样本身上糊着 $\sigma_i$ 大小的噪声、离目标就差 $\sigma_i$ 那么远,一步该按这个尺度挪: > $\frac{\varepsilon_i}{\sigma_i}=\sigma_i$ > 第 4 步 · 两边同乘 $\sigma_i$,解出: > $\varepsilon_i=\sigma_i\cdot\sigma_i=\sigma_i^2$ > 两个 $\sigma_i$ 的出处:第 3 步右边那个是「想挪多远」;左边分母那个是「score 自带 $1/\sigma_i$、拖了后腿,要补偿」。数字验算:$\sigma_i=10$ 代第 3 步,$\varepsilon_i/10=10\Rightarrow\varepsilon_i=100=10^2$ ✓;$\sigma_i=0.1$,$\varepsilon_i/0.1=0.1\Rightarrow\varepsilon_i=0.01=0.1^2$ ✓。 > > 抖动为什么跟着缩(机制):$\varepsilon_i$ 扮演的是这一步模拟的时长 $\mathrm dt$(§3.0 会正式讲),布朗运动「方差 = 时长」,所以这一步抖入的方差 $=2\varepsilon_i\propto\sigma_i^2$、标准差 $\propto\sigma_i$——退火不改噪声系数,改的是「每步模拟多长时间」。又因每档步数 $M$ 固定,一档总时长 $M\varepsilon_i$ 也随 $\sigma_i^2$ 一起缩:大档「跑很久、铺得开」、小档「跑一小段、原地细调」,由粗到细是在时间尺度上实现的。 > > 顺带的配平:漂移每步挪 $\varepsilon_i\lVert s_\theta\rVert\sim\sigma_i$、抖动每步 $\sqrt{2\varepsilon_i}\sim\sigma_i$,两项同步缩放——每档跑的都是同一配方的 Langevin,只是整体尺度跟着退火缩,像同一段动作在不同倍率的地图上重放。 三个角标,三种性质:式(2) 里三个带 $i$ 的量,对 $i$ 的依赖完全不同—— - $\varepsilon_i$:真依赖 $i$,步长随档缩($\propto\sigma_i^2$,见上折叠,退火机制所在); - $s_\theta(\cdot,\sigma_i)$:真依赖 $i$,$\sigma_i$ 是喂给网络的输入,换档就换了向量场(平衡分布也跟着换成 $p_{\sigma_i}$); - $z_i^m$:不依赖 $i,m$,每步都从同一个 $\mathcal N(0,I)$ 新抽,角标只是编号、给每次抽样一个身份证,宣示各步噪声独立(i.i.d.)、不许复用——若写成同一个 $z$,每步抖同一个方向,随机性就塌了,附A「平稳分布是 $p$」的论证(依赖每步噪声独立)也不成立。 ⚠️ 采样的 $z$ 和训练的 $\varepsilon$ 是两个不同的噪声: Langevin 里的 $z$ 是采样时每步抖的随机噪声;训练时定义预测目标用的 $\varepsilon$ 是加噪扰动。只是都叫「噪声」,不是一回事。(还有一个:论文式(2)的步长 $\varepsilon_i$ 又是另一个东西,是个小标量步长,和这两个噪声都无关,只是也借用了字母 ε。) 噪声项是必需件:只顺 score 走是登山,一万次落点全挤在峰顶,铺不出 $p$ 的形状(高维里峰顶那张图本身还是坏图);加上 $\sqrt{2\varepsilon_i}\,z$,「漂移往里收、噪声往外摊」平衡出的落点分布才是 $p$ 本身(为什么见折叠 ②)。 退火 Langevin(论文式2):把上面这条 Langevin 套在 §2.2 那串 $\sigma$ 上、从大到小跑(为什么不能只在一档 $\sigma$ 上跑、必须退火,见折叠 ③): 1. 从纯噪声起步(对应最大的 $\sigma_N$)。 2. 在当前 $\sigma_i$ 上跑 $M$ 步 Langevin(用 $s_\theta(\cdot,\sigma_i)$)。 3. 把结果当起点,降到下一个更小的 $\sigma_{i-1}$,重复;直到最小 $\sigma_1$,输出 ≈ 干净图。 **大 $\sigma$ 阶段先把样本拽进数据大致区域,小 $\sigma$ 阶段抠细节,和你 DDPM/DDIM「从噪声一步步去噪」是同一种「由粗到细」,只是这里用 Langevin + score 实现。**它俩为什么长得像、以及那条确定性 ODE 视角,§4(反向 SDE)、§6(概率流 ODE)会正式合并。 > [!note]- 两层循环怎么数:档数 $N$ × 每档步数 $M$(两组具体配置) > 上面 1–3 就是两层循环: > - 外层:从大到小遍历 $N$ 档噪声,$\sigma_N>\sigma_{N-1}>\dots>\sigma_1$。$N$ = 档数(论文式(1) 就用这个 $N$)。⚠️ 本论文约定 $\sigma_1$ 最小、$\sigma_N$ 最大(和 §2.2 式(1) 那串 $\sigma_1<\cdots<\sigma_N$ 是同一套);NCSN 原论文 2019 反过来、用降序编号($\sigma_1$ 最大),读原文时留神。 > - 内层:在每一档 $\sigma_i$ 上原地跑 $M$ 步 Langevin。 > - 总步数 $=$ 档数 $\times$ 每档步数 $=N\times M$。 > > 两组具体配置($N$ 是外层档数、不是总步数): > - 原版 NCSN:$N=10$ 档、每档 $M=100$ 步 → 总 $10\times100=1000$ 步。十档、每档百步。 > - 本论文(Score-SDE)刷 CIFAR-10 那个 SOTA(FID 2.20):$N=1000$ 档、每档 $1$ 步预测器 $+$ $1$ 步校正器(PC)→ 约 $1000+1000=2000$ 次网络调用(论文 Table 1 标 PC1000,计算量是纯预测器 P1000 的两倍)。千档、每档预测一步+校正一步。 > > 结构对比:10 档 × 每档 100 步 vs 1000 档 × 每档 (1+1) 步。档数 $N$ 越多、每档越少,就越贴近连续时间 SDE 的极限($N\to\infty$);$N=1000$ 时形态已很接近 DDPM 的千步逐步,只是每步多配了一步校正器。 > [!note]- ① Langevin 采样:这条式子怎么来 > 这条式子在做什么。 生成一张图 = 从训练时就定好的分布 $p$ 里抽一个样本。$p$ 藏在 score 里、训练阶段就固定了,采样并不改变它;但 score 是「方向场」、不能直接拿来抽样,得靠 Langevin 顺着它走,把一个样本跑出来。 > > 补个词:布朗运动。 连续时间的随机游走(花粉在水里被分子乱撞、不停抖动)。两条够用的性质:每一小段时间的位移是独立高斯噪声;时长 $t$ 的位移方差正好是 $t$(标准差 $\sqrt t$)。SDE 里的随机微元 $\mathrm dW$ 就是它的一小步,落地就是抽个随机数: > $\mathrm dW=\sqrt{\mathrm dt}\,z,\qquad z\sim\mathcal N(0,I)$ > > 这条式子的来头。 Langevin 是个通用采样法(早于扩散模型):要从任意分布 $p$ 采样,只要能算它的 score $\nabla\log p$,就反复跑这条 Langevin SDE,这就是它的原始形态: > $\mathrm dx = \nabla_x\log p(x)\,\mathrm dt + \sqrt2\,\mathrm dW$ > 漂移 $\nabla\log p$ 把点往高密度引导;$\sqrt2\,\mathrm dW$ 每步注入随机、给落点方差(散开)。跑到平稳,点的分布正好是 $p$。 > 为什么能套到我们这儿: 我们要采样的 $p$ 就是某一档噪声下的加噪边缘分布,它的 score 恰好是 §2.1/§2.2 训练好的 $s_\theta$;把 $s_\theta$ 当这个 score 代进去就能采样,一个量不缺。 > > 为什么跑到平稳正好是 $p$(直觉)。 漂移想把点往高密度收拢、噪声想把点摊散,两股力每步都在较劲。某处比 $p$ 还尖(挤过头)就被噪声摊平,比 $p$ 还散就被漂移拉回;唯一让分布不再变(分布对时间的变化率为 $0$)的形状就是 $p$。方差的来源是噪声,方差多大由「漂移往里压 + 噪声往外撑」的平衡决定。严格证明在附A(Fokker–Planck 那页)§A.4:把分布对时间的导数令为 $0$、两项相消,解出的平稳分布就是 $p$。 > > 噪声前为什么偏偏是 $\sqrt2$。 系数由平稳条件锁定:要让平稳分布正好是 $p$,漂移系数 $a$、噪声系数 $b$ 必须满足 > $b^2 = 2a$ > 由 Fokker–Planck 推出:噪声项在里头自带一个 Itô 的 $\dfrac12$($(\mathrm dW)^2=\mathrm dt$ 来的),令平稳 $\partial\rho/\partial t=0$、代 $\rho=p$、两项抵成 $0$,就逼出这个 $2$(严格推导见附A §A.4 的「$b^2=2a$」折叠)。上面那条原始 Langevin 取 $a=1$,于是 $b^2=2$、$b=\sqrt2$。 > > 漂移里只有 score。 式子里只出现 $\nabla\log p$,不出现 $p$ 本身、更没有配分函数 $Z$。这就是「只有一个 score 网络」也能采样的原因。 > > 离散到论文式(2)(三步,看清开头那个 $x^{m-1}$ 从哪来)。 先钉一句:SDE 描述的是「增量」,不是「位置」——$\mathrm dx$ 读作「这一小瞬间挪了多少」,式子里没有「现在在哪」。 > > 第 1 步 · 连续切成有限小步:$\mathrm dt$ 换成步长 $\varepsilon_i$、$\mathrm dW=\sqrt{\mathrm dt}\,z$ 换成 $\sqrt{\varepsilon_i}\,z$;而增量 $\mathrm dx$ 落到离散,就是两个位置之差(第 $m$ 步位置减第 $m-1$ 步位置): > $x^{m}-x^{m-1} = \varepsilon_i\,\nabla\log p(x^{m-1}) + \sqrt{2\varepsilon_i}\,z$ > (漂移在出发点 $x^{m-1}$ 处取值:这一步往哪走,看的是脚下的 score。) > > 第 2 步 · 把左边的 $x^{m-1}$ 移到右边,「增量式」翻成「更新式」——新位置 = 旧位置 + 这一步的增量: > $x^{m} = x^{m-1} + \varepsilon_i\,\nabla\log p(x^{m-1}) + \sqrt{2\varepsilon_i}\,z$ > 式(2) 开头那个「基础位置」$x^{m-1}$ 就是这么来的:SDE 只给增量,要落成能跑的一步,必须显式带上出发点。 > > 第 3 步 · 真 score 换成训练好的 $s_\theta(\cdot,\sigma_i)$、按噪声档 $i$ 给 $x$、$z$ 加齐角标,就是论文式(2): > $x_i^{m} = x_i^{m-1} + \varepsilon_i\,s_\theta(x_i^{m-1},\sigma_i) + \sqrt{2\varepsilon_i}\,z_i^{m}$ > [!note]- ② 为什么必须加噪声(只用漂移不行) > (0) 先钉住「采到了 $p$」是什么意思。 训好的 $s_\theta$ 是一个 score 场,而 score 场唯一钉死一个分布 $p$(它是 $\log p$ 的梯度,形状全在里面)——所以训练就是训出了 $p$,只是 $p$ 以「场」的形式交付:没有密度公式、没有现成抽样器,只能站在任何一点问「往哪边密度更高、多陡」。「采到了 $p$」指的是:把整个流程重复一万次,一万个落点铺出来的形状 = $p$——分布是一整团点的形状,单个点走到哪都不构成分布。Langevin 干的就是把「用 score 把 $p$ 走出来」和「从 $p$ 里抽一张」合成同一次行走:走到平稳时落点分布就是 $p$,此刻这个点本身即一份样本(附A §A.4 会严格证它)。 > > (1) score 指的是上坡,纯漂移只读得出峰的位置。 score 在每点给一支带长度的箭头:方向说哪边高、长度说多陡。只顺箭头走(纯漂移)就是登山,终点必然是箭头归零处——峰。一万个点各自登山,全停在寥寥几个峰顶上,落点分布 = 几根扎堆的尖刺、宽度为零;而 $p$ 是有宽度的。尖刺 ≠ $p$,这就是「找不到分布」的确切含义:不是找不到位置,是铺不出形状。 > > (2) 宽度存在箭头长度里,而纯漂移把长度整个扔掉。 一维例子看实:$p=\mathcal N(0,\sigma^2)$,score $=-x/\sigma^2$。两座峰位相同、宽度不同的山,score 场的方向、零点完全一样,唯一差别是箭头长度(系数 $1/\sigma^2$:山越宽箭头越短)——宽度就存在这,别处没有。可纯漂移的解是 > $x(t)=x(0)\,e^{-t/\sigma^2}$ > $\sigma$ 只出现在指数的「钟」里:管你多快到 0,不管你到哪——终点 $x(\infty)=0$ 对任何 $\sigma$ 都一样。长度信息没消失,是被整个吸收进了时间轴;而采样只看终点、不看花了多久,所以从结果里读不到它。这就是「扔掉」的机械含义:长度起的全部作用(快慢)恰好是终点不关心的量。 > > (3) 噪声 = 逼长度进入答案的对手。 噪声按单位时间固定力度往外踢、不看你在哪座山;漂移往回拉的劲儿正比于箭头长度。较劲发生在「每单位时间」这个刻度上,谁也没法靠多等一会儿占便宜,停战线只能画在拉力 = 踢力处——而拉力里带着长度,长度就被逼着写进了落点的位置。用 §3.4.1 的方差工具(那是 §3 的内容,先借结论)代 $a=-1/\sigma^2$、$b^2=2$,令平稳: > $\frac{\mathrm dv}{\mathrm dt}=-\frac{2v}{\sigma^2}+2=0\quad\Longrightarrow\quad v=\sigma^2$ > 落点方差精确等于 $\sigma^2$——一万个落点铺出来的正是 $\mathcal N(0,\sigma^2)$ 本身,存进坡度的宽度被一字不差读回。$\sigma$ 从「钟里」搬进了「答案里」,这就是噪声项存在的理由。 > > (4) 高维再补一刀:峰顶那张图本身就是坏图。 上面说明纯漂移铺不出形状;高维还有更直接的坏消息——峰顶连「一张好样本」都算不上。概率质量在高维里几乎全摊在离峰顶有段距离的一层薄壳(典型集)上:高维标准高斯 $\mathcal N(0,I_d)$ 密度最高在原点,可随手抽一个样本 $\lVert x\rVert\approx\sqrt d$,几乎必落在半径 $\sqrt d$ 的球面附近、离原点很远(原点密度最大、周围体积却小到可忽略)。所以纯漂移的输出(峰顶)是糊成一团、发灰的非典型图——删噪声的后果不是「少了多样性」,是抽样对象整个换掉了(从 $p$ 换成挤在峰顶的尖刺);加噪声后按 $p$ 的质量落点、落在薄壳上,抽到的才是正常图。 > 附带一层实现原因。 score 网络只在「数据 + 噪声」覆盖过的区域学得准;没有噪声和退火把轨迹按在这片区域里,点会飘到 score 不可信的空区,误差滚雪球,图更崩。 > > 和 DDPM、确定性 ODE 的关系。 DDPM 祖先采样每步也加噪,不是巧合:§4 会把它和 NCSN Langevin 收进同一条反向 SDE,那团噪声就是反向过程自带的随机项;删掉它、只取后验均值,DDPM 也一样向均值收缩、糊成过度平滑的图。另一条路是概率流 ODE(确定性、无噪声,DDIM 那条):它绕开上面的坑的方式,是另推一条确定映射把噪声分布输运到数据分布,落点仍在样本该在处(§6 登场,到时会看到它和 Langevin 同源)。 > [!note]- ③ 为什么要退火(σ 从大到小) > 直接在小 $\sigma$(≈ 真实数据)上跑单条 Langevin 会卡住,根子是那个流形假设(§2.2「为什么用一串 σ」折叠): > - 真实数据挤在薄流形上,流形之间、之外是大片低密度空区;空区里 score ≈ 0 或训不准,没有可信方向。 > - Langevin 从随机噪声起步多半落在空区,跨不过低密度峡谷去够到数据(漂移没方向、纯靠噪声乱撞要等到天荒地老),混合极慢甚至到不了。 > > 退火的解法:先在大 $\sigma$ 上跑,分布被噪声抹得又宽又平滑,score 处处有信号、很好走;走到大致位置后当热启动,降到小一点的 $\sigma$ 再跑几步;一路把 $\sigma$ 调小,分布逐渐变尖,点也被一路「领」到数据流形上。 > > 这正是「退火」一词的来历,和模拟退火同理:先高"温"($\sigma$ 大)便于探索、再慢慢降温($\sigma$ 小)收敛细节,避免一上来就卡死在空区。 --- ## §2.4 小结:NCSN 两件事,和 DDPM 对照 | | 训练 | 采样 | |---|---|---| | NCSN(VE) | denoising score matching:网络猜 score,预测目标 $-\varepsilon/\sigma$ | 退火 Langevin:一串 σ 从大到小,每档跑 $M$ 步 Langevin | | DDPM(VP) | 走 ELBO,网络猜 $\varepsilon$($L_\text{simple}$) | 祖先采样:按反向马尔可夫链一步步去噪 | 两条河:训练预测目标差一个已知系数(score $=-\varepsilon/$噪声标准差),采样都是「由粗到细、从噪声走回数据」。(现代 VE 这条线的后裔是 EDM / Karras。) --- ## 本节一条线 NCSN 的加噪核就是 §1.4 的 VE($\tilde x=x+\sigma\varepsilon$),它的 score $=-\varepsilon/\sigma$,这个 score 就是训练时网络要预测的目标。它做两件事:训练用 denoising score matching,把「匹配写不出的边缘 score」换成「匹配闭式的条件 score $-\varepsilon/\sigma$」,最优解相等;采样用退火 Langevin,一串 $\sigma$ 从大到小,每档「顺 score 走一步、加一份噪声」。下一节 §3 把两条河一起写成连续时间的前向 SDE——你会看到 VP、VE 只是同一条 SDE 的两组 $(f,g)$。