受限玻尔兹曼机(RBM)

一、RBM的网络结构

RBM的网络结构如下图所示:

RBM中包括两层,即:

  • 可见层(visible layer),图上的___v___
  • 隐藏层(hidden layer),图上的___h___

由上图可知,在同一层中,如上图中的可见层,在可见层中,其节点之间是没有连接的,而在层与层之间,其节点是全连接的,这是RBM最重要的结构特征:层内无连接,层间全连接

在RBM的模型中,有如下的性质:

当给定可见层神经元的状态时。各隐藏层神经元的之间是否激活是条件独立的;反之也同样成立。

下面给出RBM模型的数学化定义:

如图:

假设可见层的神经元的个数为nvn_vnv​,隐藏层的神经元的个数为nhn_hnh​,

  • vvv 表示的是可见层神经元的状态,v=(v1,v2,⋯,vnv)Tv=(v_1,v_2,⋯,v_{n_v})^Tv=(v1​,v2​,⋯,vnv​​)T。
  • hhh 表示的是隐藏层神经元的状态,h=(h1,h2,⋯,hnh)Th=(h_1,h_2,⋯,h_{n_h})^Th=(h1​,h2​,⋯,hnh​​)T。
  • aaa 表示的是可见层神经元的偏置,a=(a1,a2,⋯,anv)T∈Rnva=(a_1,a_2,⋯,a_{n_v})^T∈{R}^{n_v}a=(a1​,a2​,⋯,anv​​)T∈Rnv​。
  • bbb 表示的是隐藏层神经元的偏置,b=(b1,b2,⋯,bnh)T∈Rnhb=(b_1,b_2,⋯,b_{n_h})^T∈{R}^{n_h}b=(b1​,b2​,⋯,bnh​​)T∈Rnh​。
  • W=(wi,j)∈Rnh×nvW=(w_{i,j})∈R^{nh×nv}W=(wi,j​)∈Rnh×nv表示的是隐藏层与可见层之间的连接权重。

同时,我们记 θ=(W,a,b)\theta=(W,a,b)θ=(W,a,b)。

二、RBM模型的计算

2.1、能量函数

对于一组给定的状态(v,h)(v,h)(v,h),定义如下的能量函数:
Eθ(v,h)=−∑i=1nvaivi−∑j=1nhbjhj−∑i=1nv∑j=1nhhjwj,iviE_{\theta}(\mathbf{v}, \mathbf{h})=-\sum_{i=1}^{n_{v}} a_{i} v_{i}-\sum_{j=1}^{n_{h}} b_{j} h_{j}-\sum_{i=1}^{n_{v}} \sum_{j=1}^{n_{h}} h_{j} w_{j, i} v_{i} Eθ​(v,h)=−i=1∑nv​​ai​vi​−j=1∑nh​​bj​hj​−i=1∑nv​​j=1∑nh​​hj​wj,i​vi​
利用该能量公式,可以定义如下的联合概率分布:
Pθ(v,h)=1Zθe−Eθ(v,h)P_{\theta}(\mathbf{v}, \mathbf{h})=\frac{1}{Z_{\theta}} e^{-E_{\theta}(\mathbf{v}, \mathbf{h})} Pθ​(v,h)=Zθ​1​e−Eθ​(v,h)
其中:
Zθ=∑v,he−Eθ(v,h)Z_{\theta}=\sum_{\mathbf{v}, \mathbf{h}} e^{-E_{\theta}(\mathbf{v}, \mathbf{h})} Zθ​=v,h∑​e−Eθ​(v,h)
称为归一化因子。

当有了联合概率分布,我们便可以定义边缘概率分布,即:
Pθ(v)=∑hPθ(v,h)=1Zθ∑he−Eθ(v,h)Pθ(h)=∑vPθ(v,h)=1Zθ∑ve−Eθ(v,h)\begin{aligned} &P_{\theta}(\mathbf{v})=\sum_{\mathbf{h}} P_{\theta}(\mathbf{v}, \mathbf{h})=\frac{1}{Z_{\theta}} \sum_{\mathbf{h}} e^{-E_{\theta}(\mathbf{v}, \mathbf{h})} \\ &P_{\theta}(\mathbf{h})=\sum_{\mathbf{v}} P_{\theta}(\mathbf{v}, \mathbf{h})=\frac{1}{Z_{\theta}} \sum_{\mathbf{v}} e^{-E_{\theta}(\mathbf{v}, \mathbf{h})} \end{aligned} ​Pθ​(v)=h∑​Pθ​(v,h)=Zθ​1​h∑​e−Eθ​(v,h)Pθ​(h)=v∑​Pθ​(v,h)=Zθ​1​v∑​e−Eθ​(v,h)​

2.2、激活概率

有了上述的联合概率分布以及边缘概率分布,我们需要知道当给定可见层的状态时,隐藏层上的某一个神经元被激活的概率,即P(hk=1∣v)P(h_k=1\mid v)P(hk​=1∣v),或者当给定了隐藏层的状态时,可见层上的某一神经元被激活的概率,即P(vk=1∣h)P(v_k=1\mid h)P(vk​=1∣h)。
首先定义如下的一些标记:

