http://deeplearning.stanford.edu/wiki/index.php/%E6%A0%88%E5%BC%8F%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE%97%E6%B3%95php
逐層貪婪訓練法依次訓練網絡的每一層,進而預訓練整個深度神經網絡。在本節中,咱們將會學習如何將自編碼器「棧化」到逐層貪婪訓練法中,從而預訓練(或者說初始化)深度神經網絡的權重。算法
棧式自編碼神經網絡是一個由多層稀疏自編碼器組成的神經網絡,其前一層自編碼器的輸出做爲其後一層自編碼器的輸入。對於一個 層棧式自編碼神經網絡,咱們沿用自編碼器一章的各類符號,假定用
表示第
個自編碼器對應的
參數,那麼該棧式自編碼神經網絡的編碼過程就是,按照從前向後的順序執行每一層自編碼器的編碼步驟:網絡
同理,棧式神經網絡的解碼過程就是,按照從後向前的順序執行每一層自編碼器的解碼步驟:學習
其中, 是最深層隱藏單元的激活值,其包含了咱們感興趣的信息,這個向量也是對輸入值的更高階的表示。編碼
經過將 做爲softmax分類器的輸入特徵,能夠將棧式自編碼神經網絡中學到的特徵用於分類問題。spa
一種比較好的獲取棧式自編碼神經網絡參數的方法是採用逐層貪婪訓練法進行訓練。即先利用原始輸入來訓練網絡的第一層,獲得其參數 ;而後網絡第一層將原始輸入轉化成爲由隱藏單元激活值組成的向量(假設該向量爲A),接着把A做爲第二層的輸入,繼續訓練獲得第二層的參數
;最後,對後面的各層一樣採用的策略,即將前層的輸出做爲下一層輸入的方式依次訓練。3d
對於上述訓練方式,在訓練每一層參數的時候,會固定其它各層參數保持不變。因此,若是想獲得更好的結果,在上述預訓練過程完成以後,能夠經過反向傳播算法同時調整全部層的參數以改善結果,這個過程通常被稱做「微調(fine-tuning)」。code
實際上,使用逐層貪婪訓練方法將參數訓練到快要收斂時,應該使用微調。反之,若是直接在隨機化的初始權重上使用微調,那麼會獲得很差的結果,由於參數會收斂到局部最優。blog
若是你只對以分類爲目的的微調感興趣,那麼慣用的作法是丟掉棧式自編碼網絡的「解碼」層,直接把最後一個隱藏層的 做爲特徵輸入到softmax分類器進行分類,這樣,分類器(softmax)的分類錯誤的梯度值就能夠直接反向傳播給編碼層了。圖片
讓咱們來看個具體的例子,假設你想要訓練一個包含兩個隱含層的棧式自編碼網絡,用來進行MNIST手寫數字分類(這將會是你的下一個練習)。 首先,你須要用原始輸入 訓練第一個自編碼器,它可以學習獲得原始輸入的一階特徵表示
(以下圖所示)。
接着,你須要把原始數據輸入到上述訓練好的稀疏自編碼器中,對於每個輸入,均可以獲得它對應的一階特徵表示
。而後你再用這些一階特徵做爲另外一個稀疏自編碼器的輸入,使用它們來學習二階特徵
。(以下圖所示)
一樣,再把一階特徵輸入到剛訓練好的第二層稀疏自編碼器中,獲得每一個 對應的二階特徵激活值
。接下來,你能夠把這些二階特徵做爲softmax分類器的輸入,訓練獲得一個能將二階特徵映射到數字標籤的模型。
以下圖所示,最終,你能夠將這三層結合起來構建一個包含兩個隱藏層和一個最終softmax分類器層的棧式自編碼網絡,這個網絡可以如你所願地對MNIST數字進行分類。
棧式自編碼神經網絡具備強大的表達能力及深度神經網絡的全部優勢。
更進一步,它一般可以獲取到輸入的「層次型分組」或者「部分-總體分解」結構。爲了弄清這一點,回顧一下,自編碼器傾向於學習獲得能更好地表示輸入數據的特徵。所以,棧式自編碼神經網絡的第一層會學習獲得原始輸入的一階特徵(好比圖片裏的邊緣),第二層會學習獲得二階特徵,該特徵對應一階特徵裏包含的一些模式(好比在構成輪廓或者角點時,什麼樣的邊緣會共現)。棧式自編碼神經網絡的更高層還會學到更高階的特徵。
舉個例子,若是網絡的輸入數據是圖像,網絡的第一層會學習如何去識別邊,第二層通常會學習如何去組合邊,從而構成輪廓、角等。更高層會學習如何去組合更形象且有意義的特徵。例如,若是輸入數據集包含人臉圖像,更高層會學習如何識別或組合眼睛、鼻子、嘴等人臉器官。
張天雷(ztl2004@gmail.com), 鄧亞峯(dengyafeng@gmail.com), 許利傑(csxulijie@gmail.com)