1. 程式人生 > >BP神經網路演算法的深度解析和工程例項搭建

BP神經網路演算法的深度解析和工程例項搭建

首先宣告,這篇文章不是神經網路的掃盲文,如果只想知道神經網路的概念那筆者還是推薦找一些深入淺出的文章來看。但是如果需要自己實際搭建和使用一個神經網路,同時具備一定的數學功底的話,那這篇文章就是為了深入的剖析神經網路演算法的工作過程和模型而寫的。這裡筆者把整個神經網路的工作過程由特殊情況推廣到一般情況,讓讀者瞭解整個神經網路的工作過程,並且給出實際搭建一個神經網路的方法。希望有意願瞭解的讀者能夠拿起筆跟著文章一起把公式寫一遍。

神經網路必備的基礎的數學知識:

梯度: 相較於單變數的函式,梯度和導數的含義是一樣的,但是對於一個多變數的向量來說,其梯度的含義就是在某點處變化最快的向量場,例如對於一個三元函式t=f(x,y,z)來說,其在空間某點的梯度就是:

梯度

鏈式法則: 鏈式法則常用於複合函式求導問題 鏈式法則

神經網路演算法:

神經網路演算法靈感來源於生物細胞中的神經元結構,神經元具有樹狀突觸用來和其他神經元進行交流,在數學上突觸就可以視為訊號的來源和物件。不同神經元之間的樹狀突觸大小可能不同,不同大小的突觸對於訊號的響應程度也不同,在數學上對於訊號的響應程度就可以用權值來表示。對於相互交流頻繁的神經元其之間的突觸連線更加緊密,對應的也就是其訊號的權值較高。神經元對得到的訊號進行總結,在數學上就是對所有輸入訊號乘以各自的權值後求和。神經元在對總結好訊號進行處理,判斷是否需要輸出生物電訊號,在數學上就是將求和的訊號作為代入到某個函式中,得到函式結果,根據結果決定輸出值。一個神經元可以有多個輸出物件,但是隻有一個輸出結果,也就是相同的輸出結果可以輸出給多個輸出物件。

image

如圖所示歸納出一個神經元的數學模型,一個神經元有多個輸入x1、x2……xn,每個輸入對應了各自的權值k1、k2……kn,則其輸入的加權和為

si=x1k1+x2k2+......xnkn

假設其輸入的偏置為b,則實際的加權和為

si=x1k1+x2k2+......xnkn+b

現在,輸入變數的表示式得到了,那輸入和輸出的關係,即函式f()怎麼得到呢?一般來說,考慮到輸出的結果在0到1的範圍內,而輸入的結果的取值範圍則為實數域,因此需要一個函式其定義域為實數域,值域為0到1,常見的函式有階躍函式、sigmoid函式等,將

si帶入函式中,得到的結果就是神經元的輸出h。這裡輸出的值只有一個,但是輸出的物件可以有多個。

在瞭解單個神經元的數學模型後,將多個神經元組合起來形成網路,就是神經網路。神經網路的組成主要有三部分。對於沒有其他神經元的輸入,只有輸出的神經元,往往在第一層作為感受器而存在,這一層叫做輸入層。對於沒有其他神經元的輸出,只有別的神經元對其輸入的神經元往往在最後一層作為執行器而存在,這一層叫做輸出層。而中間既有神經元的輸入又有神經元的輸出的均為隱層。一般來說輸入層和輸出層只有一個,但是隱層可以有多個。

image

為了方便數學模型的表示,我們對於各層之間的變數進行一個命名。對於某一層的某一個神經元,與之相關的引數有:來自上一層的輸入和權值和對下一層的輸出和權值,以及其輸入的加權和,還有該神經元的處理函式。

神經元命名規則

如圖所示,對於第M層的第j個神經元,其輸入的加權和為sjM,表示第M層的第j個神經元的加權和s;其輸出為xjM,表示第M層的第j個神經元的輸出x;而第L層的第i個神經元和第M層的第j個神經元之間的權值為kijM;而第M層的處理函式可以寫為fM()。由此一個神經元有關的變數就全部都能表示了。

根據上面所講述的神經元的知識,可以得到,對於第M層的第j個神經元,有以下關係方程

1.來自上一層的輸入乘以對應的權值得到該神經元的加權和

sjM=x1Lk1jL+......xiLkijL+......xlLkljL 用累加來表示,可以寫成 sjM=i=1l(xiLkijL)

2.對加權和進行函式處理得到該神經元的輸出

xjM=fM(sjM)

由此可以類推出任意層的任意一個神經元的關係方程。

在訊號的正向傳遞中,所有的訊號經過一個個的神經元,在上述關係方程的計算下層層累積最終對輸出造成影響。

這裡,對於神經網路來說,在一次神經網路計算過程中,其各個神經元之間的權值的變化將會導致輸出的變化,為了得到一個較為理想的輸出,就要改變其各個神經元之間的權值,從而最終得到一個合適的輸出,使得該輸出和理想輸出的差值最小。這就變成了一個數學上求最值的問題,最值的物件是偏差值,也就是求偏差值最小值。其自變數就是神經網路中的各個神經元之間的權值。對於這種多變數的函式,求最值的問題就關係到了文章開頭所說的梯度。也就是求出在當前權值組合下偏差對於各權值的梯度,然後按照與梯度相反的方向,稍微修改權值,;然後再計算該權值下的梯度,然後按照與梯度相反的方向修改權值,重複上述步驟一直到輸出偏差到達最小值。這就是為什麼神經網路演算法又是一種學習演算法的原因,因為它會自己不斷的趨向最優的結果。

但是這裡存在一個問題,就是有可能最終得到的結果只是一個區域性最優解,而不是全域性最優解。對於這種情況可以通過設定初始權值,慣性等來避免,這裡先不進行闡述。

現在對上述求梯度這一過程給出數學上的表達。這裡也是神經網路演算法反向傳遞的精髓所在。

首先以一個3-4-2的神經網路為例,然後類比成a-b-c的神經網路,然後再類比成更多層的神經網路。

3-4-2神經網路正向傳遞

首先輸入通過正向傳遞到達輸出,這裡我們先一第二層的第一個和第三層的第一個為例:

第2層第1個神經元:

s12=x11k111+x21k211+x31k311 x12=f(