1 Background
1.1 什么是Sigmoid Belief Network
这一节将要学习的是Sigmoid Belief Network。首先来想一想这个名字是怎么来的,其中Belief 就等价于Bayesian Network(俗称有向图),而Sigmoid 指的是Sigmoid Function:
σ(x)=1+exp−x1
表示图中的节点都是服从0/1 分布的离散随机变量,并且概率值和Sigmoid 函数有关。
周知,有向图的因子分解很简单,因为变量之间的关系非常的清晰。而且采样也非常的简单,先从根节点开始采样,在根节点已知的情况下,子节点之间都是条件独立的(D-Separation 中的Tail to Tail 原则)。这样我们就可以一层一层的往下采样,而在神经网络中用足够多的隐藏层可以近似任何分布,在这里也一样,只要深度足够可以逼近任何的二值分布。
Neal 在1990 年结合Boltzmann Model 提出了Sigmoid Belief Network。Boltzmann Machine 定义了观察变量V 和未观察变量V 的联合分布概率:
P(v,h)=∑v,hexp{−E(v,h)}exp{−E(v,h)}
而能量函数为:
E(v,h)=−i∑αivi−j∑βjhj−i,j∑viwijhj
通过调整权值可改变概率。有了联合分布概率,从而很容易得到观察变量的概率:
P(v,h)=∑v,hexpexp{−E(v,h)}∑hexp{−E(v,h)}
因为我们观测到的数据只有可观测变量,所以学习调整权值的目的就是极大化观察变量的似然函数 −logp(V)
Sigmoid Belief Network 将无向图变成有向图的结构则有更好的因果(causal) 形式,其中未
观察变量被看作观察变量发生的原因。
1.2 Sigmoid Belief Network的模型表示
假设无向图中的节点为, {S1,S2,⋯,ST} 。根据可观测变量和不可观测变量, 可以划分为 {V,H} 如下图所示:

注意我们用 j < i 来表示i 的父亲节点,在离散数学里这是一种偏序关系,我们可以简单的认为Sj 节点在Si 节点之前进行采样。(这里老师讲的有点模糊,开始听的有点懵逼) 那么Si 节点的概率分布,等于它的两个父亲节点的分布和相应的权重的乘积之和对应的一个Sigmoid 函数(Sigmoid 函数就是用在这儿的),即为:
P(Si=1)=σ(wjiSj+wj+1iSj+1)=σ(j<i∑wjiSj)
考虑到条件独立性,完整的可以写为:
P(Si=1∣Sj:j<i)=σ(wjiSj+wj+1iSj+1)=σ(j<i∑wjiSj)
那么很简单就可以表示 P(Si=0∣Sj:j<i)
P(Si=0∣Sj:j<i)=1−σ(wjiSj+wj+1iSj+1)=σ(−wjiSj+wj+1iSj+1)
这里用到了一个很重要的性质,即为:1- σ(x)=σ(−x) 这个公式很简单,同学们自己推就可以了。下 一个问题是,想把公式 (4) 和 (5) 合并一下,因为分开不好进行统一的表达。思考到当 Si=1 时,希 望系数为 1; 当 Si=0 时,希望系数为 −1∘ 令:
Si∗=2Si−1
就可以完美的实现这个结果。所以,就可以合并起来,得到 Si 的条件概率为:
{P(Si∣Sj:j<i)=σ(Si∗∑j<iwjiSj)Si∗=2Si−1
1.3 小结
本小节讲述了SBN 算法的来源,如何从Boltzmann Machine 中演变而来,以及比Boltzmann 先进的原因。也梳理了一下Boltzmann Machine 的求解策略。然后给出了SBN 的模型表示方法,这里需要注意一下< 是一种代表父子节点关系的偏序关系。
2 Log Likelihood Gradient
2.1 Learning rule
Neal 在提出这个算法的时候,给出了Learning Rule,但是很不幸的是,这个Learning Rule 存在非常明显的缺陷。我先大致的说一下,就是梯度的值用MCMC 来采样,这样只能应对小规模的网络,层次一多起来就不work 了(Mixing time) 过长,而为什么要用MCMC 方法呢?因为Head to Head的问题,请看图1,在v 节点被观测的情况下,h 中的节点都不是条件独立的,他们之间都是相关的。那么,P(h∣v) 就很难被求出来,因为h 之间的节点相互影响,有相交解释。
“近似推断”那一节我们已经讲过了,Learning 中是需要求后验的,这里再简单描述一下。Learning的思想是令先验的Log Likelihood Function 最大化,通常使用梯度上升法来解决,在求解梯度的过程中,不可避免的要求后验,因为这个梯度的计算结果就是一个关于后验分布的期望,不可避免的要从后验中采样,因为后验很复杂不能直接采样,所以要使用MCMC 从后验中采样来求近似期望。
下面我们将求解Log Likelihood Gradient 来让大家有一个感性的认识。大佬这里有一句话如醍醐灌顶,推导的目的是看看具体的过程,然后对结论有一个感性的认识,对结论的来龙去脉有更好的理解,主要目的是辅助我们理解结论,而不是为了推导而推导。
3 Log Likelihood Function Gradient
假设联合概率分布为:
P(S)=i∏P(Si∣Sj:j<i)
而,
{P(Si∣Sj:j<i)=σ(Si∗∑j<iwjiSj)Si∗=2Si−1
实际上,应该是 σ(S∗∑j<iwjiSi+bi), 还有一个偏置,了解一点机器学习的同学都知道,这个偏置 是可以放到权值里的,因为可以看成是 0 次项对应的系数。所以,可见变量的 Log Likelihood Function
为:
Log Likelihood Function =N1v∑logP(v)
实际上这个 N1 是一个常数,要不要都可以。那么梯度的表达公式为:
∂wji∂logP(v)=P(v)1∂wji∂P(v)=P(v)1∂wji∂∑hP(v,h)=P(v)1∂wji∑h∂P(v,h)
而 P(v) 和 h 变量没什么关系,所以,可以放到求和符号里面:
P(v)1∂wji∑h∂P(v,h)=h∑P(v)∂wji∂P(v,h)
根据贝叶斯公式可得 P(v,h)=P(v)P(h∣v) 。所以, log 似然梯度为:
h∑P(h,v)P(h∣v)∂wji∂P(v,h)
而 P(v,h)=P(S), 所以梯度表达为:
h∑P(h∣v)P(S)1∂wji∂P(S)
而 P(S)=∏kP(Sk∣Sj:j<k) 。而在 ,P(S)=∏kP(Sk∣Sj:j<k) 中只有一项是和 wji 相关的。只有当k=i, 才会对应 wji, 所以只有一项和 wji 相关。那么,梯度进一步推导为:
h∑P(h∣v)P(S)1∂wji∂P(S)=h∑P(h∣v)∏kP(Sk∣Sj:j<k)1∂wji∂P(Si∣Sj:j<i)∏k=iP(Sk∣Sj:j<k)=h∑P(h∣v)P(Si∣Sj:j<i)∏k=iP(Sk∣Sj:j<k)1∂wji∏k=iP(Sk∣Sj:j<k)∂P(Si∣Sj:j<i)=h∑P(h∣v)P(Si∣Sj:j<i)1∂wji∂P(Si∣Sj:j<i)
而 P(Si∣Sj:j<i)=σ(Si∗∑j<iwjiSj) 。并且. Sigmoid 成数有一个很好的性质:
σ′(x)=(1+e−x)2e−x=1+e−x1⋅1+e−xe−x=σ(x)(1−σ(x))=σ(x)σ(−x)
而为了方便区分,后面在σ 函数中用k 来表示j(这里老师直接在最后说的,我仔细回想时有点晕,我提前就换过来了,希望可以帮助到同学们)。那么 ,∂wji∂σ(Si∗∑k<iwkiSk)=Si∗Sj, 所以
h∑P(h∣v)P(Si∣Sk:k<i)1∂wji∂P(Si∣Sk:k<i)=h∑P(h∣v)σ(Si∗∑k<iwkiSk)1σ(Si∗k<i∑wkiSk)σ(−Si∗k<i∑wkiSk)Si∗Sj=h∑P(h∣v)σ(−Si∗k<i∑wkiSk)Si∗Sj
刚刚求得的结果总结一下为:
∂wji∂logP(v)=h∑P(h∣v)σ(−Si∗k<i∑wkiSk)Si∗Sj
那么最终 log Likelihood Function Gradient 的结果为:
∂wji∂v∑logP(v)=v∑h∑P(h∣v)σ(−Si∗k<i∑wkiSk)Si∗Sj
而 P(h∣v) 可以被写作 P(h,v∣v)=P(S∣v) 。所ル ,∑v∑hP(h∣v)=∑SP(S∣v) 。那么,梯度可以写为:
∂wji∂v∑logP(v)=S∑P(S∣v)σ(−Si∗k<i∑wkiSk)Si∗Sj=E(v,h)∼P(S∣v),v∼Pdate [σ(−Si∗k<i∑wkiSk)Si∗Sj]
其中, Si 代表的是第 i 个节点的随机变量,这就是 Neal 提出鸡 Sigmoid Belief Network 的 Learning Rule。在学习的梯度迭代的过程中,是很依赖后验分布的。所以,如何把 ∑P(S∣v) 求出来是个大问题,后验概率分布非常的重要,但是这是求不出来的。在观测变量已知的情况下,由于D-Separation中的Head to Head 问题,导致所有节点之间都是有联系的,没有条件独立性,关系太复杂了。所以,∑P(S∣v)过于复杂,无法之间求解。Neal 提出的这种方法用MCMC 来近似计算P(S∣v) 很显然只适合于小规模的图,一旦复杂起来就会出现Mixing time 过长的问题,根本就不work。
3.1 小结
我们在这一小节中,讲述了Neal 提出来的learning rule,说白了就是如何使Log Likelihood Function最大化,那么就要求它的梯度。梯度的表达式,为一个关于后验的期望,由D-Separation 原则可知,后验分布过于复杂,无法求解。用MCMC 来近似计算,然而这样的方法只适合于小规模的图,一旦复杂起来就会出现Mixing time 过长的问题。所以,需要寻找新的方法。
4 Wake-Sleep Algorithm
小编在理解这个算法的过程中是有点艰辛的,主要是小编第一次听的时候,没有get 到这个算法的点。后来经常长时间的思考,翻阅了不少其他的资料才总算找到一点感觉。
通过第三节的分析,看到了Neal 提出的Learning Rule,并不work。因为有向图的explain away导致的,变量之间交织严重,无法分解,所以后验分布P(S∣v) 根本就算不出来。所以,只能用MCMC去近似,而MCMC 只能处理小规模的图模型,大规模的图模型会遇到Mixing Time 过长的问题。那么,我们的目标很明确,就是寻找更好的办法去近似后验分布。新的近似方法有下列几种思路,这里
做简单的介绍:
-
平均场理论:因为后验分布面临的最大困难就是,变量无法分解。那么,平均场理论假设后验可以分解,不就把这个问题解决了。假设q(h∣v)=∏i=1Mqi,将这个等式代入进去,会得到一个迭代式,也被称为“不动点方程”。在求解的时候,先固定住其他的维度,一次只求解一维,依次把q1,q2,⋅⋅⋅,qM 给求出来。一直这样去迭代,直到最后把整个值求出来。
这种方式比较耗时,因为前面我们讲到了,求后验很大程度上是为Learning 服务的,Learning 本身用的是梯度上升或下降算法,所以这里有一个循环。在梯度下降的每一步都要求后验,后验在平均场理论下用一个不动点方程去迭代近似,实际上不动点方程的求解过程就是一个坐标上升。而每一次坐标上升,又有一个迭代,依次求解q1,q2,⋅⋅⋅,qM 。所以说,这样就有三个迭代嵌套在一起,所有非常的耗时,计算很困难。
-
Wake-Sleep Algorithm: 既然,平均场理论的计算仍然很耗时。所以,Hinton 在1995 年,提出了用神经网络取近似后验分布的方法。它把后验分布看成是一个函数,而不是一个分布,我们知道神经网络理论上可以拟合任意的一个函数。所以,这属于学习近似推断的思想,后验分布是学习出来的,那么具体是怎么做的呢?请看下文。
4.1 Wake-Sleep Algorithm 主要思想
在Learning 的过程中,就是为了求得w。假设每一个weight 都有一个反向的weight,如下图所示:

正向的箭头为黑色的,代表正向的权重,表示为Generative Connection;反向的箭头为蓝色的,代表反向的权重,表示为Recognization Connect。每一个wji 都对应一个rji,wji是模型中本来就存在的,而rji是本来并不存在的,是我们假设它存在的。
算法可以分为两个流程:
- Wake phase: 这是一个从底向上的过程,根据有向图中D-Separation 中的Tail to Tail 原则,可以看到,bottom to up 这样采样,所有的节点都是条件独立的,计算起来非常简单。
(a) 从Bottom to up 的次序来采样**来得到每一层的样本。同样,还是假设每一个节点Si 是二值分布,节点之间的概率关系,仍然和Sigmoid 函数相关。
(b) 有了样本之后,那就好办了。我们可以拿这些样本去训练Generative Connection,也就是求w。
- Sleep phase: 这是一个从上往下的过程。
(a) 从上往下来采样以得到各个节点的样本,有向图的采样非常简单。那么,这样从上往下进行采样,得到h,v 的样本都是虚拟出来的。因为,没有把v 当成是可观测节点,所有不存在explain away 的问题。和Wake phase 很大的不同点就在于,Wake phase 是根据真实的数据v 衍生出来的。
(b) 获得了样本之后,我们就需要去学习Recognization Connection,也就是求r。
这并不是一个非常严谨的算法,我们叫它启发式算法,说是启发式算法,我们就已经承认了它并没有那么严密。他是通过引入了一个额外的Recognization Connection 去近似一个后验分布。用一个简单分布q(h∣v) 去近似后验分布p(h∣v)。前面,我们提到了可以把后验分布看成是函数,那么q(h∣v)这个函数的参数就是r。如果,我们将模型看成是一神经网络的话,q(h∣v) 就是一个随机的网络。如何我们将后验分布看成是一个函数的话,直接包装成一个黑箱就避免了复杂的分解过程。
老师在这里指出来,讲解醒眠算法的原因是,它虽然精度不高,但是非常有启发性,后面将讲述的很多算法,都可以很醒眠算法进行类比,从而得到启发。这里讲完,大家对醒眠算法的做法有了初步的了解,但是为什么这样做,一定还是有点懵逼的。下一小节,我们看看w 和r 是怎么learning 到的,从而挖掘一下其背后的思想。
4.2 w 和r 的Learning
w 和r 的Learning 过程,仍然是像之前一样使用梯度上升的方法来max Likelihood function?如果不是,那怎么操作?和KL Divergence 之间又有什么联系?这就是这一小节将要解决的问题。
主要想法就是构建一个Recognization Connection 去近似后验分布p(h|v)。聪明的同学已经观测到了,如果采用蓝色的箭头,bottom to up 这样进行采样,那么根据D-Separation 中的Tail to Tail,父亲节点已知的情况下,子节点都是相互独立的,那么概率图模型就是可分解的了。那么,计算就可以被简化了,我们用一个可分解的后验分布去近似一个不可分解的后验分布。
很显然,这样做,精度的误差是很大的,实际上week-sleep 算法追求的不是精度而是效率,什么意思呢?用一个可分解的后验分布去近似一个不可分解的后验分布,计算量肯定会变小很多。
那么,接下来给出两个 model 的模型表示:
Generative Model: Pθ(v,h),θ=w
Recognization Model: Qϕ(h∣v),ϕ=r∘
下一步,要求解的就是,这么 Learning 过程怎么 Learn? 目标函数是什么?
4.2.1 Wake phase
简单的说。第一步,首先通过 bottom up 生成样本; 第二步,再通过这些样本来进行 Learning Generative Model, 求 θ(w) 。Wake phase 就是 bottom to up 生成样本,利用样本从上往下(图1) 来学习 Pθ(v,h) 单参数。样本来自 bottom to up 的过程,即为 Qϕ(h∣v) 中采样得到的,Learning 可以理解为使样本使模型的值最大。也就是在 Qϕ(h∣v) 得到的样本下 Pθ(v,h) 的值最大。所以目标函 数可V格写做:
EQϕ(h∣v)[logPθ(v,h)]≈N1i=1∑NlogPθ(v,h)
在求解 θ 时,假设 ϕ 是已知的(因为已经从这个分布中采到了样本):
θ^=argθmaxEQϕ(h∣v)[logPθ(v,h)]
ϕ 初始是一个随机的分布。
注意到,前面有讲过近似推断的求后验的方法,这里做一个类比。
logP(X)=ELBO+KL(q∥p)ELBO=L=Eq(h∣v)[logq(h∣v)p(h,y)]=Eq(h∣v)[logp(h,v)]+H(q(h∣v))
实际上 EQϕ(h∣v)[logPθ(v,h)] 就是一个 ELBO, 因为当 Qϕ 是固定的情况下, H(Qϕ(h∣v))=0, 那么, θ^=argmaxθL(θ) 。这个优化过程可以等价于优化:
KL(Qϕ(h∣v)∥Pθ(h∣v)) (23)
4.2.2 Sleep phase
防止大家忘记,在这里给出一个详细的推导。前面过程都是一样的,不再做过多的描述,目标函数为:
ϕ^=argϕmaxElogPθ(v,h)[Qϕ(h∣v)], fixed
在推导过程中遇到常数,添加和減少都是没有关系的。那么:
ϕ^=argϕmaxEPθ(v,h)[Qϕ(h∣v)]⟺argϕmaxEPθ(v,h)[logQϕ(h∣v)]=argϕmax∫Pθ(v,h)logQϕ(h∣v)dh=argϕmax∫Pθ(v)Pθ(h∣v)logQϕ(h∣v)dh
这里的 Pθ(v) 和 ϕ 和 h 都没有关系,可以看成是一个常数,所以可以直接忽略掉:
ϕ^=argϕmax∫Pθ(h∣v)logQϕ(h∣v)dh
推导到这怎么接着进行呢?观察到因为 θ 是已知的,所以 Pθ(h∣v) 和 ϕ 没有关系。那么:
ϕ^=argϕmax∫Pθ(h∣v)logQϕ(h∣v)dh=argϕmax∫Pθ(h∣v)logPθ(h∣v)Qϕ(h∣v)dh=argϕmax−KL(Pθ(h∣v)∥Qϕ(h∣v))=argϕminKL(Pθ(h∣v)∥Qϕ(h∣v))
通过以上的推导,可以证明,确实可以将目标函数看成是一个 ELBO,从而转换为求 KL Divergence 的最小化。按照同样的方法,得到公式 (23)。
4.2.3 结论分析
通过上述的分析,看到 Wake phase 和 Sleep phase 中的目标勁数,分别为:KL (Qϕ(h∣v)∥Pθ(h∣v)) 和 KL( Pθ(h∣v)∥Qϕ(h∣v)) 。两个过程求得的 KL 散度是相反的,有点基础的同学应该知道 KL 散度不 对称,不是・个距离。
两个过程的目标函数不一致,所以这是一个启发性算法,并不可以保证收敛。Sleep 过程,可以看成不清醒,所以目标函数都搞错了。Sleep 样本是从Generative Connect 过程中采样出来的,而Model是对数据的一种假设。个人对算法的理解请看总结。
5 总结
本章节的思路其实和前面的章节都很类似,实际上有的同学已经有感觉了,这个讲解的过程就是算法的孕育和成长的过程。出现了一个问题,这个问题之前的算法无法有效的解决,针对这个问题设计一个算法,这个算法可以有效的改善这个问题的求解。这个算法在求解的过程中又遇到了什么样的问题,我们如何去解决这个问题,这就是一个算法的发展过程。
首先是讲解了Sigmoid Belief Network 的思想来源,将无向图变成有向图的结构则有更好的因果(causal) 形式,其中未观察变量被看作观察变量发生的原因。然后介绍了模型的表示方法。紧接着在模型求解的过程中,发现由于D-Separation 中的Head to Head 问题,会造成节点之间的关系复杂,无法用条件独立性分解,也就是Explain away 现象。这样后验分布的精确计算是intractable 的。所以,Neal 提出了基于MCMC 的求解方法,但是MCMC 只能求解小规模的图,大规模的图中会出现Mixing time 过长的问题,根本就不work。
这时诞生了Wake-Sleep 算法来近似推断,其主要思想就是用一个简单的分布来近似后验分布。为了解决Explain away 现象,采用的是反过来求的思路,将Head to Head 变成Tail to Tail 就可以解决这个问题了。然后两者相互迭代,相互利用数据,来使两者的数据慢慢的逼近,这是不是有点像GAN的思想,实际上GAN 的思想就有借鉴于Wake-Sleep 算法。但是,因为KL 散度并不是一个距离,所以Wake-Sleep 算法两个过程的目标函数是不一致的,算法并不收敛。这个算法是启发式的算法,而且很重要,后面很多算法的思想都可以和Wake-Sleep 算法进行对比。