受限玻尔兹曼机RBM在深度学习领域一直有重要的应用,之前一直没有接触过RBM,觉得太复杂,公式太多,这几天在Google上找到些好的turtorial,可以在这里做一个总结。
Boltzmann machines(BM)是Markov Random Fields with pairwise interaction potentials. 这里的potential,也就是势能,是来源于物理的应用。BM和多层神经网络有着相似的结构,而且BM中的节点值是二值的(非0即1),BM的节点是成对作用的,Hinton使用了基于采样的方法用于BM的训练,使得BM能够被应用到具体问题。
玻尔兹曼分布最开始是由Gibbs在统计原理里面提出来的,
P(x)=1Zexp(−E(x)) ,其中 E(x) 是变量 x 的能量,这里的能量仅仅是对应了物理学的概念,并没有额外的意义。E(x)=−θTf(x)=∑j=1mθjfj(x),在统计原理里面, x 经常是成对的,所以E(x)是描述了 x 对的“势能”。玻尔兹曼机是二值的马尔科夫随机场(Markov Random Filed),一个玻尔兹曼机可以表示为带权重的无向图: 如上图所示,对于有n个节点的无向图,由于每个节点是二值的,所以一共有2n个状态,对于一个节点 xi ,其值为1 的时候表示这个节点是’on’,其值为1的时候表示这个节点是’off’,对于一个状态向量 x ,也就是长度为n的向量,表示这个图 n 个节点的状态,其能量值为:E(x)=−bTx−xTWx=−∑j=1nbjxj−∑i,jxiWi,jxj, x 的概率分布为:P(x)=1Zexp(−E(x))Z=∑x′exp(−E(x′)),在这里, b 表示的长度为n的偏置向量, W 是n∗n的连接矩阵, Wi,j 表示的是节点 i 和节点j的连接权值,当然这里的矩阵乘积有几点需要注意,因为无向图的两个节点的连接权值只有一个,因此严格意义上来说, E(x)=−∑j=1nbjxj−∑i<jxixjwi,j .
典型的BM有可见节点(Visible Node)和隐含节点(Hidden Node), 可见节点后面使用 v 表示,隐含节点用h表示,接着上文, x 可以表示为x=v⊙h其中 ⊙ 表示的是向量连接操作,在这里我们可以把 v 理解为我们可见的训练参数,h理解为我们在训练数据里面的一些未知隐变量,如LDA里面的隐藏话题,现在的问题是,给定一组可见节点的训练数据 v1,v2,,,vn ,现在的问题是,寻找参数 W 和b是的训练预料的最大似然函数最大:
Wˆ,bˆ=argmaxW,bℓD(W,b) ,其中 ℓD(W,b)=∏i=1nP(vi)P(v)=∑h′P(v⊙h′)=∑h′exp(−E(v⊙h′))∑h′,v′exp(−E(v′⊙h′)) ,其中 E(x)=−bTx−xTWx ,这里的 v 是训练数据可见节点的状态序列,h′表示的是隐含节点的状态序列, v′ 表示的是所以可能的可见节点序列状态。在上一节中,已经给出了 p(v) 的最大似然函数,现在是如何训练。按照套路,根据最大似然函数的对数,我们对参数进行求导:
∂(logP(v))∂θ=∑ni=1log(p(vi))∂θ=∑ni=1(log∑h′exp(−E(v⊙h′))−log(∑h′,v′exp(−E(v′⊙h′))))∂θ=∑i=1n{∑h′(exp(−E(v⊙h′))⋅∂−E(v⊙h′)∂θ)∑h′exp(−E(v⊙h′))−∑h′,v′(exp(−E(v′⊙h′))⋅∂−E(v′⊙h′)∂θ)∑h′,v′exp(−E(v′⊙h′))}=∑i=1n{∑h′p(h′|v)∂−E(v⊙h′)∂θ−∑h′,v′p(h′,v′)∂−E(v′⊙h′)∂θ}(1) 而: ∂E∂wj,k=−xjxk∂E∂bj=−xj 因此: ∂log(P(v))∂wj,k=∑i=1n{∑h′(P(h′|v)xjxk)−∑h′,v′(P(h′,v′)xjxk)}(2)∂log(P(v))∂bj=∑i=1n{∑h′(P(h′|v)xj)−∑h′,v′(P(h′,v′)xj)}(3)
其实可以看出的是这个训练有个巨大的问题是, h′ 和 v′ 都是未知的,如果对全部可能的状态进行计算,无疑其计算量将会是巨大的,这个训练是不可接受的。这里就要用到采样的方法了.常用的采样方法有MCMC和Gibbs采样,因为本人非数学专业出身,所以也就不想太钻研这些理论,这里直接上玻尔兹曼机的Gibbs采样的方法。
*. wake 步:根据 P(h′|v) 采样生成 h′ *. sleep步:根据 P(v′⊙h′) 采样生成 v′⊙h′ ,也叫”dream”步骤 *. 计算求导 *. 重复上述步骤 其实wake步就是对应公式(1)的前半部分采样,sleep步就是对应公式(1)的后半部分采样。
受限制玻尔兹曼机是一种特殊的玻尔兹曼机,之所以是受限的,是因为,在RBM中,所有的连接都是在隐含节点和可见节点之间的,而在隐含节点内部和可见节点内部并没有连接,一个典型的RBM的结构就是一个二分图: RBM的能量函数和之前的BM是一样的:
E(v,h)=−bTv−cTh−hTWv 其中 c 和b是隐含节点和可见节点的偏置参数, w 是连接权重参数矩阵*. wake步骤,因为在RBM中,可见节点和隐含节点都是相互独立的,因此RBM的wake步骤可以直接计算,不需要采样 *. sleep步骤,在sleep步骤中仍然需要采样,但是有更加结构化的采样方法:Blocked Gibbs: 1. 利用可见节点数据采样隐含节点 2. 利用采样出来的隐含节点,采样隐含节点 这里每个采样步骤都可以并行!
上面提到了Blocked Gibbs,那么如何初始化采样器呢?对比分歧采样的是使用训练可见的数据进行初始化,而且不需要多次Blocked Gibbs采样。这种做法的启发是一个好的模型的采样器应该尽可能的接近可见的训练数据。 具体的操作步骤可以表示为: 上图表明了受限玻尔兹曼机中的采样方法,我们根据公式(2)算过的求取wi,j的方法: ∑h′(P(h′|v)xjxk)−∑h′,v′(P(h′,v′)xjxk) =<h′k0(vj0−v′j1)>+<h′k1(vj1−v′j2)>+...=<vj0h′k0>−<vj∞h′k∞>≈<vj0h′k0>−<vj1h′k1>(4) 其实可以看出,只需采样两个Blocked Gibbs即可。如果这两次采样的结果是一致的,参数将不会进行更新。采样这种方法,我们就可以使用熟悉的随机梯度下降的方法来进行训练了. 文字性的描述RBM 的采样和更新方法: 1. 使用训练数据可视化可见节点 2. 使用可见节点数据更新隐含节点 3. 使用隐含节点再次更新可见节点数据 4. 使用新的可见节点数据再次更新新的隐含节点序列 到这一步,我们可以很容易的对RBM的参数进行更新了,我们将P(h^{‘}|v)和P(v^{‘}\odot h^{‘})设置成相同的值,可以设置成 1N ,那么我们将得到RBM的参数更新公式: ∂log(p(v))∂wi,j≈1N∑n=1N[v(n)ih(n)i−v(n)i^h(n)i^] 这个式子可以具体对应到公式(4),那么如何更新值呢?在RBM中按照下面的步骤进行更新RBM网络的值: 1. 使用输入可见节点数据更新隐含节点: hj=11+exp(−∑iviwi,j−bj)hj=⟮0,otherwise1,ifhj>rand(0,1) , 2. 使用步骤1中的 hj 更新新的可见节点: vi^=11+exp(−∑jwi,jhj−bi) ,然后使用 vi^ 更新新的隐含节点: hj^=11+exp(−∑iwi,jvi^−bj) 至此我们可以得到各个参数更新的方法: ∂log(p(v|θ))∂wi,j≈1N∑n=1N[vnih(n)j−vni^h(n)j^]∂log(p(v|θ))∂bi≈1N∑n=1N[vni−vni^]∂log(p(v|θ))∂bj≈1N∑n=1N[hnj−hnj^] 到这里我们应该也能够明白,这篇传阅度很广的博客: Introduction to Restricted Boltzmann Machines的里面的参数更新原理了。
[注:本渣硕的数学功底有限,简单的推导已经是穷尽高数的知识了,不对的地方请勘正,也可以联系我的邮箱:luchi727@qq.com