Deep Learning 系列(1):RBM(受限波爾茲曼機)和 DBN(深信度神經網路)
前言:Deep Learning (DL深度學習)是近幾年來最火的一種機器學習方法,由Hinton(多倫多大學)提出。主要有兩分支:Geoffery Hinton和Joshua Bengio這一支用RBM組成deep architecture的研究。另一支是以Yann LeCun和Andrew Ng的(deep) convolutional networks,用convolutional network組成deep architecture的研究。
這篇博文主要介紹Hinton第一分支中最基礎的演算法RBM(受限玻爾茲曼機),DBN(深信度神經網路)是由其疊加而成。
Deep Learning 是無監督學習,也就是自動的提取訊號特徵,並由淺入深。理想情況是,由深層特徵能100%還原最初的原始訊號。由此,我們是否想到,其間的代價函式是失真差呢?
正文:廢話不多說了哈!
這裡:只截取了RBM的程式片段,弄清楚這個,基本DBN就差不多了! Deep Learning Tool (matlab版,下載)
function rbm = rbmtrain(rbm, x, opts) assert(isfloat(x), 'x must be a float'); assert(all(x(:)>=0) && all(x(:)<=1), 'all data in x must be in [0:1]'); m = size(x, 1); numbatches = m / opts.batchsize; assert(rem(numbatches, 1) == 0, 'numbatches not integer'); for i = 1 : opts.numepochs kk = randperm(m);%隨機產生1-m內的數 err = 0; for l = 1 : numbatches % 這裡很重要,引數W,b,c 的更新是以batchsize為單位,更新numbatches次(後面的NN訓練中,也是這樣) batch = x(kk((l - 1) * opts.batchsize + 1 : l * opts.batchsize), :);%這種表示法可以選取指定行列的陣列(重要!) v1 = batch; h1 = sigmrnd(repmat(rbm.c', opts.batchsize, 1) + v1 * rbm.W'); %Ref110,Hinton-guide-3.1裡有介紹,“the hidden unit turns on if this probability is greater than a random number uniformly distributed between 0 and 1.” v2 = sigmrnd(repmat(rbm.b', opts.batchsize, 1) + h1 * rbm.W); h2 = sigm(repmat(rbm.c', opts.batchsize, 1) + v2 * rbm.W'); c1 = h1' * v1; c2 = h2' * v2; 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 disp(['epoch ' num2str(i) '/' num2str(opts.numepochs) '. Average reconstruction error is: ' num2str(err / numbatches)]); end end
虛擬碼:(Ref9-Bengio-5.3.1)
附:8,9,10 文獻作為經典,必讀!(點選下載)
個人認為開始閱讀Hinton的文章有點難,建議先看中文的參考,然後再細讀其文章,這樣收穫會很多,其文章闡述了問啥要這樣做?怎麼想到的?等~即大師啦!
Bengio的文章是overview,有更綜合的DL描述,就是有點長,但是可以先看重點!
在程式碼方面,Ref2,Dark的程式碼講解不錯,(但是還是建議先把演算法弄明白)。
對於DBNs的理解,開始看Hinton的文章不太明白,其實後來發現就是RBM的堆疊,只要把RBM弄清楚了,要理解DBN不難!
8. A fast learning algorithm for deep belief nets(Hinton)下載
9. Learning Deep Architectures for AI (Bengio)
10. A Practical Guide to Training Restricted Boltzmann Machines(Hinton)