Deep Belief Network(DBN)的實(shí)現(xiàn)(c++)
2013年09月23日?創(chuàng)業(yè),技術(shù),科研? 共 1557字?評(píng)論數(shù) 24? 被圍觀 8,650+
每每想到幾年前寫一篇關(guān)于Action Classification的paper的時(shí)候,苦于沒有找到好的feature representation方法而失敗了。那時(shí)候記得也是想表示成一層一層的特征出來(lái),當(dāng)時(shí)用了關(guān)聯(lián)規(guī)則挖掘,效率沒法克服;然后上了topic model的思想來(lái)組織圖像,沒做到點(diǎn)子上?,F(xiàn)在想想也許當(dāng)時(shí)多實(shí)驗(yàn)試驗(yàn)Hierarchical topic model的思想說(shuō)不定能搞出點(diǎn)名堂。
去年Deep Learning被轟出來(lái)之后,在個(gè)方便都自然的取得了比較理想的效果。想到了自己之前的問題,或許可以借來(lái)用用。
所以,最近接觸了Deep的思想,學(xué)習(xí)并實(shí)現(xiàn)了下。先從hinton最初的DBN著手,實(shí)現(xiàn)起來(lái)還是比較簡(jiǎn)單的。雖然有很多實(shí)現(xiàn)了,考慮的長(zhǎng)遠(yuǎn)的規(guī)劃,先自己實(shí)現(xiàn)著吧。
代碼風(fēng)格Too young, too simple, sometimes naive and many bugs. 不要笑話哈~;框架參考自:yusugomori,不過他沒寫完的樣子。。
一、實(shí)現(xiàn):
1、Layer-wise pre-training階段,一層一層的訓(xùn)練Restrict Boltzmann Machine (RBM),用的CD-k(k=1)的方法;
2、最后一層加入了softmax regression,作為最終結(jié)果輸出層;
3、fine-tuning過程,即為傳統(tǒng)的BP過程。
二、實(shí)驗(yàn)
1、用的MNIST的數(shù)據(jù)集,這里為了可以忍受自己寫的幼兒園水平代碼的效率,選擇10000個(gè)樣本training,60000個(gè)樣本testing。不過傳統(tǒng)上大家都把兩者反過來(lái),效果肯定會(huì)更好了。
2、學(xué)習(xí)速率0.1,rbm和LR的L2的懲罰相l(xiāng)amda開始用的0.0002,三個(gè)隱層大小[400 400 900],這些都沒調(diào)
3、開始時(shí)候沒有進(jìn)行fine-tuning, accuracy大約在84%左右(不過這里是用的svm,當(dāng)時(shí)lr還沒寫完。。),現(xiàn)在fine-tuning之后,用softmax regression對(duì)60000個(gè)樣本分類結(jié)果為93%,還可以哈。不過把L2正則項(xiàng)的懲罰因子lamda設(shè)成0后,準(zhǔn)確率到了95%。
4、調(diào)調(diào)參,或者用60000訓(xùn)練10000測(cè)試,達(dá)到95%以上應(yīng)該沒啥問題吧。
三、源碼:https://github.com/lipiji/PG_DEEP
1、想做成像libsvm一樣好用的tool,一個(gè)train可以訓(xùn)練出模型,一個(gè)predict可以預(yù)測(cè)你的數(shù)據(jù),目前還在開發(fā)當(dāng)中。
2、源碼風(fēng)格比較幼兒園,好處就是能夠看懂每個(gè)細(xì)節(jié),方便學(xué)習(xí)吧;怪自己一直沒有遇到什么c++魯棒規(guī)范實(shí)踐的項(xiàng)目。
3、代碼沒有進(jìn)行任何矩陣等計(jì)算的優(yōu)化,優(yōu)化空間很大。
四、計(jì)劃
1、優(yōu)化代碼,理想是做一個(gè)像libsvm一樣方便大家使用的tool;
2、學(xué)習(xí)實(shí)現(xiàn)DNN, AutoEncoder和Sparse Coding啊,convolution啊、dropout啊、GPU啊等等其他升級(jí)版本;
3、能夠再次基礎(chǔ)上擴(kuò)展出vision、nlp等領(lǐng)域里面的那些好用的算法,例如word2vec等。
五、附錄
1、第一層RBM的參數(shù)矩陣W1(768x400)可視化結(jié)果,W2、W3可視化跟隨機(jī)噪聲似的,或許應(yīng)該用其他方法可視化。不過看著怎么不太舒服的樣子,之所以有很多白色的區(qū)域,是因?yàn)橐胝齽t項(xiàng)防止過擬合,體現(xiàn)了一定的稀疏性。正則項(xiàng)的懲罰因子設(shè)成0后,白色區(qū)域就消失了。
PS:有bug大家反饋哈~
Reference:
[1] A fast learning algorithm for deep belief nets
[2] A Practical Guide to Training Restricted Boltzmann Machines
