一、概述
在有向概率图模型中,由于图内存在明确的拓扑排序关系,因此因式分解的形式相对直观。然而,对于无向图,我们需要根据图中的最大团来进行因式分解。无向图模型在局部看起来并不像一个概率模型,只有在整体上才能体现出其概率模型的特性,这就引入了配分函数的概念。在处理无向图模型的学习和评估问题时,我们常常需要面对概率公式中的配分函数(Partition Function),而这个配分函数往往是难以处理的。
对于连续或离散的高维随机变量x∈Rpor{0,1,⋯,k}p,它可以表示成一个无向概率图,模型参数为θ,它的概率公式也就可以写成以下形式:
P(x;θ)=Z(θ)1P^(x;θ)
其中Z(θ)也就是配分函数,可以表示为:
Z(θ)=P^(x;θ)dx
对于这个概率模型的参数估计,可以采用极大似然估计的方法,首先,我们有一些样本,表示为X={xi}i=1N,然后使用这些样本来做极大似然估计:
θ^=θargmaxP(X;θ)=θargmaxi=1∏NP(xi;θ)=θargmaxlogi=1∏NP(xi;θ)=θargmaxi=1∑NlogP(xi;θ)=θargmaxi=1∑N(logP^(xi;θ)−logZ(θ))=θargmaxi=1∑NlogP^(xi;θ)−NlogZ(θ)=θargmax记作l(θ)N1i=1∑NlogP^(xi;θ)−logZ(θ)
这里我们也就得到了目标函数l(θ):
l(θ)=N1i=1∑NlogP^(xi;θ)−logZ(θ)
接下来使用梯度上升的方法来求解参数θ,因此也就需要对l(θ)求导:
∇θl(θ)=①N1i=1∑N∇θlogP^(xi;θ)−②∇θlogZ(θ)
这里我们首先看一下②这一项的求导:
②=∇θlogZ(θ)=Z(θ)1∇θZ(θ)=P^(x;θ)P(x;θ)∇θ∫P^(x;θ)dx=P^(x;θ)P(x;θ)∫∇θP^(x;θ)dx=∫P^(x;θ)P(x;θ)∇θP^(x;θ)dx=∫P(x;θ)∇θlogP^(x;θ)dx=EP(x;θ)[∇θlogP^(x;θ)]
注意这里的P^(x;θ)P(x;θ)之所以能够放到积分号里面,是因为对于任意x来说P^(x;θ)P(x;θ)都是个常数。
变换上述公式的目的是将导数表示为关于P(x;θ)的期望形式。然而,P(x;θ)是我们要求解的分布,是一个未知的分布,因此无法精确求解,也就无法计算这个梯度∇θl(θ),只能通过近似采样来求解。如果没有②,l(θ)可以通过梯度上升法求解,但是由于配分函数的存在,我们无法直接使用梯度上升法。这就是我们面临的问题。
二、随机最大似然(Stochastic Maximum Likelihood)
现在我们可以把∇θl(θ)下面的形式:
∇θl(θ)=N1i=1∑N∇θlogP^(xi;θ)−EP(x;θ)[∇θlogP^(x;θ)]
对于我们的训练数据,我们可以把它们看做服从一个分布Pdata,这个分布也就是训练数据的真实分布,是我们要去拟合的分布,然而也是一个我们永远不可能真正精确得到的分布,因为我们能够拿到的只有这个分布的若干样本(也就是训练数据)。有了Pdata这个定义以后,我们也可以把上面梯度中减号左边的一项写成期望的形式:
∇θl(θ)=EPdata[∇θlogP^(x;θ)]−EP(x;θ)[∇θlogP^(x;θ)]
我们的目的也就是要让P(x;θ)尽可能地逼近Pdata,这个P(x;θ)也就是我们的模型,所以我们把P(x;θ)这个分布记作Pmodel,现在我们就有了两个定义的分布,即数据的真实分布Pdata和用来拟合Pdata的Pmodel:
{datadistribution:Pdatamodeldistribution:Pmodel≜P(x;θ)
现在∇θl(θ)就可以写成∇θlogP^(x;θ)关于Pdata和Pmodel的期望的形式:
∇θl(θ)=positivephaseEPdata[∇θlogP^(x;θ)]−negativephaseEPmodel[∇θlogP^(x;θ)]
这里分别定义等号左边和右边的部分为正相(positive phase)和负相(negative phase)。
我们期待使用梯度上升法来迭代地求解最优的θ:
θ(t+1)=θ(t)+η∇θl(θ(t))
对于负相来说,我们无法对这个期望值积分,因此只能采用近似的方法,也就是在每次迭代时利用MCMC的方法(比如吉布斯采样)从Pmodel=P(x;θ(t))里采样得到样本,然后利用这些样本来近似计算负相这个积分值。这里采样得到的M个样本记作{x^i}i=1m,这些样本叫做幻想粒子(fantacy particles):
x^1∼P(x;θ(t))⋮x^m∼P(x;θ(t))⎭⎬⎫fantacyparticles
有了这些样本就可以计算负相,也就是说现在就可以用梯度上升的方法来迭代求解参数θ了,以下就是迭代求解的公式(这里也会从训练集中抽m个样本):
θ(t+1)=θ(t)+η(i=1∑m∇θlogP^(xi;θ(t))−i=1∑m∇θlogP^(x^i;θ(t)))
这个方法就叫做Gradient Ascent based on MCMC。
上面介绍的内容中引入了几个不容易理解的名词:正相、负相和幻想粒子,现在可以直观地解释一下这几个名词的含义。∇θl(θ(t))中存在正相和负相,对比目标函数l(θ)的表达式可以直观地理解这样命名的用意。
正相的作用是让模型分布在训练样本处概率增大,也就是从Pdata中采样,然后让这些样本在Pmodel中的概率增大。负相的作用是让Z(θ)的值变小,也就是说要让从Pmodel中采样出来的幻想粒子在Pmodel中的概率减小,这些样本可以认为我们是不信任它的,称它们是fantasy的,因此要让它们的概率减小。正相和负相共同作用,最终结果就会让Pmodel逼近Pdata,这个过程可以由下图表示:

可以想象如果Pmodel已经非常逼近Pdata,那么采样得到的幻想粒子和从数据集中采样的样本就会非常一致,这时对这些样本既要增大它们的概率也要压低它们的概率,此时正相和负相的作用就会抵消,也就不会再产生梯度,训练也就必须停止。
三、对比散度
对于MCMC的方法,可以参考这两个链接:
①MCM
②MCMC
上面的目标函数需要从Pdata和Pmodel里面都采样m个样本,从Pdata里面采样是很容易的,只需要从训练数据中抽取m个训练数据,而从Pmodel中采样就要采用MCMC的方法,具体的操作就是使用一个初始分布初始化马尔可夫链,然后等马尔可夫链随机游走到达平稳分布时进行采样,这里可以构建一条马尔可夫链然后从中采集m个样本,也可以构建m条马尔可夫链然后从每条马尔可夫链中采集一个样本(只不过这样比较消耗资源)。上述MCMC方法的问题是对于高维数据分布,很可能马尔可夫链的混合时间(或者叫燃烧期)会非常地长。
下图展示了采样多条马尔可夫链的吉布斯采样方法的过程,假设燃烧期是k,由于数据维度过高,很可能k就会非常大,我们可以认为是无穷大∞。这里也要注意,吉布斯采样的过程是对高维随机变量的每一维依次采样,因此这里的图中的每个step其实都表示高维随机变量每一维采样的过程:
0−step◯→1−step◯→⋯k−step◯mixingtime→⋯◯→x^1⋮0−step◯→1−step◯→⋯k−step◯→⋯◯→x^m⎭⎬⎫GibbsSampling
对比散度(Contrastive Divergence)的方法可以避免燃烧期过长的问题,在上面的抽样过程中需要为0-step的x^i按照一个初始化分布进行初始化,而对比散度的方法就是使用Pdata这个分布来作为初始化分布,具体的做法也就是从训练数据中抽取m个样本来初始化这m条马尔可夫链,也就是:
x^1=x1,x^2=x2,⋯,x^m=xm
使用Pdata初始化马尔可夫链以后只需要经过很短的几步就可以采集样本了,比如经过k步就开始采样,即使k=1也是可以的。总之,对比散度的方法与普通的直接MCMC采样的方法的区别就在于使用了Pdata初始化马尔可夫链,然后不用等漫长的混合时间,只需要k步就可以采样了,无论k步时有没有达到平稳分布,而k=1,2,3等很小的数字也是可以的。这种对比散度的方法就叫做CD Learning,之前的方法叫做ML Learning。
接下来来看看对比散度这个名字的由来。首先,先看这个式子:
θ^=θargmaxN1i=1∑NlogP(x;θ)=θargmaxEPdata[logPmodel]=θargmax∫PdatalogPmodeldx=θargmax∫PdatalogPmodeldx−与θ无关θargmax∫PdatalogPdatadx=θargmax∫PdatalogPdataPmodeldx=θargmax−KL(Pdata∣∣Pmodel)=θargminKL(Pdata∣∣Pmodel)
如你所见,原来的最大似然估计方法实际上是在最小化Pdata和Pmodel之间的KL散度。而在对比散度的方法中,我们将Pdata作为第0步的初始分布,经过多个步骤后才能达到稳定分布。我们将第0步的分布记作P(0),最终的稳定分布记作P(∞),而第k步的马尔科夫链的分布记作P(k)。由于现在Pmodel的样本来自P(k)而不是P(∞),所以通过这些样本进行的参数估计并不是在最小化KL(P(0)∣∣P(∞))(也就是KL(Pdata∣∣Pmodel)),而是在按照下面的目标函数进行参数估计:
θ^=argminContrastiveDivergence[KL(P(0)∣∣P(∞))−KL(P(k)∣∣P(∞))]
这个目标函数就是对比散度。使用CD-Learning的方法的算法如下:
t+1时刻:
①为正相从Pdata中采样,x1,x2,⋯,xm是采样的数据,也就是训练数据;
②为负相从Pmodel=P(x;θ(t))中采样,使用为正相采样的数据初始化马尔可夫链:
x^1=x1,x^2=x2,⋯,x^m=xm
然后使用吉布斯采样从马尔可夫链中第k步的分布抽取m个样本,k可以是很小的数字,甚至是1:
0−step◯→1−step◯→⋯k−step◯→x^1⋮0−step◯→1−step◯→⋯k−step◯→x^m⎭⎬⎫GibbsSampling
四、受限玻尔兹曼机的学习
1.表示
受限玻尔兹曼机在前一篇介绍了它的表示和推断问题,参考链接如下:受限玻尔兹曼机。
它的概率模型如下:
{P(h,v)=Z1exp{−E(h,v)}E(h,v)=−(hTWv+αTv+βTh)
其中:
h=(h1h2⋯hm)Tv=(v1v2⋯vn)TW=[wij]m×nα=(α1α2⋯αn)Tβ=(β1β2⋯βm)T
2.具有隐变量的能量模型
对于具有隐变量的能量模型来说,我们有的数据是观测变量v的数据,假设数据集是S,S的规模是N,即∣S∣=N,另外用θ表示参数(W,α,β),那么数据的log似然就是:
l(θ)=N1v∈S∑logP(v)
对于概率logP(v),来求它对θ的梯度,首先对这个概率做一些变换:
logP(v)=logh∑P(h,v)=logh∑Z1exp{−E(h,v)}=logh∑exp{−E(h,v)}−logZ=记作①logh∑exp{−E(h,v)}−记作②logh,v∑exp{−E(h,v)}
接下来看①和②这两项对参数θ的导数:
∂θ∂①=∂θ∂logh∑exp{−E(h,v)}=−∑hexp{−E(h,v)}1h∑exp{−E(h,v)}∂θ∂E(h,v)=−h∑∑hexp{−E(h,v)}exp{−E(h,v)}∂θ∂E(h,v)=−h∑Z1∑hexp{−E(h,v)}Z1exp{−E(h,v)}∂θ∂E(h,v)=−h∑∑hP(h,v)P(h,v)∂θ∂E(h,v)=−h∑P(h∣v)∂θ∂E(h,v)∂θ∂②=∂θ∂logh,v∑exp{−E(h,v)}=−∑h,vexp{−E(h,v)}1h,v∑exp{−E(h,v)}∂θ∂E(h,v)=−h,v∑∑h,vexp{−E(h,v)}exp{−E(h,v)}∂θ∂E(h,v)=−h,v∑Zexp{−E(h,v)}∂θ∂E(h,v)=−h,v∑P(h,v)∂θ∂E(h,v)
那么最终logP(v)对参数θ的梯度为:
∂θ∂logP(v)=∂θ∂①−∂θ∂②=h,v∑P(h,v)∂θ∂E(h,v)−h∑P(h∣v)∂θ∂E(h,v)
3.RBM的log似然梯度
接下来以求解W为例来看RBM的参数学习方法。上面有了logP(v)对参数θ的梯度,类似地logP(v)对参数wij的梯度为:
∂wij∂logP(v)=h,v∑P(h,v)∂wij∂E(h,v)−h∑P(h∣v)∂wij∂E(h,v)
然后观察一下能量函数E(h,v):
E(h,v)=−(hTWv+与W无关,记作ΔαTv+βTh)=−(hTWv+Δ)=−(i=1∑mi=1∑nhiwijvj+Δ)
那么∂wij∂E(h,v)也就很容易写出来:
∂wij∂E(h,v)=−hivj
代入∂wij∂logP(v)就有:
∂wij∂logP(v)=h,v∑P(h,v)(−hivj)−h∑P(h∣v)(−hivj)=记作①h∑P(h∣v)hivj−记作②h,v∑P(h,v)hivj
有一点要回忆一下,就是RBM无论隐变量还是观测变量都是二值的,取值只能是0或1。接下来对①和②继续进行变换,需要利用这一点:
①=h1∑h2∑⋯hi∑⋯hm∑P(h1,h2,⋯,hi,⋯,hm∣v)hivj=hi∑P(hi∣v)hivj=P(hi=1∣v)1⋅vj+P(hi=0∣v)0⋅vj=P(hi=1∣v)vj②=h∑v∑P(h,v)hivj=h∑v∑P(v)P(h∣v)hivj=v∑P(v)同①h∑P(h∣v)hivj=v∑P(v)P(hi=1∣v)vj
因此也就有:
∂wij∂logP(v)=P(hi=1∣v)vj−v∑P(v)P(hi=1∣v)vj
对于上面式子中的P(hi=1∣v)这个条件概率,我们是可以直接写出来的,这个概率在上一篇的推断问题中已经推导过了,可以参照本节开头的链接。
4.RBM的CD-k方法
所有样本的log似然l(θ)对wij的梯度现在就可以表示为:
∂wij∂l(θ)=N1v∈S∑∂wij∂logP(v)=N1v∈S∑(P(hi=1∣v)vj−EP(v)[P(hi=1∣v)vj]v∑P(v)P(hi=1∣v)vj)
这里红色的项需要对v进行积分,是untrackable的,这一项其实也就是关于P(v)的期望,因此需要借助MCMC(这里指CD-k的方法,因为RBM里的随机变量也是高维的,只用MCMC也会面临燃烧期过长的问题)的方法。
使用的采样方法还是吉布斯采样,这里具体的采样过程如下图所示,首先使用训练数据来初始化v(0),然后固定v(0)来依次采样h(0)的每一维,然后固定h(0)再来依次采样v(1)的每一维,按照如此流程进行k步,最终采样得到v(k)这一个样本,这种固定一部分来采另一部分的方法叫做块吉布斯采样(block Gibbs Sampling):

需要注意的是虽然按照吉布斯采样的方法需要依次采集每一个维度,但在RBM中由于模型的特殊性,在固定v或者h时,其余的随机变量都是相互独立的,因此实际操作中并行采每一维也是可以的。
另外我们一共有N个训练数据,因此使用每个训练数据初始化一次都可以采集到一个v(k),因此最终采集到的v(k)一共有N个。
具体的CD-k for RBM算法为:
for each v:
v(0)←v
for l=0,1,2,⋯,k−1:
for i=1,2,⋯,m:sample hi(l)∼P(hi∣v(l))
for j=1,2,⋯,n:sample vj(l+1)∼P(vj∣h(l))
for i=1,2,⋯,m,j=1,2,⋯,n:
Δwij←Δwij+∂wij∂logP(v)
这里的Δwij初始化为0,这里的∂wij∂logP(v)也就是:
∂wij∂logP(v)≈P(hi=1∣v(0))vj(0)−P(hi=1∣v(k))vj(k)
也就是说用每个训练数据采样得到的样本对应的P(hi=1∣v(k))vj(k)来代替期望EP(v)[P(hi=1∣v)vj],并且将所有训练数据计算得到的∂wij∂logP(v)累计起来得到的Δwij作为∂wij∂l(θ)的近似值,即:
∂wij∂l(θ)=N1v∈S∑∂wij∂logP(v)≈N1Δwij
最后进行梯度上升迭代求解就可以了。
五、总结
配分函数是统计物理学和统计机器学习中的一个核心概念。
定义与作用:
计算与优化:
总结
总的来说,配分函数是一个非常重要的概念,它在许多不同的领域都有应用。理解和掌握配分函数的计算和应用,对于理解和使用许多统计机器学习的方法是非常重要的。