BP神經網路優化方程式的推導

以MNIST數據集(手寫阿拉伯數字圖像,)為例,每幅圖像含有28times 28個像素。每幅圖像對應一個標籤,一共有10個標答,分別為數字0-9。設計神經網路如下圖所示:

圖像x包含p個像素{x_1,...,x_p}x_iin left[ 0,1 right] ,在本例中p=28times 28=784。每個像素對應一個輸入層神經元,第i個神經元的輸出值即為x_ii=1,...,p

隱含層包含n個神經元,接受來自輸入層的輸出值,在本例中設定n=15。每個神經元包含p個權重和1個偏置。權重用w^H_{ji}表示,偏置用b^H_j表示,其中j=1,...,ni=1,...,pH不是變數,僅表示這些權重和偏置屬於隱含層。隱含層第j個神經元的輸出值為:

H_j=sigmaleft(sum_{i=1}^pleft(w^H_{ji}x_iright)+b^H_jright)

其中sigma (z)=frac{1}{1+e^{-z}}

從直觀的角度理解上述公式,隱含層各神經元的輸出就是將接受到的所有輸入加權求和,並加一個偏置值。sigma 函數的功能是使得輸出值H_j限定在left[0,1right] 之間。

輸出層包含m個神經元,接受來自隱含層的輸出值,在本例中設定m=10,對應0,...,9這10個數字。每個神經元包含n個權重和1個偏置。權重用w^O_{kj}表示,偏置用b^O_k表示,其中k=1,...,mj=1,...,nO不是變數,僅表示這些權重和偏置屬於輸出層。輸出層第k個神經元的輸出值為:

O_k=sum_{j=1}^nleft(w^O_{kj}H_j+b^O_kright)

輸出值O_k表示輸入的圖像x的標籤為第k個標籤的可能性。

對於一個輸入的訓練圖像x,其真實標籤為第Y個標籤,那麼可以用一個m維的向量y表示x所屬的標籤:y(x)={y_1,...,y_m},其中:

left{begin{matrix}n   y_k=0, & Yne k n   y_k=1, & Y=kn  end{matrix}right.

神經網路的輸出結果與真實值之間的差為E=left{e_1,...,e_mright} ,其中 e_k=y_k-O_k,設計代價函數:C=frac{1}{2}e_k^2 ,展開得:

C=frac{1}{2}sum_{k=1}^mleft(y_k-O_kright)^2

用梯度下降法優化隱含層和輸出層的各個權重和偏置,使得代價函數值最小。

1) 首先對輸出層的權重w^O_{kj}求偏導:

frac{partial C}{partial w^O_{kj}}=sum_{k=1}^mleft(-left(y_{k}-O_{k}right)frac{partial O_{k}}{partial w^O_{kj}}right)

注意當kne kfrac{partial O_{k}}{partial w^O_{kj}}=0,因此有:

frac{partial C}{partial w^O_{kj}}=-e_kfrac{partial O_{k}}{partial w^O_{kj}}=-e_kH_j

2) 對輸出層偏置b^O_k求偏導:

frac{partial C}{partial b^O_k}=sum_{k=1}^mleft(-left(y_{k}-O_{k}right)frac{partial O_{k}}{partial b^O_k}right)

注意當kne kfrac{partial O_{k}}{partial b^O_k}=0,因此有:

frac{partial C}{partial b^O_k}=-e_kfrac{partial O_{k}}{partial b^O_k}=-e_k

3) 對隱含層的權重w^H_{ji}求偏導:

frac{partial C}{partial w^H_{ji}}=sum_{k=1}^mleft(-left(y_{k}-O_{k}right)frac{partial O_k}{partial H_j}frac{partial H_j}{partial w^H_{ji}}right)=sum_{k=1}^mleft(-e_kfrac{partial O_k}{partial H_j}frac{partial H_j}{partial w^H_{ji}}right)

