想象你是一位被蒙住眼睛的地图绘制员,站在一座浓雾笼罩的山脉里。你没法飞上天空俯瞰全貌,也没人告诉你每一座山峰的海拔。你手里只有一根手杖——当你把它杵在地上,能感觉到脚下的坡度朝向。数据分布这座“山”,就是待探索的未知地形;你的任务,是仅凭手中这根“坡度手杖”,画出一张足够精确的山势图,以便将来能在这片山上自由行走(也就是生成新样本)。这就是 Score Matching 要做的事:不直接测量“海拔”(概率密度),而是处处测量“坡度”(对数密度的梯度),再通过这些坡度信息重建整个地形。 你可能觉得奇怪:只凭坡度,真的能还原一座山吗?答案是:如果你在每个位置的坡度都知道,那么顺着坡度一路往上,你就能爬到山顶;顺着坡度往下,就能下到谷底。地形的高程信息虽然被淹没在常数中,但拓扑结构完全由坡度决定。更妙的是,“坡度”不需要知道海平面(归一化常数)——这正解决了概率建模中最头疼的配分函数难题。本文将带你从坡度的定义出发,看看如何设计目标让模型学会“报坡度”,并最终化解为去噪任务,连成扩散模型这条完整的技术线。

岗位关联

对 AI 从业者而言,理解 Score Matching 是深入扩散模型底层原理的钥匙;它让你不仅会调包,更懂得模型在训练时到底在学什么,以及如何诊断和优化生成质量。

目录
  1. 可视化演示
  2. 问题起源
  3. 核心定义
  4. 目标函数
  5. 朴素局限
  6. 去噪改进
  7. 扩散衔接
  8. 实践展望
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示Score Matching的核心机制,通过源头/管道/节点/终端四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Score Matching:得分函数 得分函数与概率密度的对数梯度 得分匹配的目标函数 核心机制可视化 Score Matching整体架构与关键组件

问题起源

盲人制图师站在雾山脚下,他知道山上一定藏着复杂的地形——也许有双峰,也许有多条山谷。但他没法飞起来看,只能随机扔下一些标记石(样本点),然后依靠手杖在这些点附近摸索。真正的数据分布就是这座雾山,而手里那一堆石头就是我们的训练数据。大多数概率模型想要描绘这座山,都需要一种叫“能量函数”的东西,再通过指数变换得到形状,最后除以一个归一化常数来保证整个山体体积为 1。这个归一化常数就是“海平面基准”。

理论上,只要知道能量函数,就能算出这个常数。可现实是,哪怕是一个 28×28 的图片分布,这个“常数的积分”也要在一个高维空间里算,几乎不可能精确完成。于是研究者意识到:与其啃下这块硬骨头,不如换一个问题来问——山整体多高我们不知道,但“站在某一点,坡向哪个方向”往往更容易估计。用数学语言说,我们避开直接建模概率密度,转而建模它的对数梯度。

回到比喻:$Z$ 就像整座山的“绝对海拔校正值”,但我们只关心坡向,所以可以先不理会它。下一节我们要定义一种完全不需要 $Z$ 的“坡度计”。

p(x)=exp⁡(−E(x))Z,Z=∫exp⁡(−E(x)) dx\displaystyle p(x) = \frac{\exp(-E(x))}{Z}, \quad Z = \int \exp(-E(x)) \, dx
这个式子说明:概率密度被拆成了“形状” $\exp(-E(x))$ 和“比例因子” $Z$ 的比值;$Z$ 常常难算,而我们要做的就是绕开它。
  1. 密度函数$p(x)$ 表示数据出现在点 $x$ 的概率密度。地形中“该点的山体层厚”。
    p(x)\displaystyle p(x)
  2. 能量函数$E(x)$ 给不同输入打分,数据常见的区域能量低,反之能量高。对应地形的“险峻程度”。
    E(x)\displaystyle E(x)
  3. 指数核$\exp(-E(x))$ 将能量转为非负权重,能量越低权重越大。这就是山体在此处的“原始隆升量”。
    exp⁡(−E(x))\displaystyle \exp(-E(x))
  4. 配分函数$Z$ 把所有权重加起来做归一化,让总面积等于 1。类似“把所有石头点的海拔都测一遍后定的基准线”。
    Z=∫exp⁡(−E(x)) dx\displaystyle Z = \int \exp(-E(x)) \, dx

