Deep Learning(深度學習)學習筆記整理系列之(四) --AutoEncoder自動編碼器
原文地址:http://blog.csdn.net/zouxy09/article/details/8775524
Deep Learning(深度學習)學習筆記整理系列
作者:Zouxy
version 1.0 2013-04-08
聲明:
1)該Deep Learning的學習系列是整理自網(wǎng)上很大牛和機器學習專家所無私奉獻的資料的。具體引用的資料請看參考文獻。具體的版本聲明也參考原文獻。
2)本文僅供學術交流,非商用。所以每一部分具體的參考資料并沒有詳細對應。如果某部分不小心侵犯了大家的利益,還望海涵,并聯(lián)系博主刪除。
3)本人才疏學淺,整理總結(jié)的時候難免出錯,還望各位前輩不吝指正,謝謝。
4)閱讀本文需要機器學習、計算機視覺、神經(jīng)網(wǎng)絡等等基礎(如果沒有也沒關系了,沒有就看看,能不能看懂,呵呵)。
5)此屬于第一版本,若有錯誤,還需繼續(xù)修正與增刪。還望大家多多指點。大家都共享一點點,一起為祖國科研的推進添磚加瓦(呵呵,好高尚的目標?。?。請聯(lián)系:zouxy09@qq.com
目錄:
六、淺層學習(Shallow Learning)和深度學習(Deep Learning)
七、Deep learning與Neural Network
8.1、傳統(tǒng)神經(jīng)網(wǎng)絡的訓練方法
9.3、Restricted Boltzmann Machine(RBM)限制波爾茲曼機
9.4、Deep BeliefNetworks深信度網(wǎng)絡
9.5、Convolutional Neural Networks卷積神經(jīng)網(wǎng)絡
接上
九、Deep Learning的常用模型或者方法
9.1、AutoEncoder自動編碼器
Deep Learning最簡單的一種方法是利用人工神經(jīng)網(wǎng)絡的特點,人工神經(jīng)網(wǎng)絡(ANN)本身就是具有層次結(jié)構(gòu)的系統(tǒng),如果給定一個神經(jīng)網(wǎng)絡,我們假設其輸出與輸入是相同的,然后訓練調(diào)整其參數(shù),得到每一層中的權(quán)重。自然地,我們就得到了輸入I的幾種不同表示(每一層代表一種表示),這些表示就是特征。自動編碼器就是一種盡可能復現(xiàn)輸入信號的神經(jīng)網(wǎng)絡。為了實現(xiàn)這種復現(xiàn),自動編碼器就必須捕捉可以代表輸入數(shù)據(jù)的最重要的因素,就像PCA那樣,找到可以代表原信息的主要成分。
具體過程簡單的說明如下:
1)給定無標簽數(shù)據(jù),用非監(jiān)督學習學習特征:

在我們之前的神經(jīng)網(wǎng)絡中,如第一個圖,我們輸入的樣本是有標簽的,即(input, target),這樣我們根據(jù)當前輸出和target(label)之間的差去改變前面各層的參數(shù),直到收斂。但現(xiàn)在我們只有無標簽數(shù)據(jù),也就是右邊的圖。那么這個誤差怎么得到呢?

如上圖,我們將input輸入一個encoder編碼器,就會得到一個code,這個code也就是輸入的一個表示,那么我們怎么知道這個code表示的就是input呢?我們加一個decoder解碼器,這時候decoder就會輸出一個信息,那么如果輸出的這個信息和一開始的輸入信號input是很像的(理想情況下就是一樣的),那很明顯,我們就有理由相信這個code是靠譜的。所以,我們就通過調(diào)整encoder和decoder的參數(shù),使得重構(gòu)誤差最小,這時候我們就得到了輸入input信號的第一個表示了,也就是編碼code了。因為是無標簽數(shù)據(jù),所以誤差的來源就是直接重構(gòu)后與原輸入相比得到。

