1. 程式人生 > >Deep Learning 系列(1):RBM(受限波爾茲曼機)和 DBN(深信度神經網路)

Deep Learning 系列(1):RBM(受限波爾茲曼機)和 DBN(深信度神經網路)

前言:Deep Learning (DL深度學習)是近幾年來最火的一種機器學習方法,由Hinton(多倫多大學)提出。主要有兩分支:Geoffery HintonJoshua Bengio這一支用RBM組成deep architecture的研究。另一支是以Yann LeCunAndrew 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)