【面向代码】学习 Deep Learning(二)Deep Belief Nets(DBNs)

http://blog.csdn.net/dark_scope/article/details/9447967

分类: 机器学习2013-07-24 11:50 517人阅读 评论(5) 收藏 举报

目录(?)[-]

  1. DBNdbnsetupm
  2. DBNdbntrainm
    1. DBNrbmtrainm
  3. DBNdbnunfoldtonnm
  4. 总结

==========================================================================================

最近一直在看Deep Learning,各类博客、论文看得不少

但是说实话,这样做有些疏于实现,一来呢自己的电脑也不是很好,二来呢我目前也没能力自己去写一个toolbox

只是跟着Andrew Ng的UFLDL tutorial 写了些已有框架的代码(这部分的代码见github)

后来发现了一个matlab的Deep Learning的toolbox,发现其代码很简单,感觉比较适合用来学习算法

再一个就是matlab的实现可以省略掉很多数据结构的代码,使算法思路非常清晰

所以我想在解读这个toolbox的代码的同时来巩固自己学到的,同时也为下一步的实践打好基础

(本文只是从代码的角度解读算法,具体的算法理论步骤还是需要去看paper的

我会在文中给出一些相关的paper的名字,本文旨在梳理一下算法过程,不会深究算法原理和公式)

==========================================================================================

使用的代码:DeepLearnToolbox  ,下载地址:点击打开,感谢该toolbox的作者

==========================================================================================

今天介绍DBN的内容,其中关键部分都是(Restricted Boltzmann Machines, RBM)的步骤,所以先放一张rbm的结构,帮助理解

(图来自baidu的一个讲解ppt)

==========================================================================================

照例,我们首先来看一个完整的DBN的例子程序:

这是\tests\test_example_DBN.m 中的ex2

[cpp] view plaincopy

  1. //train dbn
  2. dbn.sizes = [100 100];  
  3. opts.numepochs =   1;  
  4. opts.batchsize = 100;  
  5. opts.momentum  =   0;  
  6. opts.alpha     =   1;  
  7. dbn =dbnsetup(dbn, train_x, opts);                //here!!!
  8. dbn = dbntrain(dbn, train_x, opts);                //here!!!
  9. //unfold dbn to nn
  10. nn = dbnunfoldtonn(dbn, 10);                       //here!!!
  11. nn.activation_function = 'sigm';  
  12. //train nn
  13. opts.numepochs =  1;  
  14. opts.batchsize = 100;  
  15. nn = nntrain(nn, train_x, train_y, opts);  
  16. [er, bad] = nntest(nn, test_x, test_y);  
  17. assert(er < 0.10, 'Too big error');

其中的过程简单清晰明了,就是dbnsetup(),dbntrain()以及dbnunfoldtonn()三个函数

最后fine tuning的时候用了(一)里看过的nntrain和nntest,参见(一)

\DBN\dbnsetup.m

这个实在没什么好说的,

直接分层初始化每一层的rbm(受限波尔兹曼机(Restricted Boltzmann Machines, RBM))
     同样,W,b,c是参数,vW,vb,vc是更新时用到的与momentum的变量,见到代码时再说

[cpp] view plaincopy

  1. for u = 1 : numel(dbn.sizes) - 1  
  2. dbn.rbm{u}.alpha    = opts.alpha;  
  3. dbn.rbm{u}.momentum = opts.momentum;  
  4. dbn.rbm{u}.W  = zeros(dbn.sizes(u + 1), dbn.sizes(u));  
  5. dbn.rbm{u}.vW = zeros(dbn.sizes(u + 1), dbn.sizes(u));  
  6. dbn.rbm{u}.b  = zeros(dbn.sizes(u), 1);  
  7. dbn.rbm{u}.vb = zeros(dbn.sizes(u), 1);  
  8. dbn.rbm{u}.c  = zeros(dbn.sizes(u + 1), 1);  
  9. dbn.rbm{u}.vc = zeros(dbn.sizes(u + 1), 1);  
  10. end

\DBN\dbntrain.m

应为DBN基本就是把rbm当做砖块搭建起来的,所以train也很简单

[cpp] view plaincopy

  1. function dbn = dbntrain(dbn, x, opts)  
  2. n = numel(dbn.rbm);  
  3. //对每一层的rbm进行训练
  4. dbn.rbm{1} = rbmtrain(dbn.rbm{1}, x, opts);  
  5. for i = 2 : n  
  6. x = rbmup(dbn.rbm{i - 1}, x);  
  7. dbn.rbm{i} = rbmtrain(dbn.rbm{i}, x, opts);   
  8. end  
  9. end

首先映入眼帘的是对第一层进行rbmtrain(),后面每一层在train之前用了rbmup,

