接下來,我們將要介紹神經(jīng)網(wǎng)絡(luò)的訓(xùn)練算法:反向傳播算法。
反向傳播算法(Back Propagation)
我們首先直觀的介紹反向傳播算法,最后再來介紹這個算法的推導(dǎo)。當然讀者也可以完全跳過推導(dǎo)部分,因為即使不知道如何推導(dǎo),也不影響你寫出來一個神經(jīng)網(wǎng)絡(luò)的訓(xùn)練代碼。事實上,現(xiàn)在神經(jīng)網(wǎng)絡(luò)成熟的開源實現(xiàn)多如牛毛,除了練手之外,你可能都沒有機會需要去寫一個神經(jīng)網(wǎng)絡(luò)。
我們以監(jiān)督學(xué)習(xí)為例來解釋反向傳播算法。在《零基礎(chǔ)入門深度學(xué)習(xí)(2) - 線性單元和梯度下降》一文中我們介紹了什么是監(jiān)督學(xué)習(xí),如果忘記了可以再看一下。另外,我們設(shè)神經(jīng)元的激活函數(shù)f為sigmoid函數(shù)(不同激活函數(shù)的計算公式不同,詳情見反向傳播算法的推導(dǎo)一節(jié))。
我們假設(shè)每個訓(xùn)練樣本為(x,t),其中向量x是訓(xùn)練樣本的特征,而t是樣本的目標值。

首先,我們根據(jù)上一節(jié)介紹的算法,用樣本的特征x,計算出神經(jīng)網(wǎng)絡(luò)中每個隱藏層節(jié)點的輸出ai,以及輸出層每個節(jié)點的輸出yi。
然后,我們按照下面的方法計算出每個節(jié)點的誤差項:
對于輸出層節(jié)點,

其中,等號左邊是節(jié)點的誤差項,Yi是節(jié)點i的輸出值,ti是樣本對應(yīng)于節(jié)點i 的目標值。舉個例子,根據(jù)上圖,對于輸出層節(jié)點8來說,它的輸出值是y1,而樣本的目標值是t1,帶入上面的公式得到節(jié)點8的誤差項應(yīng)該是:

對于隱藏層節(jié)點,

其中,ai是節(jié)點i的輸出值,Wki是節(jié)點到它的下一層節(jié)點k的連接的權(quán)重,是節(jié)點i的下一層節(jié)點k的誤差項。例如,對于隱藏層節(jié)點4來說,計算方法如下:

最后,更新每個連接上的權(quán)值:



類似的,權(quán)重的更新方法如下:

偏置項的輸入值永遠為1。例如,節(jié)點4的偏置項應(yīng)該按照下面的方法計算:

我們已經(jīng)介紹了神經(jīng)網(wǎng)絡(luò)每個節(jié)點誤差項的計算和權(quán)重更新方法。顯然,計算一個節(jié)點的誤差項,需要先計算每個與其相連的下一層節(jié)點的誤差項。這就要求誤差項的計算順序必須是從輸出層開始,然后反向依次計算每個隱藏層的誤差項,直到與輸入層相連的那個隱藏層。這就是反向傳播算法的名字的含義。當所有節(jié)點的誤差項計算完畢后,我們就可以根據(jù)式5來更新所有的權(quán)重。
以上就是基本的反向傳播算法,并不是很復(fù)雜,您弄清楚了么?
反向傳播算法的推導(dǎo)
反向傳播算法其實就是鏈式求導(dǎo)法則的應(yīng)用。然而,這個如此簡單且顯而易見的方法,卻是在Roseblatt提出感知器算法將近30年之后才被發(fā)明和普及的。對此,Bengio這樣回應(yīng)道:
很多看似顯而易見的想法只有在事后才變得顯而易見。
接下來,我們用鏈式求導(dǎo)法則來推導(dǎo)反向傳播算法,也就是上一小節(jié)的式3、式4、式5。
前方高能預(yù)警——接下來是數(shù)學(xué)公式重災(zāi)區(qū),讀者可以酌情閱讀,不必強求。
按照機器學(xué)習(xí)的通用套路,我們先確定神經(jīng)網(wǎng)絡(luò)的目標函數(shù),然后用隨機梯度下降優(yōu)化算法去求目標函數(shù)最小值時的參數(shù)值。