1. 程式人生 > >人工智慧(四):人工神經網路

人工智慧(四):人工神經網路

在這裡我們只做總結梳理,具體的證明我們並不涉及,只要掌握原理,併為我們所用即可。

一、感知器——單個神經元

在說明神經網路之前,先介紹一下神經網路的基礎計算單元——神經元,也是一直沿用至今的“M-P神經元模型”。在這個模型中,神經元接收到來自n個其他神經元傳遞過來的輸入訊號,這些輸入訊號通過帶權重的連線進行傳遞,神經元接收到的總輸入值將與神經元的閾值進行比較,然後通過“啟用函式”處理以產生神經元的輸出,兩層神經元組成感知器。

上圖就是一個簡單的感知器,藍色是輸入的樣本,g(z)是啟用函式,z=x1*w1+…,a=g(z)

這個東西可以用來幹什麼呢?我們可以令b=-30,w1=20,w2=20,此時限制輸入的x1和x2為0或者1,啟用函式為sigmoid函式:

上圖為sigmoid函式影象,可以看出當x很大時,此函式趨於1,當x很小時,此函式趨於0,寫出真值表,可以發現這個感知器完成了一個邏輯與的操作。

將引數修改為b=-10,w1=20,w2=20,此時感知器又完成了一個邏輯或的操作,真值表就不寫了,也就是說改變這些圓圈圈之間的傳遞引數,可以使這個感知器完成邏輯或和邏輯與的操作。當然對一個輸入取非也不會有問題(b=10,w1=-20)。因此,我們可以改變連線引數,從而使感知器完成與、或、非的操作。

感知器的學習規則可以表示如下:

其中成為學習率。若感知器對訓練樣例預測正確,則感知器不會發生變化,否則將根據錯誤的程度進行權重調整。因此,我們可以改變連線引數,從而使感知器完成與、或、非的操作。

二、多層感知器——人工神經網路

在單層感知器的輸入部分和輸出層之間加入一層或多層處理單元,就構成了二層或多層感知器。在感知器模型中,只允許某一層的連線權值可調,這是因為無法知道網路隱層的神經元的理想輸出,因而難以給出一個有效的多層感知器學習演算法。多層感知器克服了單層感知器的許多缺點,原來一些單層感知器無法解決的問題,在多層感知器中就可以解決。例如,應用二層感知器就可以解決異或邏輯運算問題。常見的神經網路是形如下圖所示的層級結構,每層神經元與下層神經元全互連,神經元之間不存在同層連線,也不存在跨層連線,這樣的神經網路結構通常稱為“多層前饋神經網路”,其中輸入層神經元神經元接受外界輸入,隱層與輸出層對訊號進行加工,最後結果由輸出層神經元輸出。

這就是一個典型的神經網路,我們設為j層到j+1層的傳遞矩陣,從輸入層(藍色)到中間的第二層,就有:

同理,第二層到輸出層:

注意這個神經網路的輸出只有一個值而神經網路的輸出可以有任意個,這裡僅以此為例不再展開寫,上邊就是當已知每一層之間的係數矩陣時,神經網路求解的過程。

舉個最簡單的非線性問題之一:異或。

利用兩層感知機可以實現異或的計算,但是如何求異或中間的權重w,是一個非常關鍵的問題,求得引數,既可以得到該問題的解。這裡引申出BP演算法來求解人工神經網路。

三、BP演算法

BP演算法基本分為這兩個過程:

正向傳播FP(求損失)在這個過程中我們根據輸入的樣本給定的初始化權重值W和偏置項的值b計算最終輸出值以及輸出值與實際值之間的損失值如果損失值不在給定的範圍內則進行反向傳播的過程否則停止W,b的更新

反向傳播BP(回傳誤差)將輸出以某種形式通過隱層向輸入層逐層反傳並將誤差分攤給各層的所有單元,從而獲得各層單元的誤差訊號此誤差訊號即作為修正各單元權值的依據。

先簡單說一下什麼是梯度下降(SGD)。我們假設有一個凸函式如圖所示,如何從隨機的一點逐漸收斂到這個函式的最小值呢?

下邊的虛擬碼就是梯度下降。當迴圈次數達到一定數量時,此時的x就非常接近f(x)的最小值了。

 

a是一個更新率,當a很小時梯度收斂的很慢,當a較大時梯度收斂的較快,當a過大時可能無法收斂,比如x減去一個很小的負值,函式值比原來距離正確的最小值點更遠了。可見對於這樣一個平滑的凸函式,迭代的步子會隨著次數增加越邁越小,原因就是導數越來越小了。這樣就會使得x逐漸逼近最小值點。

