限制玻尔兹曼机(RBMs)理论详解

一、序

关于RBMs的文章已经有不少了,但是很多资料我在阅读的时候仍然对细节有一些疑惑。在查阅学习了大牛的视频、论文之后,很多问题豁然开朗,且在本文中记录下我对RBMs的粗浅了解。首先从玻尔兹曼机和限制玻尔兹曼机的结构和定义开始:

BM和RBM的结构

二、Boltmann Machines:

    玻尔兹曼机(Boltmann Machines)的能量函数(Energy function)是:

E(x,h)=hWxcxbhxUxhVh

分布函数:

P(x,h)=exp(E(x,h))/Z

其中分母Z学名叫做partition function

Z=xhexp(E(x,h))

三、Restricted Boltmann Machines:

    限制玻尔兹曼机(Restricted Boltmann Machines,简称RBMs)的能量函数(Energy function)是:

E(x,h)=hWxcxbh=jkWj,khjxkkckxkjbjhj

分布函数:

P(x,h)=exp(E(x,h))/Z

能量函数的能量越小,分布函数相应的概率就越大。

      玻尔兹曼机和限制玻尔兹曼机都属于基于能量的模型(Energy-Based Models),从模型图和公式中很容易看出两者的区别:玻尔兹曼机隐含层(和可见层)处于同一层的任意两个节点之间有一条连线;而限制玻尔兹曼机同层变量之间是相互独立的。只要有足够的隐单元,限制玻尔兹曼机可以表示任意的离散分布,玻尔兹曼机的表示能力则更强一些。另一方面,限制玻尔兹曼机比玻尔兹曼机更容易训练。

四、模型学习:

    训练RBMs就是学习能量函数的过程,变量中只有输入 x 是已知的。

RBMs

Free Energy:

    为了后面计算公式的简洁,首先引入Free Energy这个概念:

P(x)=heE(x,h)Z=eFreeEnergy(x)Z,Z=xeFreeEnergy(x)

FreeEnergy(x)=logheE(x,h)

例如:如果 hi{0,1}

FreeEnergy(x)=logheE(x,h)=loghehWx+cx+bh=cxloghehWx+bh=cxlogheh1(W1x+b1)ehn(Wnx+bn)=cxilog(1+eWix+bi)

给定参数和 x 就可以很容易的计算出Free Energy的值,不依赖于隐单元 h 的具体取值。

梯度方法进行优化:

      用梯度算法学习RBMs模型参数 θ ( θ 包括 W,c,b ),目标函数是 P(x) (这里是梯度上升,因为要求的是似然的极大值)。 P(x) 取对数求偏导:

logP(x)=FreeEnergy(x)logZ

对数似然梯度(log-likelihood gradient):
logP(x)θ=FreeEnergy(x)θ+1Zx~eFreeEnergy(x~)FreeEnergy(x~)θ=FreeEnergy(x)θ+x~P(x~)FreeEnergy(x~)θ

logP(x)θ 是对 logP(x)W,logP(x)c,logP(x)b 的统一表示,编写代码时需要分别求偏导。求偏导都没有太大难度,其中 E(x,h)W=hWxW=hx

        很多文章里喜欢写成负对数似然梯度(negative log-likelihood gradient)的形式, logP(x) 就应该用梯度下降方法来更新参数了:

logP(x)θ=FreeEnergy(x)θx~P(x~)FreeEnergy(x~)θ

训练集上的平均负对数似然梯度等于:

EP^[logP(x)θ]=EP^[FreeEnergy(x)θ]EP[FreeEnergy(x~)θ]

P^ 是训练集对应的分布, P 是模型分布,EP表示在模型分布上求期望。(这里顺便解释一下为什么大家都喜欢负对数似然而不是直接最大化似然,其实如果你有一台可以表示任何数值的超级计算机,那么取不取对数真的没什么关系,但是现实中的计算机表示能力有限,N个训练样本似然乘积很小很小,小到计算机都无法表示了,所以最好取log,概率的和不会有这样的问题;另外,在优化理论中,优化问题的标准形式就是最小化某个目标函数,所以最好加个负号,最小化负对数似然)。

    式子的第一项称为positive phrase,通过减小对应的FreeEnergy增大训练样本的概率;第二项是negative phrase,作用是增大对应的FreeEnergy来减小模型产生的样本的概率。句话不难理解,因为两项分别是往 FreeEnergy(x) 的梯度下降和 FreeEnergy(x~) 的梯度上升方向改变。这也符合最大似然标准,在训练样本上有较大的似然而在其他样本上概率较小。从分类的角度来看,训练样本是正样本,而模型样本是负样本(Negative samples)

