【面向代码】学习 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. Data Structure 基本概念

      数据(data) 描述客观事物的数值 数据项(data item) 具有原子性,不可分割的最小单位 数据元素(data element)集合的个体,通常由很多数据组成 数据对象(data object ...

    2. Http请求处理流程 管道流程 MVC扩展HttpModule

      HttpApplication  封装了管道处理请求的所有事件 HttpModule 对HttpApplication中事件的扩展 HttpHandler   处理程序  每个请求都要经过Handle ...

    3. npm ERR! missing script: dev 报错解决

      npm run dev 报错:missing script:dev 今天在运行Vue项目时,在运行npm  run dev时报错如下图: 打开package.js文件夹,发现文件夹里的scripts有 ...

    4. android状态栏和NavigationBar的动态控制显示

      项目在开发阅读器,阅读器对阅读界面的要求就是在工具栏不显示的状态下,ActionBar和NavigationBar都是不显示的,当工具栏显示时它们都出来,这就需要动态控制它们的显示与隐藏. 第一阶段: ...

    5. leecode第五十九题(螺旋矩阵 II)

      class Solution { public: vector<vector<int>> generateMatrix(int n) { )//特殊情况 { vector< ...

    6. Creazy Ideas 智能汽车和智能交通

      1.现在无人驾驶靠的是摄像头监测障碍物,计算可行路线(这个结论是看到相关视频中百度无人驾驶测试中大大的摄像头推测的,非确切信息).而非像人一样对客观事物的认知学习得到障碍物的信息,如果能将AI融入进去 ...

    7. canvas功能函数

      封装一下常用的函数, 输入:通过一些固定的值,得到一个圆形,一个心形,一个波浪,一个涟漪,一个抛物线,一个自由弹起的过程. 返回:x,y坐标. 注意: (1)坐标轴的位置,有的在0,0有的可能不在. ...

    8. Navicat Premium 12如何激活

      Navicat Premium 12如何激活 一.总结 一句话总结:激活过程中一定要断开网络连接,点电脑的飞行模式没有用,断开网络连接之后才有手动激活的选项 需要断网 点电脑的飞行模式无用 二.Nav ...

    9. missing seperator error when [make all]

      https://stackoverflow.com/questions/16931770/makefile4-missing-separator-stop makefile has a very st ...

    10. HeadFirst Ruby 第七章总结 references

      前言 这一章的内容关于 references,讲了当 Ruby 程序中可能会遇到关于 reference 与 object 之间概念混淆而导致的问题. 导言 本章从一个 astronomer 发现 s ...