本文主要是介绍Sigmoid Belief Net,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
概率生成模型(generative model)的目标就是要最大化输入数据x的概率p(x),信念网络是图理论与概率论结合,信念网(Belief Nets)需要解决两个问题:
1. 推理(inference),推导未观察变量的状态。
2. 学习(learning),调整权值使得观察变量生成的概率最大。
早期的图模型是人工定义图结构(各节点之间的关系)和各变量之间的条件概率。对于随机生成神经网来说,结构和条件概率这些知识需要通过学习从训练数据中获得。
有两类随机生成神经网,一类是基于能量模型的Boltzmann Machine;一类是因果的Sigmoid Belief Net。
Boltzmann Machine定义了观察变量v和未观察变量h的联合分布概率 p(v,h)=e−E(v,h)∑v,he−E(v,h) , E(v,h)=−∑iviai−∑jhjbj−∑i,jvihjwij 是能量函数,通过调整权值可改变概率。有了联合分布概率,从而很容易得到观察变量的概率 p(v)=∑he−E(v,h)∑v,he−E(v,h) ,学习调整权值的目的就是极大化观察变量的似然函数 −logp(v)
1. SBN似然函数和对权值的偏导
SBN的结构则有更好的因果(causal)形式,其中未观察变量被看作观察变量发生的原因。SBN中定义的是未观察变量条件下的观察变量条件概率 p(v|s1,s2,s3)=p(v|s1)p(s1|s2)p(s2|s3)p(s3)
对于任一节点 si ,其状体为1的条件概率为:
pi=p(si=1|...,sj,...)=11+exp(−bi−∑jsjwij)
因此,节点 si ,其状态为1的概率为:
p(si=1)=∑...,sj,...pip(...,sj,...)
节点 si 状态为1的似然函数为:
log(∑...,sj,...pip(...,sj,...))
节点 si 状态为0的似然函数为:
log(∑...,sj,...(1−pi)p(...,sj,...))
分别对1状态和0状态求似然函数对 wij 的偏导,状态为1时的偏导为:
∑...,sj,...pi(1−pi)p(...,sj,...)sj∑...,sj,...pip(...,sj,...)=∑...,sj,...p(...,sj,...|si)(si−pi)sj
状态为0时的偏导为:
−∑...,sj,...pi(1−pi)p(...,sj,...)sj∑...,sj,...(1−pi)p(...,sj,...)=∑...,sj,...p(...,sj,...|si)(si−pi)sj
因此,SBN中 si 节点似然函数对 wij 的偏导数为:
∑...,sj,...p(...,sj,...|si)(si−pi)sj (1)
上式为 (si−pi)sj 对条件概率 p(...,sj,...|si) 的期望值,如果通过Monte Carlo采样算法来计算(1)式,需要模拟条件概率 p(...,sj,...|si) 的发生,这是一个非常困难的事情。如果 p(...,sj,...|si) 条件独立,即:
p(...,sj,...|si)=p(...|si)p(sj|si)p(...|si)
通过简化,从而使得(1)式可以计算,但是由于Explaining away现象的出现,条件独立的条件不存在,因此(1)式计算非常困难。
2. Wake Sleep算法
Hinton et. al. 1995年提出了Wake-Sleep算法,用一个近似的方法来模拟条件概率 p(...,sj,...|si) 的发生。
一个是条件独立:
p(...,sj,...|si)=p(...|si)p(sj|si)p(...|si)
另一是引入识别权值(Recognition weights) rij 来计算 sj 的条件概率:
p(sj=1|si)=11+exp(−bj−∑isirij)
在Wake阶段,固定 rij 学习 wij ;
在Sleep阶段,固定 wij 学习 rij 。
由于Explaining away的出现,实际上,条件独立并不成立,使得在Sleep阶段学习得到的条件概率 p(...,sj,...|si) 与实际情况发生了偏差。
3. 最小描述字长(description length)与Wake Sleep算法
假设在SBN中,隐藏层节点的所有状态构成一个编码字典, α 为一个码字,对于任一输入d用码字 α 进行编码总共花费的字长为(包括编码字典的花费和输入d的编码花费,分别对应公式中第一项和第二项):
C(α,d)=C(α)+C(d|α)=∑l∈L∑j∈lC(sαj)+∑iC(sdi|α) (2)
其中, C(sαj) 为节点j的编码字长:
C(sαj)=−sαjlogpαj−(1−sαj)log(1−pαj)
(2)式中第一项为隐藏层节点编码字长,第二项为输入层节点字长。
所以输入d的平均编码字长为:
C(d)=∑αp(α)C(α,d)−(−∑αp(α)logp(α)) (3)
其中 p(α) 为码字 α 用于编码的概率,式中第二项对应编码字典的平均字长。
在Wake Sleep算法中, p(α) 由识别权重(Recognition Weights),可以表示为输入d的条件概率 Q(α|d) ,公式(3)重新改写如下:
C(d)=∑αQ(α|d)C(α,d)−(−∑αQ(α|d)logQ(α|d)) (4)
在Sleep学习阶段, C(α,d) 概率分布不变,因为 w 不变,需要调整
P(α|d)=exp(−C(α,d))∑βexp(−C(β,d))
因为,
logP(α|d)=−C(α,d)−log∑βexp(−C(β,d))
所以,
∑α(P(α|d)−Q(α|d))logP(α|d)=∑α(Q(α|d)−P(α|d))C(α,d)
所以,(4)式进一步可以改写如下:
C(d)=∑αP(α|d)C(α,d)−(−∑αP(α|d)logP(α|d))+∑αQ(α|d)logQ(α|d)P(α|d)
最后一项为KL散度距离,非负,为非最优编码方案下多余出来的编码字长。
这篇关于Sigmoid Belief Net的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!