技术交流QQ群:433250724,欢迎对算法、技术、应用感兴趣的同学加入。
上篇讲到,如果用Gibbs Sampling方法来训练rbm会非常慢,本篇中介绍一下对比散度contrastive divergence, CD算法。
我们希望得到P(v)分布下的样本,而我们有训练样本,可以认为训练样本就是服从P(v)的。因此,就不需要从随机的状态开始gibbs采样,而从训练样本开始。
CD算法大概思路是这样的,从样本集任意一个样本v0开始,经过k次Gibbs采样(实际中k=1往往就足够了),即每一步是:
ht?1~P(h|vt?1)vt~P(v|ht?1)
得到样本vk,然后对应于上一篇三个单样本的梯度,用vk去近似:
?lnP(v)?wij≈P(hi=1|v0)v0j?P(hi=1|vk)vkj?lnP(v)?ai≈=v0i?vki?lnP(v)?bi≈P(hi=1|v0)?P(hi=1|vk)
上述近似的含义是说,用一个采样出来的样本来近似期望的计算。到这里,我们就可以计算LS的梯度了,上面的CD-k算法是用于在一次梯度更新中计算梯度近似值的。下面给出CD-k的算法执行流程,这里小偷懒一下,就借用截图了[7]。
其中,sample_h_given_v(v,W,a,b),做的事情是这样的(sample_v_given_v(h,W,a,b)类似):
记qj=P(hj|v),j=1,2,…,nh,产生一个[0,1]的随机数rj,对每一个hj,如果rj<qj,则hj=1,否则hj=0。
OK, 有了CD-k算法,我们也可以总结RMB整个算法了[7],
好,到这里基本讲完了,还有一些细节trick,是不在RBM本身范畴的,在实现的时候可以具体参考[2]。后面有时间再补一篇关于RBM代码的解读。
参考资料
[1] http://www.chawenti.com/articles/17243.html
[2] 张春霞,受限波尔兹曼机简介
[3] http://www.cnblogs.com/tornadomeet/archive/2013/03/27/2984725.html
[4] http://deeplearning.net/tutorial/rbm.html
[5] Asja Fischer, and Christian Igel,An Introduction to RBM
[6] G.Hinton, A Practical Guide to Training Restricted Boltzmann Machines
[7] http://blog.csdn.net/itplus/article/details/19168937
[8] G.Hinton, Training products of experts by minimizing contrastive divergence, 2002.
[9] Bengio, Learning Deep Architectures for AI, 2009