前言:
最近一直在思考,如果我使用SCSAE(即stacked convolution sparse autoendoer)算法來訓練一個的deep model的話,其網絡的第二層開始后續所有網絡層的訓練數據從哪里來呢?其實如果在這個問題中,當我們的樣本大小(指提供的最原始數據,比如大的圖片集)和我們所訓練第一個網絡的輸入維度是一樣的話,那么第二層網絡的輸入即第一層網絡的輸出(后續的網絡依次類推),但是這種情況下根本就不會涉及到convolution(一般有convolution的地方也會有pooling),所以不屬於我想要討論的SCSAE框架。后面根據自己對deep learning的理解(剛接觸DL不到2個月,菜鳥一個)認為第二層網絡的輸入需要將原始的訓練樣本集通過covolution的方法經過第一層網絡(已訓練好了的網絡)的輸出采樣(如果輸出的特征圖尺寸比第二層網絡的輸入尺寸大的話,就需要通過隨機采樣方法了)得到。
最近同時還在思考的另一個問題是,如果我們的SCASE網絡預訓練成功后,后期的fine-tuning該怎樣進行呢?當然了,fine-tuning的過程肯定會用到BP算法的,但是此時的SCASE網絡並沒有清晰直觀的網絡結構(不像非convolution網絡那樣,雖然有多層,但是前一層網絡的輸出直接連接到后一層網絡的輸入,結構清晰,一目了然,其fine-tuning過程容易理解),所以在使用BP算法時會不會有什么不同呢?特別是其中convolution后的pooling部分,比如max-pooling,該部分就不需要學習任何參數,但它也是SCASE結構中的一層,所以感覺其對BP算法計算會有影響。
內容:
帶着這2個問題而是就在網絡上開始尋找答案了。首先,找到了一篇文章Stacked Convolutional Auto-Encoders for Hierarchical Feature Extraction,看這個標題感覺就是我想要的,只是它沒有預訓練網絡時不是用的SAE,而是標准的AE,這點影響不大。大致瀏覽了下文章,下面是一些筆記:
DAE(denoised autoencoder)是在訓練網絡參數時,先計算下輸入樣本的統計特性,並根據這個統計特性給這些樣本加入一定的噪聲,再把這些帶噪聲的圖像輸入到網絡中訓練。這樣做的好處是,如果網絡能夠重構帶噪聲的樣本,那么它的泛化能力就更強。
SCAE(本文作者的方法)中每個隱含層的節點都是用來做covolution的,因此針對某個隱含層節點,給定一張大圖片通過convolution就可以得到一張特征圖,然后對這張特征圖用剛才那個節點的權值轉置矩陣就可以還原出對應的那幅大圖。
關於梯度下降的一些小總結:
標准梯度下降也就是batch梯度下降,其更新過程的增量是一次用所有樣本的誤差來計算得到的。
隨機梯度下降和標准梯度下降法類似,區別在於它每次更新權值時只是用一個隨機的樣本來計算其增量。
共軛梯度下降是前面梯度下降的基礎上采用某種策略來更改學習率,其策略是通過一系列線搜索來找到誤差函數最小值的方向,然后在該方向上找到一個適合的學習率,當然,其第一次的線搜索為梯度的負方向。
Max-pooling可以提高提取特征的不變性,最初的目標是用在有監督的學習中的。作者所使用的max-pooling一般是無重疊的,它有公開max-pooling相關的matlab源碼:http://www.idsia.ch/~masci/software.php文章指出使用了max-pooling層后就沒有必要隱含層或者權值作L1或者L2的規則化了,why?
作者用一個隱含層(或者后面再加一個max-pooling層)對數據庫MNIST和CIFAR10提取出了20個7*7的特征,其實驗結果顯示如下:

其中的a為不加噪聲,不用pooling層學習到的特征;b是加了噪聲但沒用pooling層時的特征;c是用了2*2大小的pooling層后但沒加噪聲時對應的特征;d是用了2*2大小的pooling層且加了噪聲學習到的特征。
從上面可以看到,c圖學習到的特征比較不錯。C圖是沒有加入噪聲且用了pooling層。由於a圖和b圖學到的都是不重要的特征,而d圖學到特征的又不太像人腦視覺皮層那樣,所以作者認為加噪聲用處不大,且max-pooling功能特別強大,大到像作者說的那樣有了max-pooling后什么約束就可以不用了,好像神器一樣。我不太贊同作者的觀點,一是它只是用了普通的AE(沒有其他任何的約束,純屬一個壓縮),且特征的個數不多,訓練樣本的個數也少,所以學習不到特征也是很正常的。
后面作者構建了一個含6個隱含層的深度網絡來對MNIST和CIFAR10這2個數據庫來做識別,使用的是沒有經過任何處理的raw數據。由於一開始作者已經得到結論只用max-pooling和標准AE,不用加噪聲,所以這個網絡也是按照他的結論設定的。第1個隱含層實現100個5*5的filter,第2個隱含層為2*2的max-pooling,第3個隱含層為150個5*5的filter,第4個隱含層也為2*2的max-pooling,第5個隱含層為200個3*3的filter,第6個隱含層有300個節點,實現全連接,最后的輸出層四softmax分類器。這個網絡適用於這2個數據庫,只是在CIFAR10數據庫是,由於它的數據庫是rgb的,所以講rgb分成3個通道的圖像分別輸入到剛剛那個6隱含層網絡中識別(這點比較有意思)。
下面是它的實驗結果:
總結:
從這篇文章(文章沒太多內容,沒必要細讀)沒有找到我要的2個問題的答案,不過個人推測它預訓練的過程有點像第一個問題我猜測的那樣。第二個問題,作者根本就沒有展開說(只是說用了5%的樣本進行有監督微調),可能是這個方法默認為大家都知道了吧。
所以后面打算讀CNN方面的文章,因為如果把CNN過程弄懂了,那么我的這2個問題就不是問題了,哈哈。
參考資料:
http://www.idsia.ch/~masci/software.php
Stacked Convolutional Auto-Encoders for Hierarchical Feature Extraction
