概率密度估计的经典方法——最大似然估计——要求模型给出归一化的概率密度 pθ(x)p_\theta(x),这在复杂模型中往往不可行,因为归一化常数 Zθ=p~θ(x)dxZ_\theta = \int \tilde{p}_\theta(x)dx 的高维积分无法解析求解。2005 年,Aapo Hyvarinen 提出了一个绕过归一化常数的方法:得分匹配(Score Matching)。它不估计密度本身,而是估计密度的梯度——得分函数。

得分匹配的思想起初并未在生成模型领域引起广泛关注。直到 2019 年左右,宋飏将去噪得分匹配与朗之万采样结合,提出了基于得分的生成模型,随后发展出扩散模型。与此同时,苏剑林从能量视角分析了 GAN 的训练动力学,揭示了 GAN 与扩散 ODE 的深层联系。

这篇文章从得分匹配出发,建立 VAE、GAN 和扩散模型在分布匹配框架下的统一视角,展示这三条看似不同的研究路线如何收敛到同一组数学结构。

得分函数与 Hyvarinen 得分匹配

得分函数定义为对数概率密度的梯度:

s(x)=xlogp(x)s(x) = \nabla_x \log p(x)

得分函数有一个重要性质:它不依赖于归一化常数。因为 logp(x)=logp~(x)logZ\log p(x) = \log \tilde{p}(x) - \log Z,而 xlogZ=0\nabla_x \log Z = 0,所以 xlogp(x)=xlogp~(x)\nabla_x \log p(x) = \nabla_x \log \tilde{p}(x)。这意味着我们可以用未归一化的模型来计算得分函数,完全绕过配分函数的计算难题。

Hyvarinen 的关键观察是:我们可以通过匹配得分函数来估计模型参数,而不需要知道归一化常数。具体地,定义 Fisher 散度:

J(θ)=Epdata[12sθ(x)sdata(x)2]J(\theta) = \mathbb{E}_{p_{\text{data}}}\left[\frac{1}{2}\|s_\theta(x) - s_{\text{data}}(x)\|^2\right]

其中 sθ(x)=xlogpθ(x)s_\theta(x) = \nabla_x \log p_\theta(x) 是模型的得分函数,sdata(x)=xlogpdata(x)s_{\text{data}}(x) = \nabla_x \log p_{\text{data}}(x) 是数据的得分函数。

直接优化 J(θ)J(\theta) 需要知道数据得分 sdata(x)s_{\text{data}}(x),而这正是未知的。Hyvarinen 的贡献在于证明了,在温和的正则条件下,J(θ)J(\theta) 可以改写为仅涉及 sθ(x)s_\theta(x) 及其雅可比矩阵的形式:

J(θ)=Epdata[tr(xsθ(x))+12sθ(x)2]+constJ(\theta) = \mathbb{E}_{p_{\text{data}}}\left[\text{tr}(\nabla_x s_\theta(x)) + \frac{1}{2}\|s_\theta(x)\|^2\right] + \text{const}

其中 xsθ(x)\nabla_x s_\theta(x) 是得分函数的雅可比矩阵,tr()\text{tr}(\cdot) 是迹运算。这个目标不涉及数据得分 sdata(x)s_{\text{data}}(x),可以直接用数据样本估计期望项。

但 Hyvarinen 得分匹配有一个实际限制:tr(xsθ(x))\text{tr}(\nabla_x s_\theta(x)) 的计算需要对 sθs_\theta 的每个分量求偏导,在 xx 是高维向量时计算量很大。这正是去噪得分匹配要解决的问题。

去噪得分匹配

Vincent (2011) 提出的去噪得分匹配(Denoising Score Matching, DSM)提供了一个等价但更高效的替代方案。核心思想是:对数据加噪,然后学习如何去噪——去噪的方向恰好就是得分函数。

具体地,给定噪声水平 σ\sigma,定义扰动分布:

qσ(x~x)=N(x~;x,σ2I)q_\sigma(\tilde{x}|x) = \mathcal{N}(\tilde{x}; x, \sigma^2 I)

Vincent 证明了:

Eqσ(x~)[12sθ(x~)x~logqσ(x~x)2]=Eqσ(x~)[12sθ(x~)sσ(x~)2]+const\mathbb{E}_{q_\sigma(\tilde{x})}\left[\frac{1}{2}\|s_\theta(\tilde{x}) - \nabla_{\tilde{x}} \log q_\sigma(\tilde{x}|x)\|^2\right] = \mathbb{E}_{q_\sigma(\tilde{x})}\left[\frac{1}{2}\|s_\theta(\tilde{x}) - s_{\sigma}(\tilde{x})\|^2\right] + \text{const}