核心定义

手杖的核心功能是“测坡度”。在数学上,我们定义一种操作:先把山的形状取对数,再求梯度。为什么取对数?因为对数能把指数形式的能量函数变成简单的线性关系,而且取完对数后,那个神秘的 $Z$ 变成了一个常数项,一旦求梯度就会被消去。于是我们得到的这个量——对数概率的梯度——被称为 score 函数。

这个 score 是一个向量场:在山的每一处,它指向概率密度增长最快的方向。如果你站在半山腰,score 会告诉你“往上走能到更高概率的地方”;如果你站在谷底,score 会把你推向山坡。它不关心你到底在多高的绝对海拔——这就是我们梦寐以求的“纯坡度”。

现在,地图绘制员的手杖终于有了:只需要让模型学会在每个位置输出一个坡度向量,并且不让它依赖海平面基准。那么,如何判断模型输出的坡度准不准?这就需要一个评价目标。

s(x)=∇xlog⁡p(x)\displaystyle s(x) = \nabla_x \log p(x)
  1. 对数变换$\log p(x)$ 把乘法变成加法,且归一化常数 $Z$ 独立成项。就像把海拔的指数标尺换成了普通标尺。
    log⁡p(x)\displaystyle \log p(x)
  2. 梯度运算$\nabla_x$ 对 $x$ 求导,得到各个坐标方向的变化率。相当于手杖同时感知东西方向和南北方向的倾斜。
    ∇x\displaystyle \nabla_x
  3. Score 函数$s(x)$ 是完整的坡度向量,维度与数据维度相同。它告诉模型在山谷的哪个方向走,能更快找到高概率区域。
    s(x)=∇xlog⁡p(x)\displaystyle s(x) = \nabla_x \log p(x)
  4. 消去 Z因为 $\log p(x)=\log(\exp(-E(x))) - \log Z = -E(x) - \log Z$,梯度后 $\log Z$ 消失,所以 score 与 $Z$ 无关。
    s(x)=−∇xE(x)\displaystyle s(x) = -\nabla_x E(x)

目标函数

一个盲人制图员怎么知道自己手的坡度和真实坡度相差多少?他可以沿着山坡走一圈,每走一步都用手杖测量一次,然后比较两只手杖的读数。Fisher 散度就是为这个目的设计的:它衡量的是两个分布对应的 score 函数之间的平方差期望,让模型 score 在数据的每个常见位置上尽量贴近真实 score。

这里 $s_\theta(x)$ 是参数为 $\theta$ 的神经网络输出的预测坡度。目标函数的值越小,说明模型对地形坡度的把握越准。我们并不需要在整个空间上都准确,而是按真实数据分布加权——也就是说,模型应该优先把出现频率高的区域(人流密集的路线)的坡度测准,冷门悬崖测不准关系不大。

看起来目标函数很自然,但是里面有个致命问题:真实坡度 $\nabla_x \log p(x)$ 我们并不知道!如果已知真实分布,还要训练模型做什么?这就好比制图员想比较,却没有“标准手杖”。于是下一步,数学家们设法把这个目标改写成只含模型输出的形式。

J(θ)=12 Ep(x)[∥sθ(x)−∇xlog⁡p(x)∥2]\displaystyle J(\theta) = \frac{1}{2} \, \mathbb{E}_{p(x)} \left[ \left\| s_\theta(x) - \nabla_x \log p(x) \right\|^2 \right]
  1. 模型输出$s_\theta(x)$ 是神经网络给出的坡度预测,参数由 $\theta$ 控制。
    sθ(x)\displaystyle s_\theta(x)
  2. 真实坡度$\nabla_x \log p(x)$ 是理论上的 score,是我们想逼近的“金标准”。
    ∇xlog⁡p(x)\displaystyle \nabla_x \log p(x)
  3. 平方误差$\left\| \cdot \right\|^2$ 把两个向量的差转为非负数值,让正的偏差和负的偏差都能被惩罚。
    ∥sθ(x)−∇xlog⁡p(x)∥2\displaystyle \left\| s_\theta(x) - \nabla_x \log p(x) \right\|^2
  4. 期望$\mathbb{E}_{p(x)}[\cdot]$ 按数据分布取平均,表示“在山上最常见的路段上,平均测坡度误差”。
    Ep(x)\displaystyle \mathbb{E}_{p(x)}
  5. 系数$\frac{1}{2}$ 是为了让后续求导时系数整洁,不影响最优点。
    12\displaystyle \frac{1}{2}

朴素局限

面对目标函数中未知的真实 score,经典做法是“掩耳盗铃”——利用分部积分,把真实 score 的表达从损失中挤出去,让损失只依赖于模型自身的一阶、二阶信息。这个技巧的代价是:你需要在每个数据点上计算模型输出对输入的导数矩阵(雅可比矩阵)的迹,相当于不仅要测坡度,还要测坡度在山体上的弯折程度(曲率)。

如果你尝试用深度学习实现它,就会发现麻烦接踵而至。首先,对神经网络输出求输入的各阶偏导需要反向传播两次,计算复杂度随维度线性增长;在高维图像、点云上,这个开销让训练几乎不可行。其次,在样本稀少的数据稀疏区,曲率估计方差巨大,手杖会疯狂摆动,模型根本学不出稳定的坡度。于是研究者开始寻找另一条路。

这就像你原本只想测坡度,结果为了修正误差,还得同时测量坡度的变化率。对于一位只能靠手杖摸路的绘图员来说,这要求太高了。我们需要一个更巧妙的招:去噪。

J(θ)=Ep(x)[tr⁡ ⁣(∇xsθ(x))+12∥sθ(x)∥2]+const\displaystyle J(\theta) = \mathbb{E}_{p(x)} \left[ \operatorname{tr}\!\left( \nabla_x s_\theta(x) \right) + \frac{1}{2} \left\| s_\theta(x) \right\|^2 \right] + \text{const}
  1. 迹运算$\operatorname{tr}\!\left( \nabla_x s_\theta(x) \right)$ 表示对模型 score 的雅可比矩阵求迹,即对角线元素之和,量化“曲率的总强度”。
    tr⁡ ⁣(∇xsθ(x))\displaystyle \operatorname{tr}\!\left( \nabla_x s_\theta(x) \right)
  2. 模型梯度$\nabla_x s_\theta(x)$ 是模型输出对输入的导数矩阵,展示坡度随位置变化的快慢。
    ∇xsθ(x)\displaystyle \nabla_x s_\theta(x)
  3. 平方项$\frac{1}{2} \left\| s_\theta(x) \right\|^2$ 鼓励模型不要输出过大的坡度,相当于给手杖灵敏度设置正则。
    12∥sθ(x)∥2\displaystyle \frac{1}{2} \left\| s_\theta(x) \right\|^2
  4. 常数项$\text{const}$ 是与 $\theta$ 无关的项,不影响参数优化,可以忽略。
    const\displaystyle \text{const}

去噪改进

回到山里,当你对某处地形没有把握时,最简单粗暴的试探方法是弯腰捡起一块小石头,往山坡上轻轻一推,看它往哪个方向滚。这个“踢石头”的动作,就是去噪 Score Matching 的核心思想。我们不直接在原样本上测坡度,而是把每个样本加上一点高斯噪声(把石头踢一下),然后让模型预测“石头本该滚向哪里”。妙的是,加噪之后的条件分布完全已知,它的坡度可以用解析式直接写出来——不再需要估计任何神秘梯度。

看右边这个表达式,它只要求神经网络的输出与“噪声方向”反着对齐。原始数据是什么、分布长什么样,全部不用管。训练时,我们随机采一个真实样本 $x$,随机采高斯噪声 $z$,构造扰动样本 $\tilde{x}=x+\sigma z$,然后让模型在 $\tilde{x}$ 处的输出尽量等于 $-\frac{z}{\sigma}$。模型就学会了在“石头被踢到的地方”感知到坡度。

现在绘图员的工具箱彻底升级:不再费力测曲率,只需“踢石头、看方向”。而且石头踢得越大(噪声越大),能感知到的地形范围就越广;踢得越小,局部细节越精确。多尺度地踢,就能多尺度地画出山的全貌。

