本節參考的是網頁http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial中關於Building Deep Networks for Classification一節的介紹。分下面2大部分內容:
1. 從self-taught到deep networks:
從前面的關於self-taught learning介紹(Deep learning:十五(Self-Taught Learning練習))可以看到,該ML方法在特征提取方面是完全用的無監督方法,本次要講的就是在上面的基礎上再用有監督的方法繼續對網絡的參數進行微調,這樣就可以得到更好的效果了。把self-taught learning的兩個步驟合在一起的結構圖如下所示:
很顯然,上面是一個多層神經網絡,三層。
一般的,前面的無監督學習到的模型參數可以當做是有監督學習參數的初始化值,這樣當我們用有大量的標注了的數據時,就可以采用梯度下降等方法來繼續優化參數了,因為有了剛剛的初始化參數,此時的優化結果一般都能收斂到比較好的局部最優解。如果是隨機初始化模型的參數值的話,那么在多層神經網絡中一般很難收斂到局部較好值,因為多層神經網絡的系統函數是非凸的。
那么該什么時候使用微調技術來調整無監督學習的結果呢?只有我們有大量標注的樣本下才可以。當我們有大量無標注的樣本,但有一小部分標注的樣本時也是不適合使用微調技術的。如果我們不想使用微調技術的話,那么在第三層分類器的設計時,應該采用級聯的表達方式,也就是說學習到的結果和原始的特征值一起輸入。當然了,如果采用了微調技術,則效果更好,就不需要繼續用級聯的特征表達了。
2. Deep networks小綜述:
如果使用多層神經網絡的話,那么將可以得到對輸入更復雜的函數表示,因為神經網絡的每一層都是上一層的非線性變換。當然,此時要求每一層的activation函數是非線性的,否則就沒有必要用多層了。
Deep networks的優點:
一、比單層神經網絡能學習到更復雜的表達。比如說用k層神經網絡能學習到的函數(且每層網絡節點個數時多項式的)如果要用k-1層神經網絡來學習,則這k-1層神經網絡節點的個數必須是指數級龐大的數字。
二、不同層的網絡學習到的特征是由最底層到最高層慢慢上升的。比如在圖像的學習中,第一個隱含層層網絡可能學習的是邊緣特征,第二隱含層就學習到的是輪廓什么的,后面的就會更高級有可能是圖像目標中的一個部位,也就是是底層隱含層學習底層特征,高層隱含層學習高層特征。
三、這種多層神經網絡的結構和人體大腦皮層的多層感知結構非常類似,所以說有一定的生物理論基礎。
Deep networks的缺點:
一、網絡的層次越深,所需的訓練樣本數越多,如果是用有監督學習的話,那么這些樣本就更難獲取,因為要進行各種標注。但是如果樣本數太少的話,就很容易產生過擬合現象。
二、因為多層神經網絡的參數優化問題是一個高階非凸優化問題,這個問題通常收斂到一個比較差的局部解,普通的優化算法一般都效果不好。也就是說,參數的優化問題是個難點。
三、梯度擴散問題。因為當網絡層次比較深時,在計算損失函數的偏導時一般需要使用BP算法,但是這些梯度值隨着深度慢慢靠前而顯著下降,這樣導致前面的網絡對最終的損失函數的貢獻很小。這樣的話前面的權值更新速度就非常非常慢了。一個理論上比較好的解決方法是將后面網絡的結構的神經元的個數提高非常多,以至於它不會影響前面網絡的結構的學習。但這樣豈不是和低深度的網絡結構一樣了嗎?所以不妥。
所以一般都是采用的層次貪婪訓練方法來訓練網絡的參數,即先訓練網絡的第一個隱含層,然后接着訓練第二個,第三個…最后用這些訓練好的網絡參數值作為整體網絡參數的初始值。這樣的好處是數據更容易獲取,因為前面的網絡層次基本都用無監督的方法獲得,很容易,只有最后一個輸出層需要有監督的數據。另外由於無監督學習其實隱形之中已經提供了一些輸入數據的先驗知識,所以此時的參數初始化值一般都能得到最終比較好的局部最優解。比較常見的一種層次貪婪訓練方法就是stacked autoencoders。它的編碼公式如下所示:
解碼公式如下:
最后的就是用stacked autoencoders學習到的參數來初始化整個網絡了,此時整個網絡可以看做是一個單一的神經網絡模型,只是它是多層的而已,而通常的BP算法是對任意層的網絡都有效的。最后的參數調整步驟和前面學習到的稀疏編碼模型是一樣的。其過程截圖如下:
參考資料:
http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial
Deep learning:十五(Self-Taught Learning練習)