深度学习入门教程UFLDL学习实验笔记一:稀疏自编码器
UFLDL即(unsupervised feature learning & deep learning)。這是斯坦福網(wǎng)站上的一篇經(jīng)典教程。顧名思義,你將在這篇這篇文章中學(xué)習(xí)到無監(jiān)督特征學(xué)習(xí)和深度學(xué)習(xí)的主要觀點(diǎn)。
UFLDL全文出處在這:http://ufldl.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B,本文為本人原創(chuàng),參考了UFLDL的教程,是我自己個(gè)人對于這一系列教程的理解以及自己的實(shí)驗(yàn)結(jié)果。非盈利性質(zhì)網(wǎng)站轉(zhuǎn)載請?jiān)谖恼麻_頭處著名本文作者:77695,來源http://www.cnblogs.com/cj695/。盈利性質(zhì)網(wǎng)站轉(zhuǎn)載請與作者聯(lián)系,聯(lián)系方式在文章后面。如未聯(lián)系,本人將通過一切可能且合法的途徑追繳相應(yīng)稿酬。請?jiān)谵D(zhuǎn)載時(shí)保留此聲明。
神經(jīng)網(wǎng)絡(luò)
一個(gè)神經(jīng)網(wǎng)絡(luò)由一系列神經(jīng)元組成,一個(gè)神經(jīng)元由一系列參數(shù)x1,x2。。。及偏置量+1作為輸入,將輸入與對應(yīng)權(quán)值W(與x1,x2。。。相乘),(與1相乘)相乘后求和,并將和放入激活函數(shù),即可得到該神經(jīng)元的輸出。我們稱這個(gè)神經(jīng)元的輸入-輸出映射關(guān)系其實(shí)就是一個(gè)邏輯回歸(logistic regression)
在這里激活函數(shù)我們用:
他的導(dǎo)數(shù)是右邊的形式
這是sigmoid函數(shù)的圖像
整個(gè)神經(jīng)元可以用一個(gè)公式表示:
神經(jīng)網(wǎng)絡(luò)就是很多個(gè)神經(jīng)元組合在一起,一個(gè)神經(jīng)元的輸出,也可以是另外一個(gè)神經(jīng)元的輸入,如下圖:
具體請直接查看UFLDL相應(yīng)教程,這里不再贅述,下文一樣。
反向傳導(dǎo)算法
一個(gè)神經(jīng)網(wǎng)絡(luò)向前傳導(dǎo),其神經(jīng)元的參數(shù)可以是各種各樣的,這樣也會導(dǎo)致各種各樣的借,而我希望我整個(gè)神經(jīng)網(wǎng)絡(luò)的輸出,是與我預(yù)期的輸出越相近越好,為了描述相近的程度,我們計(jì)算神經(jīng)網(wǎng)絡(luò)輸出與預(yù)計(jì)輸出的差值的平方和。這個(gè)和越小,即輸出與預(yù)期越接近,我們稱這個(gè)叫做代價(jià)函數(shù)。但使得輸出與預(yù)期接近的W參數(shù)組合有很多,并不是每一種組合都好,也不是說越接近越好,當(dāng)W參數(shù)太大的時(shí)候,會發(fā)生過擬合,使得泛化能力不夠,因此我們引入所有W的平方和,加入到代價(jià)函數(shù)中,我們稱它叫懲罰項(xiàng)。我們使用梯度下降法,求得最優(yōu)的W,b這就是機(jī)器學(xué)習(xí)的整個(gè)過程。梯度下降中,其實(shí)就是求得代價(jià)函數(shù)對W,b的偏導(dǎo)值。在計(jì)算偏導(dǎo)的時(shí)候,因?yàn)閺?fù)合函數(shù)的求導(dǎo)法則:
可以看到,要求整個(gè)懲罰函數(shù)的導(dǎo)數(shù)首先就要計(jì)算從懲罰函數(shù)開始向后求導(dǎo),具體公式這里就不貼了。
梯度檢驗(yàn)
要檢測自己反向傳導(dǎo)得到的偏導(dǎo)函數(shù)是否正確,這里有一種簡單粗暴的方法,就是梯度檢驗(yàn),通過對某一個(gè)參數(shù)加以及減一個(gè)較小的值的差除以2倍較小的值即可近似算出該點(diǎn)偏導(dǎo)值,因此可以用來檢驗(yàn)偏導(dǎo)是否計(jì)算正確。但為什么我們不直接用這個(gè)計(jì)算代替求偏導(dǎo)函數(shù),因?yàn)樘?#xff01;
在這里我們用L-BFGS算法快速計(jì)算偏導(dǎo)數(shù)
自編碼算法與稀疏性
使得輸出盡可能與輸入一致我們稱之為自編碼。比如,若隱藏層神經(jīng)元數(shù)目小于輸入層,則這個(gè)網(wǎng)絡(luò)就要學(xué)習(xí)怎么去壓縮這些數(shù)據(jù)。使得神經(jīng)元大部分的時(shí)間都是被抑制的限制則被稱作稀疏性限制。其懲罰函數(shù)如下:
可視化自編碼器訓(xùn)練結(jié)果
可以證明,時(shí)有單元i有最大激勵(lì)。
實(shí)現(xiàn)
生成數(shù)據(jù)集:即從所有10副512x512的圖片中取8x8的塊,一共取10000塊。
這是數(shù)據(jù)集的一些圖片,可以看到這主要是一些自然圖片。
這里只粘貼所有自己實(shí)現(xiàn)部分的代碼。
?| 1 2 3 4 5 6 7 8 9 10 | [w,h,n]=size(IMAGES); randx=randi(w-patchsize,1,numpatches); randy=randi(h-patchsize,1,numpatches); randIdx=randi(n,1,numpatches); for i=1 : numpatches ????pc=IMAGES(randx(i):randx(i)+patchsize-1,randy(i):randy(i)+patchsize-1,randIdx(i)); ????patches(:,i)=pc(:); end |
生成結(jié)果如下:
實(shí)現(xiàn)懲罰函數(shù)以及梯度函數(shù):按照之前的公式計(jì)算,大家直接看代碼吧。
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [l,n]=size(data); dataHidden=sigmoid(W1*data+b1*ones(1,n)); dataOut=sigmoid(W2*dataHidden+b2*ones(1,n)); rou=sum(dataHidden,2)/n; spCost=beta*(sum((sparsityParam*log(sparsityParam*ones(size(rou))./rou)... ????+(1-sparsityParam)*log(((1-sparsityParam)*ones(size(rou)))./(1-rou))))); xyCost=(sum(sum((dataOut-data).*(dataOut-data))))/2/n; wCost=(lambda/2)*((sum(sum(W1.*W1))+sum(sum(W2.*W2)))); cost=wCost+xyCost+spCost; delta3=-(data-dataOut).*dataOut.*(1-dataOut); spDt=beta*((-sparsityParam*ones(size(rou))./rou)+(((1-sparsityParam)... ????*ones(size(rou)))./(ones(size(rou))-rou))); delta2=((W2')*delta3+spDt*ones(1,n)).*dataHidden.*(1-dataHidden); W2grad=(delta3*(dataHidden'))/n+lambda*W2; W1grad=(delta2*(data'))/n+lambda*W1; b2grad=delta3*ones(n,1)/n; b1grad=delta2*ones(n,1)/n; |
實(shí)現(xiàn)時(shí)候出了一個(gè)問題,算梯度的時(shí)候少加了lambda*W1,粗心害死人啊!
梯度檢驗(yàn):按照公式實(shí)現(xiàn)梯度檢驗(yàn),檢驗(yàn)實(shí)現(xiàn)的梯度是否正確。
?| 1 2 3 4 5 6 | for i=1 :(size(theta,1)) ????e = zeros(size(theta)); ????e(i)=EPSILON; ????cha=(J(theta+e)-J(theta-e)); ????numgrad(i)=cha/(2*EPSILON); end |
看到運(yùn)行結(jié)果
只差10^-12數(shù)量級,說明梯度檢驗(yàn)的實(shí)現(xiàn)沒錯(cuò)
訓(xùn)練以及結(jié)果:
最后運(yùn)行得到結(jié)果如下:
可以看到學(xué)習(xí)出來的結(jié)果基本是圖片相互正交的部分,相當(dāng)于傅立葉變換中不同頻率正弦波,相當(dāng)于很多正交的基,這些“基”以一定的權(quán)重相加,就能夠近似組成任何一個(gè)8x8的圖片塊。
另外值得一提的是,對于梯度下降算法,在這里使用的是L-BFGS算法,對于這個(gè)算法,我們不能將它用于商業(yè)用途,若用與商業(yè)用途的話,可以使用fminlbfgs函數(shù),他比L-BFGS慢但可用于商業(yè)用途。
?
本博客(http://www.cnblogs.com/cj695/)未標(biāo)明轉(zhuǎn)載的內(nèi)容均為本站原創(chuàng),非商業(yè)用途轉(zhuǎn)載時(shí)請署名(77695)并注明來源(http://www.cnblogs.com/cj695/)。商業(yè)用途請聯(lián)系作者(77695)QQ:646710030。作者(77695)保留本博客所有內(nèi)容的一切權(quán)利。總結(jié)
以上是生活随笔為你收集整理的深度学习入门教程UFLDL学习实验笔记一:稀疏自编码器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 亚马逊与微软赢得一亿美元云计算合约,IB
- 下一篇: 深度学习入门教程UFLDL学习实验笔记三