Ep(x)Eqσ(x~∣x)[∥sθ(x~)−∇x~log⁡qσ(x~∣x)∥2]=Ep(x), z∼N(0,I)[∥sθ(x+σz)+zσ∥2]+const\displaystyle \mathbb{E}_{p(x)} \mathbb{E}_{q_\sigma(\tilde{x}|x)} \left[ \left\| s_\theta(\tilde{x}) - \nabla_{\tilde{x}} \log q_\sigma(\tilde{x}|x) \right\|^2 \right]= \mathbb{E}_{p(x),\, z\sim\mathcal{N}(0,I)} \left[ \left\| s_\theta(x + \sigma z) + \frac{z}{\sigma} \right\|^2 \right] + \text{const}
  1. 加噪样本$\tilde{x} = x + \sigma z$,其中 $z \sim \mathcal{N}(0,I)$,相当于把原始石头 $x$ 往随机方向踢了一下,踢出的偏移由 $\sigma$ 控制。
    x~=x+σz\displaystyle \tilde{x} = x + \sigma z
  2. 条件分布$q_\sigma(\tilde{x}|x) = \mathcal{N}(\tilde{x}; x, \sigma^2 I)$,给定原始点后,落点服从高斯分布。
    qσ(x~∣x)\displaystyle q_\sigma(\tilde{x}|x)
  3. 条件 score$\nabla_{\tilde{x}} \log q_\sigma(\tilde{x}|x) = -\frac{\tilde{x}-x}{\sigma^2}$,这是解析可得的,不需要网络估算。
    ∇x~log⁡qσ(x~∣x)=−x~−xσ2\displaystyle \nabla_{\tilde{x}} \log q_\sigma(\tilde{x}|x) = -\frac{\tilde{x}-x}{\sigma^2}
  4. 等价目标代入后损失转化为让 $s_\theta(x+\sigma z)$ 匹配 $-\frac{z}{\sigma}$,即预测噪声方向。
    ∥sθ(x+σz)+zσ∥2\displaystyle \left\| s_\theta(x + \sigma z) + \frac{z}{\sigma} \right\|^2

扩散衔接

把“踢石头”的动作连续化、时间化,就得到了扩散模型。设想制图员不只是踢一下,而是不断重复踢、越踢越大,直到把整座山搅成一片浓雾(高斯噪声);然后从浓雾中反向走回山体,每一步都需要知道当前迷雾中的“坡度”——这正是 score 函数。前向扩散过程对应随机微分方程(SDE),而反向 SDE 中的漂移项显式依赖 score。

这个方程告诉你,反向生成时,每一步的“行走方向”由两部分组成:一部分是时间依赖的确定性漂移,另一部分是 score 给出的“向真实山体攀爬”的方向。如果没有 score,模型就只能像无头苍蝇一样在噪声中乱逛;有了 score,它才知道哪边坡向上、哪边坡向下。

可以说,扩散模型把 Score Matching 从“画地图”升级为“导航系统”,score 函数贯穿了训练和采样的始终。训练时,我们学的是每一步去噪的方向;采样时,我们用这些方向沿着山体轮廓一步步回到高概率区域。

dx=[f(x,t)−g2(t) ∇xlog⁡pt(x)]dt+g(t) dwˉ\displaystyle dx = \left[ f(x,t) - g^2(t) \, \nabla_x \log p_t(x) \right] dt + g(t) \, d\bar{w}
  1. 漂移项$f(x,t)$ 描述前向过程的系统移动,是山的“板块漂移”。
    f(x,t)\displaystyle f(x,t)
  2. 扩散系数$g(t)$ 控制噪声注入速度,决定当前时刻“雾的浓度”。
    g(t)\displaystyle g(t)
  3. Score 项$\nabla_x \log p_t(x)$ 是 $t$ 时刻扰动分布的 score,是反向生成的方向盘。
    ∇xlog⁡pt(x)\displaystyle \nabla_x \log p_t(x)
  4. 反向随机性$d\bar{w}$ 是反向时间的布朗运动,保证采样时仍有一定探索性,避免走进平坦死区。
    dwˉ\displaystyle d\bar{w}

实践展望

有了 score 这个“坡度场”,我们怎么从零开始在山上行走呢?最经典的采样方法是朗之万动力学:先随便选一个位置(通常是噪声中的随机点),然后循环执行“往 score 方向走一小步,再叠加一个随机扰动”。这样走下去,最终会走到山的概率质量集中区域。这个过程就像在雾中摸索,每一步都依靠手杖调整方向,同时允许自己踉跄一下,最终走到某个真实图像的附近。

