首页 > 代码库 > 深度学习方法:受限玻尔兹曼机RBM(三)模型求解,Gibbs sampling

深度学习方法:受限玻尔兹曼机RBM(三)模型求解,Gibbs sampling

欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld。
技术交流QQ群:433250724,欢迎对算法、技术、应用感兴趣的同学增加。

接下来重点讲一下RBM模型求解方法。其有用的依旧是梯度优化方法,可是求解须要用到随机採样的方法。常见的有:Gibbs Sampling和对照散度(contrastive divergence, CD[8])算法。

RBM目标函数

如果给定的训练集合是S={vi}<script type="math/tex" id="MathJax-Element-1">S = \{v^i\} </script>,总数是ns<script type="math/tex" id="MathJax-Element-2">n_s</script>。当中每个样本表示为vi=(vi1,vi2,,vinv)<script type="math/tex" id="MathJax-Element-3">\textbf{v}^{i} = (v_1^i, v_2^i, \dots , v_{n_v}^i)</script>。且都是独立同分布i.i.d的。RBM採用最大似然预计,即最大化

lnLS=lni=1nsP(vi)=i=1nslnP(vi)
<script type="math/tex; mode=display" id="MathJax-Element-4">\begin{equation} \ln L_S = \ln \prod_{i=1}^{n_s}P(\textbf{v}^i) = \sum_{i=1}^{n_s}\ln P(\textbf{v}^i) \end{equation}</script>

參数表示为θ=(W,a,b)<script type="math/tex" id="MathJax-Element-5">\theta = (W, \textbf{a}, \textbf{b})</script>,因此统一的參数更新表达式为:

θ=θ+η?lnLS?θ
<script type="math/tex; mode=display" id="MathJax-Element-6">\begin{equation} \theta = \theta + \eta\frac{\partial \ln L_S}{\partial \theta} \end{equation}</script>
当中,η<script type="math/tex" id="MathJax-Element-7">\eta</script>表示学习速率。因此,非常明显。仅仅要我们能够求解出參数的梯度,我们就能够求解RMB模型了。我们先考虑随意单个训练样本(v0<script type="math/tex" id="MathJax-Element-8">\textbf{v}^0</script>)的情况,即
LS=lnP(v0)=ln(1Zhe?E(v0,h))=lnhe?E(v0,h)?lnv,he?E(v,h)
<script type="math/tex; mode=display" id="MathJax-Element-9">\begin{equation} L_S = \ln P(\textbf{v}^0) =\ln(\frac{1}{Z}\sum_{\textbf{h}}e^{-E(\textbf{v}^0,\textbf{h})})\=\ln\sum_{\textbf{h}}e^{-E(\textbf{v}^0,\textbf{h})} - \ln \sum_{\textbf{v},\textbf{h}}e^{-E(\textbf{v},\textbf{h})} \end{equation}</script>
当中v<script type="math/tex" id="MathJax-Element-10">\textbf{v}</script>表示随意的训练样本,而v0<script type="math/tex" id="MathJax-Element-11">\textbf{v}^0</script>则表示一个特定的样本。

