我們?nèi)【W(wǎng)絡(luò)所有輸出層節(jié)點的誤差平方和作為目標函數(shù):

其中,表示是樣本的誤差。
然后,我們用文章《零基礎(chǔ)入門深度學(xué)習(xí)(2) - 線性單元和梯度下降》中介紹的隨機梯度下降算法對目標函數(shù)進行優(yōu)化:

隨機梯度下降算法也就是需要求出誤差Ed對于每個權(quán)重Wji的偏導(dǎo)數(shù)(也就是梯度),怎么求呢?

觀察上圖,我們發(fā)現(xiàn)權(quán)重Wji僅能通過影響節(jié)點j的輸入值影響網(wǎng)絡(luò)的其它部分,設(shè)netj是節(jié)點j的加權(quán)輸入,即

Ed是netj的函數(shù),而netj是Wji的函數(shù)。根據(jù)鏈式求導(dǎo)法則,可以得到:

上式中,Xji是節(jié)點i傳遞給節(jié)點j的輸入值,也就是節(jié)點的輸出值。
對于

的推導(dǎo),需要區(qū)分輸出層和隱藏層兩種情況。
輸出層權(quán)值訓(xùn)練

考慮上式第一項:

考慮上式第二項:

將第一項和第二項帶入,得到:

如果令

,也就是一個節(jié)點的誤差項是網(wǎng)絡(luò)誤差對這個節(jié)點輸入的偏導(dǎo)數(shù)的相反數(shù)。帶入上式,得到:

上式就是式3。
將上述推導(dǎo)帶入隨機梯度下降公式,得到:

上式就是式5。
隱藏層權(quán)值訓(xùn)練

上式就是式4。
——數(shù)學(xué)公式警報解除——
至此,我們已經(jīng)推導(dǎo)出了反向傳播算法。需要注意的是,我們剛剛推導(dǎo)出的訓(xùn)練規(guī)則是根據(jù)激活函數(shù)是sigmoid函數(shù)、平方和誤差、全連接網(wǎng)絡(luò)、隨機梯度下降優(yōu)化算法。如果激活函數(shù)不同、誤差計算方式不同、網(wǎng)絡(luò)連接結(jié)構(gòu)不同、優(yōu)化算法不同,則具體的訓(xùn)練規(guī)則也會不一樣。但是無論怎樣,訓(xùn)練規(guī)則的推導(dǎo)方式都是一樣的,應(yīng)用鏈式求導(dǎo)法則進行推導(dǎo)即可。
神經(jīng)網(wǎng)絡(luò)的實現(xiàn)
現(xiàn)在,我們要根據(jù)前面的算法,實現(xiàn)一個基本的全連接神經(jīng)網(wǎng)絡(luò),這并不需要太多代碼。我們在這里依然采用面向?qū)ο笤O(shè)計。
首先,我們先做一個基本的模型:

如上圖,可以分解出5個領(lǐng)域?qū)ο髞韺崿F(xiàn)神經(jīng)網(wǎng)絡(luò):
Network 神經(jīng)網(wǎng)絡(luò)對象,提供API接口。它由若干層對象組成以及連接對象組成。
Layer 層對象,由多個節(jié)點組成。
Node 節(jié)點對象計算和記錄節(jié)點自身的信息(比如輸出值、誤差項等),以及與這個節(jié)點相關(guān)的上下游的連接。
Connection 每個連接對象都要記錄該連接的權(quán)重。