其中 sσ(x~)=x~logqσ(x~)s_\sigma(\tilde{x}) = \nabla_{\tilde{x}} \log q_\sigma(\tilde{x}) 是扰动分布的得分函数。当 σ\sigma 足够小时,qσpdataq_\sigma \approx p_{\text{data}},因此最小化 DSM 目标等价于匹配数据分布的得分函数。

对于高斯噪声 qσ(x~x)=N(x~;x,σ2I)q_\sigma(\tilde{x}|x) = \mathcal{N}(\tilde{x}; x, \sigma^2 I),条件得分函数有简洁形式:

x~logqσ(x~x)=x~xσ2\nabla_{\tilde{x}} \log q_\sigma(\tilde{x}|x) = -\frac{\tilde{x} - x}{\sigma^2}

DSM 的训练目标因此变为:

LDSM=Expdata,ϵN(0,I)[12sθ(x+σϵ)+ϵσ2]\mathcal{L}_{\text{DSM}} = \mathbb{E}_{x \sim p_{\text{data}}, \epsilon \sim \mathcal{N}(0, I)}\left[\frac{1}{2}\left\|s_\theta(x + \sigma\epsilon) + \frac{\epsilon}{\sigma}\right\|^2\right]

这正是扩散模型训练目标的核心形式。去噪得分匹配建立了得分函数估计与扩散模型之间的桥梁:扩散模型就是在多个噪声水平上训练得分函数,然后用朗之万动力学从学到的得分场中采样

得分函数向量场与朗之万采样
Loading visualization...
混合高斯分布的密度热力图叠加得分函数箭头。点击任意位置,观察朗之万采样轨迹如何沿得分函数走向密度高峰。

GAN 的对抗训练:估计密度比

GAN(Generative Adversarial Network)采用了一种与得分匹配截然不同的策略。它不显式估计密度或得分函数,而是通过对抗训练隐式地衡量分布差异。

GAN 的判别器 D(x)D(x) 学习区分真实样本和生成样本。Goodfellow 等人 (2014) 证明,最优判别器为:

D(x)=pr(x)pr(x)+pg(x)D^*(x) = \frac{p_r(x)}{p_r(x) + p_g(x)}

其中 prp_r 是真实数据分布,pgp_g 是生成分布。这等价于估计密度比 pr(x)pg(x)\frac{p_r(x)}{p_g(x)}:当 D(x)=1/2D^*(x) = 1/2 时,两个分布在 xx 处无法区分。

原始 GAN 的训练目标等价于最小化 Jensen-Shannon 散度 JS(prpg)\text{JS}(p_r \| p_g)。WGAN 将目标替换为 W1(pr,pg)W_1(p_r, p_g),判别器变为学习 Kantorovich-Rubinstein 对偶中的 1-Lipschitz 函数。

GAN 作为扩散 ODE

苏剑林在《生成扩散模型漫谈(十九):作为扩散ODE的GAN》中提出了一个深刻的统一视角:GAN 的训练过程可以理解为扩散 ODE 在"参数训练时间维度"上的实现。

Wasserstein 梯度流方程

考虑生成器参数 θ\theta 的演化。如果目标是缩小生成分布 pgp_g 与数据分布 pdatap_{\text{data}} 之间的 W2W_2 距离,那么参数的连续演化遵循 Wasserstein 梯度流方程:

dθdt=θW2(pg,pdata)\frac{d\theta}{dt} = -\nabla_\theta W_2(p_g, p_{\text{data}})

这个方程描述了参数沿 W2W_2 距离下降最快的方向移动——这正是最自然的连续优化动力学。

判别器估计密度比

GAN 判别器的最优解 D(x)=pdata(x)pdata(x)+pg(x)D^*(x) = \frac{p_{\text{data}}(x)}{p_{\text{data}}(x) + p_g(x)} 可以改写为对数密度比的形式:

r(x)=logpdata(x)pg(x)=logD(x)1D(x)r(x) = \log \frac{p_{\text{data}}(x)}{p_g(x)} = \log \frac{D^*(x)}{1 - D^*(x)}

这个密度比 r(x)r(x) 正是两个分布之间差异的局部度量——它衡量了在 xx 处数据分布密度相对于生成分布密度的优势程度。从 Wasserstein 梯度流的角度看,r(x)r(x) 等价于估计分布间的密度梯度方向。

向前推一步

将密度梯度方向 r(x)r(x) 投影到生成器参数空间,就得到了参数更新方向。具体地,密度比 r(x)r(x) 给出了分布应该向何处移动的信号,而生成器 Gθ(z)G_\theta(z) 将这个信号从数据空间反传到参数空间:

θEzp(z)[r(Gθ(z))]\nabla_\theta \mathbb{E}_{z \sim p(z)}[r(G_\theta(z))]

这个梯度正是 Wasserstein 梯度流在离散参数空间中的近似实现——判别器提供梯度方向,生成器将梯度投影到参数空间。

单步优化的等价性

以下为启发式推导(informal argument),用于说明两种参数更新方向在判别器仅训练一步时为何"指向同一处"。严格证明需展开判别器对 θ\theta 的链式法则、逐项核对梯度系数,本文不涉及——感兴趣的读者可参考苏剑林《生成扩散模型漫谈(十九):作为扩散ODE的GAN》中式 (8) 与式 (11) 的完整推导。

关键一步:在单步优化的条件下,上述参数更新近似等价于标准 GAN 的非饱和损失。推导路线如下。

首先,从最优判别器恢复密度比。GAN 的最优判别器为 D(x)=pdata(x)/(pdata(x)+pg(x))D^*(x) = p_{\text{data}}(x) / (p_{\text{data}}(x) + p_g(x)),由此可以构造对数密度比:

r(x)=logD(x)1D(x)=logpdata(x)pg(x)r(x) = \log \frac{D^*(x)}{1 - D^*(x)} = \log \frac{p_{\text{data}}(x)}{p_g(x)}

现在比较两个生成器目标的梯度方向。非饱和损失 θEz[logD(Gθ(z))]\nabla_\theta \mathbb{E}_z[-\log D(G_\theta(z))] 与 Wasserstein 梯度流投影 θEz[r(Gθ(z))]\nabla_\theta \mathbb{E}_z[r(G_\theta(z))] 是否指向相同的参数更新方向?关键代数步骤如下:将 logD-\log D^* 展开,

logD(x)=logpdatapdata+pg=log(1+pgpdata)-\log D^*(x) = -\log \frac{p_{\text{data}}}{p_{\text{data}} + p_g} = \log\left(1 + \frac{p_g}{p_{\text{data}}}\right)

pgpdatap_g \ll p_{\text{data}}(生成分布尚未拟合数据分布时),log(1+pg/pdata)pg/pdataer\log(1 + p_g / p_{\text{data}}) \approx p_g / p_{\text{data}} \propto e^{-r}。因此 logDer-\log D^* \approx e^{-r},而 rr 的梯度方向与 ere^{-r} 的负梯度方向一致(ere^{-r} 关于 θ\theta 单调递减)。这意味着:

θEz[logD(Gθ(z))]θEz[r(Gθ(z))]\nabla_\theta \mathbb{E}_z[-\log D(G_\theta(z))] \quad \Longleftrightarrow \quad \nabla_\theta \mathbb{E}_z[r(G_\theta(z))]

左端是标准 GAN 生成器的非饱和损失梯度,右端是 Wasserstein 梯度流的参数投影。这个等价性仅在判别器与生成器交替优化一步时成立——判别器提供一次密度比估计,生成器据此做一步参数更新。苏剑林在原文中式(8)和式(11)的推导给出了完整的代数核对(本文略去)。

为什么 GAN 不能训练太多步

上述等价性有一个关键前提:判别器只训练一步。如果判别器训练过多步,密度比估计 r(x)r(x) 会逐渐偏离真实的梯度方向。原因在于,当判别器接近最优时,D(x)D^*(x) 趋近于 0 或 1,梯度信号饱和——判别器变得过于自信,无法提供有意义的密度比信息。此时参数更新不再等价于沿 Wasserstein 梯度流方向移动,而是沿着一个被扭曲的方向更新,导致训练不稳定。

这正是原始 GAN 训练中判别器与生成器需要严格同步更新的根本原因:等价性仅在单步优化时成立,多步优化会破坏这种等价性。

与扩散模型的结构对比

从 Wasserstein 梯度流的视角看,扩散模型与 GAN 的根本区别在于"传输步数":

  • 扩散模型TT 步完成从噪声到数据的传输——每步只做小幅修正,得分函数在每一步都提供准确的梯度方向,因此优化景观平滑。
  • GAN 用 1 步完成从噪声到数据的传输——单步大更新,等价性仅在单步优化时才成立,梯度方向一旦偏离就难以纠正。

这个对比揭示了 GAN 训练不稳定的根本原因:一步到位的映射比多步渐进的映射更难优化,梯度信号更不稳定。扩散模型的多步结构天然提供了更平滑的优化景观,每一步都有纠错的机会。

