對於一個擁有輸入層,隱藏層,輸出層的三層神經網絡,我們稱之為shallow learning,它處理輸入特征明顯的數據效果很好,但對於比較復雜的數據需要引入更多的隱藏層,因為每一個隱藏層可以看作對上一層輸出的非線性轉換,也就可以學習到更加復雜的模型。
但是單純的在原來三層網絡上曾加隱藏層並沒有帶來更好的效果,因為層數曾加以后使用梯度下降法優化的是一個高度非凸的優化問題,訓練誤差很容易陷入局部極值,還有通過反向傳導算法計算導數的時候,隨着網絡深度的增加,反向傳導的梯度幅值會急劇減小,使得網絡中最初幾層的權值在訓練過程中調整的幅度非常小,我在使用具體數據實驗時,曾加隱藏層的個數對於最終的結果幾乎沒影響,原因在於,對於深度網絡反向傳導時主要訓練的只是最后的logistic層,對於前面的幾層只是進行一些微調。
要解決上述問題我們需要預訓練深度網絡,即逐層的訓練參數,然后把預訓練完成的隱藏層級聯在一起,在這之前首先介紹自編碼器,它是一種無監督學習,通過自編碼器計算出的權重已收斂於合理的范圍之內,相比之前隨機的選擇權重明顯靠譜很多。
自編碼器
自編碼神經網絡是一種無監督學習算法,它使用反向傳播算法訓練權重值,比如下圖
可以看到輸入層與輸出層的神經元數量相等,自編碼神經網絡嘗試學習一個 的函數。換句話說,它嘗試逼近一個恆等函數,從而使得輸出
接近於輸入
。恆等函數雖然看上去不太有學習的意義,但是當我們為自編碼神經網絡加入某些限制,比如限定隱藏神經元的數量,我們就可以從輸入數據中發現一些有趣的結構。舉例來說,假設某個自編碼神經網絡的輸入
是一張
圖像(共100個像素)的像素灰度值,於是
,其隱藏層
中有50個隱藏神經元。注意,輸出也是100維的
。由於只有50個隱藏神經元,我們迫使自編碼神經網絡去學習輸入數據的壓縮表示,也就是說,它必須從50維的隱藏神經元激活度向量
中重構出100維的像素灰度值輸入
。如果網絡的輸入數據是完全隨機的,比如每一個輸入
都是一個跟其它特征完全無關的獨立同分布高斯隨機變量,那么這一壓縮表示將會非常難學習。但是如果輸入數據中隱含着一些特定的結構,比如某些輸入特征是彼此相關的,那么這一算法就可以發現輸入數據中的這些相關性。事實上,這一簡單的自編碼神經網絡通常可以學習出一個跟主元分析(PCA)結果非常相似的輸入數據的低維表示。
如果中間隱藏層是線性轉換,那么n個隱藏神經元就相當於輸入數據映射到最明顯的n個主元,而如果是非線性轉換,比如使用sigmoid激活函數,那么自編碼器就與PCA有所不同,特別是當多個自編碼器級聯在一起構成深度網絡的時候必須用非線性轉換來求激活值。
我們還可以在自編碼器上加上稀疏性的約束條件,一般來講數據稀疏更有利於表達數據的特性,如果神經元輸出接近於1,我們就認為是被激活的,接近於0就認為是被抑制的,要使數據盡量稀疏就要使被抑制的值遠多於被激活的值。我們在原來的優化函數中加上稀疏性的懲罰項如下。
式子中 是個比較小的常量值(比如0.05),
是第j個神經元的激活度,上面的懲罰項將對於兩個值有明顯差異的情況進行懲罰,從而使
逐漸靠近
。
為了使隱藏層發掘出更具泛化能力的特性和防止過擬合,以一定比例清零輸入數據,稱作去噪自編碼,它根據去噪后的數據編碼,再重構出輸入數據。可以理解為識別出被部分遮擋的某個物體。
具體實例:
首先輸入原始數據記為x,訓練完成后得到特征一與特征二 。
最后級聯訓練完的兩個隱藏層和softmax層,構成一個完整的自編碼網絡,使用反向傳播算法微調整個模型。