反向傳播算法詳細(xì)推導(dǎo)
反向傳播(英語(yǔ):Backpropagation,縮寫為BP)是“誤差反向傳播”的簡(jiǎn)稱,是一種與最優(yōu)化方法(如梯度下降法)結(jié)合使用的,用來(lái)訓(xùn)練人工神經(jīng)網(wǎng)絡(luò)的常見方法。該方法對(duì)網(wǎng)絡(luò)中所有權(quán)重計(jì)算損失函數(shù)的梯度。這個(gè)梯度會(huì)反饋給最優(yōu)化方法,用來(lái)更新權(quán)值以最小化損失函數(shù)。 在神經(jīng)網(wǎng)絡(luò)上執(zhí)行梯度下降法的主要算法。該算法會(huì)先按前向傳播方式計(jì)算(并緩存)每個(gè)節(jié)點(diǎn)的輸出值,然后再按反向傳播遍歷圖的方式計(jì)算損失函數(shù)值相對(duì)于每個(gè)參數(shù)的偏導(dǎo)數(shù)。
我們將以全連接層,激活函數(shù)采用 Sigmoid 函數(shù),誤差函數(shù)為 Softmax+MSE 損失函數(shù)的神經(jīng)網(wǎng)絡(luò)為例,推導(dǎo)其梯度傳播方式。
準(zhǔn)備工作
1、Sigmoid 函數(shù)的導(dǎo)數(shù)
回顧 sigmoid 函數(shù)的表達(dá)式:
其導(dǎo)數(shù)為:
可以看到,Sigmoid 函數(shù)的導(dǎo)數(shù)表達(dá)式最終可以表達(dá)為激活函數(shù)的輸出值的簡(jiǎn)單運(yùn)算,利
用這一性質(zhì),在神經(jīng)網(wǎng)絡(luò)的梯度計(jì)算中,通過緩存每層的 Sigmoid 函數(shù)輸出值,即可在需
要的時(shí)候計(jì)算出其導(dǎo)數(shù)。Sigmoid 函數(shù)導(dǎo)數(shù)的實(shí)現(xiàn):
import numpy as np # 導(dǎo)入 numpy
def sigmoid(x): # sigmoid 函數(shù)
return 1 / (1 + np.exp(-x))
def derivative(x): # sigmoid 導(dǎo)數(shù)的計(jì)算
return sigmoid(x)*(1-sigmoid(x))
2、均方差函數(shù)梯度
均方差損失函數(shù)表達(dá)式為:
其中為真實(shí)值,
為輸出值。則它的偏導(dǎo)數(shù)
可以展開為:
利用鏈?zhǔn)椒▌t分解為
僅當(dāng)
k = i 時(shí)才為 1,其他點(diǎn)都為0, 也就是說 只與第
i號(hào)節(jié)點(diǎn)相關(guān),與其他節(jié)點(diǎn)無(wú)關(guān),因此上式中的求和符號(hào)可以去掉,均方差的導(dǎo)數(shù)可以推導(dǎo)為
單個(gè)神經(jīng)元梯度
對(duì)于采用 Sigmoid 激活函數(shù)的神經(jīng)元模型,它的數(shù)學(xué)模型可以寫為
其中
- 變量的上標(biāo)表示層數(shù),如
表示第一個(gè)隱藏層的輸出
-
x表示網(wǎng)絡(luò)的輸入
單個(gè)神經(jīng)元模型如下圖所示
- 輸入節(jié)點(diǎn)數(shù)為
J- 其中輸入第
個(gè)節(jié)點(diǎn)到輸出
的權(quán)值連接記為
- 其中輸入第
- 上標(biāo)表示權(quán)值屬于的層數(shù),下標(biāo)表示當(dāng)前連接的起始節(jié)點(diǎn)號(hào)和終止節(jié)點(diǎn)號(hào)
- 如下標(biāo)
表示上一層的第
號(hào)節(jié)點(diǎn)到當(dāng)前層的 1 號(hào)節(jié)點(diǎn)
- 如下標(biāo)
- 未經(jīng)過激活函數(shù)的輸出變量為
,經(jīng)過激活函數(shù)之后的輸出為
- 由于只有一個(gè)輸出節(jié)點(diǎn),故