?LS?θ=?lnP(v0)?θ=??θ(lnhe?E(v0,h))???θ(lnv,he?E(v,h))=?1he?E(v0,h)he?E(v0,h)?E(v0,h)?θ+1v,he?E(v,h)v,he?E(v,h)?E(v,h)?θ=?hP(h|v0)?E(v0,h)?θ+v,hP(h,v)?E(v,h)?θ
<script type="math/tex; mode=display" id="MathJax-Element-12">\begin{equation} \frac{\partial L_S}{\partial \theta} = \frac{\partial\ln P(\textbf{v}^0)}{\partial \theta}\=\frac{\partial}{\partial\theta}(\ln\sum_{\textbf{h}}e^{-E(\textbf{v}^0,\textbf{h})}) - \frac{\partial}{\partial\theta}(\ln \sum_{\textbf{v},\textbf{h}}e^{-E(\textbf{v},\textbf{h})})\=-\frac{1}{\sum_{\textbf{h}}e^{-E(\textbf{v}^0,\textbf{h})}}\sum_{\textbf{h}}e^{-E(\textbf{v}^0,\textbf{h})}\frac{\partial E(\textbf{v}^0,\textbf{h})}{\partial\theta} + \frac{1}{\sum_{\textbf{v},\textbf{h}}e^{-E(\textbf{v},\textbf{h})}}\sum_{\textbf{v},\textbf{h}}e^{-E(\textbf{v},\textbf{h})}\frac{\partial E(\textbf{v},\textbf{h})}{\partial\theta}\=-\sum_{\textbf{h}}P(\textbf{h}|\textbf{v}^0)\frac{\partial E(\textbf{v}^0,\textbf{h})}{\partial\theta} + \sum_{\textbf{v},\textbf{h}}P(\textbf{h},\textbf{v})\frac{\partial E(\textbf{v},\textbf{h})}{\partial\theta} \end{equation}</script>
(当中第3个等式左边内条件概率P(h|v0)<script type="math/tex" id="MathJax-Element-13">P(\textbf{h}|\textbf{v}^0)</script>,由于e?E(v0,h)he?E(v0,h)=e?E(v0,h)/Zhe?E(v0,h)/Z=P(v0,h)P(v0)=P(h|v0)<script type="math/tex" id="MathJax-Element-14">\frac{e^{-E(\textbf{v}^0,\textbf{h})}}{\sum_{\textbf{h}}e^{-E(\textbf{v}^0,\textbf{h})}} = \frac{e^{-E(\textbf{v}^0,\textbf{h})}/Z}{\sum_{\textbf{h}}e^{-E(\textbf{v}^0,\textbf{h})}/Z} = \frac{P(\textbf{v}^0,\textbf{h})}{P(\textbf{v}^0)} = P(\textbf{h}|\textbf{v}^0)</script>)

上面式子的两个部分的含义是期望——左边是梯度?E(v0,h)?θ<script type="math/tex" id="MathJax-Element-15">\frac{\partial E(\textbf{v}^0,\textbf{h})}{\partial\theta}</script>在条件概率分布P(h|v0)<script type="math/tex" id="MathJax-Element-16">P(\textbf{h}|\textbf{v}^0)</script>下的期望;右边是梯度?E(v,h)?θ<script type="math/tex" id="MathJax-Element-17">\frac{\partial E(\textbf{v},\textbf{h})}{\partial\theta}</script>在联合概率分布P(h,v)<script type="math/tex" id="MathJax-Element-18">P(\textbf{h},\textbf{v})</script>下的期望。

要求前面的条件概率是比較easy一些的。而要求后面的联合概率分布是非常困难的,由于它包括了归一化因子Z<script type="math/tex" id="MathJax-Element-19">Z</script>(对全部可能的取值求和,连续的情况下是积分)。因此我们採用一些随机採样来近似求解。把上面式子再推导一步,能够得到。

?LS?θ=?hP(h|v0)?E(v0,h)?θ+vP(v)hP(h|v)?E(v,h)?θ
<script type="math/tex; mode=display" id="MathJax-Element-20">\begin{equation} \frac{\partial L_S}{\partial \theta} =-\sum_{\textbf{h}}P(\textbf{h}|\textbf{v}^0)\frac{\partial E(\textbf{v}^0,\textbf{h})}{\partial\theta} + \sum_{\textbf{v}}P(\textbf{v})\sum_{\textbf{h}}P(\textbf{h}|\textbf{v})\frac{\partial E(\textbf{v},\textbf{h})}{\partial\theta} \end{equation}</script>

因此。我们重点就是须要就算hP(h|v)?E(v,h)?θ<script type="math/tex" id="MathJax-Element-21">\sum_{\textbf{h}}P(\textbf{h}|\textbf{v})\frac{\partial E(\textbf{v},\textbf{h})}{\partial\theta}</script>,特别的。针对參数W,a,b<script type="math/tex" id="MathJax-Element-22">W, \textbf{a}, \textbf{b}</script>来说,有