负样本

    把训练样本代入求均值即可得到梯度公式的第一项 EP^[FreeEnergy(x)θ] 的值,第二项 EP[FreeEnergy(x~)θ] 计算模型分布上的期望,这就比较困难了,因为这需要取遍所有可能的 x 的值。所以接下来我们就需要用到MCMC 采样来近似估计了。用MCMC采样得到的一组样本来近似估计整体的样本分布,梯度公式第二项在采样得到的样本上求近似期望(平均值)得到估计值。在实际中,常用Gibbs采样,Gibbs 采样是MCMC 算法的一种。用Gibbs从模型分布中采样n个样本,然后负对数似然梯度在训练集上的期望就可以近似为:

EP^[logP(x)θ]EP^[FreeEnergy(x)θ]1ni=1nFreeEnergy(xi~)θ

        最后,简要概括一下RBMs模型学习方法的步骤:(1)、求偏导,(2)、采样,(3)、估计负对数似然梯度,(4)、梯度下降方法更新参数。

五、Gibbs采样:

      对RBMs模型来说, Gibbs主要有两个作用:一是估计negative log-likelihood gradient;二是在训练完模型之后(如DBN,DBN是由多个RBMs叠加而成的),用Gibbs进行采样,可以看到模型对数据的拟合以及网络中间隐含层的抽象效果。

       在RBMs模型训练过程中,Gibbs就是用来对negative log-likelihood gradient进行估计的。Gibbs采样分两个小步对 (x,h) 进行采样,第一步固定 x h 进行采样,第二步固定 h x 进行采样,交替进行直到收敛

x1P^(x)h1P(h|x1)x2P(x|h1)h2P(h|x2)xk+1P(x|hk)

    因为在训练过程中,训练模型分布会逐渐逼近训练样本分布,所以第一步可以从训练样本的分布 P^ 抽取样本作为 x1 。如果第一步直接从模型 P 中采样,Gibbs采样会迅速收敛。

    例如:假设h{0,1}H,已经得到 x1 ,需要对 h1 采样。 P(h|x)=jp(hj|x) (注:条件分布的具体推导过程见下一小节内容), 由于隐单元之间是相互独立的,所以可以采用block Gibbs采样,对所有的隐单元同时进行采样,加快采样收敛。分别求 p(hj=1|x) ,如果 p(hj=1|x)U[0,1] (大于等于均匀分布的一个采样),就设置 hj=1 ,否则设置 hj=0

条件分布:

    Gibbs采样主要是根据条件分布迭代进行采样的,所以在采样之前要先推导出条件分布公式。

P(h|x)=P(x,h)/hP(x,h)=exp(hWx+cx+bh)/Zhexp(hWx+cx+bh)/Z=exp(hWx+bh)hexp(hWx+bh)h=exp(hjhjWjx+bjhj)hexp(hjhjWjx+bjhj)WjWj=jexp(hjWjx+bjhj)h1...hHjexp(hjWjx+bjhj)=jexp(hjWjx+bjhj)jhjexp(hjWjx+bjhj)=jexp(hjWjx+bjhj)hjexp(hjWjx+bjhj)=jp(hj|x)

如果 hj{0,1} ,可以得到:

p(hj=1|x)=exp(Wjx+bj)1+exp(Wjx+bj)=sigm(Wjx+bj)

p(hj=0|x)=1p(hj=1|x)

类似的:

P(x|h)=jexp(hWjxj+cjxj)xjexp(hWjxj+cjxj))=jp(xj|h)

如果 xj{0,1} ,可以得到:

p(xj=1|h)=exp(hWj+cj)1+exp(hWj+cj))=sigm(hWj+cj)