2)通過編碼器產(chǎn)生特征,然后訓練下一層。這樣逐層訓練:
那上面我們就得到第一層的code,我們的重構(gòu)誤差最小讓我們相信這個code就是原輸入信號的良好表達了,或者牽強點說,它和原信號是一模一樣的(表達不一樣,反映的是一個東西)。那第二層和第一層的訓練方式就沒有差別了,我們將第一層輸出的code當成第二層的輸入信號,同樣最小化重構(gòu)誤差,就會得到第二層的參數(shù),并且得到第二層輸入的code,也就是原輸入信息的第二個表達了。其他層就同樣的方法炮制就行了(訓練這一層,前面層的參數(shù)都是固定的,并且他們的decoder已經(jīng)沒用了,都不需要了)。

3)有監(jiān)督微調(diào):
經(jīng)過上面的方法,我們就可以得到很多層了。至于需要多少層(或者深度需要多少,這個目前本身就沒有一個科學的評價方法)需要自己試驗調(diào)了。每一層都會得到原始輸入的不同的表達。當然了,我們覺得它是越抽象越好了,就像人的視覺系統(tǒng)一樣。
到這里,這個AutoEncoder還不能用來分類數(shù)據(jù),因為它還沒有學習如何去連結(jié)一個輸入和一個類。它只是學會了如何去重構(gòu)或者復現(xiàn)它的輸入而已?;蛘哒f,它只是學習獲得了一個可以良好代表輸入的特征,這個特征可以最大程度上代表原輸入信號。那么,為了實現(xiàn)分類,我們就可以在AutoEncoder的最頂?shù)木幋a層添加一個分類器(例如羅杰斯特回歸、SVM等),然后通過標準的多層神經(jīng)網(wǎng)絡的監(jiān)督訓練方法(梯度下降法)去訓練。
也就是說,這時候,我們需要將最后層的特征code輸入到最后的分類器,通過有標簽樣本,通過監(jiān)督學習進行微調(diào),這也分兩種,一個是只調(diào)整分類器(黑色部分):

另一種:通過有標簽樣本,微調(diào)整個系統(tǒng):(如果有足夠多的數(shù)據(jù),這個是最好的。end-to-end learning端對端學習)

一旦監(jiān)督訓練完成,這個網(wǎng)絡就可以用來分類了。神經(jīng)網(wǎng)絡的最頂層可以作為一個線性分類器,然后我們可以用一個更好性能的分類器去取代它。
在研究中可以發(fā)現(xiàn),如果在原有的特征中加入這些自動學習得到的特征可以大大提高精確度,甚至在分類問題中比目前最好的分類算法效果還要好!
AutoEncoder存在一些變體,這里簡要介紹下兩個:
Sparse AutoEncoder稀疏自動編碼器:
當然,我們還可以繼續(xù)加上一些約束條件得到新的Deep Learning方法,如:如果在AutoEncoder的基礎上加上L1的Regularity限制(L1主要是約束每一層中的節(jié)點中大部分都要為0,只有少數(shù)不為0,這就是Sparse名字的來源),我們就可以得到Sparse AutoEncoder法。

如上圖,其實就是限制每次得到的表達code盡量稀疏。因為稀疏的表達往往比其他的表達要有效(人腦好像也是這樣的,某個輸入只是刺激某些神經(jīng)元,其他的大部分的神經(jīng)元是受到抑制的)。
Denoising AutoEncoders降噪自動編碼器:
降噪自動編碼器DA是在自動編碼器的基礎上,訓練數(shù)據(jù)加入噪聲,所以自動編碼器必須學習去去除這種噪聲而獲得真正的沒有被噪聲污染過的輸入。因此,這就迫使編碼器去學習輸入信號的更加魯棒的表達,這也是它的泛化能力比一般編碼器強的原因。DA可以通過梯度下降算法去訓練。

9.2、Sparse Coding稀疏編碼
如果我們把輸出必須和輸入相等的限制放松,同時利用線性代數(shù)中基的概念,即O = a1*Φ1+ a2*Φ2+….+ an*Φn, Φi是基,ai是系數(shù),我們可以得到這樣一個優(yōu)化問題:
Min |I – O|,其中I表示輸入,O表示輸出。
通過求解這個最優(yōu)化式子,我們可以求得系數(shù)ai和基Φi,這些系數(shù)和基就是輸入的另外一種近似表達。