在实际项目中,大家都不会只用一个噪声尺度,而是像 NCSN(Noise Conditional Score Networks)一样给模型注入一个“尺度条件”:让它同时知道当前踢石头的力度,从而在不同尺度下都能给出准确坡度。从医学图像生成到分子构象预测,这套方法已经成为生成模型家族里的重要成员。

回看整条路线:从“归一化常数难算”到“只测坡度”,从“直接匹配 score 需要曲率”到“加噪后等价预测噪声”,再到扩散模型里那个无处不在的 $\nabla \log p_t(x)$。Score Matching 就像地图绘制员的训练营,教会神经网络如何用最简单的手杖,去读懂整座山的心跳。

xt+1=xt+ε2 s(xt)+ε zt,zt∼N(0,I)\displaystyle x_{t+1} = x_t + \frac{\varepsilon}{2} \, s(x_t) + \sqrt{\varepsilon} \, z_t, \quad z_t \sim \mathcal{N}(0,I)
  1. 当前位置$x_t$ 是第 $t$ 步的采样位置(相当于制图员此刻站的地方)。
    xt\displaystyle x_t
  2. 步长$\varepsilon$ 控制每次行走的跨度,太小收敛慢,太大容易越过山脊。
    ε\displaystyle \varepsilon
  3. score 驱动$\frac{\varepsilon}{2} s(x_t)$ 让位置沿 score 方向移动,跟随坡度向上攀爬。
    ε2s(xt)\displaystyle \frac{\varepsilon}{2} s(x_t)
  4. 随机扰动$\sqrt{\varepsilon} z_t$ 引入随机性,帮助跳出平坦区域和局部陷阱。
    εzt\displaystyle \sqrt{\varepsilon} z_t

AI 应用场景

医学影像生成与增强

阶段:模型训练与生成

解决的问题:传统模型直接估计密度困难,且 GAN 训练不稳定;Score Matching 用去噪目标稳定学习分布梯度,无需计算配分函数。

具体案例:在低剂量 CT 影像公开数据集上,使用 NCSN 框架训练去噪 score 网络,再通过朗之万采样生成高清晰度 CT 切片。与 GAN 相比,生成样本的多样性和细节都更优,同时训练过程可监控损失函数而无需对抗博弈。

分子构象生成与药物筛选

阶段:条件生成

解决的问题:分子构象空间高维、复杂,直接建模密度不可行;利用 score 匹配可以仅估计梯度,配合 Langevin 采样探索构象空间。

具体案例:GeoDiff 等方法对分子 3D 坐标加噪、训练网络预测噪声,在蛋白质配体和多肽数据集上学到稳定构象分布,辅助虚拟筛选和先导化合物优化。

图像修复与缺失数据重建

阶段:采样约束/后验推断

解决的问题:传统插值方法在缺失区域缺乏自然纹理;score-based 扩散模型作为强先验,可以在采样时利用已知像素约束,逐步填充缺失部分。

具体案例:用无条件的 score 模型对老照片做超分辨与破损修复:在反向扩散每步,将已知区域强制设置为观测像素,只让未知区域依赖 score 自由演化,最终生成与全局结构一致的自然结果。

Python 演示

python48 行
import torchimport torch.nn as nnimport numpy as npimport matplotlib.pyplot as plt torch.manual_seed(0) def sample_data(n):    g = np.random.randint(0, 2, n)    return (torch.randn(n) + (g * 2 - 1)).float().view(-1, 1) class ScoreNet(nn.Module):    def __init__(self):        super().__init__()        self.net = nn.Sequential(            nn.Linear(1, 64), nn.SiLU(),            nn.Linear(64, 64), nn.SiLU(),            nn.Linear(64, 1)        )    def forward(self, x):        return self.net(x) def train_loop(epochs=1000, batch_size=128, sigma=0.5):    net = ScoreNet()    opt = torch.optim.Adam(net.parameters(), lr=1e-3)    for t in range(epochs):        x = sample_data(batch_size)        noise = torch.randn_like(x)        x_tilde = x + sigma * noise        target = -noise / sigma        loss = ((net(x_tilde) - target) ** 2).mean()        opt.zero_grad()        loss.backward()        opt.step()    return net def langevin_sample(net, n_samples=2000, eps=0.01, steps=100):    x = torch.randn(n_samples, 1)    for _ in range(steps):        x = x + 0.5 * eps * net(x) + np.sqrt(eps) * torch.randn_like(x)    return x if __name__ == "__main__":    net = train_loop()    samples = langevin_sample(net).numpy().squeeze()    plt.hist(samples, bins=50, density=True, alpha=0.6)    plt.title("Samples from learned score")    plt.savefig("score_samples.png")
目的:演示一维高斯混合分布上的去噪 Score Matching 训练与朗之万采样,输出生成样本直方图。
  1. sample_data(n)从两个位置相反的高斯分布中采样,模拟原始数据分布。
  2. x_tilde = x + sigma * noise对原始样本加噪,对应“踢石头”操作。
  3. target = -noise / sigma理论条件 score 的等价形式,让网络学会预测噪声方向。
  4. ((net(x_tilde) - target) ** 2).mean()去噪 Score Matching 的均方损失。
  5. x = x + 0.5 * eps * net(x) + np.sqrt(eps) * torch.randn_like(x)朗之万采样更新:沿 score 方向走 + 随机扰动。