h−k≜(h1,h2,⋯,hk−1,hk+1,⋯,hnh)T\mathbf{h}_{-k} \triangleq\left(h_{1}, h_{2}, \cdots, h_{k-1}, h_{k+1}, \cdots, h_{n_{h}}\right)^{T} h−k​≜(h1​,h2​,⋯,hk−1​,hk+1​,⋯,hnh​​)T

上式表示的是在h中去除了分量hkh_khk​后得到的向量。

αk(v)≜bk+∑i=1nvwk,ivi\mathbf{\alpha}_{k}(v) \triangleq b_{k}+\sum_{i=1}^{n_v} w_{k, i} v_{i} αk​(v)≜bk​+i=1∑nv​​wk,i​vi​

β(v,h−k)≜∑i=1nvaivi+∑j=1,j≠knhbjhj+∑i=1nv∑j=1,j≠knhhjwj,ivi\beta\left(\mathbf{v}, \mathbf{h}_{-k}\right) \triangleq \sum_{i=1}^{n_{v}} a_{i} v_{i}+\sum_{j=1, j \neq k}^{n_{h}} b_{j} h_{j}+\sum_{i=1}^{n_{v}} \sum_{j=1, j \neq k}^{n_{h}} h_{j} w_{j, i} v_{i} β(v,h−k​)≜i=1∑nv​​ai​vi​+j=1,j​=k∑nh​​bj​hj​+i=1∑nv​​j=1,j​=k∑nh​​hj​wj,i​vi​

有了如上的一些公式,我们可以得到能量公式的如下表示方法:

E(v,h)=−β(v,hk)−hkαk(v)E(v,h)=−\beta(v,h_k)−h_k\alpha_k(v) E(v,h)=−β(v,hk​)−hk​αk​(v)

那么,当给定可见层的状态时,隐藏层上的某一个神经元被激活的概率P(hk=1∣v)P(h_k=1\mid v)P(hk​=1∣v)为:

P(hk=1∣v)=P(hk=1∣h−k,v)=P(hk=1,h−k,v)P(h−k,v)=P(hk=1,h−k,v)P(hk=0,h−k,v)+P(hk=1,h−k,v)=e−E(hk=1,h−kv)e−E(hk=0,h−kv)+e−E(hk=1,h−kv)=11+e−E(hk=0,h−kv)+E(hk=1,h−h0v)=11+e[β(v,h−k)+0⋅αk(v)]+[−β(v,h−k)−1⋅αk(v)]=11+e−αk(v)\begin{aligned} P\left(h_{k}=1 \mid \mathbf{v}\right)&=P\left(h_{k}=1 \mid \mathbf{h}_{-k}, \mathbf{v}\right)\\ &=\frac{P\left(h_{k}=1, \mathbf{h}_{-k}, \mathbf{v}\right)}{P\left(\mathbf{h}_{-k}, \mathbf{v}\right)}\\ &=\frac{P\left(h_{k}=1, \mathbf{h}_{-k}, \mathbf{v}\right)}{P\left(h_{k}=0, \mathbf{h}_{-k}, \mathbf{v}\right)+P\left(h_{k}=1, \mathbf{h}_{-k}, \mathbf{v}\right)}\\ &=\frac{e^{-E\left(h_{k}=1, \mathbf{h}_{-k} \mathbf{v}\right)}}{e^{-E\left(h_{k}=0, \mathbf{h}_{-k} \mathbf{v}\right)}+e^{-E\left(h_{k}=1, \mathbf{h}_{-k} \mathbf{v}\right)}}\\ &=\frac{1}{1+e^{-E\left(h_{k}=0, \mathbf{h}_{-k} \mathbf{v}\right)+E\left(h_{k}=1, \mathbf{h}_{-h_{0}} \mathbf{v}\right)}}\\ &=\frac{1}{1+e^{\left[\beta\left(\mathbf{v}, \mathbf{h}^{-k}\right)+0 \cdot \alpha_{k}(\mathbf{v})\right]+\left[-\beta\left(\mathbf{v}, \mathbf{h}^{-k}\right)-1 \cdot \alpha_{k}(\mathbf{v})\right]}}\\ &=\frac{1}{1+e^{-\alpha_{k}(\mathbf{v})}} \end{aligned} P(hk​=1∣v)​=P(hk​=1∣h−k​,v)=P(h−k​,v)P(hk​=1,h−k​,v)​=P(hk​=0,h−k​,v)+P(hk​=1,h−k​,v)P(hk​=1,h−k​,v)​=e−E(hk​=0,h−k​v)+e−E(hk​=1,h−k​v)e−E(hk​=1,h−k​v)​=1+e−E(hk​=0,h−k​v)+E(hk​=1,h−h0​​v)1​=1+e[β(v,h−k)+0⋅αk​(v)]+[−β(v,h−k)−1⋅αk​(v)]1​=1+e−αk​(v)1​​

由Sigmoid函数可知:

Sigmoid(x)=11+e−x{Sigmoid(x)}=\frac{1}{1+e^{-x}} Sigmoid(x)=1+e−x1​

则:

P(hk=1∣v)=Sigmoid⁡(αk(v))=Sigmoid⁡(bk+∑i=1nvwk,ivi)\begin{aligned} P\left(h_{k}=1 \mid \mathbf{v}\right) &=\operatorname{Sigmoid}\left(\alpha_{k}(\mathbf{v})\right) \\ &=\operatorname{Sigmoid}\left(b_{k}+\sum_{i=1}^{n_{v}} w_{k, i} v_{i}\right) \end{aligned} P(hk​=1∣v)​=Sigmoid(αk​(v))=Sigmoid(bk​+i=1∑nv​​wk,i​vi​)​

同理,可以求得当给定了隐藏层的状态时,可见层上的某一神经元被激活的概率P(vk=1∣h)P(v_k=1\mid h)P(vk​=1∣h):

P(vk=1∣h)=Sigmoid⁡(αk(h))=Sigmoid⁡(ak+∑j=1nhwj,khj)\begin{aligned} P\left(v_{k}=1 \mid \mathbf{h}\right) &=\operatorname{Sigmoid}\left(\alpha_{k}(\mathbf{h})\right) \\ &=\operatorname{Sigmoid}\left(a_{k}+\sum_{j=1}^{n_{h}} w_{j, k} h_{j}\right) \end{aligned} P(vk​=1∣h)​=Sigmoid(αk​(h))=Sigmoid(ak​+j=1∑nh​​wj,k​hj​)​

2.3、模型的训练

2.3.1模型的优化函数

对于RBM模型,其参数主要是可见层和隐藏层之间的权重,可见层的偏置以及隐藏层的偏置,即θ=(W,a,b)\theta=(W,a,b)θ=(W,a,b),对于给定的训练样本,通过训练得到参数θ\thetaθ,使得在该参数下,由RBM表示的概率分布尽可能与训练数据相符合。

假设给定的训练集为:

X={v1,v2,⋯,vns}\mathbf{X}=\lbrace{v^1,v^2,\cdots,v^{n_s}}\rbrace X={v1,v2,⋯,vns​}

其中,nsn_sns​表示的是训练样本的数目,vi=(v1i,v2i,⋯,vnvi)Tv^i=(v^i_1,v^i_2,\cdots,v^i_{n_v})^Tvi=(v1i​,v2i​,⋯,vnv​i​)T。为了能够学习出模型中的参数,我们希望利用模型重构出来的数据能够尽可能与原始数据一致,则训练RBM的目标就是最大化如下的似然函数:

Lθ=∏i=1nsP(vi)L_{\theta}=\prod_{i=1}^{n_{s}} P\left(\mathbf{v}^{i}\right) Lθ​=i=1∏ns​​P(vi)

对于如上的似然函数的最大化问题,通常是取其log函数的形式:

ln⁡Lθ=ln⁡∏i=1nsP(vi)=∑i=1nsln⁡P(vi)\ln L_{\theta}=\ln \prod_{i=1}^{n_{s}} P\left(\mathbf{v}^{i}\right)=\sum_{i=1}^{n_{s}} \ln P\left(\mathbf{v}^{i}\right) lnLθ​=lni=1∏ns​​P(vi)=i=1∑ns​​lnP(vi)

2.3.2、最大似然的求解

对于上述的最优化问题,可以使用梯度上升法进行求解,梯度上升法的形式为:

θ=θ+η∂ln⁡Lθ∂θ\theta=\theta+\eta \frac{\partial \ln L_{\theta}}{\partial \theta} θ=θ+η∂θ∂lnLθ​​

其中,η>0称为学习率。对于∂ln⁡Lθ∂θ\frac{\partial \ln L_{\theta}}{\partial \theta}∂θ∂lnLθ​​的求解,简单的情况,只考虑一个样本的情况,则:

ln⁡Lθ=ln⁡P(v)=ln⁡(1Z∑he−E(v,h))=ln⁡∑he−E(v,h)−ln⁡Z=ln⁡∑he−E(v,h)−ln⁡∑v,he−E(v,h)\begin{aligned} \ln L_{\theta} &=\ln P(\mathbf{v}) \\ &=\ln \left(\frac{1}{Z} \sum_{\mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})}\right) \\ &=\ln \sum_{\mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})}-\ln Z \\ &=\ln \sum_{\mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})}-\ln \sum_{\mathbf{v}, \mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})} \end{aligned} lnLθ​​=lnP(v)=ln(Z1​h∑​e−E(v,h))=lnh∑​e−E(v,h)−lnZ=lnh∑​e−E(v,h)−lnv,h∑​e−E(v,h)​

则∂ln⁡Lθ∂θ\frac{\partial \ln L_{\theta}}{\partial \theta}∂θ∂lnLθ​​为:

