您的位置:首页 > 编程语言 > C语言/C++

Deep Belief Network(DBN)的实现(c++)

2015-04-20 19:47 232 查看
每每想到几年前写一篇关于Action Classification的paper的时候,苦于没有找到好的feature representation方法而失败了。那时候记得也是想表示成一层一层的特征出来,当时用了关联规则挖掘,效率没法克服;然后上了topic model的思想来组织图像,没做到点子上。现在想想也许当时多实验试验Hierarchical topic model的思想说不定能搞出点名堂。

去年Deep Learning被轰出来之后,在个方便都自然的取得了比较理想的效果。想到了自己之前的问题,或许可以借来用用。

所以,最近接触了Deep的思想,学习并实现了下。先从hinton最初的DBN着手,实现起来还是比较简单的。虽然有很多实现了,考虑的长远的规划,先自己实现着吧。

代码风格Too young, too simple, sometimes naive and many bugs. 不要笑话哈~;框架参考自:yusugomori,不过他没写完的样子。。

一、实现:

1、Layer-wise pre-training阶段,一层一层的训练Restrict Boltzmann Machine (RBM),用的CD-k(k=1)的方法;

2、最后一层加入了softmax regression,作为最终结果输出层;

3、fine-tuning过程,即为传统的BP过程。

二、实验

1、用的MNIST的数据集,这里为了可以忍受自己写的幼儿园水平代码的效率,选择10000个样本training,60000个样本testing。不过传统上大家都把两者反过来,效果肯定会更好了。

2、学习速率0.1,rbm和LR的L2的惩罚相lamda开始用的0.0002,三个隐层大小[400 400 900],这些都没调

3、开始时候没有进行fine-tuning, accuracy大约在84%左右(不过这里是用的svm,当时lr还没写完。。),现在fine-tuning之后,用softmax regression对60000个样本分类结果为93%,还可以哈。不过把L2正则项的惩罚因子lamda设成0后,准确率到了95%。

4、调调参,或者用60000训练10000测试,达到95%以上应该没啥问题吧。

三、源码https://github.com/lipiji/PG_DEEP

1、想做成像libsvm一样好用的tool,一个train可以训练出模型,一个predict可以预测你的数据,目前还在开发当中。

2、源码风格比较幼儿园,好处就是能够看懂每个细节,方便学习吧;怪自己一直没有遇到什么c++鲁棒规范实践的项目。

3、代码没有进行任何矩阵等计算的优化,优化空间很大。

四、计划

1、优化代码,理想是做一个像libsvm一样方便大家使用的tool;

2、学习实现DNN, AutoEncoder和Sparse Coding啊,convolution啊、dropout啊、GPU啊等等其他升级版本;

3、能够再次基础上扩展出vision、nlp等领域里面的那些好用的算法,例如word2vec等。

五、附录

1、第一层RBM的参数矩阵W1(768x400)可视化结果,W2、W3可视化跟随机噪声似的,或许应该用其他方法可视化。不过看着怎么不太舒服的样子,之所以有很多白色的区域,是因为引入正则项防止过拟合,体现了一定的稀疏性。正则项的惩罚因子设成0后,白色区域就消失了。

<a href="http://www.zhizhihu.com/wp-content/uploads/2013/09/dbn.jpg" class="cboxElement" rel="example4" 4365"="" style="text-decoration: none; color: rgb(1, 150, 227);">


PS:有bug大家反馈哈~

Reference:

[1] A fast learning algorithm for deep belief nets

[2] A Practical Guide to Training Restricted Boltzmann Machines

[3] https://github.com/yusugomori/DeepLearning

路人甲 : 2013年10月20日13:35:50

1楼 @回复回复

您好,关于行为检测问题能用deep—learning来做吗,例如kth数据集。提取出特征之后,能用深度学习来进行检测和分类吗?我现做的是UT-intersection交互数据集。期待您的回答。



管理员丕子 : 2014年01月24日09:38:59

2楼 @回复回复

图丢了。。。


千里之行 : 2014年02月19日15:28:46

3楼 @回复回复

丕子大哥,我想问一下的是那个Restrict Boltzmann Machine (RBM)的训练过程是怎样实现的?还有那个为什么后面要用softmax regression了?用其他的regression 方法可不可以了?



管理员丕子 : 2014年02月20日00:18:10

地下1层 @回复回复

呃 你先去读读paper?


DL学习者 : 2014年03月09日17:43:16

4楼 @回复回复