统一视角:VAE、GAN、扩散模型的分布匹配

现在我们可以将三种生成模型放在一个统一的框架下理解——它们都是分布匹配的不同实现,但优化目标和匹配策略不同。

模型优化目标匹配策略分布距离
VAE最大化 ELBO变分近似KL 散度(变分后验 vs 真实后验)
GAN对抗损失密度比估计JS 散度 / W1W_1 距离
扩散得分匹配得分函数估计W2W_2 上界

VAE 通过变分推断近似后验分布,最小化 KL(q(zx)p(zx))\text{KL}(q(z|x) \| p(z|x))。它的优势是训练稳定、有显式的潜空间结构,但受限于单步映射和 MSE 重构损失。

GAN 通过对抗训练估计分布间的密度比或距离,最小化 JS 散度或 W1W_1 距离。它能产生清晰的生成结果,但训练不稳定、模式坍塌问题严重。

扩散模型 通过多步去噪训练得分函数,其损失隐含了 W2W_2 距离的上界约束。多步结构提供了平滑的优化景观,得分匹配避免了对抗训练的不稳定性。

从分布距离的角度看,三者形成了从 KL 到 JS/W1W_1W2W_2 的递进关系。KL 散度的梯度消失问题导致 VAE 生成模糊,JS 散度在不重叠时梯度为零导致 GAN 训练不稳定,而 W2W_2 距离始终提供有意义的梯度,这从数学上解释了扩散模型的成功。

GAN 训练的分布演化
Loading visualization...
目标分布(固定双峰)与生成分布(逐步逼近)。拖动滑块控制训练步数,观察分布演化与度量值变化。

应用

RLHF 对齐中的分布匹配

在 RLHF 训练中,策略优化可以理解为一种分布匹配:将对齐策略 πθ\pi_\theta 推向奖励模型偏好的分布,同时用 KL 散度或 WW 距离约束偏离参考策略 πref\pi_{\text{ref}} 的程度。这个约束与 VAE 的正则项结构类似——都是信息瓶颈的形式。

从得分匹配的角度看,DPO(Direct Preference Optimization)可以理解为在偏好数据上学习一个隐式的得分函数:给定偏好对 (xw,xl)(x_w, x_l),DPO 的训练目标鼓励模型增加 xwx_w 的概率而降低 xlx_l 的概率,这等价于沿着偏好得分函数的方向移动策略分布。

得分蒸馏(SDS)与文本到 3D

得分蒸馏采样(Score Distillation Sampling, SDS)是文本到 3D 生成(如 DreamFusion)的核心技术。SDS 利用预训练扩散模型的得分函数来引导 3D 模型的优化:

θLSDS=Et,ϵ[w(t)(ϵϕ(xt;t)ϵ)xθ]\nabla_\theta \mathcal{L}_{\text{SDS}} = \mathbb{E}_{t, \epsilon}\left[w(t)(\epsilon_\phi(x_t; t) - \epsilon)\frac{\partial x}{\partial \theta}\right]

其中 ϵϕ\epsilon_\phi 是扩散模型的噪声预测网络,x=g(θ)x = g(\theta) 是 3D 渲染的 2D 图像。SDS 是在用扩散模型的得分函数(通过噪声预测参数化)作为"教师"信号,引导 3D 模型的参数 θ\theta 向更符合文本描述的方向更新。

这种"用预训练得分函数指导其他模型优化"的范式,正是得分匹配思想超越纯生成任务的体现。得分函数不仅用于采样,还可以作为通用的梯度信号来源。

参考文献

  1. 苏剑林. 生成扩散模型漫谈(十八):得分匹配 = 条件得分匹配. https://kexue.fm/archives/9509
  2. 苏剑林. 生成扩散模型漫谈(十九):作为扩散ODE的GAN. https://kexue.fm/archives/9662
  3. 苏剑林. 能量视角下的GAN模型. https://kexue.fm/archives/6316
  4. Hyvarinen, A. (2005). Estimation of Non-Normalized Statistical Models by Score Matching. JMLR.
  5. Vincent, P. (2011). A Connection Between Score Matching and Denoising Autoencoders. Neural Computation.
  6. Goodfellow, I., et al. (2014). Generative Adversarial Nets. NeurIPS.
  7. Song, Y., & Ermon, S. (2019). Generative Modeling by Estimating Gradients of the Data Distribution. NeurIPS.
  8. Poole, B., et al. (2023). DreamFusion: Text-to-3D using 2D Diffusion. ICLR.