六、Contrastive Divergence:

    Contrastive Divergence可以加快RBMs的训练速度,随机选择一个训练样本初始化 x1 ,并且每一次迭代只用一个模型样本来估计negative log-likelihood gradient,而不是等到MCMC采样收敛后求期望。

    k-step Contrastive Divergence(CD-k):MCMC采样k步 x1,x2,...,xk+1 , 用 xk+1 估计negative log-likelihood gradient。当k=1时,就能得到比较好的近似(DBN等pre-training k取1就够用了),k增大可以得到更好的效果。Contrastive Divergence的一种理解是在训练样本 x1 附近的局部区域内估计negative log-likelihood gradient。

借用一下大神Bengio的文章”Learning Deep Architectures for AI”的算法描述:

这里写图片描述

Persistent CD:

    CD只在附近的局部区域取Negative Sample来估计negative log-likelihood gradient,很难取到其它极值区域的样本,Persistent CD可以在一定程度上解决这个问题。Persistent CD的思想很简单,它与CD的区别仅仅在与:用上一次迭代得到的 xk+1 (即Negative Sample)作为这次迭代的初始值来初始化 x1 PS:Persistent CD是2008年Tijmen发表在ICML上的文章。

七、参考资料:

[1].Youtube上Hugo Larochelle的视频讲解:https://www.youtube.com/user/hugolarochelle/videos

[2].DeepLearning tutorial:http://deeplearning.net/tutorial/rbm.html

[3].LSIA:http://www.iro.umontreal.ca/~lisa/twiki/bin/view.cgi/Public/DBNEquations