您好,请问一下,我看了一下您源码的数据,向量的维数好像不同,请问这是为什么?还有就是我现在正把DL用于NLP分类上,我看您源码中用的采样好像是高斯采样,这和传统意义上的吉布斯采样有什么区别,谢谢~~期待您的回答



管理员丕子 : 2014年03月10日00:03:52

地下1层 @回复回复

1、可以仔细看看代码;这里的高斯分布是为了参数初始化。 求解还是用的gibbs采样,Hinton的CD-K方法。

2、向量维数不同?


DL学习者 : 2014年03月10日09:35:45

地下2层 @回复回复

不好意思,向量维数是我看错了…我以前也用yusugomori的程序,但应用于实践分类效果非常不好,会出现所分的结果呈现全部归为一类的现象,分析了好久也不知道为什么,我用的数据2000维,有些稀疏,不知道您以前是否遇到过这样的问题?



管理员丕子 : 2014年03月10日10:03:38

地下3层 @回复回复

直接做文本分类? 检查下数据归一化、学习率等等


DL学习者 : 2014年03月11日11:08:59

地下4层 @回复回复

恩恩,好的……还想请教您一个问题,我看了一下源码,您在pretrain阶段计算的时候用vh_prob += v_prob[j] * W[i][j],请问为什么不用

vh_prob += v_state[j] * W[i][j]?谢谢~~


黄冠的第二人生 : 2014年03月15日15:30:36

5楼 @回复回复

博主你好,finetune阶段的权重更新公式可以给一下推导过程或者参考资料吗?谢谢啊



管理员丕子 : 2014年03月16日09:10:14

地下1层 @回复回复

这个,BP是神经网络的经典之一啊,一搜一大把


zac : 2014年03月16日21:11:53

6楼 @回复回复

博主,看了一下你的代码,请问该行代码是CD-k方法?为什么后面减去的是概率呢?不明,还望指教 W[i][j] += momentum * 0 + gamma * ((x[j] * pos_h_prob[i] - neg_v_prob[j] * neg_h_prob[i]) / 1 - lamda * W[i][j]);


langlanglofa : 2014年04月09日16:21:20

7楼 @回复回复

你好,我准备在虚拟机下的玩下您的代码,请问您给的例子训练需要多长时间? test部分(predict) 怎么用,你在sh文件中没有提到。谢谢。



管理员丕子 : 2014年04月13日10:16:16

地下1层 @回复回复

嗯 可以自己改改试试,我这个只是教学半,没有任何代码和框架上的优化。


feng : 2014年04月17日21:49:27

8楼 @回复回复

刚刚接触神经网络,问2个问题。

3层RBM的DBN。

1. 如果训练的话batch是怎么分的呢?所有的batch全过完第一层RBM全更新完了再第二层这样一层一层的吗?

比如:

rbm1 batch1 batch2 batch3....

rbm2 batch1 batch2 batch3...

...

finetuning

还是一个batch一个batch这样搞?

比如:

batch1: rbm1 -> rbm2 -> rbm3 -> finetuning

batch2: rbm1 -> rbm2 -> rbm3 -> finetuning

2.为什么3层?500,500,900等神经元参数什么的是怎么选的呢?


leizh007 : 2014年05月12日21:12:03

9楼 @回复回复

那个fine-tuning没明白怎么弄的?是直接按普通神经网络那个反向传播算法?

我能不能加一下你QQ问一下啊,谢谢



管理员丕子 : 2014年05月13日09:38:42

地下1层 @回复回复




ls003 : 2014年06月22日07:19:50

10楼 @回复回复

楼主你好,我把输入文件换成我自己的(6000 samples*5000 features),n_lables 设置成了1,在LR::train的时候就会发生内存释放问题~我不确定是不是哪里还要设置~非常感谢



管理员丕子 : 2014年06月22日18:03:20

地下1层 @回复回复

内存放不下了吧? 我这个程序只是demo, 你可以改成batch training


DL : 2014年08月07日21:18:36

11楼 @回复回复

你好,请问您的程序中model文件夹的数据有吗?



管理员丕子 : 2014年08月07日22:45:28

地下1层 @回复回复

这个是运行过程中生成的~


: 2015年04月13日16:30:03

12楼 @回复回复

你好,请问楼主用别的数据测试过吗?



管理员丕子 : 2015年04月13日19:37:24

地下1层 @回复回复

没有 这个就是个dbn的demo,效率什么的都不行。可以尝试caffe以及cxxnet等

原文地址:http://www.zhizhihu.com/html/y2013/4365.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: