Machine Learning - Andrew Ng on Coursera (Week 5)
本篇文章將分享Coursera上Andrew Ng的Machine Learning第五周的課程,主要內容有如下,詳細內容可以參考文末附件:
- 代價函數及后向算法
- Cost function(代價函數)
- Backpropagation algorithm(BP算法 or 反向傳播算法)
- 后向算法求解神經網絡模型
- Implementation note: Unrolling parameters(實現時的注意點:展開參數)
- Gradient checking(梯度下降算法的驗證)
- Random initialization(隨機初始化)
- Putting it together(組合到一起-如何訓練一個神經網絡)
- Backpropagation example: Autonomous driving (optional)(BP算法的例子-無人駕駛汽車)
代價函數及后向算法
COST FUNCTION(代價函數)
首先回顧一下神經網絡的結構:

其中:
訓練集是:[Math Processing Error]
[Math Processing Error]?= 神經網絡的層數
[Math Processing Error]?= 第[Math Processing Error]層的單元個數(不包括偏置單元)
對于一個分類問題來說:
如果是一個二類分類(Binary classification),那么[Math Processing Error]或者[Math Processing Error],在神經網絡的輸出層上只有一個輸出單元;如果是一個多類分類(Multi-class classification), 那么在神經網絡的輸出層上有K個輸出單元。
在邏輯回歸中,Cost Function的定義相對簡單,如下所示:
[Math Processing Error]
由于神經網絡的輸出層通常有多個輸出,屬于[Math Processing Error]維向量,因此用如下的方式定義神經網絡的Cost function:
[Math Processing Error]
[Math Processing Error]
[Math Processing Error]
注意,對于訓練集的每一個樣本,都需要對輸出層所有的輸出單元計算cost并求和。
BACKPROPAGATION ALGORITHM(BP算法 OR 反向傳播算法)
和線性回歸或邏輯回歸相似,求取神經網絡的參數也可以采用梯度下降算法,但是和它們二者略微不同的是,神經網絡相對復雜。前面已經給出神經網絡的代價函數,目標是最小化代價函數:
[Math Processing Error]
我們需要通過如下兩個式子來計算梯度:
- [Math Processing Error]
- [Math Processing Error]
在上一課“神經網絡的表示”里,我們給出了前饋網絡的計算方法(向量化實現),對于一個給定訓練樣本(x, y)的神經網絡,首先通過“前向傳播”的方式從輸入層開始計算神經網絡的每一層表示,直到輸出層。
在計算梯度時,我們引入反向傳播算法,簡稱BP算法。反向算法的核心是最小化網絡輸出值和目標值之間的“誤差”,所以這里首先引入一個關于誤差的記號:
[Math Processing Error]層?[Math Processing Error]節點的誤差(error)
注:有志于弄清楚為什么的同學可以參考Mitchell教授的經典書籍《機器學習》的第四章“人工神經網絡”,有詳細的說明。
如下給出了一個完整的BP算法的流程偽代碼:

我們需要計算每個節點的梯度,這里通過反向傳播算法達到了。
補充:
我們最常用的神經網絡就是BP網絡,也叫多層前饋網絡。BP是back propagation的所寫,是反向傳播的意思。我以前比較糊涂,因為一直不理解為啥一會叫前饋網絡,一會叫BP(反向傳播)網絡,不是矛盾嗎?其實是 這樣的,前饋是從網絡結構上來說的,是前一層神經元單向饋入后一層神經元,而后面的神經元沒有反饋到之前的神經元;而BP網絡是從網絡的訓練方法上來說 的,是指該網絡的訓練算法是反向傳播算法,即神經元的鏈接權重的訓練是從最后一層(輸出層)開始,然后反向依次更新前一層的鏈接權重。因此二者并不矛盾, 只是我沒有理解其精髓而已。
隨便提一下BP網絡的強大威力:
【注】參考自《機器學習》
后向算法求解神經網絡模型
相對于線性回歸或邏輯回歸來說,BP算法不是很簡潔和清晰,需要大家能明確區分的就是前向和后向算法。
首先從前向傳播說起,下面是一個前饋神經網絡的例子:

對于這個神經網絡來說,它有4層,除了輸出層只有1個單元外,其他每層都有2個單元(除去偏置單元)。對于一個訓練樣本[Math Processing Error]來說,可以通過前向傳播的方式計算各個相關單元,就是由輸入計算分類結果的過程。
而反向傳播到底在做什么?首先簡化神經網絡的代價函數,假設僅關注一個樣本[Math Processing Error],并且僅針對一個輸出單元的神經網絡,同時忽略正則化([Math Processing Error]),這樣代價函數可以簡化為如下的形式:
[Math Processing Error]
那么對于樣本[Math Processing Error], 如果記
[Math Processing Error]層?[Math Processing Error]節點[Math Processing Error]的誤差(error)。而[Math Processing Error]。
BP算法主要是從輸出層反向計算各個節點的誤差的,故稱之為反向傳播算法,對于上例,計算的過程如下圖所示:

注:這里有些細節沒有詳細描述,具體的可參考視頻課程或者Mitchell教授的經典書籍《機器學習》的第四章“人工神經網絡”。
IMPLEMENTATION NOTE: UNROLLING PARAMETERS(實現時的注意點:展開參數)
本節主要講的是利用octave實現神經網絡算法的一個小技巧:將多個參數矩陣展開為一個向量。具體可以參考課程視頻和文末PPT,此處略。
GRADIENT CHECKING(梯度下降算法的驗證)
神經網絡算法是一個很復雜的算法,所以有必要在實現的時候做一些檢查,本節給出一個檢驗梯度的數值化方法。
關于梯度,有一種比較簡便的數值估計方法,例如,對于一元參數來說:

可以用如下公式近似估計梯度:
[Math Processing Error]
其中[Math Processing Error]取較小的值。
同理,對于多元參數或參數向量來說,上述方法同樣適用。我們的主要目標是檢查這個梯度的近似向量與反向傳播算法得到的梯度向量是否近似相等。
實現時的注意點:
- 首先實現反向傳播算法來計算梯度向量DVec;
- 其次實現梯度的近似gradApprox;
- 確保以上兩步計算的值是近似相等的;
- 在實際的神經網絡學習時使用反向傳播算法,并且關掉梯度檢查。
特別重要的是:
- 一定要確保在訓練分類器時關閉梯度檢查的代碼。如果你在梯度下降的每輪迭代中都運行數值化的梯度計算,你的程序將會非常慢。
RANDOM INITIALIZATION(隨機初始化)
還有一點需要注意,就是如何初始化參數向量、矩陣。通常情況下,我們會將參數全部初始化為0,這對于很多問題是足夠的,但是對于神經網絡算法,可能會存在一些問題。
對于梯度下降和其他優化算法,對于參數[Math Processing Error]向量的初始化是必不可少的。在神經網絡中,如果將參數全部初始化為0,可能會導致在每輪參數更新的時候,與輸入單元相關的兩個隱藏單元的結果將是相同的,即:
[Math Processing Error]
這個問題又稱之為對稱的權重問題,因此我們需要打破這種對稱,這里提供一種隨機初始化參數向量的方法:
初始化[Math Processing Error]為一個落在[Math Processing Error]區間內的隨機數,[Math Processing Error]可以很小,但是與梯度檢驗中的[Math Processing Error]沒有任何關系。
PUTTING IT TOGETHER(組合到一起-如何訓練一個神經網絡)
首先需要確定一個神經網絡的結構-神經元的連接模式,包括:
- 輸入單元的個數:特征 x(i) 的維數;
- 輸出單元的格式:類的個數
- 隱藏層的設計:比較合適的是1個隱藏層,如果隱藏層數大于1,確保每個隱藏層的單元個數相同,通常情況下隱藏層單元的個數越多越好。
在確定好神經網絡的結構后,我們按如下的步驟訓練神經網絡:
Backpropagation example: Autonomous driving (optional)(BP算法的例子-無人駕駛汽車)
關于通過神經網絡來實現一個無人駕駛汽車的例子,請大家參考課程視頻,此處略。
附本次演示文檔:ML-Coursera-Week5
總結
以上是生活随笔為你收集整理的Machine Learning - Andrew Ng on Coursera (Week 5)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Machine Learning - A
- 下一篇: Machine Learning - A