hP(h|v)?E(v,h)?wij=?hP(h|v)hivj=?hP(hi|v)P(h?i|v)hivj=?hiP(hi|v)h?iP(h?i|v)hivj=?hiP(hi|v)hivj=?(P(hi=1|v)?1?vj+P(hi=0|v)?0?vj)=?P(hi=1|v)vj
<script type="math/tex; mode=display" id="MathJax-Element-23">\begin{equation} \sum_{\textbf{h}}P(\textbf{h}|\textbf{v})\frac{\partial E(\textbf{v},\textbf{h})}{\partial w_{ij}}= -\sum_{\textbf{h}}P(\textbf{h}|\textbf{v})h_i v_j\=-\sum_{\textbf{h}}P(h_i|\textbf{v})P(h_{-i}|\textbf{v})h_i v_j\=-\sum_{h_i}P(h_i|\textbf{v})\sum_{h_{-i}}P(h_{-i}|\textbf{v})h_i v_j\=-\sum_{h_i}P(h_i|\textbf{v})h_i v_j\=-(P(h_i=1|\textbf{v})\cdot 1 \cdot v_j + P(h_i=0|\textbf{v})\cdot 0 \cdot v_j)\=-P(h_i=1|\textbf{v}) v_j \end{equation}</script>

相似的。我们能够非常easy得到:

hP(h|v)?E(v,h)?ai=?vi
<script type="math/tex; mode=display" id="MathJax-Element-24">\begin{equation} \sum_{\textbf{h}}P(\textbf{h}|\textbf{v})\frac{\partial E(\textbf{v},\textbf{h})}{\partial a_i}=-v_i \end{equation}</script>

hP(h|v)?E(v,h)?bj=?P(hi=1|v)
<script type="math/tex; mode=display" id="MathJax-Element-25">\begin{equation} \sum_{\textbf{h}}P(\textbf{h}|\textbf{v})\frac{\partial E(\textbf{v},\textbf{h})}{\partial b_j}=-P(h_i=1|\textbf{v}) \end{equation}</script>

于是,我们非常easy得到,

?lnP(v0)?wij=?hP(h|v0)?E(v0,h)?wij+vP(v)hP(h|v)?E(v,h)?wij=P(hi=1|v0)v0j?vP(v)P(hi=1|v)vj
<script type="math/tex; mode=display" id="MathJax-Element-26">\begin{equation} \frac{\partial \ln P(\textbf{v}^0)}{\partial w_{ij}} = -\sum_{\textbf{h}}P(\textbf{h}|\textbf{v}^0)\frac{\partial E(\textbf{v}^0,\textbf{h})}{\partial w_{ij}} + \sum_{\textbf{v}}P(\textbf{v})\sum_{\textbf{h}}P(\textbf{h}|\textbf{v})\frac{\partial E(\textbf{v},\textbf{h})}{\partial w_{ij}}\=P(h_i=1|\textbf{v}^0) v_j^0 - \sum_{\textbf{v}}P(\textbf{v})P(h_i=1|\textbf{v}) v_j \end{equation}</script>

?lnP(v0)?ai=v0i?vP(v)vi
<script type="math/tex; mode=display" id="MathJax-Element-27">\begin{equation} \frac{\partial \ln P(\textbf{v}^0)}{\partial a_i} = v_i^0 - \sum_{\textbf{v}}P(\textbf{v}) v_i \end{equation}</script>

?lnP(v0)?bi=P(hi=1|v0)?vP(v)P(hi=1|v)
<script type="math/tex; mode=display" id="MathJax-Element-28">\begin{equation} \frac{\partial \ln P(\textbf{v}^0)}{\partial b_i} = P(h_i=1|\textbf{v}^0) - \sum_{\textbf{v}}P(\textbf{v})P(h_i=1|\textbf{v}) \end{equation}</script>

上面求出了一个样本的梯度。对于ns<script type="math/tex" id="MathJax-Element-29">n_s</script>个样本有

?LS?wij=m=1ns[P(hi=1|vm)vmj?vP(v)P(hi=1|v)vj]
<script type="math/tex; mode=display" id="MathJax-Element-30">\begin{equation} \frac{\partial L_S}{\partial w_{ij}} =\sum_{m=1}^{n_s}\left[P(h_i=1|\textbf{v}^m) v_j^m - \sum_{\textbf{v}}P(\textbf{v})P(h_i=1|\textbf{v}) v_j\right] \end{equation}</script>

?LS?ai=m=1ns[vmi?vP(v)vi]
<script type="math/tex; mode=display" id="MathJax-Element-31">\begin{equation} \frac{\partial L_S}{\partial a_i} = \sum_{m=1}^{n_s}\left[v_i^m - \sum_{\textbf{v}}P(\textbf{v}) v_i\right] \end{equation}</script>