∂ln⁡Lθ∂θ=∂ln⁡P(v)∂θ=∂∂θ(ln⁡∑he−E(v,h))−∂∂θ(ln⁡∑v,he−E(v,h))=−1∑he−E(v,h)∑he−E(v,h)∂E(v,h)∂θ+1∑v,he−E(v,h)∑v,he−E(v,h)∂E(v,h)∂θ\begin{aligned} \frac{\partial \ln L_{\theta}}{\partial \theta} &=\frac{\partial \ln P(\mathbf{v})}{\partial \theta} \\ &=\frac{\partial}{\partial \theta}\left(\ln \sum_{\mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})}\right)-\frac{\partial}{\partial \theta}\left(\ln \sum_{\mathbf{v}, \mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})}\right) \\ &=-\frac{1}{\sum_{\mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})}} \sum_{\mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})} \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta}+\frac{1}{\sum_{\mathbf{v}, \mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})}} \sum_{\mathbf{v}, \mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})} \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta} \end{aligned} ∂θ∂lnLθ​​​=∂θ∂lnP(v)​=∂θ∂​(lnh∑​e−E(v,h))−∂θ∂​⎝⎛​lnv,h∑​e−E(v,h)⎠⎞​=−∑h​e−E(v,h)1​h∑​e−E(v,h)∂θ∂E(v,h)​+∑v,h​e−E(v,h)1​v,h∑​e−E(v,h)∂θ∂E(v,h)​​

而:

e−E(v,h)∑he−E(v,h)=e−E(v,h)Z∑he−E(v,h)Z=P(v,h)P(v)=P(h∣v)\frac{e^{-E(\mathbf{v}, \mathbf{h})}}{\sum_{\mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})}}=\frac{\frac{e^{-E(\mathbf{v}, \mathbf{h})}}{Z}}{\frac{\sum_{\mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})}}{Z}}=\frac{P(\mathbf{v}, \mathbf{h})}{P(\mathbf{v})}=P(\mathbf{h} \mid \mathbf{v}) ∑h​e−E(v,h)e−E(v,h)​=Z∑h​e−E(v,h)​Ze−E(v,h)​​=P(v)P(v,h)​=P(h∣v)

因此上式可以表示为:

∂ln⁡Lθ∂θ=−∑hP(h∣v)∂E(v,h)∂θ+∑v,hP(v,h)∂E(v,h)∂θ\frac{\partial \ln L_{\theta}}{\partial \theta}=-\sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta}+\sum_{\mathbf{v}, \mathbf{h}} P(\mathbf{v}, \mathbf{h}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta} ∂θ∂lnLθ​​=−h∑​P(h∣v)∂θ∂E(v,h)​+v,h∑​P(v,h)∂θ∂E(v,h)​

其中,∑hP(h∣v)∂E(v,h)∂θ\sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta}∑h​P(h∣v)∂θ∂E(v,h)​表示的是能量梯度函数,∂E(v,h)∂θ\frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta}∂θ∂E(v,h)​在条件分布P(h∣v)P(\mathbf{h} \mid \mathbf{v})P(h∣v)的期望;∑v,hP(v,h)∂E(v,h)∂θ\sum_{\mathbf{v}, \mathbf{h}} P(\mathbf{v}, \mathbf{h}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta}∑v,h​P(v,h)∂θ∂E(v,h)​表示的是能量梯度函数,∂E(v,h)∂θ\frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta}∂θ∂E(v,h)​在联合分布P(v,h)P(v,h)P(v,h)下的期望。

对于∑v,hP(v,h)∂E(v,h)∂θ\sum_{\mathbf{v}, \mathbf{h}} P(\mathbf{v}, \mathbf{h}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta}∑v,h​P(v,h)∂θ∂E(v,h)​,可以表示为:

∑v,hP(v,h)∂E(v,h)∂θ=∑v∑hP(v)P(h∣v)∂E(v,h)∂θ=∑vP(v)∑hP(h∣v)∂E(v,h)∂θ\begin{aligned} \sum_{\mathbf{v}, \mathbf{h}} P(\mathbf{v}, \mathbf{h}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta} &=\sum_{\mathbf{v}} \sum_{\mathbf{h}} P(\mathbf{v}) P(\mathbf{h} \mid \mathbf{v}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta} \\ &=\sum_{\mathbf{v}} P(\mathbf{v}) \sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta} \end{aligned} v,h∑​P(v,h)∂θ∂E(v,h)​​=v∑​h∑​P(v)P(h∣v)∂θ∂E(v,h)​=v∑​P(v)h∑​P(h∣v)∂θ∂E(v,h)​​

因此,只需要计算∑hP(h∣v)∂E(v,h)∂θ\sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial \theta}∑h​P(h∣v)∂θ∂E(v,h)​,这部分的计算分为三个,分别为:

  • ∑hP(h∣v)∂E(v,h)∂wi,j\sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial w_{i,j}}∑h​P(h∣v)∂wi,j​∂E(v,h)​
  • ∑hP(h∣v)∂E(v,h)∂ai\sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial a_{i}}∑h​P(h∣v)∂ai​∂E(v,h)​
  • ∑hP(h∣v)∂E(v,h)∂bj\sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial b_{j}}∑h​P(h∣v)∂bj​∂E(v,h)​

