第二讲
第二讲
需要复(预)习的知识
主要讲讲本节需要用到的知识
概率密度
概率密度是概率论中用来描述连续型随机变量在某个确定的取值点附近的相对可能性的函数(也称概率密度函数,简称 PDF)
因为在连续型概率分布中,取到每个精确点(比如P(X=a))的概率都为 0,但也不意味着该事件为不可能事件。
所以,在连续型概率分布中要求得概率,一般都是求一个范围(比如 P(a < X <= b)),求解的方法如下
偏导数
我们先从普通导数说起。假如 只有一个输入,求导就是看 稍微动一下, 会怎么变。但如果函数同时有好几个输入,比如 ,你只想知道 变化带来的影响,怎么办?把 暂时当成一个已经给定的常量,对 求导就好了,这叫偏导数:
看第二个式子的时候,反过来把 当成常量求导就可以了。
梯度
如果一个函数有好几个变量,那我们把每个变量各求一次偏导,然后把结果排成一个向量,这个向量就是梯度。还拿上面的 举例:
按高数的知识说,梯度能够表明:在当前位置,往哪个方向走,函数值上升得最快。相当于站在一座山坡上,梯度就是从目前站的点出发,上山路最陡的一条,它是一个方向。
常微分方程(ODE)和随机微分方程(SDE)
我们先只记住这两种方程的区别,不急着研究怎么解。
常微分方程,简称 ODE,可以写成:
这里的 可以理解成时间, 是会随着时间变化的状态(在我们这儿可以是一张图片), 告诉你:现在这个位置,下一小步该往哪儿走。给定起点和方程后,沿这条路线走是确定性的。
随机微分方程,简称 SDE,则在原本的变化之外,还加了随机扰动:
前一项 是确定的变化,后一项 是随机的变化。 叫维纳过程,你现在把 理解为“一小段时间里新抽到的一份随机增量”就够了。即使从同一个起点出发,每次抽的随机增量不同,走出的路线也可能不同。

不是另一种写法的
时间间隔 是我们选的一小段长度;维纳过程在这段时间里的增量是随机的,其均值为 0、方差与这段时间长度成正比。所以不能把 当成普通数字,也不能把 SDE 当成“在 ODE 后面随便加个常数”。
第一讲的 DDPM 是按离散的 一步步加噪的。第二讲会试着把时间切得越来越细,从连续时间的视角看加噪与去噪;这时 SDE 和 ODE 就轮到它们上场了。
泰勒展开
最后复习一个后面讲加速时会用到的工具。假如我们知道函数在 附近长什么样,要估计稍远一点的 处的值,最简单的方法是用当前位置的函数值和斜率:
这就是一阶泰勒近似。讲人话:站在弯曲的路上,先按脚下的切线方向往前猜一小段。若还想估得更准,可以继续考虑弯曲的程度,也就是二阶导数:
比如 ,在 时 、。用一阶式估计 得到 ;真正的值是 ,少掉的 就是这次近似的误差。 越大,光看切线通常越不靠谱。
为什么讲扩散模型会突然冒出泰勒展开?
后面我们想让生成过程少走几步,每一步就不得不跨得更远;跨得远,近似误差又容易变大。像 DPM-Solver 这样的求解方法会利用对变化趋势的近似,在速度与误差之间做取舍。这里先理解“小步好估,大步需要更聪明的估计”就行。
差不多就先这样,我们进入正题
回顾
在上一讲,我们讲了 Diffusion 模型的加噪原理并推导了公式,同时我们还推导了 DDPM 提出的损失函数:
此外,我们还研究了 DDIM 生图跳步的原理,并了解了跳步带来的利益和损失。
然而,除了 DDIM 和 DDPM 的 Diffusion 派的方法,其实还有另外一条生成范式,他们是 Score Matching(分数匹配)派。
Score Matching
先别被 score 这个名字骗了。这里的 score 既不是老师给卷子打的分,也不是给图片算一个真实程度:99%。它是概率密度先取对数,再对图片本身求梯度:
这里的 是真实图片的概率密度。 是一张图片展开后的长向量,所以 也是和图片一样长的向量:每个分量告诉我们,把对应的像素值轻轻改一点,密度会朝哪个方向增加。
还记得前面那个上山的比喻吧?如果把所有可能的图片的空间想成一片巨大的三维面,越好越真实的图片海拔越高,越差越乱的图片海拔越低。score 就是你站在当前位置时,脚下指向上坡的箭头。如果我们在很多位置都知道这个箭头,就可以让一个随机生成的点顺着它,逐渐走到真实图片比较集中的地方。这就是 Score Matching 这条路线的直觉。