?LS?bi=m=1ns[P(hi=1|vm)?vP(v)P(hi=1|v)]
<script type="math/tex; mode=display" id="MathJax-Element-32">\begin{equation} \frac{\partial L_S}{\partial b_i} = \sum_{m=1}^{n_s}\left[P(h_i=1|\textbf{v}^m) - \sum_{\textbf{v}}P(\textbf{v})P(h_i=1|\textbf{v}) \right] \end{equation}</script>

到这里就比較明白了,主要就是要求出上面三个梯度;可是由于不好直接求概率分布P(v)<script type="math/tex" id="MathJax-Element-33">P(\textbf{v})</script>,前面分析过,计算复杂度非常大。因此採用一些随机採样的方法来得到近似的解。看这三个梯度的第二项实际上都是求期望,而我们知道。样本的均值是随机变量期望的无偏预计。

Gibbs Sampling

非常多资料都有提到RBM能够用Gibbs Sampling来做。可是详细怎么做不讲(是不是有点蛋疼?),可能非常多人也不清楚究竟怎么做。以下略微介绍一下。

吉布斯採样(Gibbs sampling),是MCMC方法的一种,详细能够看我前面整理的随机採样MCMC的文章。

总的来说,Gibbs採样能够从一个复杂概率分布P(X)<script type="math/tex" id="MathJax-Element-498">P(X)</script>下生成数据,仅仅要我们知道它每个分量的相对于其它分量的条件概率P(Xk|X?k)<script type="math/tex" id="MathJax-Element-499">P(X_k|X_{-k})</script>,就能够对其进行採样。

而RBM模型的特殊性。隐藏层神经元的状态仅仅受可见层影响(反之亦然),并且同一层神经元之间是相互独立的,那么就能够依据例如以下方法依次採样:

技术分享

也就是说hi<script type="math/tex" id="MathJax-Element-500">h_i</script>是以概率P(hi|v0)<script type="math/tex" id="MathJax-Element-501">P(h_i|\textbf{v}_0)</script>为1,其它的都相似。这样当我们迭代足够次以后。我们就能够得到满足联合概率分布P(v,h)<script type="math/tex" id="MathJax-Element-502">P(\textbf{v},\textbf{h})</script>下的样本(v,h)<script type="math/tex" id="MathJax-Element-503">(\textbf{v},\textbf{h})</script>,当中样本(v)<script type="math/tex" id="MathJax-Element-504">(\textbf{v})</script>能够近似觉得是P(v)<script type="math/tex" id="MathJax-Element-505">P(\textbf{v})</script>下的样本。下图也说明了这个迭代採样的过程:
技术分享
有了样本(v)<script type="math/tex" id="MathJax-Element-506">(\textbf{v})</script>就能够求出上面写到的三个梯度(?LS?wij,?LS?ai,?LS?bi<script type="math/tex" id="MathJax-Element-507">\frac{\partial L_S}{\partial w_{ij}} ,\frac{\partial L_S}{\partial a_i} ,\frac{\partial L_S}{\partial b_i} </script>)了。用梯度上升就能够对參数进行更新了。(实际中,能够在k次迭代以后,得到样本集合{v<script type="math/tex" id="MathJax-Element-508">\textbf{v}</script>},比方迭代100次取后面一半,带入上面梯度公式的后半部分计算平均值。)

看起来非常简单是不是?可是问题是。每一次gibbs採样过程都须要重复迭代非常多次以保证马尔科夫链收敛。而这仅仅是一次梯度更新,多次梯度更新须要重复使用gibbs採样,使得算法执行效率非常低。为了加速RBM的训练过程,Hinton等人提出了对照散度(Contrastive Divergence)方法。大大加快了RBM的训练速度,将在下一篇重点讲一下。

OK。本篇先到这里。平时工作比較忙。加班什么的(IT的都这样)。晚上回到家比較晚。每天仅仅能挤一点点时间写。写的比較慢。见谅。RBM这一块能够看的资料非常多。网上一搜一大堆。还包括hinton的一些论文和Bengio的综述[9]。只是详细手写出来的思路还是借鉴了[7]。看归看。我会自己推导并用自己的语言写出来。大家有什么问题都能够留言讨论。下一篇最后讲一下CD算法。后面有时间再拿code出来剖析一下。


觉得有一点点价值,就支持一下哈!

花了非常多时间手打公式的说~很多其它内容请关注Bin的专栏


參考资料
[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

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

深度学习方法:受限玻尔兹曼机RBM(三)模型求解,Gibbs sampling