對於神經網路的損失函式,它不僅僅有一個引數,我們便需要求出損失函式對每個引數的偏導數,在最後統一進行引數更新後進行下一輪迭代。

神經網路系統使用正向傳播求當前引數的損失,然後反向傳播回傳誤差,根據誤差訊號迭代修正每層的權重。SGD演算法(stochastic gradient descent)的第一步是隨機初始化每一個引數。Stochastic的意思正是隨機。通過這組隨機的引數計算得到每一個神經元的輸入輸出值和損失函式後,就可以求損失函式對各個引數的偏導數了,梯度更新的那個delta就等於alpha*偏導數。

而BP演算法則是用來求那一堆偏導數的,BP的意思是反向傳播。就是把最後一層的誤差反向傳遞迴別的神經元,得到每一層的誤差函式,從而解出偏導數。

輸出層的誤差求取規則如下:

隱含層誤差的求取規則如下:

再更新輸入層的權值,再遞迴更新權值,求得引數。

基本過程如下演算法規則,求出引數:

舉個例子:

各部分輸入輸出如圖3所示, 下面進行各層誤差計算.

輸出層的誤差(平方和誤差,前面的1/2是為了後面的計算方便)       (1)

展開至隱層的誤差(2)

輸入層誤差

觀察上式, 我們很容易看出只有(3)式和輸入x有關。E有了,那麼就很簡單可以看出可以使用常用的隨機梯度下降法(SGD)求解.也就是求解式子中的W和V,使得誤差E最小。

 

設初始權重值w和偏置項b為:

    w=(0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65)

    b = (0.35,0.65)-->這裡為了便於計算,假設從輸入層到隱層之間, 隱層到輸出層之間的偏置項b恆定.

    1) FP計算過程

    ① 從輸入層到隱層(其實這裡的b可以看成一個特徵)

 h1 = w1*l1 + w2*l2 + b1*1 = 0.1*5 + 0.15*10 + 0.35*1 = 2.35

 h2 = w3*l1 + w4*l2 + b1*1 = 0.2*5 + 0.25*10 + 0.35*1 = 3.85

 h3 = w5*l1 + w6*l2 + b1*1 = 0.3*5 + 0.35*10 + 0.35*1 = 5.35

    則各個迴歸值經過啟用函式變換後的值為:

② 隱層到輸出層

neto1 = outh1*w7 +outh2*w9 +outh3*w11+ b2*1= 2.35*0.4 + 3.85*0.5 +5.35 *0.6+0.65 = 2.10192   

neto2 = outh1*w8 +outh2*w10 +outh3*w12 +b2*1= 2.35*0.45 + 3.85*0.55 +5.35 *0.65 +0.65= 2.24629 

則經過啟用函式變換得到:

outo1 = 0.89109 (真實值0.01) ,  outo2 = 0.90433 (真實值0.99)

    此時的平方和誤差為:

與真實值不符,需要進行BP反饋計算。

 2) BP計算過程

這裡的BP計算我們分為兩個部分.  ①隱層到輸出層的引數W的更新   ②從輸入層到隱層的引數W的更新.

在這裡,我們主要講述第一部分隱層到輸出層的引數W的更新。

 

如圖所示為從隱層到輸出層的網路結構圖。

首先,運用梯度下降法求解W7的值.

    目標函式:  ,由於此時求解W7,所以只與有關,則此時的損失函式為:

可以看出, 為凸函式(開口向上), 有最小值且最小值在導數為0的點上。

    又有 neto1 = outh1*w7 +outh2*w9 +outh3*w11+ b2*1,  outo1 =  f(o1)

則W7求偏導數得到:

(4)

又有w的更新公式:

這樣將上式帶入W的更新公式(5)就可以求得更新後的W值

最後,得到了W7的更新值為:

同理可以求得w9,w11,b2的更新值。

對於從輸入層到隱層的引數W的更新,其實和從隱層到輸出層的幾乎一樣,唯一不同的就是鏈式求導過程中的Etotal和outo1,outo2都有關係,這裡就不展開解釋了。

BP神經網路解決了神經網路中非常重要的問題,它解決了DNN中的隱層傳遞中的權重值的計算問題,極大地促進了神經網路的發展 

參考文獻:

https://blog.csdn.net/qq_32241189/article/details/80305566

https://www.cnblogs.com/asdfjkl/p/6159675.html

《機器學習》周志華