本文由 gpt-5 生成
Score Matching(评分匹配)是一种直接学习数据分布的“分数函数”的方法,其中分数定义为对输入的对数密度梯度:\(s(x) = \nabla_x \log p(x)\)。它的核心思想是:不去拟合归一化的概率密度本身,而是拟合分数函数,这样可以绕过配分函数/归一化常数难以计算的问题(典型于能量模型)。
核心定义与目标
-
设模型的分数为 \(s_\theta(x)=\nabla_x \log p_\theta(x)\),数据分布为 \(q(x)\)。分数匹配最小化 Fisher 散度:
\[\min_\theta \; \frac{1}{2}\,\mathbb{E}_{x\sim q}\big[\|s_\theta(x)-\nabla_x \log q(x)\|^2\big]. \] -
因为 \(\nabla_x \log q(x)\) 不可得,Hyvärinen 通过分部积分给出与之等价(差常数)的可计算目标:
\[J_{\text{SM}}(\theta)=\mathbb{E}_{x\sim q}\!\left[\frac{1}{2}\|s_\theta(x)\|^2 + \operatorname{div}_x\, s_\theta(x)\right], \]其中 \(\operatorname{div}_x\, s_\theta(x)=\sum_i \partial s_{\theta,i}(x)/\partial x_i\)。该形式不依赖 \(q\) 的显式密度,也不依赖 \(p_\theta\) 的归一化常数。
与能量模型的关系
- 若 \(p_\theta(x)\propto \exp(-E_\theta(x))\),则 \(s_\theta(x)=-\nabla_x E_\theta(x)\)。分数匹配直接训练输入梯度,而无需计算配分函数 \(Z(\theta)\) 或其梯度。
常见变体与实践
-
原始分数匹配(SM):用上式 \(J_{\text{SM}}\)。缺点是需要计算散度(涉及二阶导)。
-
切片/随机投影分数匹配(SSM/Hutchinson trick):
\[J_{\text{SSM}}(\theta)=\mathbb{E}_{x\sim q,\;v\sim\mathcal{N}(0,I)}\!\left[\frac{1}{2}\|s_\theta(x)\|^2 + v^\top \nabla_x s_\theta(x)\, v\right], \]用随机向量近似散度的迹,避免显式求和二阶导。
-
去噪分数匹配(DSM,Vincent 2011):对带噪数据的分数进行回归。令 \(y=x+\sigma\epsilon\),\(\epsilon\sim\mathcal{N}(0,I)\):
\[\min_\theta \;\mathbb{E}_{x,\epsilon}\big[\|s_\theta(y,\sigma) + \epsilon/\sigma\|^2\big], \]等价于拟合噪声扰动后分布的分数。实践中常对多尺度 \(\sigma\) 训练。
-
噪声条件分数网络与扩散/打分生成模型(Score-based Generative Modeling):令 \(s_\theta(x,t)\) 估计不同噪声水平 \(t\) 下的分数,训练目标形如
\[\mathbb{E}_{t,x,\epsilon}\big[\lambda(t)\,\|s_\theta(x_t,t)+\epsilon/\sigma_t\|^2\big], \]其中 \(x_t\) 是对 \(x\) 加噪后的样本(例如 VE/VP SDE/DDPM 轨迹)。采样时用朗之万动力学或反向 SDE/ODE 生成高质量样本。
直观理解
- 分数函数给出“往高密度方向”的最陡上升方向。学到准确的分数场后,可以沿该方向进行随机梯度上升并加噪(朗之万动力学)在数据流形附近采样。
- 相比最大似然,分数匹配避免了密度归一化;相比对比散度,目标是有明确统计意义的 Fisher 散度最小化。
优缺点
- 优点:不需归一化常数;与扩散/打分生成天然契合;采样可用朗之万或反向 SDE。
- 缺点:原始 SM 需要二阶导(可用 SSM/DSM缓解);要求连续变量与一定边界条件;数值上需噪声尺度/权重精心设计。
PyTorch 中的两个常用训练损失示例
-
DSM(单尺度示例):
- 公式:\(L=\mathbb{E}_{x,\epsilon}\|s_\theta(x+\sigma\epsilon,\sigma)+\epsilon/\sigma\|^2\)
- 代码片段:
- 假设 net(y, sigma) 输出与 y 同形的分数
- x: 数据张量,sigma: 标量或张量噪声水平
- 使用半平方误差时可加 1/2 系数,及可选权重 λ(σ)
-
SSM(Hutchinson):
- 公式:\(L=\mathbb{E}_{x,v}\left[\frac{1}{2}\|s_\theta(x)\|^2 + v^\top \nabla_x s_\theta(x)\, v\right]\)
- 代码思路:用 v~N(0,I),先计算 g=(s·v).sum(),然后 hvp=∇_x g,最后项为 (hvp*v).sum()
采样(以朗之万为例)
- 单尺度:
- 迭代:\(x_{k+1}=x_k+\frac{\eta}{2}s_\theta(x_k)+\sqrt{\eta}\,z_k,\; z_k\sim\mathcal{N}(0,I)\)
- 多尺度(退火朗之万/NCSN):从大噪声到小噪声逐级迭代,使用对应 \(s_\theta(\cdot,\sigma_i)\)。
- 扩散/打分模型:求解反向 SDE/ODE,通常比纯朗之万噪声更稳定高效。
易混概念澄清
- 这里的“score”指对输入 x 的对数密度梯度,不是对参数或损失的梯度。
- 分数匹配学习到的是向量场 \(s_\theta(x)\),并不直接给出可积的正常数密度,但足以用于采样与生成。