上述的三个部分计算的方法如下:
已知:

Eθ(v,h)=−∑i=1nvaivi−∑j=1nhbjhj−∑i=1nv∑j=1nhhjwj,iviE_{\theta}(\mathbf{v}, \mathbf{h})=-\sum_{i=1}^{n_{v}} a_{i} v_{i}-\sum_{j=1}^{n_{h}} b_{j} h_{j}-\sum_{i=1}^{n_{v}} \sum_{j=1}^{n_{h}} h_{j} w_{j, i} v_{i} Eθ​(v,h)=−i=1∑nv​​ai​vi​−j=1∑nh​​bj​hj​−i=1∑nv​​j=1∑nh​​hj​wj,i​vi​

则:

  • 对wj,iw_{j,i}wj,i​求导数

∑hP(h∣v)∂E(v,h)∂wj,i=−∑hP(h∣v)hjvi=−∑h∏k=1nhP(hk∣v)hjvi=−∑hP(hj∣v)P(h−j∣v)hjvi=−∑hjP(hj∣v)hjvi∑h−jP(h−j∣v)=−∑hjP(hj∣v)hjvi=−(P(hj=0∣v)⋅0⋅vi+P(hj=1∣v)⋅1⋅vi)=−P(hj=1∣v)vi\begin{aligned} \sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial w_{j, i}} &=-\sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) h_{j} v_{i} \\ &=-\sum_{\mathbf{h}} \prod_{k=1}^{n_{h}} P\left(h_{k} \mid \mathbf{v}\right) h_{j} v_{i} \\ &=-\sum_{\mathbf{h}} P\left(h_{j} \mid \mathbf{v}\right) P\left(\mathbf{h}_{-j} \mid \mathbf{v}\right) h_{j} v_{i} \\ &=-\sum_{h_{j}} P\left(h_{j} \mid \mathbf{v}\right) h_{j} v_{i} \sum_{\mathbf{h}_{-j}} P\left(\mathbf{h}_{-j} \mid \mathbf{v}\right) \\ &=-\sum_{h_{j}} P\left(h_{j} \mid \mathbf{v}\right) h_{j} v_{i} \\ &=-\left(P\left(h_{j}=0 \mid \mathbf{v}\right) \cdot 0 \cdot v_{i}+P\left(h_{j}=1 \mid \mathbf{v}\right) \cdot 1 \cdot v_{i}\right) \\ &=-P\left(h_{j}=1 \mid \mathbf{v}\right) v_{i} \end{aligned} h∑​P(h∣v)∂wj,i​∂E(v,h)​​=−h∑​P(h∣v)hj​vi​=−h∑​k=1∏nh​​P(hk​∣v)hj​vi​=−h∑​P(hj​∣v)P(h−j​∣v)hj​vi​=−hj​∑​P(hj​∣v)hj​vi​h−j​∑​P(h−j​∣v)=−hj​∑​P(hj​∣v)hj​vi​=−(P(hj​=0∣v)⋅0⋅vi​+P(hj​=1∣v)⋅1⋅vi​)=−P(hj​=1∣v)vi​​

  • 对aia_{i}ai​求导数

∑hP(h∣v)∂E(v,h)∂ai=−∑hP(h∣v)vi=−vi∑hP(h∣v)=−vi\begin{aligned} \sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial a_{i}} &=-\sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) v_{i} \\ &=-v_{i} \sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) \\ &=-v_{i} \end{aligned} h∑​P(h∣v)∂ai​∂E(v,h)​​=−h∑​P(h∣v)vi​=−vi​h∑​P(h∣v)=−vi​​

  • 对bjb_{j}bj​求导数

∑hP(h∣v)∂E(v,h)∂bj=−∑hP(h∣v)hj=−∑h∏k=1nhP(hk∣v)hj=−∑hP(hj∣v)P(h−j∣v)hj=−∑hjP(hj∣v)hj∑h−jP(h−j∣v)=−∑hjP(hj∣v)hj=−(P(hj=0∣v)⋅0+P(hj=1∣v)⋅1)=−P(hj=1∣v)\begin{aligned} \sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) \frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial b_{j}} &=-\sum_{\mathbf{h}} P(\mathbf{h} \mid \mathbf{v}) h_{j} \\ &=-\sum_{\mathbf{h}} \prod_{k=1}^{n_{h}} P\left(h_{k} \mid \mathbf{v}\right) h_{j} \\ &=-\sum_{\mathbf{h}} P\left(h_{j} \mid \mathbf{v}\right) P\left(\mathbf{h}_{-j} \mid \mathbf{v}\right) h_{j} \\ &=-\sum_{h_{j}} P\left(h_{j} \mid \mathbf{v}\right) h_{j} \sum_{\mathbf{h}_{-j}} P\left(\mathbf{h}_{-j} \mid \mathbf{v}\right) \\ &=-\sum_{h_{j}} P\left(h_{j} \mid \mathbf{v}\right) h_{j} \\ &=-\left(P\left(h_{j}=0 \mid \mathbf{v}\right) \cdot 0+P\left(h_{j}=1 \mid \mathbf{v}\right) \cdot 1\right) \\ &=-P\left(h_{j}=1 \mid \mathbf{v}\right) \end{aligned} h∑​P(h∣v)∂bj​∂E(v,h)​​=−h∑​P(h∣v)hj​=−h∑​k=1∏nh​​P(hk​∣v)hj​=−h∑​P(hj​∣v)P(h−j​∣v)hj​=−hj​∑​P(hj​∣v)hj​h−j​∑​P(h−j​∣v)=−hj​∑​P(hj​∣v)hj​=−(P(hj​=0∣v)⋅0+P(hj​=1∣v)⋅1)=−P(hj​=1∣v)​

