bp反向傳播演算法
1. bp神經網路演算法介紹
BP神經網路演算法介紹:一種基於反向傳播的多層前饋神經網路學習演算法。
BP神經網路演算法,全稱為反向傳播神經網路演算法,是一種在多層前饋神經網路中應用的學習演算法。其核心是通過反向傳播的方式,調整神經網路的參數,使得網路能夠學習到輸入與輸出之間的映射關系。這種演算法廣泛應用於模式識別、圖像處理、語音識別等領域。其主要分為兩個階段:前向傳播和反向傳播。
在前向傳播階段,輸入數據從輸入層進入神經網路,經過各層的處理後,得到輸出層的結果。這個過程主要涉及到神經網路的權重和偏置等參數。在反向傳播階段,根據輸出層的結果與真實結果的誤差,計算損失函數對權重的梯度,並更新權重和偏置。通過這種方式,神經網路能夠不斷地調整參數,以減小預測誤差。反向傳播過程中,利用梯度下降法或其他優化演算法來更新參數,使得網路的性能逐漸優化。
BP神經網路演算法的主要優點是具有很強的非線性映射能力和自學習能力。通過調整網路結構和參數,可以處理復雜的非線性問題。此外,該演算法具有良好的通用性,可以應用於各種領域。然而,BP神經網路也存在一些缺點,如訓練時間長、容易陷入局部最小值等。因此在實際應用中,需要針對具體問題對演算法進行優化和改進。
BP神經網路演算法的核心是反向傳播和梯度下降法。通過不斷地調整神經網路的參數,使網路逐漸適應輸入與輸出之間的映射關系。在實際應用中,需要根據具體問題選擇合適的網路結構和學習率等參數,以保證演算法的性能和效果。此外還需要注意防止過擬合和欠擬合等問題保證神經網路的泛化能力。
2. 一文徹底搞懂BP演算法:原理推導+數據演示+項目實戰(上篇)
反向傳播演算法(Backpropagation Algorithm,簡稱BP演算法)是深度學習的重要思想基礎,對於初學者來說也是必須要掌握的基礎知識!本文希望以一個清晰的脈絡和詳細的說明,來讓讀者徹底明白BP演算法的原理和計算過程。
全文分為上下兩篇,上篇主要介紹BP演算法的原理(即公式的推導),介紹完原理之後,我們會將一些具體的數據帶入一個簡單的三層神經網路中,去完整的體驗一遍BP演算法的計算過程;下篇是一個項目實戰,我們將帶著讀者一起親手實現一個BP神經網路(不使用任何第三方的深度學習框架)來解決一個具體的問題。
圖 1 所示是一個簡單的三層(兩個隱藏層,一個輸出層)神經網路結構,假設我們使用這個神經網路來解決二分類問題,我們給這個網路一個輸入樣本 ,通過前向運算得到輸出 。輸出值 的值域為 ,例如 的值越接近0,代表該樣本是"0"類的可能性越大,反之是"1"類的可能性大。
為了便於理解後續的內容,我們需要先搞清楚前向傳播的計算過程,以圖1所示的內容為例:
輸入的樣本為:
第一層網路的參數為:
第二層網路的參數為:
第三層網路的參數為:
第一層隱藏層有三個神經元: 、 和 。該層的輸入為:
以 神經元為例,則其輸入為:
同理有:
假設我們選擇函數 作為該層的激活函數(圖1中的激活函數都標了一個下標,一般情況下,同一層的激活函數都是一樣的,不同層可以選擇不同的激活函數),那麼該層的輸出為: 、 和 。
第二層隱藏層有兩個神經元: 和 。該層的輸入為:
即第二層的輸入是第一層的輸出乘以第二層的權重,再加上第二層的偏置。因此得到和的輸入分別為:
該層的輸出分別為: 和 。
輸出層只有一個神經元 :。該層的輸入為:
即:
因為該網路要解決的是一個二分類問題,所以輸出層的激活函數也可以使用一個Sigmoid型函數,神經網路最後的輸出為: 。
在1.1節里,我們已經了解了數據沿著神經網路前向傳播的過程,這一節我們來介紹更重要的反向傳播的計算過程。假設我們使用隨機梯度下降的方式來學習神經網路的參數,損失函數定義為 ,其中 是該樣本的真實類標。使用梯度下降進行參數的學習,我們必須計算出損失函數關於神經網路中各層參數(權重 和偏置 )的偏導數。
假設我們要對第 層隱藏層的參數 和 求偏導數,即求 和 。假設 代表第 層神經元的輸入,即 ,其中 為前一層神經元的輸出,則根據鏈式法則有:
因此,我們只需要計算偏導數 、 和 。
前面說過,第k層神經元的輸入為: ,因此可以得到:
上式中, 代表第 層神經元的權重矩陣 的第 行, 代表第 層神經元的權重矩陣 的第 行中的第 列。
我們以1.1節中的簡單神經網路為例,假設我們要計算第一層隱藏層的神經元關於權重矩陣的導數,則有:
因為偏置b是一個常數項,因此偏導數的計算也很簡單:
依然以第一層隱藏層的神經元為例,則有:
偏導數 又稱為 誤差項(error term,也稱為「靈敏度」) ,一般用 表示,例如 是第一層神經元的誤差項,其值的大小代表了第一層神經元對於最終總誤差的影響大小。
根據第一節的前向計算,我們知道第 層的輸入與第 層的輸出之間的關系為:
又因為 ,根據鏈式法則,我們可以得到 為:
由上式我們可以看到,第 層神經元的誤差項 是由第 層的誤差項乘以第 層的權重,再乘以第 層激活函數的導數(梯度)得到的。這就是誤差的反向傳播。
現在我們已經計算出了偏導數 、 和 ,則 和 可分別表示為:
下面是基於隨機梯度下降更新參數的反向傳播演算法:
單純的公式推導看起來有些枯燥,下面我們將實際的數據帶入圖1所示的神經網路中,完整的計算一遍。
我們依然使用如圖5所示的簡單的神經網路,其中所有參數的初始值如下:
輸入的樣本為(假設其真實類標為"1"):
第一層網路的參數為:
第二層網路的參數為:
第三層網路的參數為:
假設所有的激活函數均為Logistic函數: 。使用均方誤差函數作為損失函數:
為了方便求導,我們將損失函數簡化為:
我們首先初始化神經網路的參數,計算第一層神經元:
上圖中我們計算出了第一層隱藏層的第一個神經元的輸入 和輸出 ,同理可以計算第二個和第三個神經元的輸入和輸出:
接下來是第二層隱藏層的計算,首先我們計算第二層的第一個神經元的輸入z₄和輸出f₄(z₄):
同樣方法可以計算該層的第二個神經元的輸入 和輸出 :
最後計算輸出層的輸入 和輸出 :
首先計算輸出層的誤差項 ,我們的誤差函數為 ,由於該樣本的類標為「1」,而預測值為 ,因此誤差為 ,輸出層的誤差項為:
接著計算第二層隱藏層的誤差項,根據誤差項的計算公式有:
最後是計算第一層隱藏層的誤差項:
3. 讀懂反向傳播演算法(bp演算法)
反向傳播演算法可以說是神經網路最基礎也是最重要的知識點。基本上所以的優化演算法都是在反向傳播算出梯度之後進行改進的。同時,也因為反向傳播演算法是一個遞歸的形式,一層一層的向後傳播誤差即可,很容易實現(這部分聽不懂沒關系,下面介紹)。不要被反向傳播嚇到,掌握其核心思想就很容易自己手推出來。
我們知道神經網路都是有一個loss函數的。這個函數根據不同的任務有不同的定義方式,但是這個loss函數的目的就是計算出當前神經網路建模出來輸出的數據和理想數據之間的距離。計算出loss之後,根據反向傳播演算法就可以更新網路中的各種參數以此使loss不斷下降,即可使輸出的數據更加理想。
所以,現在的任務是,已知一個網路的loss之後,如何根據loss來更新參數呢?具體點即如何更新網路節點中的權重w和偏差b的值呢?
這里我們採用的是全連接神經網路進行說明。
要想把這個過程說清楚,首先需要將神經網路中各個參數用文字表達清楚。定義的就是w和b在網路中的准確位置。
對於 表示的是神經網路中第 層第k個節點到神經網路中第 層第j個節點之間的權重。注意w的下標是首位表示的是節點後層節點的位置,末尾表示是前層節點的位置。理解這樣的表達方式在後面的計算中會很好理解。
同理,對於b的表示:
b的表示相比於w要簡單一些,符號 表示第l層網路在第j個節點的偏置。無論w還是b的表示,上標都是表示層數。並且 和 表示都是第l層網路第j個節點的參數。所以該節點的輸出可以表示為:
神經網路輸出之後會經過一個激活函數,這用激活函數用 表示,則經過激活函數輸出為:
至此,根據上面符號 、 、 、 。我們可以對於神經網路裡面每一個數據准確的表示了。
給定一個損失函數之後,用 表示,說白了反向傳播就是求∂C/∂w和∂C/∂b,然後將這個值乘以和對應的w,b進行相減就可以實現一次的參數更新了。為什麼這樣的操作就可以優化網路,減小loss值呢?
來源於導數的概念和速度相關。∂C/∂w和∂C/∂b相當於loss值C相對於w和v變化的速度。如果∂C/∂w是正的,則增大w,C也會增大,如果希望C減小的話,應該減小w;並且∂C/∂w的絕對值越大,表示w對C的值影響越大,w稍微有一點變化,C就會有大幅變化。如果要優化C變小,w應該對應的減少多少呢?也沒有一個確定的答案。這里通過變化的速度和學習率相乘作為一個減小的值。通過多輪迭代。最終是希望c達到最小點。而當函數落入最小值的時候,無論是局部最小還是全局最小,其周圍一定是平滑的。所以此時∂C/∂w和∂C/∂b將會變得很小甚至為0,即參數不在更新了。當函數在局部最小點處參數不在更新出現梯度消失的問題時,目前也有各種trick進行解決。不是這里的重點。
為了好說明,這里定義一個很簡單的損失函數C:
接下來就是有意思的階段了。這里還是利用上一節中∂C/∂w和∂C/∂b的解釋。如果我們想要求出∂C/∂w和∂C/∂b的值,即具體的 、 對C影響速率的值,我們找一個中間變數∂C/∂ 。因為我們知道:
我們定義:
當我們知道了 值之後,我們根據 式子可以很容易求出 。
利用導數的鏈式法則:
很容易推出來不是?同理可以求出:
可以看出通過媒介 很容易求出∂C/∂w和∂C/∂b。那麼我們現在來理解一下 到底是什麼意思,以及如何求出來每一個l層j節點的 值。
根據定義:
可以看出來 就是 對於C的影響大小(聯系之前說的導數和速率的關系)。而 是第 層第 個神經元未進過激活函數之前的輸出。所以我們可以理解 為網路中第 層第 個神經元對loss的影響。所以很直觀的看法就是我們先求出單個神經元對loss值得影響,然後再計算該神經元內部參數對於loss的影響。
ok,如果我們已經理解了為什麼要引入 變數以及如何利用該變數計算具體參數的梯度後,接下來我們就可以看看如何獲得 值。反向傳播的名字我想也就是通過計算 的方式而來的。是一層一層遞歸而來的。
既然說是遞歸的方式,我們來思考一下 和 之間有什麼關系,如果找到這個關系之後,我們就可以默認我們如果知道最後一層網路節點的 值,我們就可以獲得倒數第二層網路節點的 值,倒數第三層,倒數第四層,……以此推類即可獲得整個網路的每個節點的 值。至此我們的反向傳播也基本完成了。
所以最重要的有兩點:
先看問題1,直接根據求導的鏈式法則就可以找出兩個的關系,具體公式如下,可以多看看手寫一下,思路上也很簡單。
覺得這樣的鏈式公式還是很直觀的,如果不好理解,可以自己畫一個神經網路圖,連上節點與節點之間的線,標上參數,然後推一下應該就能理解了。
這里的 都表示的未經過激活函數的神經元的輸出。 表示激活函數。因為:
所以:
帶入上式就可以得出:
至此就找出了 和 之間的關系了。
(還能簡化,根據最開始我們定義的 )。
理解起來就是網路中前面一層某一個神經元對於loss的影響與該層的後一層所有的神經元對loss的影響、該神經元的輸出大小、該神經元與後一層神經元連接的權重有關系的,並且是一個累加的效應。這樣的理解也是非常直觀合乎常理的。
現在萬事具備,只差問題2了。即假設最後一層網路是L,最後一層 如何計算得出。最後一層的 值就像一個導火索,一旦有了開始,就可以利用我們之前推出來的: 公式進行反向傳播了(反向傳播還是很形象的不是?)。現在解決這個問題。這個問題就是和損失函數具體怎麼定義有關系了。不過我們先不考慮C的具體形式,根據通用的鏈式法則我們可以得到:
這里需要注意的是最後一層激活函數使用的是哪種。最後一層激活函數在計算某一個神經元的輸出時可能會結合其他節點的輸出來計算。比如softmax激活函數,其輸出的是一個概率值【0,1】。輸出大小就是結合輸出所有的值。
現在我們來考慮兩個具體的損失函數,並且採用之前定義的均方誤差損失函數 :
求導為:
因為sigmoid輸出的值僅僅和輸入的x值有關 。所以 當 時值為0.所以:
根據上面,BP推導有三部曲,先求出 ,再根據 分別求出 、 。總結公式如下:
啟動上面反傳的導火索是最後一層的 值,計算公式為:
根據最後一層不同類型的激活函數不同對待。