【生成模型(一)】Score-Based Generative Models
文章目录
- 🌱 第一步:什么是 p(x)p(\mathbf{x})p(x)?
- 🔢 第二步:如何用神经网络表示 p(x)p(\mathbf{x})p(x)?
- ✅ 标准做法:指数族表示(Exponential Family)
- 📈 第三步:如何训练这个模型?—— 最大似然估计(MLE)
- 最常用的方法:最大化似然(Maximum Likelihood Estimation)
- ⚠️ 第四步:问题来了—— ZθZ_\thetaZθ 太难算!
- 💡 第五步:换个思路——不直接学 pθ(x)p_\theta(\mathbf{x})pθ(x),而是学它的“梯度”
- 🧪 第六步:如何学 score function?—— Score Matching
- 🔑 关键突破(Hyvärinen, 2005):
- 🌀 第七步:学好了 score,怎么生成新样本?
- ⚠️ 第八步:为什么原始方法失败?—— 低密度区域问题
- 💎 第九步:解决方案——用多个噪声尺度扰动数据
- 🔥 第十步:采样——Annealed Langevin Dynamics(退火朗之万)
- ⏳ 第十一步:终极形式——SDE(随机微分方程)
- ✅ 总结:完整流程
- 🎯 你的问题总结
- ✅ 第一步:澄清概念 —— `p_data(x)` 到底是什么?
- ❗ 关键点:
- ✅ 第二步:原始损失函数为什么不可行?
- ✅ 第三步:关键突破 —— Hyvärinen (2005) 的“魔法”
- 🔥 最终得到的 Score Matching 损失:
- 🧠 这个公式的含义:
- ✅ 第四步:为什么这个新损失函数有效?—— 它在“隐式地”优化真实 score!
- 💡 直观理解:
- ✅ 第五步:实际操作 —— 如何计算这个损失?
- ✅ 第六步:举个一维例子(帮助理解)
- ✅ 总结回答你的问题
- 💡 一句话记住:
Generative Modeling by Estimating Gradients of the Data Distribution
- 什么是概率分布 p(x)p(\mathbf{x})p(x)
- 为什么可以写成 ef(x)Z\frac{e^{f(\mathbf{x})}}{Z}Zef(x)
- 为什么用最大似然估计(MLE)
- 什么是归一化常数 ZZZ,为什么它很难算
- 什么是 score function(分数函数)
- 为什么 score matching 能避开 ZZZ
- 为什么 Langevin dynamics 能用来生成数据
- 为什么原始方法不行,需要加噪声
- 为什么加多个尺度的噪声,以及 SDE 是怎么来的
🌱 第一步:什么是 p(x)p(\mathbf{x})p(x)?
假设你有一堆猫的图片。每张图片是一个高维向量 x∈RD\mathbf{x} \in \mathbb{R}^Dx∈RD(比如 D=32×32×3=3072D = 32 \times 32 \times 3 = 3072D=32×32×3=3072)。
我们相信这些图片不是乱来的,而是从某个“真实世界的数据分布”中采样出来的。这个分布就叫 p(x)p(\mathbf{x})p(x)。
- p(x)p(\mathbf{x})p(x) 是一个概率密度函数(PDF)
- 它满足两个条件:
- p(x)≥0p(\mathbf{x}) \geq 0p(x)≥0 对所有 x\mathbf{x}x
- ∫RDp(x)dx=1\int_{\mathbb{R}^D} p(\mathbf{x}) \, d\mathbf{x} = 1∫RDp(x)dx=1(总概率为1)
我们的目标:找到一个模型,能近似这个 p(x)p(\mathbf{x})p(x),然后自己生成新的猫图!
🔢 第二步:如何用神经网络表示 p(x)p(\mathbf{x})p(x)?
一个很自然的想法是:让神经网络输出一个“打分” fθ(x)f_\theta(\mathbf{x})fθ(x),然后把这个打分转换成概率。
但直接让神经网络输出 p(x)p(\mathbf{x})p(x) 有问题:你怎么保证它积分等于1?
✅ 标准做法:指数族表示(Exponential Family)
我们定义模型为:
pθ(x)=efθ(x)Zθp_\theta(\mathbf{x}) = \frac{e^{f_\theta(\mathbf{x})}}{Z_\theta} pθ(x)=Zθefθ(x)
其中:
- fθ(x)f_\theta(\mathbf{x})fθ(x):任意函数(比如一个深度神经网络),输出一个实数(“未归一化的 log 概率”)
- Zθ=∫efθ(x)dxZ_\theta = \int e^{f_\theta(\mathbf{x})} d\mathbf{x}Zθ=∫efθ(x)dx:归一化常数(normalizing constant)
🔍 为什么这样写?
因为 efθ(x)>0e^{f_\theta(\mathbf{x})} > 0efθ(x)>0,保证了非负性;除以 ZθZ_\thetaZθ 保证了总积分为1。
这就像 softmax:每个类别得分 fif_ifi,概率 =efi∑jefj= \frac{e^{f_i}}{\sum_j e^{f_j}}=∑jefjefi。这里只是把“求和”变成了“积分”。
✅ 所以:任何概率分布都可以写成 ef(x)Z\frac{e^{f(\mathbf{x})}}{Z}Zef(x) 的形式(只要 fff 足够灵活)。
📈 第三步:如何训练这个模型?—— 最大似然估计(MLE)
我们有一堆训练数据 {x(1),x(2),...,x(N)}\{\mathbf{x}^{(1)}, \mathbf{x}^{(2)}, ..., \mathbf{x}^{(N)}\}{x(1),x(2),...,x(N)},假设它们独立地来自真实分布 pdata(x)p_{\text{data}}(\mathbf{x})pdata(x)。
我们希望模型 pθ(x)p_\theta(\mathbf{x})pθ(x) 尽可能接近真实分布。
最常用的方法:最大化似然(Maximum Likelihood Estimation)
“让模型认为训练数据出现的概率尽可能高”。
似然函数(Likelihood):
L(θ)=∏n=1Npθ(x(n))\mathcal{L}(\theta) = \prod_{n=1}^N p_\theta(\mathbf{x}^{(n)}) L(θ)=n=1∏Npθ(x(n))
取对数(更好数值稳定):
logL(θ)=∑n=1Nlogpθ(x(n))\log \mathcal{L}(\theta) = \sum_{n=1}^N \log p_\theta(\mathbf{x}^{(n)}) logL(θ)=n=1∑Nlogpθ(x(n))
代入我们的模型:
logpθ(x)=fθ(x)−logZθ\log p_\theta(\mathbf{x}) = f_\theta(\mathbf{x}) - \log Z_\theta logpθ(x)=fθ(x)−logZθ
所以目标变成:
maxθ∑n=1N[fθ(x(n))−logZθ]=(∑n=1Nfθ(x(n)))−NlogZθ\max_\theta \sum_{n=1}^N \left[ f_\theta(\mathbf{x}^{(n)}) - \log Z_\theta \right] = \left( \sum_{n=1}^N f_\theta(\mathbf{x}^{(n)}) \right) - N \log Z_\theta θmaxn=1∑N[fθ(x(n))−logZθ]=(n=1∑Nfθ(x(n)))−NlogZθ
⚠️ 第四步:问题来了—— ZθZ_\thetaZθ 太难算!
Zθ=∫efθ(x)dxZ_\theta = \int e^{f_\theta(\mathbf{x})} d\mathbf{x} Zθ=∫efθ(x)dx
- x\mathbf{x}x 是高维的(比如 3072 维)
- 积分没有解析解
- 无法用数值积分(维度太高,“维度灾难”)
- 蒙特卡洛方法也很难(因为你还不知道 pθp_\thetapθ,这就是你要学的!)
👉 所以:只要 fθf_\thetafθ 是任意神经网络,ZθZ_\thetaZθ 就不可计算!
这就是为什么传统模型要限制结构:
- 自回归模型(PixelCNN):把联合概率分解成条件概率乘积,避免高维积分
- 归一化流(Normalizing Flows):用可逆变换,保证 ZθZ_\thetaZθ 可算
- VAE:用变分下界近似 log-likelihood
但这些限制了模型表达能力!
💡 第五步:换个思路——不直接学 pθ(x)p_\theta(\mathbf{x})pθ(x),而是学它的“梯度”
我们观察到:
∇xlogpθ(x)=∇x(fθ(x)−logZθ)=∇xfθ(x)\nabla_\mathbf{x} \log p_\theta(\mathbf{x}) = \nabla_\mathbf{x} \left( f_\theta(\mathbf{x}) - \log Z_\theta \right) = \nabla_\mathbf{x} f_\theta(\mathbf{x}) ∇xlogpθ(x)=∇x(fθ(x)−logZθ)=∇xfθ(x)
因为 ZθZ_\thetaZθ 是个常数(对 x\mathbf{x}x 求导为0)!
✅ 所以:梯度 ∇xlogp(x)\nabla_\mathbf{x} \log p(\mathbf{x})∇xlogp(x) 和归一化常数 ZZZ 无关!
这个梯度有一个名字:score function(分数函数)
定义:
score function: s(x):=∇xlogp(x)\text{score function: } \mathbf{s}(\mathbf{x}) := \nabla_\mathbf{x} \log p(\mathbf{x}) score function: s(x):=∇xlogp(x)
- 它是一个向量场:每个点 x\mathbf{x}x 都有一个“方向”,指向概率更高的地方
- 它告诉我们:在 x\mathbf{x}x 附近,往哪个方向走,概率会变大
🧪 第六步:如何学 score function?—— Score Matching
我们不知道真实 score ∇logpdata(x)\nabla \log p_{\text{data}}(\mathbf{x})∇logpdata(x),但我们可以定义一个神经网络 sθ(x)\mathbf{s}_\theta(\mathbf{x})sθ(x) 来逼近它。
损失函数:Fisher Divergence(费雪散度)
L=Epdata(x)[∥∇xlogpdata(x)−sθ(x)∥22]\mathcal{L} = \mathbb{E}_{p_{\text{data}}(\mathbf{x})} \left[ \left\| \nabla_\mathbf{x} \log p_{\text{data}}(\mathbf{x}) - \mathbf{s}_\theta(\mathbf{x}) \right\|_2^2 \right] L=Epdata(x)[∥∇xlogpdata(x)−sθ(x)∥22]
问题:真实 score 未知!
🔑 关键突破(Hyvärinen, 2005):
这个损失可以通过分部积分(integration by parts)重写成不需要真实 score 的形式!
最终得到(省略推导):
LSM=Epdata(x)[tr(∇xsθ(x))+12∥sθ(x)∥2]+const\mathcal{L}_{\text{SM}} = \mathbb{E}_{p_{\text{data}}(\mathbf{x})} \left[ \text{tr}\left( \nabla_\mathbf{x} \mathbf{s}_\theta(\mathbf{x}) \right) + \frac{1}{2} \| \mathbf{s}_\theta(\mathbf{x}) \|^2 \right] + \text{const} LSM=Epdata(x)[tr(∇xsθ(x))+21∥sθ(x)∥2]+const
虽然仍有梯度,但只需要对 sθ\mathbf{s}_\thetasθ 求导,完全不需要真实分布的 score!
✅ 所以:我们可以用任何神经网络 sθ(x)\mathbf{s}_\theta(\mathbf{x})sθ(x),直接用训练数据学习 score function!
🌀 第七步:学好了 score,怎么生成新样本?
答案:Langevin Dynamics(朗之万动力学)
它是一个 MCMC 算法,仅用 score function 就能从 p(x)p(\mathbf{x})p(x) 中采样!
算法步骤:
- 初始化 x0\mathbf{x}_0x0(随便给,比如全零或高斯噪声)
- 重复 K 次:
xk+1=xk+ϵ⋅sθ(xk)+2ϵ⋅zk,zk∼N(0,I)\mathbf{x}_{k+1} = \mathbf{x}_k + \epsilon \cdot \mathbf{s}_\theta(\mathbf{x}_k) + \sqrt{2\epsilon} \cdot \mathbf{z}_k, \quad \mathbf{z}_k \sim \mathcal{N}(0, I) xk+1=xk+ϵ⋅sθ(xk)+2ϵ⋅zk,zk∼N(0,I)
- 第一项:向高概率方向走(梯度上升)
- 第二项:加噪声,防止卡在局部最大值
- 当 ϵ→0\epsilon \to 0ϵ→0,K→∞K \to \inftyK→∞,xK∼p(x)\mathbf{x}_K \sim p(\mathbf{x})xK∼p(x)
✅ 所以:学好 sθ\mathbf{s}_\thetasθ 后,就能用 Langevin 生成新数据!
⚠️ 第八步:为什么原始方法失败?—— 低密度区域问题
Langevin 从 x0∼N(0,I)\mathbf{x}_0 \sim \mathcal{N}(0, I)x0∼N(0,I) 开始。
但在高维空间中,真实数据 pdata(x)p_{\text{data}}(\mathbf{x})pdata(x) 非常集中(比如所有猫图都集中在某些区域),而 N(0,I)\mathcal{N}(0, I)N(0,I) 的大部分质量在远离数据的地方(低密度区)。
而 score matching 的损失是:
Epdata(x)[∥error∥2]\mathbb{E}_{p_{\text{data}}(\mathbf{x})}[\| \text{error} \|^2] Epdata(x)[∥error∥2]
→ 只关心数据高密度区域的误差!低密度区完全不管!
但 Langevin 刚开始就在低密度区 → score 不准 → 一开始方向就错了 → 生成失败!
💎 第九步:解决方案——用多个噪声尺度扰动数据
想法:不要只学原始数据的 score,还要学“模糊版”数据的 score
定义:
- pσ(x)=∫pdata(y)⋅N(x;y,σ2I)dyp_{\sigma}(\mathbf{x}) = \int p_{\text{data}}(\mathbf{y}) \cdot \mathcal{N}(\mathbf{x}; \mathbf{y}, \sigma^2 I) \, d\mathbf{y}pσ(x)=∫pdata(y)⋅N(x;y,σ2I)dy
- 相当于:每个训练图加高斯噪声 σz\sigma \mathbf{z}σz,得到模糊图
性质:
- 小 σ\sigmaσ:接近原始数据
- 大 σ\sigmaσ:分布更平滑,覆盖整个空间(低密度区也被填充)
我们训练一个 噪声条件 score 网络(NCSN):
sθ(x,σ)≈∇xlogpσ(x)\mathbf{s}_\theta(\mathbf{x}, \sigma) \approx \nabla_\mathbf{x} \log p_{\sigma}(\mathbf{x}) sθ(x,σ)≈∇xlogpσ(x)
损失函数:
∑i=1Lλi⋅Epσi(x)[∥∇logpσi(x)−sθ(x,σi)∥2]\sum_{i=1}^L \lambda_i \cdot \mathbb{E}_{p_{\sigma_i}(\mathbf{x})} \left[ \| \nabla \log p_{\sigma_i}(\mathbf{x}) - \mathbf{s}_\theta(\mathbf{x}, \sigma_i) \|^2 \right] i=1∑Lλi⋅Epσi(x)[∥∇logpσi(x)−sθ(x,σi)∥2]
通常取 λi=σi2\lambda_i = \sigma_i^2λi=σi2
🔥 第十步:采样——Annealed Langevin Dynamics(退火朗之万)
- 从 x∼N(0,I)\mathbf{x} \sim \mathcal{N}(0, I)x∼N(0,I) 开始(对应最大噪声 σL\sigma_LσL)
- 对 σ=σL,σL−1,...,σ1\sigma = \sigma_L, \sigma_{L-1}, ..., \sigma_1σ=σL,σL−1,...,σ1:
- 用 sθ(x,σ)\mathbf{s}_\theta(\mathbf{x}, \sigma)sθ(x,σ) 运行若干步 Langevin
- 逐步减小 σ\sigmaσ(从模糊到清晰)
- 最终得到清晰样本
✅ 这样:每一步都在 score 准确的区域采样!
⏳ 第十一步:终极形式——SDE(随机微分方程)
把离散的 LLL 个噪声尺度 → 连续时间 t∈[0,T]t \in [0, T]t∈[0,T]
-
前向(加噪):
dx=f(x,t)dt+g(t)dwd\mathbf{x} = \mathbf{f}(\mathbf{x}, t) dt + g(t) d\mathbf{w} dx=f(x,t)dt+g(t)dw
例如:f=0\mathbf{f} = 0f=0, g(t)=2g(t) = \sqrt{2}g(t)=2 → 纯布朗运动 -
反向(生成):
dx=[f(x,t)−g(t)2∇xlogpt(x)]dt+g(t)dwˉd\mathbf{x} = \left[ \mathbf{f}(\mathbf{x}, t) - g(t)^2 \nabla_\mathbf{x} \log p_t(\mathbf{x}) \right] dt + g(t) d\bar{\mathbf{w}} dx=[f(x,t)−g(t)2∇xlogpt(x)]dt+g(t)dwˉ
训练目标:
Et∼U(0,T)[λ(t)⋅Ept(x)[∥∇logpt(x)−sθ(x,t)∥2]]\mathbb{E}_{t \sim \mathcal{U}(0,T)} \left[ \lambda(t) \cdot \mathbb{E}_{p_t(\mathbf{x})} \left[ \| \nabla \log p_t(\mathbf{x}) - \mathbf{s}_\theta(\mathbf{x}, t) \|^2 \right] \right] Et∼U(0,T)[λ(t)⋅Ept(x)[∥∇logpt(x)−sθ(x,t)∥2]]
- 若 λ(t)=g(t)2\lambda(t) = g(t)^2λ(t)=g(t)2,则等价于最大化似然
采样:
- 用 SDE 求解器(如 Euler-Maruyama)模拟反向过程
- 或用 ODE(probability flow ODE)做确定性生成,并计算精确 log-likelihood
✅ 总结:完整流程
| 步骤 | 问题 | 解决方案 |
|---|---|---|
| 1 | 数据来自分布 p(x)p(\mathbf{x})p(x) | 目标是建模 p(x)p(\mathbf{x})p(x) |
| 2 | 用 pθ(x)=efθ/Zp_\theta(\mathbf{x}) = e^{f_\theta}/Zpθ(x)=efθ/Z 表示 | 通用,但 ZZZ 难算 |
| 3 | 用 MLE 训练 → 需要 ZZZ | 不可行! |
| 4 | 转而学 score ∇logp(x)\nabla \log p(\mathbf{x})∇logp(x) | 不依赖 ZZZ! |
| 5 | 用 Score Matching 训练 sθ\mathbf{s}_\thetasθ | 无需真实 score! |
| 6 | 用 Langevin Dynamics 采样 | 仅需 score! |
| 7 | Langevin 在低密度区失败 | 加噪声扰动数据 |
| 8 | 用多尺度噪声训练 NCSN | 覆盖全空间 |
| 9 | 用 Annealed Langevin 采样 | 从模糊到清晰 |
| 10 | 推广到连续时间 → SDE | 统一框架,支持似然计算、ODE 采样等 |
现在你应该明白了:
Score-Based Models 的核心思想是:绕过归一化常数,直接学习概率的“梯度”,再用物理模拟(Langevin/SDE)来生成数据。
这既是深刻的数学,也是优雅的工程。
你问得非常好!这是理解 Score Matching 最核心、也最容易卡住的地方。我们来用最通俗、最细节的方式,一步一步拆解这个“魔法”是如何发生的。
🎯 你的问题总结
p_data(x)不就是样本分布吗?为什么不是已知的?- 损失函数里有
∇ log p_data(x),这不是“真值”(Ground Truth)吗? - 更新后的公式全是神经网络
s_θ(x)的值,没有 GT,那优化目标不就没了?
这三个问题其实是一个问题:“既然真实 score 是未知的,那我们到底在优化什么?”
✅ 第一步:澄清概念 —— p_data(x) 到底是什么?
你说得对!p_data(x) 就是我们想学习的“真实数据分布”。
- 比如,所有猫的图片构成一个分布
p_data(x)。 - 我们手里的训练集
{x₁, x₂, ..., x_N},就是从这个分布中采样出来的一小部分样本。
❗ 关键点:
我们知道的是“样本”,不是“分布”本身!
- 分布
p_data(x)是一个连续的、高维的、未知的函数。 - 我们不知道它在任意点
x的值是多少,更不知道它的梯度∇ log p_data(x)是多少!
所以:
✅ p_data(x) 是未知的!
✅ ∇ log p_data(x) 是未知的!
✅ 我们只有样本 x_i ~ p_data(x) 可以用!
✅ 第二步:原始损失函数为什么不可行?
我们最初的想法是:
让神经网络
s_θ(x)去逼近真实 score∇ log p_data(x)
所以损失函数写成:
L=Epdata(x)[∥∇xlogpdata(x)−sθ(x)∥2]\mathcal{L} = \mathbb{E}_{p_{data}(x)} \left[ \| \nabla_x \log p_{data}(x) - s_\theta(x) \|^2 \right] L=Epdata(x)[∥∇xlogpdata(x)−sθ(x)∥2]
这看起来很合理,但问题是:
我们根本不知道
∇ log p_data(x)是多少!
这就像是:
“我要训练一个模型去预测明天的天气温度,但我连今天的温度都不知道,我怎么算误差?”
所以这个损失函数虽然形式上完美,但在实践中无法计算,因为缺少 GT。
✅ 第三步:关键突破 —— Hyvärinen (2005) 的“魔法”
Hyvärinen 发现了一个惊人的数学技巧:
可以通过分部积分(integration by parts),把这个依赖于“真实 score”的损失函数,重写成一个只依赖于
s_θ(x)和p_data(x)的形式!
具体推导非常复杂(涉及高维微积分),但我们只需要记住结果:
🔥 最终得到的 Score Matching 损失:
LSM=Epdata(x)[tr(∇xsθ(x))+12∥sθ(x)∥2]+const\mathcal{L}_{SM} = \mathbb{E}_{p_{data}(x)} \left[ \text{tr}\left( \nabla_x s_\theta(x) \right) + \frac{1}{2} \| s_\theta(x) \|^2 \right] + \text{const} LSM=Epdata(x)[tr(∇xsθ(x))+21∥sθ(x)∥2]+const
🧠 这个公式的含义:
tr(∇ₓ s_θ(x)):这是对神经网络s_θ(x)的雅可比矩阵(Jacobian matrix)求迹(trace)。简单说,就是对s_θ(x)的每一个输出分量,对其每一个输入维度求偏导,然后把对角线上的元素加起来。||s_θ(x)||²:这是神经网络输出的平方和。𝔼_p_data(x)[...]:我们仍然需要从真实数据分布中采样x,但这没问题!因为我们有训练集!
✅ 第四步:为什么这个新损失函数有效?—— 它在“隐式地”优化真实 score!
现在,损失函数里确实没有 ∇ log p_data(x) 了!
那它是在优化什么?
答案是:它在优化一个“代理目标”,这个目标的最小值恰好对应于 s_θ(x) ≈ ∇ log p_data(x)。
💡 直观理解:
想象一下,你有一个黑盒子(真实分布 p_data(x)),你不知道里面是什么,但你可以往里面扔一个点 x,然后观察它“流向”哪里(即 ∇ log p_data(x) 的方向)。
Score Matching 的巧妙之处在于:
它不直接测量“流的方向”,而是测量“如果我假设流的方向是
s_θ(x),那么这个假设是否自洽?”
- 如果
s_θ(x)真的是真实 score,那么它满足一些特定的数学性质(比如散度定理)。 - Score Matching 的损失函数就是衡量
s_θ(x)是否满足这些性质。 - 当
s_θ(x)满足这些性质时,损失最小 → 此时s_θ(x)就是真实 score!
✅ 第五步:实际操作 —— 如何计算这个损失?
我们不需要知道 p_data(x) 的解析形式,只需要:
- 从训练集中随机采样一个点
x(因为x ~ p_data(x)) - 把
x输入到神经网络s_θ(x),得到输出向量 - 计算
s_θ(x)的雅可比矩阵∇ₓ s_θ(x) - 求迹
tr(∇ₓ s_θ(x)) - 计算
||s_θ(x)||² - 加起来,就是损失的一个样本估计
✅ 所以,整个过程完全基于训练数据和神经网络的输出,不需要任何“真实 score”的 GT!
✅ 第六步:举个一维例子(帮助理解)
假设我们有一堆数据点 x_i,它们来自一个未知分布 p_data(x)。
我们定义一个简单的神经网络 s_θ(x) = a * x + b(一维线性函数)。
我们的目标是让 s_θ(x) ≈ d/dx log p_data(x)。
根据 Score Matching,损失是:
LSM=Epdata(x)[ddxsθ(x)+12(sθ(x))2]\mathcal{L}_{SM} = \mathbb{E}_{p_{data}(x)} \left[ \frac{d}{dx} s_\theta(x) + \frac{1}{2} (s_\theta(x))^2 \right] LSM=Epdata(x)[dxdsθ(x)+21(sθ(x))2]
因为是一维,tr(∇ₓ s_θ(x)) = d/dx s_θ(x) = a。
所以损失变成:
LSM=Epdata(x)[a+12(ax+b)2]\mathcal{L}_{SM} = \mathbb{E}_{p_{data}(x)} \left[ a + \frac{1}{2} (a x + b)^2 \right] LSM=Epdata(x)[a+21(ax+b)2]
现在,我们从训练集中采样 x_i,代入计算:
LSM≈1N∑i=1N[a+12(axi+b)2]\mathcal{L}_{SM} \approx \frac{1}{N} \sum_{i=1}^N \left[ a + \frac{1}{2} (a x_i + b)^2 \right] LSM≈N1i=1∑N[a+21(axi+b)2]
然后,我们就可以用梯度下降来优化参数 a 和 b!
👉 注意:这里完全没有用到 d/dx log p_data(x)!我们只是在优化 a 和 b,使得这个损失最小。
当损失最小时,s_θ(x) = a*x + b 就会近似等于真实 score!
✅ 总结回答你的问题
| 你的疑问 | 解答 |
|---|---|
p_data(x) 不就是样本分布吗?为什么不是已知的? | 我们知道的是“样本”,不是“分布函数”。分布是未知的、连续的、高维的。我们只能通过样本去“估计”它。 |
损失函数里有 ∇ log p_data(x),这不是 GT 吗? | 是的,但它在原始损失里是 GT,但在 Score Matching 重写后的损失里,它被消掉了! |
| 更新后的公式全是神经网络的值,没有 GT,优化目标不就没有了吗? | 不!优化目标还在! 新的目标是:让神经网络 s_θ(x) 的输出满足某种数学性质(由分部积分推导出)。当它满足这个性质时,它就自动等于真实 score。这是一个“无监督”的、基于数据本身的优化目标。 |
💡 一句话记住:
Score Matching 是一种“自我指涉”的学习方法:它不比较神经网络和真实值,而是检查神经网络自身的输出是否“自洽”,从而间接地学到真实 score。