因此,它們可以用來表達輸入I,這個過程也是自動學習得到的。如果我們在上述式子上加上L1的Regularity限制,得到:
Min |I – O| + u*(|a1| + |a2| + … + |an|)
這種方法被稱為Sparse Coding。通俗的說,就是將一個信號表示為一組基的線性組合,而且要求只需要較少的幾個基就可以將信號表示出來。“稀疏性”定義為:只有很少的幾個非零元素或只有很少的幾個遠大于零的元素。要求系數(shù) ai是稀疏的意思就是說:對于一組輸入向量,我們只想有盡可能少的幾個系數(shù)遠大于零。選擇使用具有稀疏性的分量來表示我們的輸入數(shù)據(jù)是有原因的,因為絕大多數(shù)的感官數(shù)據(jù),比如自然圖像,可以被表示成少量基本元素的疊加,在圖像中這些基本元素可以是面或者線。同時,比如與初級視覺皮層的類比過程也因此得到了提升(人腦有大量的神經(jīng)元,但對于某些圖像或者邊緣只有很少的神經(jīng)元興奮,其他都處于抑制狀態(tài))。
稀疏編碼算法是一種無監(jiān)督學習方法,它用來尋找一組“超完備”基向量來更高效地表示樣本數(shù)據(jù)。雖然形如主成分分析技術(PCA)能使我們方便地找到一組“完備”基向量,但是這里我們想要做的是找到一組“超完備”基向量來表示輸入向量(也就是說,基向量的個數(shù)比輸入向量的維數(shù)要大)。超完備基的好處是它們能更有效地找出隱含在輸入數(shù)據(jù)內(nèi)部的結(jié)構(gòu)與模式。然而,對于超完備基來說,系數(shù)ai不再由輸入向量唯一確定。因此,在稀疏編碼算法中,我們另加了一個評判標準“稀疏性”來解決因超完備而導致的退化(degeneracy)問題。(詳細過程請參考:UFLDL Tutorial稀疏編碼)

比如在圖像的Feature Extraction的最底層要做Edge Detector的生成,那么這里的工作就是從Natural Images中randomly選取一些小patch,通過這些patch生成能夠描述他們的“基”,也就是右邊的8*8=64個basis組成的basis,然后給定一個test patch, 我們可以按照上面的式子通過basis的線性組合得到,而sparse matrix就是a,下圖中的a中有64個維度,其中非零項只有3個,故稱“sparse”。
這里可能大家會有疑問,為什么把底層作為Edge Detector呢?上層又是什么呢?這里做個簡單解釋大家就會明白,之所以是Edge Detector是因為不同方向的Edge就能夠描述出整幅圖像,所以不同方向的Edge自然就是圖像的basis了……而上一層的basis組合的結(jié)果,上上層又是上一層的組合basis……(就是上面第四部分的時候咱們說的那樣)
Sparse coding分為兩個部分:
1)Training階段:給定一系列的樣本圖片[x1, x 2, …],我們需要學習得到一組基[Φ1, Φ2, …],也就是字典。
稀疏編碼是k-means算法的變體,其訓練過程也差不多(EM算法的思想:如果要優(yōu)化的目標函數(shù)包含兩個變量,如L(W, B),那么我們可以先固定W,調(diào)整B使得L最小,然后再固定B,調(diào)整W使L最小,這樣迭代交替,不斷將L推向最小值。EM算法可以見我的博客:“從最大似然到EM算法淺解”)。
訓練過程就是一個重復迭代的過程,按上面所說,我們交替的更改a和Φ使得下面這個目標函數(shù)最小。

每次迭代分兩步:
a)固定字典Φ[k],然后調(diào)整a[k],使得上式,即目標函數(shù)最?。唇釲ASSO問題)。
b)然后固定住a [k],調(diào)整Φ [k],使得上式,即目標函數(shù)最?。唇馔筈P問題)。
不斷迭代,直至收斂。這樣就可以得到一組可以良好表示這一系列x的基,也就是字典。
2)Coding階段:給定一個新的圖片x,由上面得到的字典,通過解一個LASSO問題得到稀疏向量a。這個稀疏向量就是這個輸入向量x的一個稀疏表達了。

例如: