转【面向代码】学习 Deep Learning(二)Deep Belief Nets(DBNs)
【面向代码】学习 Deep Learning(二)Deep Belief Nets(DBNs)
http://blog.csdn.net/dark_scope/article/details/9447967
分类: 机器学习2013-07-24 11:50 517人阅读 评论(5) 收藏 举报
==========================================================================================
最近一直在看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
- //train dbn
- dbn.sizes = [100 100];
- opts.numepochs = 1;
- opts.batchsize = 100;
- opts.momentum = 0;
- opts.alpha = 1;
- dbn =dbnsetup(dbn, train_x, opts); //here!!!
- dbn = dbntrain(dbn, train_x, opts); //here!!!
- //unfold dbn to nn
- nn = dbnunfoldtonn(dbn, 10); //here!!!
- nn.activation_function = 'sigm';
- //train nn
- opts.numepochs = 1;
- opts.batchsize = 100;
- nn = nntrain(nn, train_x, train_y, opts);
- [er, bad] = nntest(nn, test_x, test_y);
- 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
- for u = 1 : numel(dbn.sizes) - 1
- dbn.rbm{u}.alpha = opts.alpha;
- dbn.rbm{u}.momentum = opts.momentum;
- dbn.rbm{u}.W = zeros(dbn.sizes(u + 1), dbn.sizes(u));
- dbn.rbm{u}.vW = zeros(dbn.sizes(u + 1), dbn.sizes(u));
- dbn.rbm{u}.b = zeros(dbn.sizes(u), 1);
- dbn.rbm{u}.vb = zeros(dbn.sizes(u), 1);
- dbn.rbm{u}.c = zeros(dbn.sizes(u + 1), 1);
- dbn.rbm{u}.vc = zeros(dbn.sizes(u + 1), 1);
- end
\DBN\dbntrain.m
应为DBN基本就是把rbm当做砖块搭建起来的,所以train也很简单
[cpp] view plaincopy
- function dbn = dbntrain(dbn, x, opts)
- n = numel(dbn.rbm);
- //对每一层的rbm进行训练
- dbn.rbm{1} = rbmtrain(dbn.rbm{1}, x, opts);
- for i = 2 : n
- x = rbmup(dbn.rbm{i - 1}, x);
- dbn.rbm{i} = rbmtrain(dbn.rbm{i}, x, opts);
- end
- 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
- for i = 1 : opts.numepochs //迭代次数
- kk = randperm(m);
- err = 0;
- for l = 1 : numbatches
- batch = x(kk((l - 1) * opts.batchsize + 1 : l * opts.batchsize), :);
- v1 = batch;
- h1 = sigmrnd(repmat(rbm.c', opts.batchsize, 1) + v1 * rbm.W'); //gibbs sampling的过程
- v2 = sigmrnd(repmat(rbm.b', opts.batchsize, 1) + h1 * rbm.W);
- h2 = sigmrnd(repmat(rbm.c', opts.batchsize, 1) + v2 * rbm.W');
- //Contrastive Divergence 的过程
- //这和《Learning Deep Architectures for AI》里面写cd-1的那段pseudo code是一样的
- c1 = h1' * v1;
- c2 = h2' * v2;
- //关于momentum,请参看Hinton的《A Practical Guide to Training Restricted Boltzmann Machines》
- //它的作用是记录下以前的更新方向,并与现在的方向结合下,跟有可能加快学习的速度
- rbm.vW = rbm.momentum * rbm.vW + rbm.alpha * (c1 - c2) / opts.batchsize;
- rbm.vb = rbm.momentum * rbm.vb + rbm.alpha * sum(v1 - v2)' / opts.batchsize;
- rbm.vc = rbm.momentum * rbm.vc + rbm.alpha * sum(h1 - h2)' / opts.batchsize;
- //更新值
- rbm.W = rbm.W + rbm.vW;
- rbm.b = rbm.b + rbm.vb;
- rbm.c = rbm.c + rbm.vc;
- err = err + sum(sum((v1 - v2) .^ 2)) / opts.batchsize;
- end
- end
\DBN\dbnunfoldtonn.m
DBN的每一层训练完成后自然还要把参数传递给一个大的NN,这就是这个函数的作用
[cpp] view plaincopy
- function nn = dbnunfoldtonn(dbn, outputsize)
- %DBNUNFOLDTONN Unfolds a DBN to a NN
- % outputsize是你的目标输出label,比如在MINST就是10,DBN只负责学习feature
- % 或者说初始化Weight,是一个unsupervised learning,最后的supervised还得靠NN
- if(exist('outputsize','var'))
- size = [dbn.sizes outputsize];
- else
- size = [dbn.sizes];
- end
- nn = nnsetup(size);
- %把每一层展开后的Weight拿去初始化NN的Weight
- %注意dbn.rbm{i}.c拿去初始化了bias项的值
- for i = 1 : numel(dbn.rbm)
- nn.W{i} = [dbn.rbm{i}.c dbn.rbm{i}.W];
- end
- 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的
分享到:
- 顶
- 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其实也是这样的- 回复Dan7291125:1.其实我也不是很了解,我目前只看了DBN,你可以看看这个,may help:http://www.sigvc.org/bbs/thread-524-1-1.html
- 1. 图模型上的区别就是有向与无向 具体在算法上是如何体现的呢
- 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,之前做的只是初始化参数值而已- 回复Dan7291125:1.yeah,图模型不一样
- 请问一下两个问题:
转【面向代码】学习 Deep Learning(二)Deep Belief Nets(DBNs)的更多相关文章
- 论文学习 :Learning a Deep Convolutional Network for Image Super-Resolution 2014
(Learning a Deep Convolutional Network for Image Super-Resolution, ECCV2014) 摘要:我们提出了一种单图像超分辨率的深度学习方 ...
- deep learning 以及deep learning 常用模型和方法
首先为什么会有Deep learning,我们得到一个结论就是Deep learning需要多层来获得更抽象的特征表达. 1.Deep learning与Neural Network 深度学习是机器学 ...
- 深度神经网络多任务学习(Multi-Task Learning in Deep Neural Networks)
https://cloud.tencent.com/developer/article/1118159 http://ruder.io/multi-task/ https://arxiv.org/ab ...
- 集智学院 “Deep X:Deep Learning with Deep Knowledge”的公开讲座---总结
人工智能旨在了解人类智能的本质,并创造出能模仿人类智能做出反应的智能机器,目前在一些领域已经取得显著的成功,如AI玩游戏.问答系统.自动驾驶.无人机.机器人.翻译.人脸识别.语音识别等领域.深度学习的 ...
- Coursera, Deep Learning 1, Neural Networks and Deep Learning - week4, Deep Neural Networks
Deep Neural Network Getting your matrix dimention right 选hyper-pamameter 完全是凭经验 补充阅读: cost 函数的计算公式: ...
- 【深度学习Deep Learning】资料大全
最近在学深度学习相关的东西,在网上搜集到了一些不错的资料,现在汇总一下: Free Online Books by Yoshua Bengio, Ian Goodfellow and Aaron C ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】
转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)
##机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)---#####注:机器学习资料[篇目一](https://github.co ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料汇总 (上)
转载:http://dataunion.org/8463.html?utm_source=tuicool&utm_medium=referral <Brief History of Ma ...
随机推荐
- git checkout -b 分支name 分支的新建, 切换, 删除, 查看
$ git checkout 711 -berror: switch `b' requires a value 以上, 可以看出, 参数 -b 放到最后是错误的. 711@MININT- 64 /d ...
- maven项目, 单元测试失败提示 Class not found datastorage........
---恢复内容开始--- 单元测试失败: 提示 Class not found datastorage........ 原因: maven 环境变量问题, eclipse 没有自动更新下载 ...
- C# 视频多人脸识别的实现
上一篇内容的调整,提交到git了,https://github.com/catzhou2002/ArcFaceDemo基本思路如下:一.识别线程1.获取当前图片2.识别当前图片的人脸位置,并将结果存入 ...
- git报错fatal: loose object ....(stored in .git/objects/....) is emtpy
主要是非正常关机.把.git给破坏了 参考https://stackoverflow.com/questions/12571557/fixing-a-corrupt-loose-object-as-a ...
- H5多媒体(用面向对象的方法控制视频、音频播放、暂停、延时暂停)
视频,音频播放器会是我们在工作中用到的一些h5新标签,它自带一些属性,比如暂停播放,快进快退,但是,我们经常不用原生的样式或者方法,我们需要自定义这些按钮来达到我们需要的样式,也需要我们自定义来实现一 ...
- php后台操作以及一些减缓服务器压力的问题
上次提到一个微信投票系统,做了一个微信重定向解决了,一个授权复用的问题,昨天投票系统正式投入使用:测试的时候没有问题,上线后出现了一点小问题, 一:php页面参数接受和php中 switch 那个先执 ...
- 关于怎么在CSDN中修改代码行中字体的颜色
先吐槽一下自己的心路历程吧,自己现在也是在CSDN中发表了自己好几篇的原创博文,但每一篇博文自己总感觉怪怪的,就是说不出自己哪里有毛病呢,知道今天恍然大悟,原来自己的代码行真心丑的要死,没有呈现出在编 ...
- SpringCloud 之 Hystrix熔断器
Hystrix Hystrix请求熔断与服务降级 Hystrix线程隔离&请求缓存&请求合并
- Feign
Feign简介 Feign是一个声明式的Web服务客户端,使用Feign可使得Web服务客户端的写入更加方便. 它具有可插拔注释支持,包括Feign注解和JAX-RS注解.Feign还支持可插拔编码器 ...
- 最简单的网络图片的爬取 --Pyhon网络爬虫与信息获取
1.本次要爬取的图片的url http://www.nxl123.cn/static/imgs/php.jpg 2.代码部分 import requestsimport osurl = "h ...