其中frac{partial O_k}{partial H_j}=sum_{j=1}^nfrac{partialleft(w^O_{kj}H_{j}right)}{partial H_j}=w^O_{kj} (當jne jfrac{partialleft(w^O_{kj}H_{j}right)}{partial H_j}=0

z_j=sum_{i=1}^pleft(w^H_{ji}x_i+b^H_jright) ,有frac{partial H_j}{partial w^H_{ji}}=frac{partial sigma(z_j)}{partial z_j}frac{partial z_j}{partial w^H_{ji}}

因為frac{dsigma(z)}{dz}=left(frac{1}{1+e^{-z}}right)=frac{-e^{-z}}{left(1+e^{-z}right)^2}=frac{1}{1+e^{-z}}left(1-frac{1}{1+e^{-z}}right)=sigma(z)left(1-sigma(z)right),所以有frac{partial sigma}{partial z_j}=H_j(1-Hj)

frac{partial z_j}{partial w^H_{ji}}=frac{partial sum_{i=1}^pleft(w^H_{ji}x_i+b^H_jright)}{partial w^H_{ji}}=x_i (當ine ifrac{partial sum_{i=1}^pleft(w^H_{ji}x_i+b^H_jright)}{partial w^H_{ji}}=0

所以,frac{partial C}{partial w^H_{ji}}=sum_{k=1}^mleft(-e_kw^O_{kj}H_j(1-H_j)x_iright)=-H_j(1-H_j)x_isum_{k=1}^mleft(e_kw^O_{kj}right)

4) 對隱含層的偏置b^H_j求偏導:

與前述過程類似,frac{partial C}{partial b^H_j}=sum_{k=1}^mleft(-e_kw^O_{kj}frac{partial H_j}{partial b^H_j}right),其中frac{partial H_j}{partial b^H_j}=H_j(1-H_j),得到

frac{partial C}{partial b^H_j}=-H_j(1-H_j)sum_{k=1}^mleft(e_kw^O_{kj}right)

訓練數據集是由一組圖像構成,對於訓練集的代價函數可以設定為每個圖像代價函數的平均,那麼不難得出,訓練集的代價函數的上述4個偏導數也是圖像對應偏導數的平均。

根據上述4個偏導數分別修正隱含層和輸出層的各個權重和偏置(沿負梯度方向下降):

bar{w}^O_{kj}=w^O_{kj}+eta e_kH_j

bar{b}^O_k=b^O_k+eta e_k

bar{w}^H_{ji}=w^H_{ji}+eta H_j(1-H_j)x_isum_{k=1}^mleft(e_kw^O_{kj}right)

bar{b}^H_j=b^H_j+eta H_j(1-H_j)sum_{k=1}^mleft(e_kw^O_{kj}right)

但對於多層網路,用如上方式求導就過於繁複了,為了簡化這一過程,我們先給出一個delta 的定義:

delta^l_k=frac{partial C}{partial z^l_k}

其中l是層,輸入層l=1,輸出層l=L。那麼對於輸出層有:

delta^L_k=frac{partial C}{partial z^L_k}=frac{partial C}{partial a^L_k}frac{partial a^L_k}{partial z^L_k}

對於二範數形式的代價函數C=frac{1}{2}sum_{k=1}^mleft(y_k-O_kright)^2,有:frac{partial C}{partial a^L_k}=-e_k

根據網路的層次結構可設:z^{l+1}_k=sum_{j=1}^pleft(w^{l+1}_{kj}a^l_jright),且:C=g^{l+1}left(z^{l+1}_1,dots,z^{l+1}_qright),其中l層和l+1層神經元的數量分別為pq,那麼應用偏導數的鏈式法則可得:

delta^l_j=frac{partial C}{partial z^l_j}=sum_{k=1}^qleft(frac{partial C}{partial z^{l+1}_k}frac{partial z^{l+1}_k}{partial z^l_j}right)=sum_{k=1}^qleft(delta^{l+1}_kw^{l+1}_{kj}sigma(z^l_j)right)

此時我們發現,delta^l_j的計算只依賴於l層的計算結果和left(delta^{l+1}_1,dots,delta^{l+1}_qright),太棒了!這樣我們就可以遞推式的計算每一層的delta^l_j了。在算得delta^l_j後,容易得到:frac{partial C}{partial b^l_j}=delta^l_j,以及:frac{partial C}{partial w^l_{kj}}=delta^l_ja^{l-1}_k,這就形成了BP網路的四個方程式:

(1)delta^L_k=frac{partial C}{partial a^L_k}frac{partial a^L_k}{partial z^L_k}

(2)delta^l_j=sigma(z^l_j)sum_{k=1}^qleft(w^{l+1}_{kj}delta^{l+1}_kright)

(3)frac{partial C}{partial b^l_j}=delta^l_j

(4)frac{partial C}{partial w^l_{kj}}=delta^l_ja^{l-1}_k

舉個例子:如果我們在輸出層採用了SoftMax函數,形式如下:

a^L_j=s(z^L_j)=frac{e^{z^L_j}}{sum_{k=1}^{p}e^{z^L_k}}

那麼:

frac{partial a^L_k}{partial z^L_k}=frac{sum_{k=1}^{p}e^{z^L_{k}}-e^{z^L_k}}{left(sum_{k=1}^{p}e^{z^L_{k}}right)^2}e^{z^L_k}=frac{e^{z^L_k}}{sum_{k=1}^{p}e^{z^L_{k}}}frac{sum_{k=1}^{p}e^{z^L_{k}}-e^{z^L_k}}{sum_{k=1}^{p}e^{z^L_{k}}}=s(z^L_k)left(1-s(z^L_k)right)

因此有:delta^L_k=-e_ka^L_kleft(1-a^L_kright),是不是很簡單呢?

全文完。


推薦閱讀:

Google黑科技系列 4:自動修正你的靈魂畫作autodraw.com
可怕!斯坦福AI看臉即知性取向,國外媒體和網友都炸了
在Windows平台上搭建基於Keras的Python神經網路環境
深度學習系列3 - CNNs 以及應對過擬合的詳細探討
從梯度下降到擬牛頓法:盤點訓練神經網路的五大學習演算法

TAG:神经网络 | 人工智能 | 人工智能算法 |