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

来源:互联网 发布:团队管理的软件 编辑:程序博客网 时间:2024/04/28 19:36

每每想到几年前写一篇关于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);">RBM的W

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


  1. 路人甲 : 2013年10月20日13:35:50 1楼 @回复回复

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


  2. 管理员
    丕子 : 2014年01月24日09:38:59 2楼 @回复回复

    图丢了。。。

  3. 千里之行 : 2014年02月19日15:28:46 3楼 @回复回复

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


    • 管理员
      丕子 : 2014年02月20日00:18:10 地下1层 @回复回复

      呃 你先去读读paper?

  4. 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]?谢谢~~

  5. 黄冠的第二人生 : 2014年03月15日15:30:36 5楼 @回复回复

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


    • 管理员
      丕子 : 2014年03月16日09:10:14 地下1层 @回复回复

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

  6. 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]);

  7. langlanglofa : 2014年04月09日16:21:20 7楼 @回复回复

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


    • 管理员
      丕子 : 2014年04月13日10:16:16 地下1层 @回复回复

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

  8. 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等神经元参数什么的是怎么选的呢?

  9. leizh007 : 2014年05月12日21:12:03 9楼 @回复回复

    那个fine-tuning没明白怎么弄的?是直接按普通神经网络那个反向传播算法?
    我能不能加一下你QQ问一下啊,谢谢


    • 管理员
      丕子 : 2014年05月13日09:38:42 地下1层 @回复回复

  10. 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

  11. DL : 2014年08月07日21:18:36 11楼 @回复回复

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


    • 管理员
      丕子 : 2014年08月07日22:45:28 地下1层 @回复回复

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

  12.  : 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


0 0
原创粉丝点击