對於BP神經網絡,本文將從簡介(神經網絡以及前饋神經網絡概念)、激活函數、正向傳播、反向傳播這幾個方面做出簡要描述。 首先來看一下神經網絡的簡介。
神經網絡概念
神經網絡是一種運算模型,由大量的節點(或稱為神經元)之間相互聯接構成。在感知機的基礎上發展出來。每個節點代表一種特定的輸出函數,稱為激勵函數(activation function)。每兩個節點間的連接都代表一個對於通過該連接信號的加權值,稱之為權重,這相當於人工神經網絡的記憶。網絡的輸出則依網絡的連接方式,權重值和激勵函數的不同而不同。而網絡自身通常都是對自然界某種算法或者函數的逼近,也可能是對一種邏輯策略的表達。 神經網絡的提出也是得益於生物神經網絡的思考,模擬生物大腦的網絡處理方式。在生物神經網絡中,每個神經元之間互聯,當神經元接收了外部的輸入,其神經元電位處於較高時,神經元會處於“興奮”狀態時會向其他神經元傳遞化學物質。而人工神經網絡正是出於這種思考,我們假設每個神經元電位高於某個“閾值”時會處於興奮,則對於每個神經元,如圖所示,我們可以通過將神經元的輸入的線性組合量減去該閾值化作為函數變量的函數來量化是否處於興奮狀態,這個函數我們常常稱之為激活函數。而這個模型在業界稱為“M-P神經元模型”。
常見的激活函數
1.sigmod函數 $$f(z)=\frac{1}{1+exp(-z)}$$ 一般用於BP神經網絡,求導較為簡單,其導數是f(z)*(1-f(z)),計算梯度較為方便,但其也有梯度消失等缺點。$$$$ 2.Tanh函數 $$f(z)=tanh(z)=\frac{exp(z)-exp(-z)}{exp(z)+exp(-z)}$$ 一般用於RNN循環神經網絡。$$$$ 3.Relu函數 f(z)=max(0,x)$$$$ 一般用於CNN卷積神經網絡。因其大於0時導數為其本身,梯度消失問題可以緩解。
前饋神經網絡
前饋神經網絡采用一種單向多層結構。其中每一層包含若干個神經元,同一層的神經元之間沒有互相連接,層間信息的傳送只沿一個方向進行。其中第一層稱為輸入層。最后一層為輸出層。中間為隱含層,簡稱隱層。隱層可以是一層,也可以是多層。將單個神經元以一定的層次結構連接起來就得到神經網絡。
BP神經網絡
對於多層神經網絡的學習,我們通常通過誤差逆傳播(error BackPropagation,簡稱BP)算法進行學習。誤差逆傳播算法適用於多種神經網絡,例如常見的多層前饋神經網絡,遞歸神經網絡等。
為了全面了解BP神經網絡的過程,我們先從理論推導一下,進而從實例來走一遍BP神經網絡的過程。 我們判定一個網絡的好壞,一般需要一定的誤差函數來判斷網絡預測結果與實際結果的差距。 一般常用的誤差函數是均方誤差:Ek=½∑(Ý-Y)2
BP算法基於梯度下降策略,以目標負梯度方向對參數進行訓練,對於誤差Ek,對於給定學習率η,以目標的負梯度方向對參數進行調整,有
$$Δw=-η\frac{∂EK}{∂w}$$ 根據鏈式求偏導(一層一層求偏導),有 $$\frac{∂EK}{∂wj}=\frac{∂EK}{∂Ýj}*\frac{∂Ýj}{∂βj}*\frac{∂βj}{∂wj}$$ $$\frac{∂EK}{∂bj}=\frac{∂EK}{∂Ýj}*\frac{∂Ýj}{∂βj}*\frac{∂βj}{∂bj}$$ 可能看公式優點復雜,直接舉例子。
三層網絡,輸入值[0.35,0.9],實際輸出值[0.5],邊上的數值都是權值w。 我們都知道,一個神經元,都有輸入和輸出,輸入是未通過激活函數的數值,輸出是激活函數后的數值。令z為該結點神經元的輸入,y為輸出,δ為誤差,激活函數為sigmod函數,w代表邊上的權值。 初始矩陣 $$x=z0=\bigl(\begin{smallmatrix} \\ 0.35&0.9\end{smallmatrix}\bigr)$$ yout=0.5 $$w0=\begin{bmatrix} & \\w31&w32 & \\w41&w42 \end{bmatrix}=\begin{bmatrix} & \\0.1&0.8 & \\0.4&0.6 \end{bmatrix}$$ $$w1=\bigl(\begin{smallmatrix} \\ w53&w54\end{smallmatrix}\bigr)=\bigl(\begin{smallmatrix} \\ 0.3&0.9\end{smallmatrix}\bigr)$$
我們先走一遍前向傳播 $$z1=w0*x=\begin{bmatrix} \\0.1*0.35+0.8*0.9&0.4*0.35+0.6*0.9\end{bmatrix}=\begin{bmatrix} \\z3&z4 \end{bmatrix}=\begin{bmatrix} \\0.755&0.68 \end{bmatrix}$$ $$y1=f(z1)=\begin{bmatrix} \\y3&y4 \end{bmatrix}=\begin{bmatrix} \\0.680&0.663 \end{bmatrix}$$ 同理可得, $$z5=w1*y1=\bigl(\begin{smallmatrix} 0.801\end{smallmatrix}\bigr)$$最終損失E=1/2*(0.69-0.5)2=0.01805
我們當然希望損失越小越好,於是進行反向傳播來調節w,實際上反向傳播就是梯度下降法中鏈式法則的使用。
根據公式:
E=1/2*(y5-yout)2
y5=f(z5)
z5=(w53*y3)
這時我們需求出E對w的偏導,根據鏈式法則:
同理,依次求出
再按照這個權重參數進行一遍正向傳播得出來的Error為0.165,而這個值比原來的0.19要小,迭代更新100次,最后權值為
除此之外,我們還會有一個問題,為什么要沿着梯度的反方向更新參數?
答:因為我們的目標是使損失函數值最小,而梯度的方向是函數值增加最快的方向,因此要沿着梯度的反方向更新參數。
這其中涉及到方向函數Duf(x,y)=fx(x,y)cosθ+fy(x,y)sinθ{到時候再詳細寫一下我對方向函數的理解}
設A=(fx(x,y),fy(x,y)),I=(cosθ,sinθ)
那么我們可以得到:
Duf(x,y)=AI=|A||I|cosα(α為向量A與向量I之間的夾角)
得出結論:
當α=0時,即A和I的方向相同時,Duf(x,y)取最大值,函數在這個方向的增加最快。
當α= π時,即A和I的方向相同時,Duf(x,y)取最小值,函數在這個方向的減小最快。
參考:[1]劉建平Pinard:深度神經網絡(DNN)反向傳播算法(BP)http://www.cnblogs.com/pinard/p/6422831.html#
[2]全連接神經網絡中反向傳播算法數學推導https://zhuanlan.zhihu.com/p/61863634