[4].Yoshua Bengio:Learning Deep Architectures for AI

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RBM(Restricted Boltzmann Machine)是一种基于能量的概率模型,常用于无监督学习任务中。下面给出RBM的公式推导及Matlab代码实现。 一、RBM的公式推导 RBM是一个两层神经网络,包括输入层和隐藏层。假设输入层有m个节点,隐藏层有n个节点。RBM的网络结构如下图所示: ![RBM网络结构](https://img-blog.csdn.net/20180320235415595?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1bmd5b25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) RBM的能量函数为: $$ E(v,h)=-\sum_{i=1}^{m}\sum_{j=1}^{n}v_iw_{ij}h_j-\sum_{i=1}^{m}v_ib_i-\sum_{j=1}^{n}h_jc_j $$ 其中,$v$表示输入层的节点状态,$h$表示隐藏层的节点状态,$w_{ij}$表示第$i$个输入节点和第$j$个隐藏节点之间的连接权重,$b_i$表示第$i$个输入节点的偏置,$c_j$表示第$j$个隐藏节点的偏置。 RBM的概率分布为: $$ P(v,h)=\frac{1}{Z}e^{-E(v,h)} $$ 其中,$Z$为归一化因子,可以表示为: $$ Z=\sum_{v}\sum_{h}e^{-E(v,h)} $$ RBM的训练目标是最大化样本出现的概率,即最大化对数似然函数。对于一个训练样本$v$,其对应的对数似然函数为: $$ \log P(v)=\log\sum_{h}e^{-E(v,h)} $$ 使用对比散度(Contrastive Divergence,CD)算法来学习RBM的参数。CD算法的核心思想是通过采样来估计对数似然函数的梯度。具体地,对于一个训练样本$v$,按照以下步骤进行: 1. 将$v$作为输入层的状态,通过前向传播计算出隐藏层的状态$h_0$; 2. 从隐藏层的概率分布中采样出一个样本$h_1$; 3. 将$h_1$作为隐藏层的状态,通过反向传播计算出输入层的状态$v_1$; 4. 从输入层的概率分布中采样出一个样本$v_2$; 5. 将$v_2$作为输入层的状态,通过前向传播计算出隐藏层的状态$h_2$。 最后,更新参数$w_{ij}$、$b_i$和$c_j$,使得对数似然函数的梯度最大化。 具体地,对于一个样本$v$,其对应的参数梯度为: $$ \frac{\partial\log P(v)}{\partial w_{ij}}=v_ih_{0j}-v_ih_{1j} $$ $$ \frac{\partial\log P(v)}{\partial b_i}=v_i-v_{2i} $$ $$ \frac{\partial\log P(v)}{\partial c_j}=h_{0j}-h_{2j} $$ 其中,$h_{0}$、$h_{1}$和$h_{2}$分别表示通过前向传播计算出的隐藏层状态。 二、RBM的Matlab代码实现 以下是使用Matlab实现RBM的代码示例,其中使用了CD算法来训练RBM模型。 ```matlab % RBM的Matlab代码实现 % 数据集:MNIST手写数字数据集,训练集60000个样本,测试集10000个样本 % 神经网络结构:输入层784个节点,隐藏层100个节点 % CD算法的参数:k=1,学习率lr=0.1 % 加载数据集 load mnist_train_data.mat load mnist_test_data.mat % 初始化RBM模型参数 input_size = 784; % 输入层节点数 hidden_size = 100; % 隐藏层节点数 w = 0.1 * randn(input_size, hidden_size); % 输入层和隐藏层之间的连接权重 b = zeros(1, input_size); % 输入层的偏置 c = zeros(1, hidden_size); % 隐藏层的偏置 % 训练RBM模型 batch_size = 100; % 每个batch的样本数 num_epochs = 10; % 迭代次数 k = 1; % CD算法的参数 lr = 0.1; % 学习率 % 对训练集进行预处理,将像素值归一化到[0,1]之间 train_data = double(train_data) / 255; for epoch = 1:num_epochs % 迭代训练 for batch = 1:floor(size(train_data, 1) / batch_size) % 逐个batch训练 % 选取一个batch的样本 batch_data = train_data((batch - 1) * batch_size + 1 : batch * batch_size, :); % 正向传播 h0_prob = sigmoid(batch_data * w + repmat(c, batch_size, 1)); % 隐藏层的概率分布 h0_sample = double(h0_prob > rand(size(h0_prob))); % 从概率分布中采样出隐藏层的状态 v1_prob = sigmoid(h0_sample * w' + repmat(b, batch_size, 1)); % 重构输入层的概率分布 v1_sample = double(v1_prob > rand(size(v1_prob))); % 从概率分布中采样出重构的输入层状态 % 反向传播 h1_prob = sigmoid(v1_sample * w + repmat(c, batch_size, 1)); % 重构的隐藏层的概率分布 h1_sample = double(h1_prob > rand(size(h1_prob))); % 从概率分布中采样出重构的隐藏层状态 % 计算参数梯度 w_grad = batch_data' * h0_prob - v1_sample' * h1_prob; % 输入层和隐藏层之间的连接权重的梯度 b_grad = sum(batch_data - v1_sample); % 输入层的偏置的梯度 c_grad = sum(h0_prob - h1_prob); % 隐藏层的偏置的梯度 % 更新参数 w = w + lr * w_grad / batch_size; b = b + lr * b_grad / batch_size; c = c + lr * c_grad / batch_size; end % 每个epoch结束后,计算一次对数似然函数的值 error = zeros(size(train_data, 1), 1); for i = 1:size(train_data, 1) v = train_data(i, :); h_prob = sigmoid(v * w + repmat(c, 1, 1)); % 隐藏层的概率分布 v_recon = sigmoid(h_prob * w' + repmat(b, 1, 1)); % 重构的输入层的概率分布 error(i) = -sum(v .* log(v_recon) + (1 - v) .* log(1 - v_recon)); end fprintf('Epoch %d, error = %f\n', epoch, mean(error)); end % 测试RBM模型 test_data = double(test_data) / 255; % 对测试集进行预处理 h_prob = sigmoid(test_data * w + repmat(c, size(test_data, 1), 1)); % 隐藏层的概率分布 v_recon = sigmoid(h_prob * w' + repmat(b, size(test_data, 1), 1)); % 重构的输入层的概率分布 error = -sum(sum(test_data .* log(v_recon) + (1 - test_data) .* log(1 - v_recon), 2)); % 计算对数似然函数的值 fprintf('Test error = %f\n', error); % 定义sigmoid函数 function y = sigmoid(x) y = 1 ./ (1 + exp(-x)); end ``` 参考文献: [1] Hinton G E, Salakhutdinov R R. Restricted Boltzmann machines for collaborative filtering[C]//Proceedings of the 25th international conference on Machine learning. ACM, 2008: 448-455. [2] Fischer A, Igel C. An introduction to restricted Boltzmann machines[J]. Progress in Pattern Recognition, Image Analysis, Computer Vision, and Applications, 2012, 7441: 14-36.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值