Deep learning:二十四(stacked autoencoder練習(xí))
AutoEncoder是多層神經(jīng)網(wǎng)絡(luò),其中輸入層和輸出層表示相同的含義,具有相同的節(jié)點(diǎn)數(shù)。AutoEncode學(xué)習(xí)的是一個(gè)輸入輸出相同的“恒等函數(shù)”。不過輸入和輸出相同,使得這個(gè)網(wǎng)絡(luò)的輸出沒有任何意義。AutoEncoder的意義在于學(xué)習(xí)的(通常是節(jié)點(diǎn)數(shù)更少的)中間coder層(最中間的那一層),這一層是輸入向量的良好表示。這個(gè)過程起到了“降維”的作用。當(dāng)AutoEncoder只有一個(gè)隱含層的時(shí)候,其原理相當(dāng)于主成分分析(PCA),當(dāng)AutoEncoder有多個(gè)隱含層的時(shí)候,每?jī)蓪又g可以用RBM來pre-training,最后由BP來調(diào)整最終權(quán)值。網(wǎng)絡(luò)權(quán)重更新公式很容易用求偏導(dǎo)數(shù)的方法推導(dǎo)出來,算法是梯度下降法。(RBM:層內(nèi)無連接,層間全連接,二分圖)
Denoising AutoEncoder是AutoEncoder的一個(gè)變種,與AutoEncoder不同的是,Denoising AutoEncoder在輸入的過程中加入了噪聲信息,從而讓AutoEncoder能夠?qū)W習(xí)這種噪聲。
Denoising AutoEncoder與RBM非常像:
(1)參數(shù)一樣:隱含層偏置、顯示層偏置、網(wǎng)絡(luò)權(quán)重
(2)作用一樣:都是輸入的另一種(壓縮)表示
(3)過程類似:都有reconstruct,并且都是reconstruct與input的差別,越小越好
Denoising AutoEncoder與RBM的區(qū)別:
背后原理就不說了(RBM是能量函數(shù)),區(qū)別在于訓(xùn)練準(zhǔn)則。RBM是隱含層“產(chǎn)生”顯示層的概率(通常用log表示),Denoising AutoEncoder是輸入分布與reconstruct分布的KL距離。所用的訓(xùn)練方法,前者是CD-k,后者是梯度下降。RBM固定只有兩層;AutoEncoder,可以有多層,并且這些多層網(wǎng)絡(luò)可以由標(biāo)準(zhǔn)的bp算法來更新網(wǎng)絡(luò)權(quán)重和偏置,與標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)不同的是,AutoEncoder的輸入層和最終的輸出層是“同一層”,不僅僅是節(jié)點(diǎn)數(shù)目、輸出相同,而是完完全全的“同一層”,這也會(huì)影響到這一層相關(guān)的權(quán)值更新方式??傊斎肱c輸出是同一層,在此基礎(chǔ)上,再由輸入與輸出的差別構(gòu)造準(zhǔn)則函數(shù),再求各個(gè)參數(shù)的偏導(dǎo)數(shù),再用bp方式更新各個(gè)權(quán)重。
【AutoEncoder工程代碼】:相關(guān)Matlab工程代碼主頁(yè):http://www.cs.toronto.edu/~hinton/MatlabForSciencePaper.html
論文:Science – 2006 Science_Reducing the Dimensionality of Data with Neural Networks
(如下所有文件,放到同一個(gè)目錄下)
1). 下載手寫體數(shù)據(jù)MNIST:http://yann.lecun.com/exdb/mnist/, 并在Linux或Windows下進(jìn)行解壓;(60,000 個(gè)訓(xùn)練集 和, 10,000 個(gè)測(cè)試集,數(shù)字手寫體0-9 10類)
train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)
2). 下載共軛梯度代碼:http://learning.eng.cam.ac.uk/carl/code/minimize/minimize.m
3). 下載AutoEncoder代碼,包括如下13個(gè)Matlab文件:
mnistdeepauto.m //訓(xùn)練AutoEncoder的主文件;
mnistclassify.m //用于訓(xùn)練分類器的主文件;
converter.m //轉(zhuǎn)換MNIST文件為Matlab數(shù)據(jù)格式;
rbm.m //訓(xùn)練RBM二進(jìn)制隱層和二進(jìn)制可視單元;
rbmhidlinear.m //訓(xùn)練RBM高斯隱層和二進(jìn)制可視單元;
backprop.m //進(jìn)行fine-tuning的反向傳播代碼;
backpropclassify.m //利用“Encoder”網(wǎng)絡(luò)進(jìn)行分類的反向傳播;
CG_MNIST.m //Conjugate Gradient optimization for fine-tuning an autoencoder
CG_CLASSIFY_INIT.m //Conjugate Gradient optimization for classification (training top-layer weights while holding low-level weights fixed)
CG_CLASSIFY.m //Conjugate Gradient optimization for classification (training all weights)
makebatches.m //Creates minibatches for RBM training
mnistdisp.m //顯示fine-tuning階段的進(jìn)度;
README.txt //說明文件
4). 在Matlab中執(zhí)行mnistdeepauto.m文件訓(xùn)練autoencoder;我們看一下此文件中大致做了一些什么操作:
maxepoch=10; //RBM學(xué)習(xí)時(shí)的迭代次數(shù)
numhid=1000; numpen=500; numpen2=250; numopen=30; //設(shè)置各個(gè)隱藏層的神經(jīng)元的個(gè)數(shù);這個(gè)程序所采用的網(wǎng)絡(luò)共有四層?!?000 500 250 30】
converter; \\作者提供的二進(jìn)制數(shù)據(jù)需要將原始數(shù)據(jù)文件轉(zhuǎn)換成Matlab數(shù)據(jù)格式
makebatches; \\把大的數(shù)據(jù)塊拆成每塊100個(gè)樣本的小塊 batchdata [樣本數(shù),維數(shù),分塊數(shù)]
//開始四層RBM訓(xùn)練
rbm; \\迭代學(xué)習(xí),分別學(xué)習(xí)到4個(gè)RBM模型,mnisthp.mat,?mnisthp2.mat,?mnistpo.mat,?mnistvh.mat記錄了RBM學(xué)習(xí)到的模型(3個(gè)參數(shù):權(quán)重矩陣W,前向偏移量b,后向偏移量c)
這里有一個(gè)問題,就是W,叫做鏈接權(quán)重矩陣可能更合適一點(diǎn),如果叫做轉(zhuǎn)移矩陣的話,一個(gè)問題就是,為什么P(v=1|h)=sigmod(c+Wv), 而P(h=1|v)=sigmod(b+W’h),這里W是用的轉(zhuǎn)置而不是W的逆?因?yàn)橹庇^上會(huì)有一個(gè)問題就是說 y=Wx的話,那么就應(yīng)該有x=inv(W)y,但是這里確只是用一個(gè)轉(zhuǎn)置,而且正交矩陣才具有此性質(zhì),W’=inv(W). 而其實(shí) 這個(gè)是RBM 能量函數(shù)的性質(zhì),在RBM能量函數(shù)中 v和h 有種偽對(duì)陣性,上述兩式是在能量函數(shù)基礎(chǔ)上計(jì)算條件概率得到的。
backprop; \\反向傳播的訓(xùn)練速度好慢啊。==b,迭代200次估計(jì)需要1天多,我們直接迭代1次跑個(gè)demo,最終反向傳播之后可以學(xué)習(xí)到 w1,w2,w3,w4四個(gè)編碼權(quán)重矩陣及w5,w6,w7,w8四個(gè)解碼權(quán)重矩陣。
5). 若執(zhí)行mnistclassify.m可訓(xùn)練MNIST分類器
6). 代碼中有很多參數(shù)可以進(jìn)行調(diào)節(jié)You can also set various parameters in the code, such as maximum number of epochs, learning rates, network architecture, etc.
Q:DAE 比DBN 好?
【參考】:
1.http://blog.csdn.net/xceman1997/article/details/9392153
3.http://www.cs.toronto.edu/~hinton/MatlabForSciencePaper.html
4. DeepLearning 工具包匯總http://blog.csdn.net/zouxy09/article/details/11910527
5. DeepLearning 工具包Matlab代碼集合:https://github.com/rasmusbergpalm/DeepLearnToolbox,是丹麥工業(yè)大學(xué)以為碩士期間的工作
6. DeepLearning 工具包C, C++, Java, phython, scala代碼集合,https://github.com/yusugomori/DeepLearning
7. RBM詳解:http://ibillxia.github.io/blog/2013/04/12/Energy-Based-Models-and-Boltzmann-Machines/
【備注源碼注釋】:http://jacoxu.com/?p=692