下面我們來(lái)計(jì)算均方差算是函數(shù)的梯度
由于單個(gè)神經(jīng)元只有一個(gè)輸出,那么損失函數(shù)可以表示為
添加 是為了計(jì)算方便,我們以權(quán)值連接的第
號(hào)節(jié)點(diǎn)的權(quán)值
為例,考慮損失函數(shù)
對(duì)其的偏導(dǎo)數(shù)
由于 ,由上面的推導(dǎo)可知 Sigmoid 函數(shù)的導(dǎo)數(shù)
把 寫成
由于
從上式可以看到,誤差對(duì)權(quán)值 的偏導(dǎo)數(shù)只與輸出值
、真實(shí)值
t 以及當(dāng)前權(quán)值連接的輸 有關(guān)
全鏈接層梯度
我們把單個(gè)神經(jīng)元模型推廣到單層全連接層的網(wǎng)絡(luò)上,如下圖所示。輸入層通過一個(gè)全連接層得到輸出向量 ,與真實(shí)標(biāo)簽向量
t 計(jì)算均方差。輸入節(jié)點(diǎn)數(shù)為 ,輸出節(jié)點(diǎn)數(shù)為
K 。

與單個(gè)神經(jīng)元不同,全鏈接層有多個(gè)輸出節(jié)點(diǎn) ,每個(gè)輸出節(jié)點(diǎn)對(duì)應(yīng)不同真實(shí)標(biāo)簽
,均方誤差可以表示為
由于 只與
有關(guān)聯(lián),上式中的求和符號(hào)可以去掉,即
將 帶入
考慮 函數(shù)的導(dǎo)數(shù)
將 記為
最終可得
由此可以看到,某條連接 上面的連接,只與當(dāng)前連接的輸出節(jié)點(diǎn)
,對(duì)應(yīng)的真實(shí)值節(jié)點(diǎn)的標(biāo)簽
,以及對(duì)應(yīng)的輸入節(jié)點(diǎn)
x 有關(guān)。
我們令 ,則
可以表達(dá)為
其中 變量表征連接線的終止節(jié)點(diǎn)的梯度傳播的某種特性,使用
表示后,
偏導(dǎo)數(shù)只與當(dāng)前連接的起始節(jié)點(diǎn)
,終止節(jié)點(diǎn)處
有關(guān),理解起來(lái)比較直觀。
反向傳播算法
看到這里大家也不容易,畢竟這么多公式哈哈哈,不過激動(dòng)的時(shí)刻到了
先回顧下輸出層的偏導(dǎo)數(shù)公式
多層全連接層如下圖所示
- 輸出節(jié)點(diǎn)數(shù)為
K,輸出 - 倒數(shù)的二層的節(jié)點(diǎn)數(shù)為
J,輸出為 - 倒數(shù)第三層的節(jié)點(diǎn)數(shù)為
I,輸出為

均方誤差函數(shù)
由于 通過每個(gè)輸出節(jié)點(diǎn)
與
相關(guān)聯(lián),故此處不能去掉求和符號(hào)
將 帶入
函數(shù)的導(dǎo)數(shù)
,繼續(xù)求導(dǎo),并將
寫回
對(duì)于 可以應(yīng)用鏈?zhǔn)椒▌t分解為
由圖可知 ,故有
所以
考慮到 與
k 無(wú)關(guān),可將其提取出來(lái)
再一次有 ,并利用
函數(shù)的導(dǎo)數(shù)
有
由于
其中 ,則
仿照輸出層的書寫方式,定義
此時(shí) 可以寫為當(dāng)前連接的起始節(jié)點(diǎn)的輸出值
與終止節(jié)點(diǎn)
的梯度信息
的簡(jiǎn)單相乘運(yùn)算:
通過定義 變量,每一層的梯度表達(dá)式變得更加清晰簡(jiǎn)潔,其中
可以簡(jiǎn)單理解為當(dāng)前連接
對(duì)誤差函數(shù)的貢獻(xiàn)值。
總結(jié)
輸出層:
倒數(shù)第二層:
倒數(shù)第三層:
其中 為倒數(shù)第三層的輸入,即倒數(shù)第四層的輸出
依照此規(guī)律,只需要循環(huán)迭代計(jì)算每一層每個(gè)節(jié)點(diǎn)的 等值即可求得當(dāng)前層的偏導(dǎo)數(shù),從而得到每層權(quán)值矩陣
的梯度,再通過梯度下降算法迭代優(yōu)化網(wǎng)絡(luò)參數(shù)即可。
好了,反向傳播算法推導(dǎo)完畢,代碼實(shí)現(xiàn)可以參考另一篇博客神經(jīng)網(wǎng)絡(luò)之動(dòng)手實(shí)現(xiàn)反向傳播(BP)算法