常见误区

误区Score Matching 就是让神经网络学会输出 $p(x)$ 或在 $[0,1]$ 之间的概率值,所以训练完可以当密度估计用。

正解Score Matching 拟合的是概率密度的对数梯度(score),也就是“坡度”而非“海拔”。模型输出可能是个任意实数向量,没有概率的归一化含义。你可以用 score 做采样(Langevin),但不能直接把模型输出当概率。就像手杖只能告诉你坡向,不能告诉你绝对海拔。

为何常见:因为 "score" 这个词容易与机器学习中的分类分数混淆,而且概率模型通常输出密度,所以初学者想当然地认为 score 就是密度。

误区去噪 Score Matching 只需要选取一个合适的 $\sigma$,训练出来的模型就能在所有区域给出准确 score。

正解单一噪声尺度只能覆盖一个平滑范围。大噪声能感知全局结构,小噪声保留局部细节,真实数据分布常常是高维流形,只有用多尺度噪声(如 NCSN 中的几何序列或扩散模型里的时间连续噪声)才能在细节和全局之间取得平衡。

为何常见:在小 toy 数据集上固定 $\sigma$ 往往也能生成像样的样本,容易让人误以为扩展到大图像也能成立。

误区去噪目标学到的就是原始数据分布 $\log p(x)$ 的梯度,可以直接用于精确似然计算。

正解去噪目标实际针对的是扰动后的分布 $p_\sigma(\tilde{x})$,其 score 与原始 score 存在偏差。只有 $\sigma \to 0$ 时才约等于真实 score,但 $\sigma$ 趋近 0 时估计方差又变大,所以实际中必须在多尺度噪声之间折中,这也是扩散模型使用时间依赖 score 的原因。

为何常见:因为公式推导中写着 $\nabla \log p_\sigma$ 与真实 score 的极限关系,学习者容易忽略扰动前后的差异。

误区既然 score 是密度上升方向,那 score 的模长小就表示该处概率密度小,模型可以直接用 $||s||$ 来评估异常程度。

正解score 是梯度的模,只反映概率密度变化快慢,不代表密度本身高低。在概率分布的峰值处 score 恰好为 0,但密度是最高的。所以不能用 score 大小直接做异常检测,除非结合能量函数。这就像山顶十分平坦(坡度为 0),但海拔其实最高。

为何常见:直觉上认为“坡缓的地方地势低”,但实际地形中平坦的高原和谷底都存在,混淆了斜率与高度。

面试题

Q1. Score 函数 $s(x)$ 的定义是下列哪一项?

单选题 · easy

  • A.概率密度 $p(x)$ 本身
  • B.对数概率密度的梯度 $\nabla_x \log p(x)$← 正确答案
  • C.累积分布函数的补数
  • D.损失函数对参数的梯度

答案:B。score 是“坡度”不是“高度”,即对对数密度求输入的梯度,而非对参数求梯度。A 指密度,D 是训练时的参数梯度,C 与 score 无关,所以选 B。

Q2. Score Matching 最主要的优势是什么?

单选题 · easy

  • A.不需要任何训练数据
  • B.不需要计算归一化常数 $Z$← 正确答案
  • C.不需要设计神经网络结构
  • D.不需要损失函数

答案:B。因为 $\log p(x)=\log \tilde{p}(x)-\log Z$,梯度后 $Z$ 消失,所以 score 天然规避配分函数。训练数据和网络仍是必须的。

Q3. 朴素 Score Matching 的损失中,除了平方项还需要计算什么?

单选题 · mid

  • A.模型输出对输入的雅可比矩阵的迹← 正确答案
  • B.模型输出的熵
  • C.噪声协方差的逆
  • D.真实标签的 one-hot 编码

答案:A。通过分部积分消去未知真实 score 后,引入 $\operatorname{tr}(\nabla_x s_\theta)$,也就是曲率项。高维下这个项计算代价很大,因此才发展出去噪方法。

Q4. 朗之万采样更新公式中,用于保持探索性的随机项是?

单选题 · easy

  • A.$\frac{\varepsilon}{2} s(x_t)$
  • B.$\sqrt{\varepsilon} z_t$← 正确答案
  • C.$\varepsilon$
  • D.$\log p(x_t)$

答案:B。$s(x_t)$ 是确定性驱动力,$\sqrt{\varepsilon} z_t$ 才引入随机扰动,帮助模型跳过平坦区域,避免落到局部陷阱。

Q5. 关于去噪 Score Matching,下列说法正确的有?

多选题 · mid

  • A.加噪样本服从条件高斯分布← 正确答案
  • B.条件 score 可由噪声残差解析计算← 正确答案
  • C.训练目标等价于让网络预测噪声← 正确答案
  • D.网络需要输出原始干净样本

答案:ABC。加噪后 $\tilde{x}=x+\sigma z$,条件 score 为 $-z/\sigma$,因此等价于预测噪声方向,不需要输出干净样本,D 错误。

Q6. 为什么单一噪声尺度训练出的 score 模型往往不理想?

单选题 · mid

  • A.因为模型容量不够大
  • B.无法同时覆盖全局结构和局部细节← 正确答案
  • C.因为噪声是离散的
  • D.因为梯度无法反向传播

答案:B。大噪声看全局、小噪声看细节,单一尺度只能片面描述地形。需要多尺度/时间连续噪声,这正是扩散模型前向加噪过程的意义。B 正确,其余不是根本原因。

Q7. 在反向扩散 SDE 中,score $\nabla_x \log p_t(x)$ 的作用是?

单选题 · hard

  • A.控制向真实数据区域漂移的方向← 正确答案
  • B.决定反向噪声的方差
  • C.用于直接输出生成图像
  • D.计算似然函数的归一化常数

答案:A。反向 SDE 的漂移项包含 $g^2(t)$ 乘 score,它引导样本从纯噪声逐步回到数据流形。它不直接输出图像,也不决定噪声方差。

Q8. 关于朴素 Score Matching 与去噪 Score Matching,正确的有?

多选题 · hard

  • A.朴素方法需要真实 score
  • B.朴素方法需要计算雅可比迹← 正确答案
  • C.去噪方法通过加噪构造可解析的条件 score← 正确答案
  • D.去噪方法完全不需要噪声

答案:BC。朴素方法经过变换不需要真实 score,但需要雅可比迹,所以 A 错、B 对。去噪方法依赖加噪来获得解析条件 score,C 对、D 错。

Q9. Score 与能量函数 $E(x)$ 的关系是?

单选题 · mid

  • A.$s(x) = -\nabla_x E(x)$← 正确答案
  • B.$s(x) = \nabla_x E(x)$
  • C.$s(x) = E(x)$
  • D.完全无关

答案:A。当 $p(x)\propto \exp(-E(x))$ 时,$\log p(x) = -E(x)+\text{const}$,求梯度后即为 $-\nabla_x E(x)$。这告诉我们能量越小的地方 score 指向那里。

Q10. NCSN(Noise Conditional Score Network)为什么需要给网络输入噪声尺度 $\sigma$?

单选题 · hard

  • A.为了控制输出图像的像素大小
  • B.让网络在不同平滑程度下返回正确的 score← 正确答案
  • C.为了计算配分函数
  • D.为了减少参数量

答案:B。不同 $\sigma$ 对应不同扰动分布,score 也随 $\sigma$ 变化。输入 $\sigma$ 使网络能区分当前是在大雾还是晴天中测坡度,从而给出正确方向。这与图像大小、配分函数无关。