斯坦福大學(xué)機(jī)器學(xué)習(xí)斯坦福大學(xué)機(jī)器學(xué)習(xí)第九課“神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)(Neural Networks: Learning)”學(xué)習(xí)筆記,本次課程主要包括8部分:
1) Cost function(代價(jià)函數(shù))
2) Backpropagation algorithm(BP算法 or 反向傳播算法)
3) Backpropagation intuition(BP算法的直觀解釋)
4) Implementation note: Unrolling parameters(實(shí)現(xiàn)時(shí)的注意點(diǎn):展開參數(shù))
5) Gradient checking(梯度下降算法的驗(yàn)證)
6) Random initialization(隨機(jī)初始化)
7) Putting it together(組合到一起-如何訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò))
8) Backpropagation example: Autonomous driving (optional)(BP算法的例子-無人駕駛汽車)
以下是每一部分的詳細(xì)解讀。
1) Cost function(代價(jià)函數(shù))
首先回顧一下神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu):
其中:
訓(xùn)練集是:
L = 神經(jīng)網(wǎng)絡(luò)的層數(shù)
對(duì)于一個(gè)分類問題來說:
如果是一個(gè)二類分類(Binary classification),那么y = 0 或1,在神經(jīng)網(wǎng)絡(luò)的輸出層上只有一個(gè)輸出單元;
如果是一個(gè)多類分類(Multi-class classification), 那么
在神經(jīng)網(wǎng)絡(luò)的輸出層上有K個(gè)輸出單元。
Cost function:
在邏輯回歸中,Cost Function的定義相對(duì)簡(jiǎn)單,如下所示:
由于神經(jīng)網(wǎng)絡(luò)的輸出層通常有多個(gè)輸出,屬于k維向量,因此用如下的方式定義神經(jīng)網(wǎng)絡(luò)的Cost function:
注意,對(duì)于訓(xùn)練集的每一個(gè)樣本,都需要對(duì)輸出層所有的輸出單元計(jì)算cost并求和。
2) Backpropagation algorithm(BP算法 or 反向傳播算法)
和線性回歸或邏輯回歸相似,求取神經(jīng)網(wǎng)絡(luò)的參數(shù)也可以采用梯度下降算法,但是和它們二者略微不同的是,神經(jīng)網(wǎng)絡(luò)相對(duì)復(fù)雜,如果計(jì)算它的梯度?
我們知道,神經(jīng)網(wǎng)絡(luò)的Cost function是:
目標(biāo)是最小化Cost function:
我們需要通過如下兩個(gè)式子來計(jì)算梯度:
在上一課“神經(jīng)網(wǎng)絡(luò)的表示”里,我們給出了前饋網(wǎng)絡(luò)的計(jì)算方法(向量化實(shí)現(xiàn)),對(duì)于一個(gè)給定訓(xùn)練樣本(x, y)的神經(jīng)網(wǎng)絡(luò),首先通過“前向傳播”的方式從輸入層開始計(jì)算神經(jīng)網(wǎng)絡(luò)的每一層表示,直到輸出層。例如對(duì)于如下的4層神經(jīng)網(wǎng)絡(luò):
計(jì)算的方法如下:
有了神經(jīng)網(wǎng)絡(luò)的“表示”,如何計(jì)算梯度?這個(gè)時(shí)候,我們引入反向傳播算法,簡(jiǎn)稱BP算法。反向算法的核心是最小化網(wǎng)絡(luò)輸出值和目標(biāo)值之間的“誤差”,所以這里首先引入一個(gè)關(guān)于誤差的記號(hào):
對(duì)于神經(jīng)網(wǎng)絡(luò)輸出層的單元來說,例如上例中的第4層,誤差的計(jì)算比較直觀:
但是對(duì)于隱藏層的誤差計(jì)算,就不那么直觀了:
注:有志于弄清楚為什么的同學(xué)可以參考Mitchell教授的經(jīng)典書籍《機(jī)器學(xué)習(xí)》的第四章“人工神經(jīng)網(wǎng)絡(luò)”,有詳細(xì)的說明。
現(xiàn)在我們可以給出一個(gè)完成的BP算法,至于BP算法的一些解釋和說明,將會(huì)在之后的小節(jié)給出:
我們需要計(jì)算每個(gè)節(jié)點(diǎn)的梯度,這里通過反向傳播算法達(dá)到了。
補(bǔ)充:關(guān)于前饋網(wǎng)絡(luò)和BP神經(jīng)網(wǎng)絡(luò)的關(guān)系,可以參考這篇文章中的解釋:
我們最常用的神經(jīng)網(wǎng)絡(luò)就是BP網(wǎng)絡(luò),也叫多層前饋網(wǎng)絡(luò)。BP是back propagation的所寫,是反向傳播的意思。我以前比較糊涂,因?yàn)橐恢辈焕斫鉃樯兑粫?huì)叫前饋網(wǎng)絡(luò),一會(huì)叫BP(反向傳播)網(wǎng)絡(luò),不是矛盾嗎?其實(shí)是 這樣的,前饋是從網(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ò)的強(qiáng)大威力:
1)任何的布爾函數(shù)都可以由兩層單元的網(wǎng)絡(luò)準(zhǔn)確表示,但是所需的隱藏層神經(jīng)元的數(shù)量隨網(wǎng)絡(luò)輸入數(shù)量呈指數(shù)級(jí)增長(zhǎng);
2)任意連續(xù)函數(shù)都可由一個(gè)兩層的網(wǎng)絡(luò)以任意精度逼近。這里的兩層網(wǎng)絡(luò)是指隱藏層使用sigmoid單元、輸出層使用非閾值的線性單元;
3)任意函數(shù)都可由一個(gè)三層的網(wǎng)絡(luò)以任意精度逼近。其兩層隱藏層使用sigmoid單元、輸出層使用非閾值的線性單元。【注】參考自《機(jī)器學(xué)習(xí)》
3) Backpropagation intuition(BP算法的直觀解釋)
相對(duì)于線性回歸或邏輯回歸來說,BP算法不是很簡(jiǎn)潔和清晰,這一小節(jié)將解釋神經(jīng)網(wǎng)絡(luò)BP算法的一些步驟,希望對(duì)大家直觀的了解BP算法有一些幫助。不過Andrew Ng教授也說了:
And even though, you know, I have used back prop for many years, sometimes it's a difficult algorithm to understand.
首先從前向傳播說起,下面是一個(gè)前饋神經(jīng)網(wǎng)絡(luò)的例子:
對(duì)于這個(gè)神經(jīng)網(wǎng)絡(luò)來說,它有4層,除了輸出層只有1個(gè)單元外,其他每層都有2個(gè)單元(除去偏置單元)。對(duì)于一個(gè)訓(xùn)練樣本
那么反向傳播到底在做什么?首先簡(jiǎn)化神經(jīng)網(wǎng)絡(luò)的代價(jià)函數(shù):
我們僅關(guān)注一個(gè)樣本\(x^{(i)}, y^{(i)},并且僅針對(duì)一個(gè)輸出單元的神經(jīng)網(wǎng)絡(luò)(上例),同時(shí)忽略正則化(\(\lambda = 0), 這樣Cost function可以簡(jiǎn)化為如下的形式:
那么對(duì)于樣本i, BP算法在神經(jīng)網(wǎng)絡(luò)上是如何生效的? 如果記
其中:
BP算法主要是從輸出層反向計(jì)算各個(gè)節(jié)點(diǎn)的誤差的,故稱之為反向傳播算法,對(duì)于上例,計(jì)算的過程如下圖所示:
注:這里有些細(xì)節(jié)沒有詳細(xì)描述,具體的可參考視頻課程或者M(jìn)itchell教授的經(jīng)典書籍《機(jī)器學(xué)習(xí)》的第四章“人工神經(jīng)網(wǎng)絡(luò)”。
4) Implementation note: Unrolling parameters(實(shí)現(xiàn)時(shí)的注意點(diǎn):展開參數(shù))
本節(jié)主要講的是利用octave實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)算法的一個(gè)小技巧:將多個(gè)參數(shù)矩陣展開為一個(gè)向量。具體可以參考課程視頻,此處略。
5) Gradient checking(梯度下降算法的驗(yàn)證)
神經(jīng)網(wǎng)絡(luò)算法是一個(gè)很復(fù)雜的算法,所以有必要在實(shí)現(xiàn)的時(shí)候做一些檢查,本節(jié)給出一個(gè)檢驗(yàn)梯度的數(shù)值化方法。
關(guān)于梯度,有一種比較簡(jiǎn)便的數(shù)值估計(jì)方法,例如,對(duì)于一元參數(shù)來說:
可以用如下公式近似估計(jì)梯度:
其中
同理,對(duì)于多元參數(shù)或參數(shù)向量來說,上述方法同樣適用:
我們的主要目標(biāo)是檢查這個(gè)梯度的近似向量與反向傳播算法得到的梯度向量是否近似相等:
實(shí)現(xiàn)時(shí)的注意點(diǎn):
特別重要的是:
6) Random initialization(隨機(jī)初始化)
關(guān)于如何學(xué)習(xí)一個(gè)神經(jīng)網(wǎng)絡(luò)的細(xì)節(jié)到目前為止基本說完了,不過還有一點(diǎn)需要注意,就是如何初始化參數(shù)向量or矩陣。通常情況下,我們會(huì)將參數(shù)全部初始化為0,這對(duì)于很多問題是足夠的,但是對(duì)于神經(jīng)網(wǎng)絡(luò)算法,會(huì)存在一些問題,以下將會(huì)詳細(xì)的介紹。
對(duì)于梯度下降和其他優(yōu)化算法,對(duì)于參數(shù)
在神經(jīng)網(wǎng)絡(luò)中:
如果將參數(shù)全部初始化為0:
會(huì)導(dǎo)致一個(gè)問題,例如對(duì)于上面的神經(jīng)網(wǎng)絡(luò)的例子,如果將參數(shù)全部初始化為0,在每輪參數(shù)更新的時(shí)候,與輸入單元相關(guān)的兩個(gè)隱藏單元的結(jié)果將是相同的,既:
這個(gè)問題又稱之為對(duì)稱的權(quán)重問題,因此我們需要打破這種對(duì)稱,這里提供一種隨機(jī)初始化參數(shù)向量的方法: 初始化
7) Putting it together(組合到一起-如何訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò))
關(guān)于神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,我們已經(jīng)談到了很多,現(xiàn)在是時(shí)候?qū)⑺鼈兘M合到一起了。那么,如何訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)?
首先需要確定一個(gè)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)-神經(jīng)元的連接模式, 包括:
在確定好神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)后,我們按如下的步驟訓(xùn)練神經(jīng)網(wǎng)絡(luò):
1. 隨機(jī)初始化權(quán)重參數(shù);
2. 實(shí)現(xiàn):對(duì)于每一個(gè)
3. 實(shí)現(xiàn):計(jì)算代價(jià)函數(shù)
4. 實(shí)現(xiàn):反向傳播算法用于計(jì)算偏導(dǎo)數(shù)
5. 使用梯度檢查來比較反向傳播算法計(jì)算的
6. 在反向傳播的基礎(chǔ)上使用梯度下降或其他優(yōu)化算法來最小化
8) Backpropagation example: Autonomous driving (optional)(BP算法的例子-無人駕駛汽車)
關(guān)于通過神經(jīng)網(wǎng)絡(luò)來實(shí)現(xiàn)一個(gè)無人駕駛汽車的例子,請(qǐng)大家參考課程視頻,此處略。
參考資料:
機(jī)器學(xué)習(xí)視頻可以在Coursera機(jī)器學(xué)習(xí)課程上觀看或下載: https://class.coursera.org/ml
http://en.wikipedia.org/wiki/Backpropagation
Mitchell教授的經(jīng)典書籍《機(jī)器學(xué)習(xí)》
聯(lián)系客服