图示中的范围是所有可能的图片的集合,颜色越淡,代表图片质量越差
对谁求导?"概率大"又是什么意思?
是对图片 的各个数值求导(毕竟图片中的每一个像素点的数值都是能变化的,所以他们是变量),不是对模型参数 求导。这里说的"概率大"为了方便理解,严格讲是概率密度高;连续型变量刚好等于某一张指定图片的概率并不能这样理解。
以高斯分布为例
如果上面还太抽象,先不看图片,来看一维高斯 。把它的密度取 log,那些不含 的常数求导后都会变成 0,留下:
假如 ,那 score 就是正的,也就是叫你往右走;,那 score 就是负的,也就是叫你往左走。两边都指向密度最高的均值附近。换成很多维的各向同性高斯,也一样,只是结果变成了向量:。
真实图片的 score 去哪里找?
我们先想一个问题:假如有个函数 ,会给每张图片一个非负的数,数字越大代表这张图越符合我们想建模的分布,能直接叫它"概率密度"吗?还不能。概率密度有一条规矩:对所有可能的图片积分,总量得等于 1,也就是 100%。所以必须拿 除以它的积分后的总量
这个 就叫归一化常数(也常叫配分函数)。积分里的 遍历所有可能的图片;积分做完得到的是一个数,不随我们接下来要考察的那张图片 改变。问题在于,一张图片有那么多像素、那么多可能的取值,要把所有图片的 加起来求 ,根本算不动
现在对 取 log 再求梯度,前面那个难算的 就自己没了,毕竟 是一个常数,求完导就没了:
所以如果我们已经知道未归一化的函数 ,要算 score 就不用先求出 ,这是采用对数梯度的一大方便之处。比如上面那个高斯例子,密度前面一长串不含 的系数,求 score 时都可以不管
然而,高斯分布的密度我们会写,但真实图片的 谁会写?这显然写不出来
因此,消掉 只是解决了归一化常数难算的问题;真实数据对应的 还不知道,我们仍然算不出
那深度学习的意义就出来了,我们就训练一个网络 去猜 score。这件事叫 Score Matching:我们希望网络给出的方向,尽量和真实的 一样。不过如果直接把真实 score 当答案来算误差,也就没有一个标准来评判模型做的究竟是好还是不好了。有没有办法自己造出一个算得出的标准答案呢?当然有,那就是加噪
加噪得到的标准答案
我们拿一张已知的真实图片 ,自己抽一份标准高斯噪声 加上去,得到一张受污染的图片 :
这里 控制噪声有多大。固定住这张 后, 的条件分布就是一个均值为 、协方差为 的高斯:
这不就是上一节刚算过的高斯 score 吗?对带噪图片 求梯度,马上得到:
讲人话:我们知道原图,也知道自己加了哪份噪声,所以能给网络一个"从带噪图片往回走"的箭头。让网络 看着带噪图片和噪声强度猜这个箭头,就能写出一个可以计算的训练目标(即损失函数):
这叫 Denoising Score Matching,简称 DSM,翻译过来就是"去噪分数匹配"。我们亲手加噪,答案 就在手里,模型负责学会指出往回走的方向
条件分布的 score 就是真实图片分布的 score 吗?
那当然不是了 是"原图固定为某一张 "时的条件分布;而把所有可能的原图都考虑进去,得到的带噪图片整体分布是 。网络只看到 和 ,不知道这次究竟是哪张 。当我们对许多训练样本取平均时,用上面的条件 score 当训练答案,网络最理想的预测会是这些答案在给定 时的平均,而这个平均恰好等于带噪整体分布的 score 。这一步有数学依据,但两个分布不能直接画等号;并且带噪分布也不等于未经加噪的
控制噪声的大小
假如 很小,带噪图片和真实图片差不多,网络能学到一些精细结构,但在离真实图片很远的地方,没多少训练样本给它指路;而生成时我们可能恰好从那里开始。要是 太大,离得很远时也能知道大致往哪儿走,但想还原细节又困难

就像图中显示的一样,噪声小的时候,图片原来的特征被保留的比较好,分布也没太大变化。但噪声较大的时候,分布则受到了比较大的影响,分布变成了一坨,看不出原来的样子
怎么办?不要只用一个 ,安排一串由小到大的噪声强度 ,分别给图片加噪,让一个网络同时学习各档噪声下的方向 。这就是 NCSN(Noise Conditional Score Network,噪声条件分数网络)的思路
生图时我们反过来用:先在大噪声这档找一个大概的方向,把样本带到像图片的区域;然后慢慢降低 ,在小噪声这档修轮廓、补细节。就像先远远看见山在哪儿,走近了再找通往山顶的小路。
降低噪声强度,是模型自己判断的什么时候细修吗?
不是。 这串时间表是我们事先定的,生成时人为地从大的 走向小的 。模型做的是在指定噪声强度下告诉我们方向,不是自己决定哪一刻该换档。
那每一档具体怎么走?一种常用办法叫 朗之万采样(Langevin Dynamics):沿着网络预测的 score 走一点,再加一小份随机扰动。例如把当前图片记为 ,可以写成:
是这档噪声的步长, 是预测的 score ,即方向;在一个 下可以重复走好多小步,再切到下一档。因为每次都要重新抽 ,同一个起点也不一定会走出完全相同的结果。这样在不同噪声档位上逐步走的做法,叫 Annealed Langevin Dynamics(退火朗之万动力学)
为何既有往上走又有随机扰动?
score 提供走向高密度区域的方向,随机扰动则让采样不是一条死板的爬山路线。它的目标是从学到的分布里采样,不是只找到一张密度最高的图片,不然大家岂不是都挤到同一个山顶去了?这里的 和 是这一种常用写法的系数约定,重点先记住 方向 + 随机性。
猜噪声和猜 score 是什么关系?
看到这里你可能会说:一边要网络猜噪声,一边要网络猜 score,难道它们是完全不相干的两派?其实不是。把第一讲的加噪公式拿回来:
固定原图 时, 的均值是 ,方差是 。照着高斯 score 的公式来算:
也就是说,在给定原图的这道训练题里,噪声 和条件 score 只差一个负号、一个已知的缩放系数。网络预测的 因而也能换算成相应噪声水平下的 score 估计:
这里又是"条件 score"还是"总体 score"?
上一个等式里的 明确给定了原图;生成时却没有 。网络只接收 和 ,在理想训练条件下,它学到的是这些训练答案在给定 时的平均,可以用来估计该时间步全部带噪图片的分布 的 score。不要把这两个 score 直接写成同一个东西。
所以说 Diffusion 派 和 Score Matching 派 更像是从不同角度看同一类问题:一个先写出图片怎样加噪、再学着把噪声猜出来;另一个先问图片分布的上坡方向在哪里、再学着沿方向采样。接下来课程会把离散的加噪步骤变成连续时间的 SDE,看看这两条思路如何被放进同一个框架。
从离散加噪到 SDE
先回忆一下第一讲的 DDPM:,每次保留一点旧图片,再添一份新噪声。NCSN 虽然用的是另一套噪声强度 ,也要在一档一档的噪声水平之间切换。问题是:非得把时间切成一格一格的吗?
可以试着把每一格切得越来越细。连续时间里,我们把当前图片记为 ,在短短的 中,它既会有确定性的变化,又会受到一小份随机扰动:
这就是前面预习过的 SDE。 控制确定性的"漂移", 控制随机扰动有多强, 则提供连续时间下的随机增量。往正时间方向解这个方程,可以让数据逐渐变成噪声。
这里的 和第一讲的步数 是一回事吗?
它们都表示"加噪进行到哪里",但第一讲的 是整数步号,今天的 可以取连续的时间值。别把一小段时间 和"整数步数减一"直接画等号。具体从离散公式走到哪一个 SDE,还取决于怎么让每小步的噪声强度随步长一起变化。
例如,让 DDPM 每一小步的噪声方差近似为 ,在步长趋近于零时,会得到一种叫 VP-SDE(Variance Preserving,方差保持)的形式:
其中 就是连续时间里的噪声速率。前面的 让原来的信号逐渐衰减,后面的随机项不断加噪;它对应的是 DDPM 这一类前向过程。NCSN 的"在数据上不断增加高斯噪声"则可以对应另一类 VE-SDE(Variance Exploding,方差爆炸):确定性漂移为零,噪声的方差随着时间增长。
"方差爆炸"是说模型训练炸了吗?
不是!VP 和 VE 是两类前向噪声过程的名字。"爆炸"说的是 VE 的噪声方差沿正时间方向越加越大,不是我们前面说的梯度爆炸。
到这儿,两条路线终于可以放在同一张地图上看了:DDPM、NCSN 虽然起步的讲法不同,但都能从"数据怎样逐渐变成噪声"的连续过程来描述。那要生图,该怎么把这条过程倒过来?
反向 SDE (reverse SDE)
如果前向 SDE 知道怎么把数据扰乱,是不是把公式里的 改成负数,就能把它恢复?没这么省事。前向加噪不断注入随机性,反向时还得知道当前噪声水平下,图片整体分布的密度往哪里变高。这正是刚才费劲学的 score。
对上面的一般形式,在通常的条件下,反向时间过程可以写成:
这里 是时间 时所有带噪图片的整体密度,不是给定某张原图时的条件密度。 表示反向采样所用的随机过程;中括号里多出来的 score 项,是倒着走时对漂移方向的修正。实际中我们不知道真 score,就拿网络学到的 代替。
为什么括号里是"减 score",却说它帮我们走向数据?
因为这条公式按正向时间 的坐标写,生成时我们从大 走向小 ,所以 。只盯着中括号的负号看,很容易把实际走的方向搞反。如果改用一个从零开始递增的"生成时间"来写,公式的符号也会相应变化;本文沿用从 往 走的约定。
怎样在电脑上"解"它?拿一串离散的时间点,从 抽一张噪声图开始,每一步用当前的 更新图片,再加入对应的随机扰动。这类数值方法里最朴素的一种叫 Euler–Maruyama,你可以把它理解为"随机方程版本的欧拉法"。只要网络估计得够准、步子取得够细,走到时间零就得到图片。
问题和第一讲又像了:步子太小,网络要调用很多次;步子太大,数值误差明显。再加上每一步还有随机扰动,想又快又准并不容易。课程给的传统采样例子里,往往需要上千个很小的步骤。
概率流 ODE (PF-ODE)
反向 SDE 每一步都有新的随机性。那可不可以找一条确定性的路线,也能让大量样本随着时间变化时,呈现相同的概率分布?答案是可以,对应的方程叫 Probability Flow ODE,也就是概率流常微分方程:
注意这里没有 ,而且 score 前面的系数从反向 SDE 的 变成了 。两者不是把随机项随手擦掉就完事了:系数也得跟着调整,才能在理想情况下保持同样的各时刻概率分布。实际采样时还是用网络 代替真 score。
那么这个 到底从哪儿冒出来的?课程的推导用了 Fokker–Planck 方程,它描述的不是单张图片怎么跑,而是一大群图片在各个位置上的密度 怎么变化。前向 SDE 对应的密度变化是:
第一项是确定性漂移把整群样本带走,第二项是随机扰动把密度往周围摊开。现在用 ,把它改写成"密度被一股速度场推着走"的样子:
方括号里的 ,正是上面那个 ODE 的速度。因此在真 score、相同初始分布等理想条件下,用这股速度推着样本走,得到的密度变化会和原 SDE 相同。这里不必硬背 Fokker–Planck 方程;重要的是看清:随机过程怎样摊开整群样本,可以用另一股确定性的速度场来实现相同的密度变化。
和 又是什么?
是散度,用来描述一股流在当前位置是往外散还是往里汇; 是拉普拉斯算子。如果你没学过这两个符号,可以先跳过中间公式,只记住它是在比较"一大群样本的密度如何变化",不是在断言两种方法里每张图片都走同一条路。
"分布一样"难道不就是"每张图走得一样"?
不是。想象一群人从教学楼走到食堂:只看某个时间点各区域的人数,两种路线安排可能一样;但单看其中一个同学,他经过哪条路未必一样。反向 SDE 与对应的概率流 ODE 说的是各时间点的边缘分布相同(在真 score 等理想条件下),不是说同一个初始噪声会生成逐像素相同的图片。网络误差和数值求解误差也会让实际结果有所偏离。
ODE 没有新抽的随机项,从给定起点往下走的轨迹是确定的,也方便我们借用常微分方程的数值求解方法,按误差与速度来设计步长。不过确定性不等于没有生成多样性:起点 仍是随机采样的;同样,也不能简单断言 ODE 一定比 SDE 质量差,得看具体的模型和求解方法。
说了这么多,我们把两条生成路线摆到一张表里比一比就知道了:
| 比较项 | 反向 SDE | 概率流 ODE(PF-ODE) |
|---|---|---|
| 更新方程 | ||
| 过程性质 | 随机:每一步还有随机扰动 | 确定:给定起点后,沿确定的轨迹走 |
| 采样多样性 | 较高 | 较低;换起点仍可生成不同图片 |
| 采样质量 | 较高 | 较低;不是普遍保证 |
| 采样速度 | 通常较慢 | 通常较快,可借助 ODE 求解器加速 |
| 同一个起点重复生成 | 后续抽到的噪声不同,结果可能不同 | 在模型与求解设置相同的情况下,结果相同 |
| 各时刻的分布 | 与对应 PF-ODE 的边缘分布相同(理想条件下) | 与对应反向 SDE 的边缘分布相同(理想条件下) |
| 求解方式 | 可用 Euler–Maruyama 等随机数值方法 | 可用 ODE 求解器,包括后面要说的 DPM-Solver |
| 求解时的侧重点 | 需处理随机扰动及离散化误差 | 不额外注入噪声,主要考虑数值求解误差 |
「多样性、质量更高」和「边缘分布相同」矛盾吗?
表里「较高/较低」是课程对具体采样方法的定性比较,不是定理。在真 score、理想求解且初始分布相同的条件下,两种过程在终点的分布也相同,不能由随机/确定性直接推出哪一种图片必然更好、整体多样性必然更高。实际结果还取决于网络误差、求解器、步数与随机项的使用方式;速度也不能脱离这些条件一概而论。
「同一个起点结果相同」是不是说 PF-ODE 只能生成一张图?
不是!表里比较的是固定同一份起点噪声 的情形。换一份随机起点,就能得到另一条轨迹、另一张图。两种方法在理想情况下相同的是整群样本在某个时间点的分布,不是固定一个起点时生成的那张图片。
这是不是听着有点像第一讲的 DDIM?对,都是希望少加生成过程中的额外随机性,用更少的步数走回数据。它们之间有联系,但别把"DDIM 公式"和"任何概率流 ODE 求解"直接当成完全相同的东西。
DPM-Solver
有了 ODE,问题还没结束:电脑不能凭空画出整条连续轨迹,还是得选几个时间点来算。之前的欧拉法只看当前位置的变化方向;如果跳得太远,把弯路当直路走,误差就大。Runge–Kutta 之类的方法会多看几次中间位置,走得更准,但每多看一次,通常又要调用神经网络。
为了比较速度,课程用了一个很实在的指标:NFE(Number of Function Evaluations,函数评估次数)。在这里,可以近似理解成生成一张图时调用噪声/score 网络多少次。比如一次更新里调用四次网络,即使只写作"一步",也要算四次 NFE。
"采样步数"为什么不一定等于 NFE?
某些求解器走一步只问网络一次,另一些会先看中点、再问几次网络,最后才决定怎么走。所以说"10 步生成"还得看看每步调用网络几次;和第一讲 DDIM 跳步时一样,我们真正想省的是耗时的网络调用。
DPM-Solver 就是为这类扩散模型对应的 ODE 设计的求解器。它利用方程中一部分已知的结构:能按公式处理的部分尽量别让网络瞎猜;难处理的、由网络预测噪声提供的部分,再用近似方法来估计。课程提到的一阶、二阶以及更高阶的版本,核心都是在每次用多少次网络评估和能承受多大的跳步误差之间取舍。这里要是把完整求解器公式全堆上来,我估计我会先死在这里,所以先抓住这个主意。
它和普通的欧拉法究竟差在哪儿?
我们拿第一讲的 VP 加噪过程来看。在连续时间里,给定原图 ,带噪图片可以写成 。这里的 是连续时间的信号系数和噪声标准差,并满足 ;注意此处的 相当于第一讲的 ,不是第一讲定义的 。这个记号上的小坑得先填上,不然后面的公式很容易看晕。
把网络预测的噪声与 score 的换算式代入概率流 ODE,它会变成"一项关于 的已知线性变化,加上一项由网络预测噪声决定的变化"。普通欧拉法把这两项一起按当前斜率近似;DPM-Solver 则把已知的线性部分按公式精确处理,把更难处理的网络预测部分留下来做近似。能算准的先算准,别让整个方程陪着一起猜。
课程在这里还引入了对数信噪比作为新的时间坐标,记作 。信号相对噪声越强, 就越大;沿着生成方向从噪声走回图片时,它会逐渐增大。在这个新坐标下,一阶版本可以理解为:跨越一次较大的时间区间时,先假设网络预测的噪声在这段区间里变化不大,只调用一次网络;二阶版本多看一个位置,利用两次网络结果修正估计;更高阶则继续近似网络输出如何变化。
这个"一阶"和刚才复习的泰勒展开有关吗?
有关:它们都在用有限的信息估计一小段范围内的变化。不过 DPM-Solver 不是把整条方程无脑做泰勒展开:它先利用扩散 ODE 的特殊结构处理已知部分,再近似网络预测的部分。因此,同样花几次 NFE,它可能比直接套一个通用求解器更划算。
还有个挺有意思的联系:对于 VP 过程,上面说的 DPM-Solver-1 用一次网络评估来估计一个区间,写成更新式后与第一讲介绍的确定性 DDIM 更新相同。但它们的出发点不一样:DDIM 是从保留加噪边缘分布、重新安排生成路线来理解跳步;DPM-Solver 则是从扩散 ODE 的数值求解来理解这件事。这个对应说的是特定的一阶公式,不能推成"DDIM 就等于所有阶的 DPM-Solver"。
高阶一定比低阶好吗?
高阶近似可能让一次大跳步更准确,但往往也需要更多次网络评估;在固定 NFE 预算下,要一起看步数、每步成本和最终图片效果,不能只比方程上写的"阶数"。我们预习泰勒展开,就是为了理解为什么知道更多变化信息,有机会降低大步走时的误差。
课程的结论是:与普通的数值求解方式相比,DPM-Solver 在网络调用次数很有限时尤其有优势;直接使用已有的噪声预测模型,通常不必重新训练,在大约 10~20 次 NFE 时也能得到不错的结果。这是具体实验和模型条件下的经验,不是承诺任何图片都能十步无损生出来。
总结
这一讲的信息量有点大,我已经要炸了。把主线压缩成下面几步,就没那么吓人:
- 先学方向:score 是 ,告诉当前带噪图片往哪个方向走;不知道真实密度,就通过给图片加噪,用 DSM 训练网络来估计它。NCSN 再让网络学会应对不同噪声强度。
- 再换视角:离散地加噪、去噪可以放进连续时间的 SDE 里。反向 SDE 利用 score 把噪声变回图片,而 DDPM 与 score-based 方法也因此有了共同语言。
- 最后想办法快一点:与 SDE 具有相同边缘分布的概率流 ODE 给了另一条确定性采样路线;DPM-Solver 利用这条 ODE 的结构,在较少的网络调用次数下尽量控制跳步误差。
这一讲里哪些"相同"不能直接画等号?
噪声预测和score 估计能在对应的加噪设定下换算,但它们不是什么情况下都相同;反向 SDE和概率流 ODE在理想情况下有相同的各时刻边缘分布,但单张图片走的轨迹不同;DPM-Solver-1和确定性 DDIM有特定公式上的对应,不代表更高阶求解器都是 DDIM。弄清楚每句话的条件,比死记公式更有用。
到这里,第二讲的路线就串起来了:第一讲解决"怎样把噪声猜出来",第二讲换成"怎样估计图片该往哪里走",最后把这两种视角连起来,寻找更快的生成办法。
参考文献
- 【极致中配】2026年春季 斯坦福大学 CME296: 扩散与大视觉模型 Diffusion & Large Vision Models)
- Generative Modeling by Estimating Gradients of the Data Distribution
- Score-Based Generative Modeling through Stochastic Differential Equations
- DPM-Solver: A Fast ODE Solver for Diffusion Probabilistic Model Sampling in Around 10 Steps
