深度網絡初探

基本概念

若是已經學過了以前的課程,深度網絡的概念很好理解:
git

在輸入層如輸出層之間加入若干由稀疏自編碼器(Sparse autoencoder)構成的隱藏層(Hidden layer,一般多於2層),造成一個多層人工神經網絡,是爲【深度網絡】,對這個網絡的訓練過程也稱爲【深度學習】。github

因爲每一個隱藏層都是一個稀疏自編碼器,它能對上層傳來的數據作特徵提取,所以多個隱藏層可以提取原數據的高階特徵,高階特徵就意味着更復雜的特徵。算法

使用深度網絡最主要的優點在於,它能以更加緊湊簡潔的方式來表達比淺層網絡大得多的函數集合。網絡

而且,這種【逐層抽象】的工做方式與大腦皮層是相似的。雖然沒有人知道模仿大腦是不是通向通用 AI 的必經之路,就比如飛機不必定像鳥同樣才能飛,可是就目前的實踐來看,深度網絡的效果還不錯。
機器學習


數學過程

逐層貪婪訓練方法

逐層貪婪算法的主要思路是每次只訓練網絡中的一層,即咱們首先訓練一個只含一個隱藏層的網絡,僅當這層網絡訓練結束以後纔開始訓練一個有兩個隱藏層的網絡,以此類推。
函數

即從第1個隱藏層開始,把上一層的數據做爲輸入訓練一個稀疏自編碼器,每次只訓練一層,直到把全部的隱藏層都訓練完成,最後再訓練輸出層(一般是一個分類器)。學習

這樣作有兩個好處:優化

  1. 只須要無標記數據,而無標記數據相比有標記數據廉價的多;編碼

  2. 能使參數位於解空間中較好的位置上,以這些位置爲起點開始梯度降低更有可能收斂到比較好的局部極值點,這是由於無標籤數據已經提供了大量輸入數據中包含的模式的先驗信息。spa

棧式自編碼算法

就是逐層訓練稀疏自編碼器的算法。該算法較簡單,其僞代碼描述:

for i = 1 : numberOfHiddenLayers
    if i==1
        使用全量數據訓練第i個隱藏層;
    else
        使用 features(i-1) 訓練第i個隱藏層;
    end
    features(i) = 第i個隱藏層從上游數據中提取的特徵;
end

使用 features(numberOfHiddenLayers) 訓練分類器;

微調多層自編碼算法

在逐層訓練完成後,參數已經被逐層初始化,此時將深度網絡做爲一個總體,構建代價函數並應用梯度降低等優化算法對參數進行進一步調整,是爲【微調】(fine-tuning)。

若是將 softmax 做爲最後的分類器,那麼 softmax 的代價函數就是整個網絡的代價函數:

不一樣的是這個代價函數不只是 θ 的函數,還隱性地包括了全部隱藏層的參數。在優化以前必須先計算 J 對全部參數的偏導數。

求導的過程以下:

使用前向傳播算法計算每一層的輸出

這一步在數學上和代碼上都不難。

使用反向傳播算法計算每一層的殘差

我認爲前向與反向傳播中有幾個要注意的點:

  1. 計算輸出層的殘差

    對每一條樣本都要計算在各層的殘差,而且在求導的時候使用單條樣本的代價函數。

  2. softmax 的訓練要計入截距項(bias term)

    在訓練隱藏層的時候,咱們把輸入數據和截距項的參數分開表示和計算(W 和 b),但在 softmax 中,一般把它們合在一塊兒統一表示(θ),至少本文是這麼作的,你也能夠實現一個分開表示的版本。

    所以傳給 softmax 數據須要在末尾增長一個維度,其值爲 +1,且參數初始化的時候要把截距項的參數包括進去。

  3. 高階特徵(深層自編碼器)的可視化

    這是一個相對目前教程進度更復雜的問題,因此課後做業並無要求將高階特徵可視化。但可視化能帶來的一個明顯好處就是提供對高階特徵的一個直觀表達,或人類能看懂的表達,因爲人類大腦皮層的工做方式相似,這也許還能幫助咱們理解大腦逐層的抽象原理。

    高階特徵可視化存在不止一種方法,已經有不少論文探討了這個問題:

    論文1 

    論文2

    知乎上的討論

    本文采用最簡單的「權值內積」方法來可視化深層特徵。

    我會再專門研究下這個問題,也許會再開一篇文章作一番更全面的討論。

計算 J 對每一個參數的偏導

惟一的難點就是向量化,若是已完成了 sparse autoencoder 和 softmax 的做業,只需將代碼複用便可。


課後做業

做業代碼

本章的課後做業將以前每章的代碼做爲不一樣部件整合起來造成一個深度網絡系統。其中的部件包括稀疏自編碼器、softmax分類器等自己就是相對小型的機器學習系統,因此整個訓練過程較複雜,容易出錯。

stackedAEExercise.m

stackedAECost.m

計算結果:

相關文章
相關標籤/搜索