因此,∂ln⁡Lθ∂θ\frac{\partial \ln L_{\theta}}{\partial \theta}∂θ∂lnLθ​​为:

∂ln⁡Lθ∂wj,i=P(hj=1∣v)vi−∑vP(v)P(hj=1∣v)vi∂ln⁡Lθ∂ai=vi−∑vP(v)vi∂ln⁡Lθ∂bj=P(hj=1∣v)−∑vP(v)P(hj=1∣v)\begin{gathered} \frac{\partial \ln L_{\theta}}{\partial w_{j, i}}=P\left(h_{j}=1 \mid \mathbf{v}\right) v_{i}-\sum_{\mathbf{v}} P(\mathbf{v}) P\left(h_{j}=1 \mid \mathbf{v}\right) v_{i} \\ \frac{\partial \ln L_{\theta}}{\partial a_{i}}=v_{i}-\sum_{\mathbf{v}} P(\mathbf{v}) v_{i} \\ \frac{\partial \ln L_{\theta}}{\partial b_{j}}=P\left(h_{j}=1 \mid \mathbf{v}\right)-\sum_{\mathbf{v}} P(\mathbf{v}) P\left(h_{j}=1 \mid \mathbf{v}\right) \end{gathered} ∂wj,i​∂lnLθ​​=P(hj​=1∣v)vi​−v∑​P(v)P(hj​=1∣v)vi​∂ai​∂lnLθ​​=vi​−v∑​P(v)vi​∂bj​∂lnLθ​​=P(hj​=1∣v)−v∑​P(v)P(hj​=1∣v)​

2.3.3、优化求解

Hinton提出了高效的训练RBM的算法——对比散度(Contrastive Divergence, CD)算法。

k步CD算法的具体步骤为:

对∀v\forall v∀v,取初始值:v(0):=vv^{(0)}:=vv(0):=v,然后执行k步Gibbs采样,其中第t步先后执行:

  • 利用P(h∣v(t−1))P(h∣v(t−1))P(h\mid v^{(t−1)})P(h\mid v^{(t−1)})P(h∣v(t−1))P(h∣v(t−1))采样出h(t−1)h^{(t−1)}h(t−1)

  • 利用P(v∣h(t−1))P(v∣h(t−1))P(v\mid h^{(t−1)})P(v\mid h^{(t−1)})P(v∣h(t−1))P(v∣h(t−1))采样出v(t)v^{(t)}v(t)
    上述两个过程分别记为:sample_h_given_v和sample_v_given_h。记pjv=P(hj=1∣v),j=1,2,⋯,nhp^v_j=P(h_j=1\mid v),j=1,2,⋯,n_hpjv​=P(hj​=1∣v),j=1,2,⋯,nh​,则sample_h_given_v中的计算可以表示为:

  • for j=1,2,⋯,nh do

  • {

    • 产生[0,1]上的随机数rjr_jrj​
    • hj={1if rj<pjv0otherwise h_{j}= \begin{cases}1 & \text { if } r_{j}<p_{j}^{\mathbf{v}} \\ 0 & \text { otherwise }\end{cases}hj​={10​ if rj​<pjv​ otherwise ​
  • }

同样,对于sample_v_given_h,记pih=P(vi=1∣h),i=1,2,⋯,nvp^h_i=P(v_i=1\mid h),i=1,2,⋯,n_vpih​=P(vi​=1∣h),i=1,2,⋯,nv​,则sample_h_given_v中的计算可以表示为:

  • for j=1,2,⋯,n_h do
  • {
    • 产生[0,1]上的随机数rjr_jrj​
    • vi={1if ri<pii0otherwise v_{i}= \begin{cases}1 & \text { if } r_{i}<p_{i}^{\mathbf{i}} \\ 0 & \text { otherwise }\end{cases}vi​={10​ if ri​<pii​ otherwise ​
  • }

三、Codes

# import matplotlib.pylab as plt
import numpy as np
# import random
import matplotlib.pyplot as plt
# 导入数据
path = 'mnist.npz'
f = np.load(path)
train_images, train_labels = f['x_train'], f['y_train']
test_images, test_labels = f['x_test'], f['y_test']
x_train_origin,t_train_origin = train_images, train_labels
x_test_origin,t_test_origin = test_images, test_labels
f.close()# (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
X_train = x_train_origin/255.0
X_test = x_test_origin/255.0
m,h,w = x_train_origin.shape
X_train = X_train.reshape((m,1,h,w))
data = X_train[:5000].reshape(5000,784)
# 定义RBM类class RBM:'''设计一个专用于MNIST生成的RBM模型'''def __init__(self):self.nv = 784self.nh = 500self.lr = 0.1self.W = np.random.randn(self.nh,self.nv)*0.1self.bv = np.zeros(self.nv)self.bh = np.zeros(self.nh)def sigmoid(self,z):return 1.0/(1.0+np.exp(-z))def forword(self,inpt):z = np.dot(inpt,self.W.T) + self.bhreturn self.sigmoid(z)def backward(self,inpt):z = np.dot(inpt,self.W) + self.bvreturn self.sigmoid(z) def train_loader(self, X_train):# 将批次的数据放入self.batchesnp.random.shuffle(X_train)self.batches = []for i in range(0,len(X_train),self.batch_sz):self.batches.append(X_train[i:i+self.batch_sz])self.indice = 0def get_batch(self):if self.indice>=len(self.batches):return Noneself.indice += 1return np.array(self.batches[self.indice-1])def fit(self, X_train, epochs=50, batch_sz = 128):'''用梯度上升法做训练'''self.batch_sz = batch_szerr_list = []for epoch in range(epochs):#初始化data loaderself.train_loader(X_train)err_sum = 0while 1:# 获取每一个批次的数据v0_prob = self.get_batch()# 判断停止条件if type(v0_prob)==type(None):breaksize = len(v0_prob)# 初始化数据dW = np.zeros_like(self.W)dbv = np.zeros_like(self.bv)dbh = np.zeros_like(self.bh)#for v0_prob in  batch_data:# 前向计算h0_prob = self.forword(v0_prob)             h0 = np.zeros_like(h0_prob)h0[h0_prob > np.random.random(h0_prob.shape)] = 1# 反向计算v1_prob = self.backward(h0)v1 = np.zeros_like(v1_prob)v1[v1_prob > np.random.random(v1_prob.shape)] = 1# 前向计算h1_prob = self.forword(v1)h1 = np.zeros_like(h1_prob)                                        h1[h1_prob > np.random.random(h1_prob.shape)] = 1# 更新权重和偏置dW = np.dot(h0.T , v0_prob) - np.dot(h1.T , v1_prob)dbv = np.sum(v0_prob - v1_prob,axis = 0)dbh = np.sum(h0_prob - h1_prob,axis = 0)# 计算通过RBM计算的数据 v1_prob 和原始的数据 v0_prob 的差距(平均值)err_sum += np.mean(np.sum((v0_prob - v1_prob)**2,axis=1))# 因为是一个批次的计算,所以要除以批次的长度dW /= sizedbv /= sizedbh /= sizeself.W += dW*self.lrself.bv += dbv*self.lrself.bh += dbh*self.lrerr_sum = err_sum / len(X_train)err_list.append(err_sum)print('Epoch {0},err_sum {1}'.format(epoch, err_sum))plt.plot(err_list)def predict(self,input_x):# 前向计算h0_prob = self.forword(input_x)                h0 = np.zeros_like(h0_prob)# 抽样h0[h0_prob > np.random.random(h0_prob.shape)] = 1# 反向重建v1 = self.backward(h0)return v1
# 训练模型
rbm = RBM()
rbm.fit(data,epochs=30)
Epoch 0,err_sum 0.3226145231436522
Epoch 1,err_sum 0.1894215878352615
Epoch 2,err_sum 0.1603149519658396
Epoch 3,err_sum 0.14455416861531484
Epoch 4,err_sum 0.1327990997451072
Epoch 5,err_sum 0.12590473771415872
Epoch 6,err_sum 0.11899274631075996
Epoch 7,err_sum 0.11418312942830691
Epoch 8,err_sum 0.1103784907015621
Epoch 9,err_sum 0.10724277163880112
Epoch 10,err_sum 0.1045853946343495
Epoch 11,err_sum 0.10208084398765771
Epoch 12,err_sum 0.09958932872645758
Epoch 13,err_sum 0.09786572348900954
Epoch 14,err_sum 0.09620250876747143
Epoch 15,err_sum 0.09472879435816595
Epoch 16,err_sum 0.09306643274063546
Epoch 17,err_sum 0.09104791313409315
Epoch 18,err_sum 0.09089877918606573
Epoch 19,err_sum 0.08939959546191861
Epoch 20,err_sum 0.0881565612194433
Epoch 21,err_sum 0.0875070280641069
Epoch 22,err_sum 0.08600029603963232
Epoch 23,err_sum 0.08502847499916892
Epoch 24,err_sum 0.08427697958008522
Epoch 25,err_sum 0.0843718926237028
Epoch 26,err_sum 0.08366332665468071
Epoch 27,err_sum 0.08363968930822757
Epoch 28,err_sum 0.08215656937123944
Epoch 29,err_sum 0.08153711678040095

def visualize(input_x):plt.figure(figsize=(5,5), dpi=180)for i in range(0,8):for j in range(0,8):img = input_x[i*8+j].reshape(28,28)plt.subplot(8,8,i*8+j+1)plt.imshow(img ,cmap = plt.cm.gray)
#显示64张手写数字
images = data[0:64]
visualize(images)

#显示重构的图像
rebuild_value = [rbm.predict(x) for x in images]
visualize(rebuild_value)

RBM受限玻尔兹曼机相关推荐

  1. RBM受限玻尔兹曼机的公式推导及代码实现(matlab)

      考虑一组具有mmm个样本的数据集X={x(1),-,x(m)}\mathbb{X}=\{x^{(1)},\dots,x^{(m)}\}X={x(1),-,x(m)},独立地由真实数据生成分布pda ...

  2. RBM受限玻尔兹曼机的一点理解

    RBM是玻尔兹曼机的一种,每一个layer之间的node没有相连. 一个很好的介绍看这里,是一个intuitive的introduction. RBM最重要的一点就是只有两层,两层之间即可以向前传播, ...

  3. RBM(受限玻尔兹曼机)解析

    1.RBM结构 RBM包括隐层.可见层和偏置层.与前馈神经网络不一样,RBM在可见层和隐层间的链接方向不定的(值可以双向传播,隐层->可见层和可见层->隐层)和完全链接的. Boltzma ...

  4. 受限玻尔兹曼机RBM的基本原理详细概述

    RBM受限玻尔兹曼机是组成深度信念网络的一种基本单元,RBM是一种概率生成模型也是一种能量模型, RBM模块中主要包括一个隐含层和一个可见层.其中,受限玻尔兹曼机的隐含层和可见层是通过双向连接的方式进 ...

  5. keras 受限玻尔兹曼机_目前深度学习的模型有哪几种,适用于哪些问题?

    深度学习的模型有很多, 目前开发者最常用的深度学习模型与架构包括 CNN.DBN.RNN.RNTN.自动编码器.GAN 等.雷锋网搜集整理了涉及以上话题的精品文章,供初学者参考,加速深度学习新手入门. ...

  6. 受限玻尔兹曼机的python参考实现

    简介 众所周知,玻尔兹曼机好是好,但是太复杂了,所以在实际应用中不会使用.而受限玻尔兹曼机(Restricted Boltzmann machine, RBM)是它的一个带约束的版本,因此模型变得更加 ...

  7. 从RBM(受限玻尔兹曼机)开始、到深度信念网络(DBN)再到自动编码器(AE)

    从RBM(受限玻尔兹曼机)开始.到深度信念网络(DBN)再到自动编码器(AE) 目录

  8. 受限玻尔兹曼机(RBM)与python在Tensorflow的实现

    任何程序错误,以及技术疑问或需要解答的,请扫码添加作者VX:1755337994 简介 受限玻尔兹曼机是一种无监督,重构原始数据的一个简单的神经网络. 受限玻尔兹曼机先把输入转为可以表示它们的一系列输 ...

  9. 受限玻尔兹曼机(RBM)在Tensorflow的实现

    Deep Learning with TensorFlow IBM Cognitive Class ML0120EN Module 4 - Restricted Boltzmann Machine 简 ...

最新文章

  1. 【Cocos2d开发】Cocos2d下安卓环境的搭建
  2. Spring 中的Scheduler
  3. 读取字符串字符时出错_JVM | 运行时常量池和字符串常量池及intern()
  4. 【通知】深度学习之人脸图像算法核心代码开源和勘误汇总
  5. 吴恩达神经网络1-2-2_图神经网络进行药物发现-第1部分
  6. mysql主从同步搭建和故障排除
  7. 尚学堂java答案解析 第三章
  8. 『深度应用』一文搞懂深度学习人脸识别模型开发流程
  9. 【Java IO流】RandomAccessFile类的使用
  10. DB2之CLOB对象用法
  11. java 获取中文拼音首字母(缩写) 含pinyin4j maven包
  12. 【字体分享】来一波免费的漂亮英文手写体(上)
  13. 如何设置条形码的尺寸
  14. 捷配送了10块板子后,决定做一个“小霸王”手柄
  15. springboot redis: xxx as a subtype of [simple type, class java.lang.Object]: no such class found
  16. easyUI设置表格中的背景色
  17. 【修改电脑版微信提示音】
  18. B站付费视频使up主掉粉过万
  19. python羊车门问题_羊车门作业 Python版
  20. 【CTF题解NO.00008】mini-LCTF 2021 official write up by arttnba3

热门文章

  1. 讨论一下CQS (命令-查询 分离)原则
  2. LeetCode 47. 全排列 II【数组,回溯算法,排序去重】
  3. web安全基础--一句话木马笔记
  4. 新角度解读C++内联函数的前世今生(上)(详细必看)
  5. 计算机设计大赛评分表,利用Excel制作竞赛评分自动计算系统
  6. 西双版纳的春节什么样?
  7. AI中Deepfake的部分研究前沿与文献综述
  8. 一款实用的机器翻译API
  9. 功能最强大的php框架,【精粹】架构合理+强大的PHP框架再次推荐,傲视群雄~
  10. uboot移植新手入门实践