BP算法(Back Propagation),即反向傳播算法,是一種與最優化方法(如梯度下降法)結合使用的,用來訓練人工神經網絡的常見方法。BP算法會計算網絡中所有權重的損失函數的梯度,這個梯度會反饋給最優化方法,用來更新權值以最小化損失函數。它的學習過程由信號的正向傳播(求損失)與誤差的反向傳播(誤差回傳)兩個過程組成。
要了解BP算法的計算過程,我們首先要先了解BP神經網絡的基本模型,如下圖所示:
從上圖中可以看出,BP神經網絡模型主要有輸入層,隱含層,輸出層。其中,隱含層可以有多層。Xn是我們已知的樣本數據;Wij是第i層到第j層的權值,在信息正向傳遞的過程中,同樣為已知數據,而在誤差反向傳遞的過程中,我們要更新的就是Wij;Ym是最后輸出的數據。
對BP神經網絡模型有了基本了解以后,我們來了解一下BP算法的總體流程,BP算法流程圖如下:
上面我們說過 ,BP算法的學習過程由信號的正向傳播(求損失)與誤差的反向傳播(誤差回傳)兩個過程組成。接下來,我們通過一個簡單的例子來分別說明這兩個過程(本例為轉載):
假設,你有這樣一個網絡層:
第一層是輸入層,包含兩個神經元i1,i2,和截距項b1;第二層是隱含層,包含兩個神經元h1,h2和截距項b2,第三層是輸出o1,o2,每條線上標的wi是層與層之間連接的權重,激活函數我們默認為sigmoid函數。
現在對它們賦上初值,如下圖:
輸入數據 i1=0.05,i2=0.10;
輸出數據 o1=0.01,o2=0.99;
初始權重 w1=0.15,w2=0.20,w3=0.25,w4=0.30,w5=0.40,w6=0.45,w7=0.50,w8=0.55
我們的目標是在給出輸入數據i1和i2(0.05和0.10)的情況下,使輸出盡可能與原始輸出o1,o2(0.01和0.99)接近。
(一)前向傳播
1、輸入層—->隱含層:
計算神經元h1的輸入加權和:
神經元h1的輸出o1:(此處用到激活函數為sigmoid函數):
同理,可計算出神經元h2的輸出o2:
2、隱含層—->輸出層:
計算輸出層神經元o1和o2的值:
得到outo1和outo2以后,前向傳播的過程就結束了,我們得到輸出值為[0.75136079 , 0.772928465],與實際值[0.01 , 0.99]相差還很遠,現在我們對誤差進行反向傳播,更新權值,重新計算輸出。
(二)反向傳播
1、計算總誤差
總誤差(square error),即流程圖中的E:
本例中有兩個輸出,所以我們需要分別計算o1和o2的誤差,然后對o1和o2的誤差進行加和,總誤差為兩者之和:
2、隱含層—->輸出層的權值更新:
以權重參數w5為例,如果我們想知道w5對整體誤差產生了多少影響,可以用整體誤差對w5求偏導求出:(鏈式法則)
下面的圖可以更直觀的看清楚誤差是怎樣反向傳播的:
現在我們來分別計算每個式子的值:
計算:
計算:
(這一步實際上就是對sigmoid函數求導)
計算:
最后三者相乘:
這樣我們就計算出整體誤差E對w5的偏導值。
最后我們來更新w5的值:
(其中,是學習速率,這里我們取0.5)
同理,可更新w6、w7、w8:
3、隱含層—->隱含層的權值更新:
方法其實與上面說的差不多,但是有個地方需要變一下,在上文計算總誤差對w5的偏導時,是從out(o1)—->net(o1)—->w5,但是在隱含層之間的權值更新時,是out(h1)—->net(h1)—->w1,而out(h1)會接受E(o1)和E(o2)兩個地方傳來的誤差,所以這個地方兩個都要計算。
計算:
先計算:
同理,計算出:
兩者相加得到總值:
再計算:
再計算:
最后,三者相乘:
最后,更新w1的權值:
同理,可更新w2、w3、w4的權值:
通過本例,我們對BP算法的具體操作和計算過程有了一些了解,接下來我們來具體說一說BP算法中涉及到的一些概念和核心方法。
(一)激活函數
在多層神經網絡中,上層節點的輸出和下層節點的輸入之間具有一個函數關系,這個函數稱為激活函數。
1、激活函數的用途
如果不用激勵函數(其實相當於激勵函數是f(x) = x),在這種情況下,因為每一層節點的輸入都是上層輸出的線性函數,所以無論神經網絡有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,這種情況下神經網絡的逼近能力就相當有限。正因如此,我們才需要引入非線性函數作為激活函數,這樣深層神經網絡表達能力才能更加強大(不再是輸入的線性組合,而是幾乎可以逼近任意函數)。對於激活函數,一般要求連續可微,以滿足求導需求。
2、常見的幾種激活函數
Sigmoid函數的表達式:
Sigmoid的圖像如下:
Sigmoid的導數圖像:
通過分析圖像,我們不難發現,Sigmoid函數的輸出值范圍在0到1之間,特別的,如果是非常大的負數,輸出為0;如果是非常大的正數,輸出為1。
Sigmiod函數的優點:
(1)Sigmoid的取值范圍在(0, 1),而且是單調遞增,比較容易優化
(2)Sigmoid求導比較容易,可以直接推導得出。
缺點:
(1)Sigmoid函數收斂比較緩慢
(2)由於Sigmoid是軟飽和,容易產生梯度消失,對於深度網絡訓練不太適合(從圖上sigmoid的導數可以看出當x趨於無窮大的時候,也會使導數趨於0)
(3) Sigmoid函數並不是以(0,0)為中心點
tanh函數的表達式:
tanh的函數圖像:
tanh的導數圖像:
tanh函數的優點:
(1)函數輸出以(0,0)為中學
(2)收斂速度相對於Sigmoid更快
缺點:
(1) tanh沒有解決sigmoid梯度消失的問題
(二)偏導數、方向導數與梯度(這部分內容主要轉載於https://www.cnblogs.com/shine-lee/p/11715033.html)
在上文講解BP算法是如何計算的例子中,我們提到了鏈式法則,鏈式法則的計算里就利用了偏導數 。“偏導”的英文本意是“partial derivatives(局部導數)”,就是“局限於與自己相關的某個小范圍之內的導數計算”,並不直接關注全局發生了什么,而是根據與自己相關的信息,計算並輸出接下來的結果(鏈式法則中偏導數的具體計算公式和方法可參考https://zhuanlan.zhihu.com/p/44138371?utm_source=wechat_session)。
(三)梯度下降法
我們都知道,BP算法的正向傳播是從輸入層經過隱藏層再到輸出層,最終得到預測結果,而在第一次傳輸過程中,使用到的權重(或者說參數)都是開始隨機初始化的數據,這就導致利用隨機初始化的權重計算得到的結果,與真實值的誤差通常很大。
而神經網絡要做的一件事其實就是得到與真實值相近甚至一樣的預測值,那么就把問題指向了如何修正這些權重,才能使得預測值接近真實值。於是就提出了損失函數,損失函數實際上就是計算真實值和預測值之間的誤差。我們以這個誤差為基准,來進行BP算法的第二個部分——反向傳播。這個過程的核心就是梯度下降法,求每個權重對應誤差的偏導數值,以此作為修正權重的依據。
在上文中我們簡要介紹了梯度的幾何意義,具體來說,對於函數f(x,y),在點(x0,y0),沿着梯度向量的方向就是(∂f/∂x0, ∂f/∂y0)T的方向是f(x,y)增加最快的地方。或者說,沿着梯度向量的方向,更加容易找到函數的最大值。反過來說,沿着梯度向量相反的方向,也就是 -(∂f/∂x0, ∂f/∂y0)T的方向,梯度減少最快,也就是更加容易找到函數的最小值。
正因為梯度向量的這種特性,在最小化損失函數時,我們可以通過梯度下降法來迭代求解,以得到最小化的損失函數(梯度下降法的算法詳解可參考https://www.cnblogs.com/pinard/p/5970503.html)。在這里我們主要探討的問題是:梯度下降法找到的一定是下降最快的方向么?答案是否定的。梯度下降法並不一定是全局下降最快的方向,它只是目標函數在當前的點的切平面(當然高維問題不能叫平面)上下降最快的方向。
(暫時先這樣,梯度下降法的總結略多,之后會繼續更,個人認為通過例子學習BP算法比直接推導抽象公式要更容易理解,具體推導的抽象公式會慢慢更)