Deep Learning(深度學(xué)習(xí))學(xué)習(xí)筆記整理系列之(四) --AutoEncoder自動(dòng)編碼器
原文地址:http://blog.csdn.net/zouxy09/article/details/8775524
Deep Learning(深度學(xué)習(xí))學(xué)習(xí)筆記整理系列
作者:Zouxy
version 1.0 2013-04-08
聲明:
1)該Deep Learning的學(xué)習(xí)系列是整理自網(wǎng)上很大牛和機(jī)器學(xué)習(xí)專家所無私奉獻(xiàn)的資料的誓竿。具體引用的資料請(qǐng)看參考文獻(xiàn)客峭。具體的版本聲明也參考原文獻(xiàn)蹲盘。
2)本文僅供學(xué)術(shù)交流凯亮,非商用。所以每一部分具體的參考資料并沒有詳細(xì)對(duì)應(yīng)箱舞。如果某部分不小心侵犯了大家的利益偏友,還望海涵,并聯(lián)系博主刪除忘衍。
3)本人才疏學(xué)淺,整理總結(jié)的時(shí)候難免出錯(cuò)卿城,還望各位前輩不吝指正枚钓,謝謝。
4)閱讀本文需要機(jī)器學(xué)習(xí)瑟押、計(jì)算機(jī)視覺搀捷、神經(jīng)網(wǎng)絡(luò)等等基礎(chǔ)(如果沒有也沒關(guān)系了,沒有就看看多望,能不能看懂嫩舟,呵呵)氢烘。
5)此屬于第一版本,若有錯(cuò)誤家厌,還需繼續(xù)修正與增刪威始。還望大家多多指點(diǎn)。大家都共享一點(diǎn)點(diǎn)像街,一起為祖國(guó)科研的推進(jìn)添磚加瓦(呵呵,好高尚的目標(biāo)敖臁)镰绎。請(qǐng)聯(lián)系:zouxy09@qq.com
目錄:
六沸停、淺層學(xué)習(xí)(Shallow Learning)和深度學(xué)習(xí)(Deep Learning)
七膜毁、Deep learning與Neural Network
8.1愤钾、傳統(tǒng)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練方法
9.3、Restricted Boltzmann Machine(RBM)限制波爾茲曼機(jī)
9.4伙菊、Deep BeliefNetworks深信度網(wǎng)絡(luò)
9.5败玉、Convolutional Neural Networks卷積神經(jīng)網(wǎng)絡(luò)
十一占业、參考文獻(xiàn)和Deep Learning學(xué)習(xí)資源
接上
九绒怨、Deep Learning的常用模型或者方法
9.1、AutoEncoder自動(dòng)編碼器
Deep Learning最簡(jiǎn)單的一種方法是利用人工神經(jīng)網(wǎng)絡(luò)的特點(diǎn)谦疾,人工神經(jīng)網(wǎng)絡(luò)(ANN)本身就是具有層次結(jié)構(gòu)的系統(tǒng)南蹂,如果給定一個(gè)神經(jīng)網(wǎng)絡(luò),我們假設(shè)其輸出與輸入是相同的念恍,然后訓(xùn)練調(diào)整其參數(shù)六剥,得到每一層中的權(quán)重晚顷。自然地,我們就得到了輸入I的幾種不同表示(每一層代表一種表示)疗疟,這些表示就是特征该默。自動(dòng)編碼器就是一種盡可能復(fù)現(xiàn)輸入信號(hào)的神經(jīng)網(wǎng)絡(luò)。為了實(shí)現(xiàn)這種復(fù)現(xiàn)策彤,自動(dòng)編碼器就必須捕捉可以代表輸入數(shù)據(jù)的最重要的因素栓袖,就像PCA那樣,找到可以代表原信息的主要成分店诗。
具體過程簡(jiǎn)單的說明如下:
1)給定無標(biāo)簽數(shù)據(jù)裹刮,用非監(jiān)督學(xué)習(xí)學(xué)習(xí)特征:
在我們之前的神經(jīng)網(wǎng)絡(luò)中,如第一個(gè)圖庞瘸,我們輸入的樣本是有標(biāo)簽的捧弃,即(input, target),這樣我們根據(jù)當(dāng)前輸出和target(label)之間的差去改變前面各層的參數(shù)擦囊,直到收斂违霞。但現(xiàn)在我們只有無標(biāo)簽數(shù)據(jù),也就是右邊的圖瞬场。那么這個(gè)誤差怎么得到呢买鸽?
如上圖,我們將input輸入一個(gè)encoder編碼器贯被,就會(huì)得到一個(gè)code癞谒,這個(gè)code也就是輸入的一個(gè)表示,那么我們?cè)趺粗肋@個(gè)code表示的就是input呢刃榨?我們加一個(gè)decoder解碼器弹砚,這時(shí)候decoder就會(huì)輸出一個(gè)信息,那么如果輸出的這個(gè)信息和一開始的輸入信號(hào)input是很像的(理想情況下就是一樣的)枢希,那很明顯桌吃,我們就有理由相信這個(gè)code是靠譜的。所以苞轿,我們就通過調(diào)整encoder和decoder的參數(shù)茅诱,使得重構(gòu)誤差最小,這時(shí)候我們就得到了輸入input信號(hào)的第一個(gè)表示了搬卒,也就是編碼code了瑟俭。因?yàn)槭菬o標(biāo)簽數(shù)據(jù),所以誤差的來源就是直接重構(gòu)后與原輸入相比得到契邀。
2)通過編碼器產(chǎn)生特征摆寄,然后訓(xùn)練下一層。這樣逐層訓(xùn)練:
那上面我們就得到第一層的code,我們的重構(gòu)誤差最小讓我們相信這個(gè)code就是原輸入信號(hào)的良好表達(dá)了微饥,或者牽強(qiáng)點(diǎn)說逗扒,它和原信號(hào)是一模一樣的(表達(dá)不一樣,反映的是一個(gè)東西)欠橘。那第二層和第一層的訓(xùn)練方式就沒有差別了矩肩,我們將第一層輸出的code當(dāng)成第二層的輸入信號(hào),同樣最小化重構(gòu)誤差肃续,就會(huì)得到第二層的參數(shù)黍檩,并且得到第二層輸入的code,也就是原輸入信息的第二個(gè)表達(dá)了始锚。其他層就同樣的方法炮制就行了(訓(xùn)練這一層建炫,前面層的參數(shù)都是固定的,并且他們的decoder已經(jīng)沒用了疼蛾,都不需要了)。
3)有監(jiān)督微調(diào):
經(jīng)過上面的方法艺配,我們就可以得到很多層了察郁。至于需要多少層(或者深度需要多少,這個(gè)目前本身就沒有一個(gè)科學(xué)的評(píng)價(jià)方法)需要自己試驗(yàn)調(diào)了转唉。每一層都會(huì)得到原始輸入的不同的表達(dá)皮钠。當(dāng)然了,我們覺得它是越抽象越好了赠法,就像人的視覺系統(tǒng)一樣麦轰。
到這里,這個(gè)AutoEncoder還不能用來分類數(shù)據(jù)砖织,因?yàn)樗€沒有學(xué)習(xí)如何去連結(jié)一個(gè)輸入和一個(gè)類款侵。它只是學(xué)會(huì)了如何去重構(gòu)或者復(fù)現(xiàn)它的輸入而已〔啻浚或者說新锈,它只是學(xué)習(xí)獲得了一個(gè)可以良好代表輸入的特征,這個(gè)特征可以最大程度上代表原輸入信號(hào)眶熬。那么妹笆,為了實(shí)現(xiàn)分類,我們就可以在AutoEncoder的最頂?shù)木幋a層添加一個(gè)分類器(例如羅杰斯特回歸娜氏、SVM等)拳缠,然后通過標(biāo)準(zhǔn)的多層神經(jīng)網(wǎng)絡(luò)的監(jiān)督訓(xùn)練方法(梯度下降法)去訓(xùn)練。
也就是說贸弥,這時(shí)候窟坐,我們需要將最后層的特征code輸入到最后的分類器,通過有標(biāo)簽樣本,通過監(jiān)督學(xué)習(xí)進(jìn)行微調(diào)狸涌,這也分兩種切省,一個(gè)是只調(diào)整分類器(黑色部分):
另一種:通過有標(biāo)簽樣本,微調(diào)整個(gè)系統(tǒng):(如果有足夠多的數(shù)據(jù)帕胆,這個(gè)是最好的朝捆。end-to-end learning端對(duì)端學(xué)習(xí))
一旦監(jiān)督訓(xùn)練完成,這個(gè)網(wǎng)絡(luò)就可以用來分類了懒豹。神經(jīng)網(wǎng)絡(luò)的最頂層可以作為一個(gè)線性分類器芙盘,然后我們可以用一個(gè)更好性能的分類器去取代它。
在研究中可以發(fā)現(xiàn)脸秽,如果在原有的特征中加入這些自動(dòng)學(xué)習(xí)得到的特征可以大大提高精確度儒老,甚至在分類問題中比目前最好的分類算法效果還要好!
AutoEncoder存在一些變體记餐,這里簡(jiǎn)要介紹下兩個(gè):
Sparse AutoEncoder稀疏自動(dòng)編碼器:
當(dāng)然驮樊,我們還可以繼續(xù)加上一些約束條件得到新的Deep Learning方法,如:如果在AutoEncoder的基礎(chǔ)上加上L1的Regularity限制(L1主要是約束每一層中的節(jié)點(diǎn)中大部分都要為0片酝,只有少數(shù)不為0囚衔,這就是Sparse名字的來源),我們就可以得到Sparse AutoEncoder法雕沿。
如上圖练湿,其實(shí)就是限制每次得到的表達(dá)code盡量稀疏。因?yàn)橄∈璧谋磉_(dá)往往比其他的表達(dá)要有效(人腦好像也是這樣的审轮,某個(gè)輸入只是刺激某些神經(jīng)元肥哎,其他的大部分的神經(jīng)元是受到抑制的)。
Denoising AutoEncoders降噪自動(dòng)編碼器:
降噪自動(dòng)編碼器DA是在自動(dòng)編碼器的基礎(chǔ)上疾渣,訓(xùn)練數(shù)據(jù)加入噪聲篡诽,所以自動(dòng)編碼器必須學(xué)習(xí)去去除這種噪聲而獲得真正的沒有被噪聲污染過的輸入。因此榴捡,這就迫使編碼器去學(xué)習(xí)輸入信號(hào)的更加魯棒的表達(dá)霞捡,這也是它的泛化能力比一般編碼器強(qiáng)的原因。DA可以通過梯度下降算法去訓(xùn)練薄疚。
9.2碧信、Sparse Coding稀疏編碼
如果我們把輸出必須和輸入相等的限制放松,同時(shí)利用線性代數(shù)中基的概念街夭,即O = a1*Φ1+ a2*Φ2+….+ an*Φn砰碴, Φi是基,ai是系數(shù)板丽,我們可以得到這樣一個(gè)優(yōu)化問題:
Min |I – O|呈枉,其中I表示輸入趁尼,O表示輸出。
通過求解這個(gè)最優(yōu)化式子猖辫,我們可以求得系數(shù)ai和基Φi酥泞,這些系數(shù)和基就是輸入的另外一種近似表達(dá)。
因此啃憎,它們可以用來表達(dá)輸入I芝囤,這個(gè)過程也是自動(dòng)學(xué)習(xí)得到的。如果我們?cè)谏鲜鍪阶由霞由螸1的Regularity限制辛萍,得到:
Min |I – O| + u*(|a1| + |a2| + … + |an|)
這種方法被稱為Sparse Coding悯姊。通俗的說,就是將一個(gè)信號(hào)表示為一組基的線性組合贩毕,而且要求只需要較少的幾個(gè)基就可以將信號(hào)表示出來悯许。“稀疏性”定義為:只有很少的幾個(gè)非零元素或只有很少的幾個(gè)遠(yuǎn)大于零的元素辉阶。要求系數(shù) ai是稀疏的意思就是說:對(duì)于一組輸入向量先壕,我們只想有盡可能少的幾個(gè)系數(shù)遠(yuǎn)大于零。選擇使用具有稀疏性的分量來表示我們的輸入數(shù)據(jù)是有原因的谆甜,因?yàn)榻^大多數(shù)的感官數(shù)據(jù)垃僚,比如自然圖像,可以被表示成少量基本元素的疊加店印,在圖像中這些基本元素可以是面或者線。同時(shí)倒慧,比如與初級(jí)視覺皮層的類比過程也因此得到了提升(人腦有大量的神經(jīng)元按摘,但對(duì)于某些圖像或者邊緣只有很少的神經(jīng)元興奮,其他都處于抑制狀態(tài))纫谅。
稀疏編碼算法是一種無監(jiān)督學(xué)習(xí)方法炫贤,它用來尋找一組“超完備”基向量來更高效地表示樣本數(shù)據(jù)。雖然形如主成分分析技術(shù)(PCA)能使我們方便地找到一組“完備”基向量付秕,但是這里我們想要做的是找到一組“超完備”基向量來表示輸入向量(也就是說兰珍,基向量的個(gè)數(shù)比輸入向量的維數(shù)要大)。超完備基的好處是它們能更有效地找出隱含在輸入數(shù)據(jù)內(nèi)部的結(jié)構(gòu)與模式询吴。然而掠河,對(duì)于超完備基來說,系數(shù)ai不再由輸入向量唯一確定猛计。因此唠摹,在稀疏編碼算法中,我們另加了一個(gè)評(píng)判標(biāo)準(zhǔn)“稀疏性”來解決因超完備而導(dǎo)致的退化(degeneracy)問題奉瘤。(詳細(xì)過程請(qǐng)參考:UFLDL Tutorial稀疏編碼)
比如在圖像的Feature Extraction的最底層要做Edge Detector的生成勾拉,那么這里的工作就是從Natural Images中randomly選取一些小patch,通過這些patch生成能夠描述他們的“基”,也就是右邊的8*8=64個(gè)basis組成的basis藕赞,然后給定一個(gè)test patch, 我們可以按照上面的式子通過basis的線性組合得到成肘,而sparse matrix就是a,下圖中的a中有64個(gè)維度斧蜕,其中非零項(xiàng)只有3個(gè)双霍,故稱“sparse”。
這里可能大家會(huì)有疑問惩激,為什么把底層作為Edge Detector呢店煞?上層又是什么呢?這里做個(gè)簡(jiǎn)單解釋大家就會(huì)明白风钻,之所以是Edge Detector是因?yàn)椴煌较虻腅dge就能夠描述出整幅圖像顷蟀,所以不同方向的Edge自然就是圖像的basis了……而上一層的basis組合的結(jié)果,上上層又是上一層的組合basis……(就是上面第四部分的時(shí)候咱們說的那樣)
Sparse coding分為兩個(gè)部分:
1)Training階段:給定一系列的樣本圖片[x1, x 2, …]骡技,我們需要學(xué)習(xí)得到一組基[Φ1, Φ2, …]鸣个,也就是字典。
稀疏編碼是k-means算法的變體布朦,其訓(xùn)練過程也差不多(EM算法的思想:如果要優(yōu)化的目標(biāo)函數(shù)包含兩個(gè)變量囤萤,如L(W, B),那么我們可以先固定W是趴,調(diào)整B使得L最小涛舍,然后再固定B,調(diào)整W使L最小唆途,這樣迭代交替富雅,不斷將L推向最小值。EM算法可以見我的博客:“從最大似然到EM算法淺解”)肛搬。
訓(xùn)練過程就是一個(gè)重復(fù)迭代的過程没佑,按上面所說,我們交替的更改a和Φ使得下面這個(gè)目標(biāo)函數(shù)最小温赔。
每次迭代分兩步:
a)固定字典Φ[k]蛤奢,然后調(diào)整a[k],使得上式陶贼,即目標(biāo)函數(shù)最衅》贰(即解LASSO問題)。
b)然后固定住a [k]拜秧,調(diào)整Φ [k]瓜晤,使得上式,即目標(biāo)函數(shù)最懈鼓伞(即解凸QP問題)痢掠。
不斷迭代驱犹,直至收斂。這樣就可以得到一組可以良好表示這一系列x的基足画,也就是字典雄驹。
2)Coding階段:給定一個(gè)新的圖片x,由上面得到的字典淹辞,通過解一個(gè)LASSO問題得到稀疏向量a医舆。這個(gè)稀疏向量就是這個(gè)輸入向量x的一個(gè)稀疏表達(dá)了。
例如: