朗之万方程
Langevin方程描述了微观粒子运动(Langevin读音类似朗之万,因为是法国人)。大概是下面这种形式
mx¨=−γx˙+Fext+dWt
x¨是加速度,x˙是速度。这个公式本质上就是牛顿第二定律,右边第一项表示粒子受到的黏滞阻力(和速度成反比),Fext表示外力(比如重力,这里我们总是认为外力来自某个保守场),dWt是维纳过程的增量。
Wt维纳过程,其实就是布朗运动,或者说随机游走。我们认为它的均值是0、关于t是独立的,并且是平稳的,服从高斯分布。也就是
dWt∼N(0,σ2)
因为每个时刻都是独立的,所以自相关函数形式如下,δ表示狄拉克函数,也就是说只有s=t的时候有个无穷大的相关性,其他时候不相关,⟨⋅⟩
的含义是取期望/取平均。
⟨dWs⋅dWt⟩=2σ⋅δ(s−t)
所以总的来看,朗之万方程大概就是在说,粒子受到的力来自三个部分,除了阻力和外力,还有一个来自涨落的随机力,这个随机力均值为0,并且每一时刻的随机力之间是不相关的。
玻尔兹曼分布
在统计物理当中有个结论。当系统处于平衡态的时候,粒子在空间上服从玻尔兹曼分布,也就是说,某一点x处的密度n(x)和势能Ep有关。
n(x)∝exp(−Ep/kT)
势能越大,概率越小。温度越低,系统的能量也越低,越趋近于低势能的点;温度越高,分布就越平均。k是玻尔兹曼常数,出现在这里的原因是为了把内能和开氏温标对齐。
简单起见,考虑最简单的重力场中的大气密度分布,这是个经典例子。假设重力场中的大气处处等温,几乎无限高。我们任选一个参考平面为h=0,那么在高度h处,任取一个小小的高度微元dh
上下的压强差
dP=n(h)mg⋅dh
压强来自粒子的碰撞,P∝n⟨Ek⟩,⟨Ek⟩表示平均动能,类似于求期望,平均动能实际上就是内能,正比于kT。因为温度处处相同,所以P∝n/(kT),代入上面的方程
dhdn=Cnmgh/(kT)
这是个可以分离变量的微分方程,很好求,求解出来就会有上面的指数形式。这个结论不难推广到一般的保守场。
Langevin方程从微观的角度描述了粒子的运动,而玻尔兹曼定律从宏观的角度描述了粒子密度的分布。这也就意味着我们只要按照Langevin方程模拟粒子的运动,就能从对应的玻尔兹曼分布中采样。至于这个分布长什么样子,取决于势能,也就是保守场。
Score Matching
概率密度就像是气体密度,可以想象成有很多粒子按照概率密度弥散在空间当中,只不过这个空间可能是高维的,并且需要归一化。玻尔兹曼常数k在这里有点碍眼,可以直接去掉。在样本点x(或者叫做状态x)的概率密度:
p(x)=Z1exp(−E(x)/T)
概率密度需要归一化,所以有个有个Z=∫exp(−E(x)/T)dx在分母(如果状态是离散的,积分就变成求和,概率密度改成概率分布)。这个形式和softmax一模一样。这个积分在一般情况下是没法算的,intractable。
原则上,我们可以训练一个模型去学习这个势能Eθ(x)。拿到一个样本,模型输出其势能,然后最大化对数似然函数,记模型参数是θ。不失一般性,我们直接假设T=1,那就有似然函数
J(θ∣x)=logp(x∣θ)=−Eθ(x)−logZ
使用梯度上升的方法最大化这个函数会碰到问题。Z和θ有关,不能看成常数,因此
∇θlogp(x∣θ)=−∇θEθ(x)−∇θZ
等式右边第一项好求,反向传播一下就能算出来。第二项归一化因子涉及高维度的积分,没法求。因此在训练的时候,基于势能的方法没法进行。
有没有方法可以彻底绕开这个归一化因子呢?我们可以注意到Z和x无关(积分积掉了),只要两边都对x求梯度,Z就不见了。换句话说,我们不需要学习势能,转而学习势能的负梯度——也就是力场!。
∇xlogp(x∣θ)=−∇xEθ(x)=sθ(x)
sθ(x)就是score函数。我们的优化目标转而变成把score函数和真实分布的梯度匹配上,最小化二者的平方损失
MSE(sθ(x),∇xlogpdata(x))
也就是最小化
J(θ)=Ex∼pdata(x)∥sθ(x)−∇xlogpdata(x)∥2
但是我们并不知道真实分布对样本x的梯度。我们把期望写回积分的形式。根据期望的定义,有
J(θ)=∫Ωpdata(x)∥sθ(x)−∇xlogpdata(x)∥2dx
其中Ω是样本空间。
我们简化一下记号,pdata(x)记作p(x),∇xlogpdata(x)记作s(x),把平方损失展开:
∥sθ(x)−s(x)∥2=∥sθ(x)∥2+∥s(x)∥2−2sθ(x)⋅s(x)
第二项和θ无关,直接写成常数C,代回到积分当中
∫Ωp(x)[∥sθ(x)∥2−2sθ(x)⋅s(x)+C]dx
把常数提出去,变成∫Ωp(x)Cdx,和θ无关,在优化的时候直接不用管。那么剩下的项就是
∫Ωp(x)∥sθ(x)∥2dx−2∫Ωp(x)sθ(x)⋅s(x)dx
第一项就是Ex∼pdata(x)[∥sθ(x)∥2],这个好算,就是从数据集里面采样,然后算score函数的平方。
第二项可以作分部积分
2∫Ωp(x)sθ(x)⋅∇xlogp(x)dx===2∫Ωsθ(x)⋅∇xp(x)dx2∫Ωsθ(x)⋅d∇xp(x)2∫∂Ωsθ(x)⋅∇xp(x)⋅n(x)dS−2∫Ωp(x)∇xsθ(x)dx
如果Ω=Rd,并且概率密度在无穷远处衰减为0,那么第一项会是0。只剩下第二项,也就是sθ(x)对x的梯度的期望。
所以最后优化目标变成了
J(θ)=Ex∼p(x)[∥sθ(x)∥2−2∇xsθ(x)]
不需要真实PDF的梯度了。因为我们采用神经网络来拟合s(x),因此sθ(x)对x的梯度也可以用反向传播算法求出来。这个优化目标里面每一项都可以算。数据集如果很大,期望不好求,可以minibatch
+ 随机梯度下降。
前面说到,score函数其实就是力场,有了力场之后,我们可以通过模拟Langevin方程来采样。甚至还可以引入Metropolis-Hasting来确保是平稳的(想象一下那个拒绝概率,分子分母里面的势能都在指数上面,相除会变成做差,做差实际上就是对x的梯度,也就是score函数)。