Deep Learning 系列(1):RBM(受限波尔兹曼机)和 DBN(深信度神经网络)

转自:http://blog.csdn.net/hanzihan123/article/details/23707143

前言:Deep Learning (DL深度学习)是近几年来最火的一种机器学习方法,由Hinton(多伦多大学)提出。主要有两分支:Geoffery HintonJoshua Bengio这一支用RBM组成deep architecture的研究。另一支是以Yann LeCunAndrew Ng(deep) convolutional networks,用convolutional network组成deep architecture的研究

     这篇博文主要介绍Hinton第一分支中最基础的算法RBM(受限玻尔兹曼机),DBN(深信度神经网络)是由其叠加而成。

     Deep Learning 是无监督学习,也就是自动的提取信号特征,并由浅入深。理想情况是,由深层特征能100%还原最初的原始信号。由此,我们是否想到,其间的代价函数是失真差呢?

正文:废话不多说了哈!

Deep Learning 系列(1):RBM(受限波尔兹曼机)和 DBN(深信度神经网络)_第1张图片Deep Learning 系列(1):RBM(受限波尔兹曼机)和 DBN(深信度神经网络)_第2张图片Deep Learning 系列(1):RBM(受限波尔兹曼机)和 DBN(深信度神经网络)_第3张图片

Deep Learning 系列(1):RBM(受限波尔兹曼机)和 DBN(深信度神经网络)_第4张图片

这里:只截取了RBM的程序片段,弄清楚这个,基本DBN就差不多了! Deep Learning Tool (matlab版,下载)

[html]  view plain copy
  1. function rbm = rbmtrain(rbm, x, opts)  
  2.     assert(isfloat(x), 'x must be a float');  
  3.     assert(all(x(:)>=0) && all(x(:)<=1), 'all data in x must be in [0:1]');  
  4.     m = size(x, 1);  
  5.     numbatches = m / opts.batchsize;  
  6.       
  7.     assert(rem(numbatches, 1) == 0, 'numbatches not integer');  
  8.   
  9.     for i = 1 : opts.numepochs  
  10.         kk = randperm(m);%随机产生1-m内的数  
  11.         err = 0;  
  12.         for l = 1 : numbatches  % 这里很重要,参数W,b,c 的更新是以batchsize为单位,更新numbatches次(后面的NN训练中,也是这样)  
  13.             batch = x(kk((l - 1) * opts.batchsize + 1 : l * opts.batchsize), :);%这种表示法可以选取指定行列的数组(重要!)  
  14.               
  15.             v1 = batch;  
  16.             h1 = sigmrnd(repmat(rbm.c', opts.batchsize, 1) + v1 * rbm.W');  
  17.             %Ref110,Hinton-guide-3.1里有介绍,“the hidden unit turns on if this probability is greater than a random number uniformly distributed between 0 and 1.”  
  18.             v2 = sigmrnd(repmat(rbm.b', opts.batchsize, 1) + h1 * rbm.W);  
  19.             h2 = sigm(repmat(rbm.c', opts.batchsize, 1) + v2 * rbm.W');  
  20.   
  21.             c1 = h1' * v1;  
  22.             c2 = h2' * v2;  
  23.   
  24.             rbm.vW = rbm.momentum * rbm.vW + rbm.alpha * (c1 - c2)     / opts.batchsize;  
  25.             rbm.vb = rbm.momentum * rbm.vb + rbm.alpha * sum(v1 - v2)' / opts.batchsize;  
  26.             rbm.vc = rbm.momentum * rbm.vc + rbm.alpha * sum(h1 - h2)' / opts.batchsize;  
  27.   
  28.             rbm.W = rbm.W + rbm.vW;  
  29.             rbm.b = rbm.b + rbm.vb;  
  30.             rbm.c = rbm.c + rbm.vc;  
  31.   
  32.             err = err + sum(sum((v1 - v2) .^ 2)) / opts.batchsize;  
  33.         end  
  34.           
  35.         disp(['epoch ' num2str(i) '/' num2str(opts.numepochs)  '. Average reconstruction error is: ' num2str(err / numbatches)]);  
  36.           
  37.     end  
  38. end  

伪代码:(Ref9-Bengio-5.3.1)

Deep Learning 系列(1):RBM(受限波尔兹曼机)和 DBN(深信度神经网络)_第5张图片

附:8,9,10 文献作为经典,必读!(点击下载)

         个人认为开始阅读Hinton的文章有点难,建议先看中文的参考,然后再细读其文章,这样收获会很多,其文章阐述了问啥要这样做?怎么想到的?等~即大师啦!

          Bengio的文章是overview,有更综合的DL描述,就是有点长,但是可以先看重点!

         在代码方面,Ref2,Dark的代码讲解不错,(但是还是建议先把算法弄明白)。

对于DBNs的理解,开始看Hinton的文章不太明白,其实后来发现就是RBM的堆叠,只要把RBM弄清楚了,要理解DBN不难!


参考资料:1.zouxy09的博文,其DL讲解非常不错,强烈推荐哈!

                      2.Dark的面向代码的讲解,不错!

                      3.tornadomeet的DL讲解很详细,值得学习

                      4.celery chen 的DBN有简单易懂的模型

                     5. 关于玻尔兹曼能量分布的ppt,讲解很详细

                     6. peghoty的博文,介绍RBM非常详细,值得一看!

                     7.DBN的matlab代码,工具包(还有CNN,NN,SAE等),很不错,直接可以运行

                     8. A fast learning algorithm for deep belief nets(Hinton)下载

                     9.  Learning Deep Architectures for AI (Bengio)

                    10. A Practical Guide to Training Restricted Boltzmann Machines(Hinton)

                     11. DBN的tutorial教学(原版,很简单)

                      12. 极度世界的CSDN的博客,有UFLDL的练习,可以看一下

你可能感兴趣的:(深度学习)