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

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

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

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

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

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