rbmup其实就是简单的一句sigm(repmat(rbm.c', size(x, 1), 1) + x * rbm.W');

也就是上面那张图从v到h计算一次,公式是Wx+c

接下来是最关键的rbmtrain了:

\DBN\rbmtrain.m

代码如下,说明都在注释里

论文参考:【1】Learning Deep Architectures for AI   以及   

【2】A Practical Guide to Training Restricted Boltzmann Machines

你可以和【1】里面的这段伪代码对应一下

[cpp] view plaincopy

  1. for i = 1 : opts.numepochs //迭代次数
  2. kk = randperm(m);  
  3. err = 0;  
  4. for l = 1 : numbatches  
  5. batch = x(kk((l - 1) * opts.batchsize + 1 : l * opts.batchsize), :);  
  6. v1 = batch;  
  7. h1 = sigmrnd(repmat(rbm.c', opts.batchsize, 1) + v1 * rbm.W');            //gibbs sampling的过程
  8. v2 = sigmrnd(repmat(rbm.b', opts.batchsize, 1) + h1 * rbm.W);  
  9. h2 = sigmrnd(repmat(rbm.c', opts.batchsize, 1) + v2 * rbm.W');  
  10. //Contrastive Divergence 的过程 
  11. //这和《Learning Deep Architectures for AI》里面写cd-1的那段pseudo code是一样的
  12. c1 = h1' * v1;  
  13. c2 = h2' * v2;  
  14. //关于momentum,请参看Hinton的《A Practical Guide to Training Restricted Boltzmann Machines》
  15. //它的作用是记录下以前的更新方向,并与现在的方向结合下,跟有可能加快学习的速度
  16. rbm.vW = rbm.momentum * rbm.vW + rbm.alpha * (c1 - c2)     / opts.batchsize;      
  17. rbm.vb = rbm.momentum * rbm.vb + rbm.alpha * sum(v1 - v2)' / opts.batchsize;  
  18. rbm.vc = rbm.momentum * rbm.vc + rbm.alpha * sum(h1 - h2)' / opts.batchsize;  
  19. //更新值
  20. rbm.W = rbm.W + rbm.vW;  
  21. rbm.b = rbm.b + rbm.vb;  
  22. rbm.c = rbm.c + rbm.vc;  
  23. err = err + sum(sum((v1 - v2) .^ 2)) / opts.batchsize;  
  24. end  
  25. end

\DBN\dbnunfoldtonn.m

DBN的每一层训练完成后自然还要把参数传递给一个大的NN,这就是这个函数的作用

[cpp] view plaincopy

  1. function nn = dbnunfoldtonn(dbn, outputsize)  
  2. %DBNUNFOLDTONN Unfolds a DBN to a NN  
  3. %   outputsize是你的目标输出label,比如在MINST就是10,DBN只负责学习feature  
  4. %   或者说初始化Weight,是一个unsupervised learning,最后的supervised还得靠NN  
  5. if(exist('outputsize','var'))  
  6. size = [dbn.sizes outputsize];  
  7. else
  8. size = [dbn.sizes];  
  9. end  
  10. nn = nnsetup(size);  
  11. %把每一层展开后的Weight拿去初始化NN的Weight  
  12. %注意dbn.rbm{i}.c拿去初始化了bias项的值  
  13. for i = 1 : numel(dbn.rbm)  
  14. nn.W{i} = [dbn.rbm{i}.c dbn.rbm{i}.W];  
  15. end  
  16. end

最后fine tuning就再训练一下NN就可以了

总结

还是那句话,本文只是梳理一下学习路线,具体的东西还是要靠paper

dbn主要的关键就是rbm,推荐几篇经典的文章吧,rbm可是Hinton的宝贝啊

其中涉及到MCMC,Contrastive divergence,感觉比Autoencoder难理解多了

[1] An Introduction to Restricted Boltzmann Machines

[2] Learning Deep Architectures for AI                                                     Bengio大作啊

[3] A Practical Guide to Training Restricted Boltzmann Machines              上面提到过,比较细致

[4] A learning Algorithm for Boltzmann Machines                                      Hinton的

分享到:

  • 上一篇:【面向代码】学习 Deep Learning(一)Neural Network
  • 下一篇:【面向代码】学习 Deep Learning(三)Convolution Neural Network(CNN)
  • 0
    0

    查看评论

    2楼 _呕哑嘲哳 2013-07-28 12:35发表 [回复]
    1. 图模型上的区别就是有向与无向 具体在算法上是如何体现的呢
    2. 这样DBN就只是实现了用来初始化 后面的fine tuning和分类实现还是必须由NN/BP来实现
    Re: Dark_Scope 2013-07-28 12:54发表 [回复]
    回复Dan7291125:1.其实我也不是很了解,我目前只看了DBN,你可以看看这个,may help:http://www.sigvc.org/bbs/thread-524-1-1.html
    2.是的,SAE其实也是这样的
    Re: _呕哑嘲哳 2013-07-29 09:24发表 [回复]
    回复Dark_Scope:Thanks~
    1楼 _呕哑嘲哳 2013-07-28 10:44发表 [回复]
    请问一下两个问题:
    1. DBN中每层rbm是单独训练叠加的 DBM中每层rbm不是独立的,这是DBN和DBM的区别所在么?
    2. DBN中的每层rbm单独训练,得到的参数用来直接初始化NN的参数 和 用RBM逐层非监督建立结构 再用NN进行监督调整其实是一个意思吧?
    Re: Dark_Scope 2013-07-28 12:04发表 [回复]
    回复Dan7291125:1.yeah,图模型不一样
    2.初始化之后还要训练NN来调整,叫做fine tuning,之前做的只是初始化参数值而已

    转【面向代码】学习 Deep Learning(二)Deep Belief Nets(DBNs)的更多相关文章

    1. 论文学习 :Learning a Deep Convolutional Network for Image Super-Resolution 2014

      (Learning a Deep Convolutional Network for Image Super-Resolution, ECCV2014) 摘要:我们提出了一种单图像超分辨率的深度学习方 ...

    2. deep learning 以及deep learning 常用模型和方法

      首先为什么会有Deep learning,我们得到一个结论就是Deep learning需要多层来获得更抽象的特征表达. 1.Deep learning与Neural Network 深度学习是机器学 ...

    3. 深度神经网络多任务学习(Multi-Task Learning in Deep Neural Networks)

      https://cloud.tencent.com/developer/article/1118159 http://ruder.io/multi-task/ https://arxiv.org/ab ...

    4. 集智学院 “Deep X:Deep Learning with Deep Knowledge”的公开讲座---总结

      人工智能旨在了解人类智能的本质,并创造出能模仿人类智能做出反应的智能机器,目前在一些领域已经取得显著的成功,如AI玩游戏.问答系统.自动驾驶.无人机.机器人.翻译.人脸识别.语音识别等领域.深度学习的 ...

    5. Coursera, Deep Learning 1, Neural Networks and Deep Learning - week4, Deep Neural Networks

      Deep Neural Network Getting your matrix dimention right 选hyper-pamameter 完全是凭经验 补充阅读: cost 函数的计算公式: ...

    6. 【深度学习Deep Learning】资料大全

      最近在学深度学习相关的东西,在网上搜集到了一些不错的资料,现在汇总一下: Free Online Books  by Yoshua Bengio, Ian Goodfellow and Aaron C ...

    7. 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】

      转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...

    8. 机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)

      ##机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)---#####注:机器学习资料[篇目一](https://github.co ...

    9. 机器学习(Machine Learning)&深度学习(Deep Learning)资料汇总 (上)

      转载:http://dataunion.org/8463.html?utm_source=tuicool&utm_medium=referral <Brief History of Ma ...

    随机推荐

    1. centos7 下载安装tomcat9

      需要Java环境 https://www.cnblogs.com/sea-stream/p/10404360.html 官网下载安装包 wget http://archive.apache.org/d ...

    2. Eclipse添加EGIT方法

      1. 安装EGIT, 其中一个方法: 2. 新建javaweb项目,测试git的使用. l  File > Team > Share Project 选择GIT 如何选择不了,则选择创建c ...

    3. CSS3一些常用动画

      /* animation */ .a-bounce,.a-flip,.a-flash,.a-shake,.a-swing,.a-wobble,.a-ring{-webkit-animation:1s ...

    4. JS中的弹窗问题confirm和prompt

      JavaScript-确认(confirm 消息对话框) confirm 消息对话框通常用于允许用户做选择的动作,如:“你对吗?”等.弹出对话框(包括一个确定按钮和一个取消按钮). 语法: confi ...

    5. Codeforces 1082 G - Petya and Graph

      G - Petya and Graph 思路: 最大权闭合子图 对于每条边,如果它选了,那么它连的的两个点也要选 边权为正,点权为负,那么就是求最大权闭合子图 代码: #pragma GCC opti ...

    6. css3动画实现伪弹幕效果

      如图所示: 效果还可以直接用麦唱APP把一首歌分享到微信里面看到,方法类似全民K歌的方法,都是用css3动画实现的, 代码如下:(这是我做真实效果前的一个dome) 直接粘代码就可以看到效果,里面有两 ...

    7. 第 3 章 镜像 - 019 - 使用公共 Registry

      保存和分发镜像的最直接方法就是使用 Docker Hub.https://hub.docker.com/ Docker Hub 是 Docker 公司维护的公共 Registry.用户可以将自己的镜像 ...

    8. idea ----> 使用idea工具整合mybaiti时出现的问题总结

      使用idea测试mabtis实例时出现  java.lang.IllegalArgumentException: Mapped Statements collection does not conta ...

    9. Python Web简单加法器的实现--Python

      坚持写博客来记录学习过程,哪怕学习的东西多么简单!下面是python中cgi相关知识. Template.py:(模板引擎文件) #模板引擎def start_response(resp=" ...

    10. WCF服务寄宿IIS与Windows服务 - C#/.NET

      WCF是Windows平台下程序间通讯的应用程序框架.整合和 .net Remoting,WebService,Socket的机制,是用来开发windows平台上分布式开发的最佳选择.wcf程序的运行 ...