1. 程式人生 > >BP神經網路介紹

BP神經網路介紹

科普神經網路是一種運算模型由大量的節點(或稱“神經元”,或“單元”)和之間相互聯接構成。每個節點代表一種特定的輸出函式,稱為激勵函式(activation function)。每兩個節點間的連線都代表一個對於通過該連線訊號的加權值,稱之為權重(weight),這相當於人工神經網路的記憶。網路的輸出則依網路的連線方式,權重值和激勵函式的不同而不同。而網路自身通常都是對自然界某種演算法或者函式的逼近,也可能是對一種邏輯策略的表達。人工神經網路通常是通過一個基於數學統計學型別的學習方法(Learning Method)得以優化,所以人工神經網路也是數學統計學方法的一種實際應用,通過統計學的標準數學方法我們能夠得到大量的可以用函式來表達的區域性結構空間,另一方面在人工智慧學的人工感知領域,我們通過數學統計學的應用可以來做人工感知方面的決定問題(也就是說通過統計學的方法,人工神經網路能夠類似人一樣具有簡單的決定能力和簡單的判斷能力),這種方法比起正式的邏輯學推理演算更具有優勢。

單個神經元(理解神經網路第一步):

  • a1~an為輸入向量的各個分量
  • w1~wn為神經元各個突觸的權值
  • b為偏置bias,或者稱之為閾值(threshold
  • f為傳遞函式,通常為非線性函式。一般有traingd(),tansig(),hardlim()。以下預設為hardlim()
  • t為神經元輸出

 數學表示

  • 向量W為權向量
  • 向量A為輸入向量,做內積需要用到轉置
  • b為偏置(bias),或者稱之為閾值(threshold)
  • f為傳遞函式,也即激勵函式

帶有 sigma 函式(頂部)和 cutoff 函式(底部)

可見,一個神經元的功能是求得輸入向量與權向量的內積後,經一個非線性傳遞函式得到一個標量結果

單個神經元的作用:把一個n維向量空間用一個超平面分割成兩部分(稱之為判斷邊界),給定一個輸入向量,神經元可以判斷出這個向量位於超平面的哪一邊。(SVM也即是做的這部分工作,所以說,當單個神經元的時候,BP神經網路做的工作與SVM類似。該超平面的方程:WXT + b = 0)

  • 向量W為權向量
  • 向量X為輸入向量
  • b為偏置(bias),或者稱之為閾值(threshold)

 首先解釋一下單個神經元如何進行分類判斷:

 引入一個閾值邏輯單元(Threshold Logic Unit,TLU)的名詞,它可以輸入一組加權係數的量,對它們進行求和,如果這個和達到或者超過了某個閾值,輸出一個量。

讓我們用符號標註這些功能,首先,有輸入值以及它們的權係數:

1, X 2, ..., X n1, W 2, ..., W n。接著是求和計算出的i*W i,產生了激發層a,換一種方法表示:

a = (X1 * W1)+(X2 * W2)+...+(Xi * Wi)+...+ (Xn * Wn)

閾值稱為theta。最後,輸出結果y。當a >=thetay=1,反之y=0。請注意輸出可以是連續的,因為它也可以由一個squash函式s(或sigma)判定,該函式的自變數是a,函式值在01之間,y=s(a)

假設一個 TLU 有兩個輸入值,它們的權係數等於 1,theta 值等於 1.5。當這個 TLU 輸入 <0,0>、<0,1>、<1,0> 和 <1,1> 時,它的輸出分別為 0、0、0、1。TLU 將這些輸入分為兩組:0 組和 1 組。就像懂得邏輯連線(布林運算 AND)的人腦可以類似地將邏輯連線的句子分類那樣,TLU 也懂得一點邏輯連線之類的東西。 

 神經網路的學習是模仿大腦調節神經網路連線的原理。TLU通過改變它的權值以及閾值來進行學習。回想上面,我們看到SUM()>=theta時候,TLU在臨界點是輸出的是1而不是0,這就相當於當SUM(Wi * Xi)  +  (-1 * theta) >=0的時候。這時候,我們把-1當做是一個常量輸入,而他的權係數theta θ在學習過程(或者說是訓練過程)中進行調整。這樣,當 SUM(X i* W i)+ (-1 * theta) >= 0 時,y=1,反之 y=0。

在培訓過程中,神經網路輸入:

  1. 一系列需要分類的術語示例X(input)
  2. 它們的正確分類或者目標Target

這樣的輸入可以看成一個向量:<X 1, X 2, ..., X n, theta, t>,這裡 t 是一個目標或者正確分類。神經網路用這些來調整權係數,其目的使培訓中的目標與其分類相匹配。因為神經網路是有指導的培訓。或許你現在會問,神經網路是如何通過“調整權係數”來進行學習的?也即神經網路的學習規則。下面介紹一下:權係數的調整有一個學習規則,一個理想化的學習演算法如下所示

?
理想化的學習演算法 fully_trained = FALSE DO UNTIL (fully_trained): fully_trained = TRUE FOR EACH training_vector = <X1, X2, ..., Xn, theta, target>:: # Weights compared to theta a = (X1 * W1)+(X2 * W2)+...+(Xn * Wn) - theta y = sigma(a) IF y != target: fully_trained = FALSE FOR EACH Wi: MODIFY_WEIGHT(Wi)      # According to the training rule IF (fully_trained): BREAK

有一條似乎合理的規則是基於這樣一種思想,即權係數和閾值的調整應該由分式 (t - y) 確定。這個規則通過引入 alpha (0 < alpha < 1) 完成。我們把 alpha 稱為 學習率。W i 中的更改值等於 (alpha * (t - y)* Xi)。當 alpha 趨向於 0 時,神經網路的權係數的調整變得保守一點;當 alpha 趨向於 1 時,權係數的調整變得激進。一個使用這個規則的神經網路稱為 感知器,並且這個規則被稱為感知器學習規則。概念一下貌似太多,針對單節點的描述可以暫時到此,對於我們的主題BP網路的學習規則接下來將會描述。

神經元網路:

單層神經元網路是最基本的神經元網路形式,由有限個神經元構成,所有神經元的輸入向量都是同一個向量。由於每一個神經元都會產生一個標量結果,所以單層神經元的輸出是一個向量,向量的維數等於神經元的數目。 示意圖:

多層神經元網路(BP網路圖)

BP (Back Propagation)神經網路,即誤差反傳誤差反向傳播演算法的學習過程,由資訊的正向傳播和誤差的反向傳播兩個過程組成。由上圖可知,BP神經網路是一個三層的網路:

  • 輸入層(input layer)輸入層各神經元負責接收來自外界的輸入資訊,並傳遞給中間層各神經元;
  • 隱藏層(Hidden Layer):中間層是內部資訊處理層,負責資訊變換,根據資訊變化能力的需求,中間層可以設計為單隱層或者多隱層結構;最後一個隱層傳遞到輸出層各神經元的資訊,經進一步處理後,完成一次學習的正向傳播處理過程
  • 輸出層(Output Layer):顧名思義,輸出層向外界輸出資訊處理結果

  當實際輸出與期望輸出不符時,進入誤差的反向傳播階段。誤差通過輸出層,按誤差梯度下降的方式修正各層權值,向隱層、輸入層逐層反傳。周而復始的資訊正向傳播和誤差反向傳播過程,是各層權值不斷調整的過程,也是神經網路學習訓練的過程,此過程一直進行到網路輸出的誤差減少到可以接受的程度,或者預先設定的學習次數為止。

  好了,以上對於神經網路的結構以及各個元件之間的執行時關係描述到此為止,那麼,現在重要的是:具體是如何在誤差反向傳播的過程中,對各個層權係數進行調整?規則是什麼?總結上面,調整的目的即是每次訓練後減少誤差。可以使用最小二乘法或者是梯度下降演算法。首先需要介紹一下Delta學習規則

關於 delta 規則

感知器培訓規則是基於這樣一種思路——權係數的調整是由目標和輸出的差分方程表示式決定。而delta規則是基於梯度降落(也即梯度下降)這樣一種思路。在權係數的調整中,神經網路將會找到一種將誤差減少到最小的權係數的分配方式。梯度下降參考WIKI。這裡不再摘抄。

為了便於說明,將我們的網路限制為沒有隱藏節點,但是可能會有不止一個的輸出節點

設p是一組培訓中的一個元素,t(p,n)是相應的輸出節點 n 的目標。設y(p,n)為經過神經網路處理後的結果,前面提到過的squash函式s決定(還記得我們前面提到說這個函式只是為了將連續的輸出對應到我們不連續的分類target麼?這個函式本身與神經網路沒有關係哈),這裡a(p,n)是與p相關的n的啟用函式,或者用(p,n) =s(a(p,n))表示為與p相關的節點n的squash過的啟用函式。

為網路設定權係數(每個Wi),也為每個p和n建立t(p,n)與 y(p,n)的差分這就意味著為每個p設定了網路全部的誤差(因為通過這個P求出來的結果有誤差,那麼久要更新所有的權係數)。因此對於每組權係數來說有一個平均誤差。但是 delta 規則取決於求平均值方法的精確度以及誤差。我們先不討論細節問題,只是說一些與某些p和n相關的誤差:1/2* square( t(p,n) - y(p,n) );現在對於每個權係數Wi,平均誤差定義如下:

?
sum = 0 FOR p = 1 TO M:         # M is number of training vectors FOR n = 1 TO N:     # N is number of output nodes sum = sum + (1/2 * (t(p,n)-y(p,n))^2) average = 1/M * sum

delta 規則就是依據這個誤差的定義來定義的。因為誤差是依據那些培訓向量來說明的,delta 規則是一種獲取一個特殊的權係數集以及一個特殊的向量的演算法。而改變權係數將會使神經網路的誤差最小化。我們不需要討論支援這個演算法的微積分學,只要認為任何Wi發生的變化都是如下所示就夠了:

alpha * s'(a(p,n)) * (t(p,n) - y(p,n)) * X(p,i,n)

X(p,i,n)是輸入到節點n的p中的第i個元素alpha是已知的學習率。最後 s'(a(p,n))是與p相關的第n個節點啟用的 squashing 函式的變化(派生)率,這就是 delta 規則

最後說說:梯度下降演算法對學習速率alpha的值非常敏感,學習速率的值越大,步長越大收斂的速度就會越快。學習速率越小,步長就小,需要迭代的次數就會多些。當alpha非常小的時候,權係數向量接近某個將誤差最小化的向量。用於權係數調節的基於delta規則的演算法就是如此。

繼續回到BP神經網路的討論,反向傳播這一演算法把支援delta規則的分析擴充套件到了帶有隱藏節點的神經網路。為了理解這個問題,設想Bob給Alice講了一個故事,然後Alice又講給了TedTed檢查了這個事實真相,發現這個故事是錯誤的。現在 Ted 需要找出哪些錯誤是Bob造成的而哪些又歸咎於Alice。當輸出節點從隱藏節點獲得輸入,網路發現出現了誤差,權係數的調整需要一個演算法來找出整個誤差是由多少不同的節點造成的,網路需要問,“是誰讓我誤入歧途?到怎樣的程度?如何彌補?”這時,網路該怎麼做呢?

同樣源於梯度降落原理,在權係數調整分析中的唯一不同是涉及到t(p,n)與y(p,n)的差分。通常來說Wi的改變在於:

alpha * s'(a(p,n)) * d(n) * X(p,i,n)

其中d(n)是隱藏節點n的函式,讓我們來看

  1. n 對任何給出的輸出節點有多大影響;
  2. 輸出節點本身對網路整體的誤差有多少影響。

一方面,n 影響一個輸出節點越多,n 造成網路整體的誤差也越多。另一方面,如果輸出節點影響網路整體的誤差越少,n 對輸出節點的影響也相應減少。這裡d(j)是對網路的整體誤差的基值,W(n,j) 是 n 對 j 造成的影響,d(j) * W(n,j) 是這兩種影響的總和。但是 n 幾乎總是影響多個輸出節點,也許會影響每一個輸出結點,這樣,d(n) 可以表示為:

SUM(d(j)*W(n,j))

這裡j是一個從n獲得輸入的輸出節點,聯絡起來,我們就得到了一個培訓規則

第1部分:在隱藏節點n和輸出節點j之間權係數改變,如下所示:

alpha * s'(a(p,n))*(t(p,n) - y(p,n)) * X(p,n,j)

第 2 部分:在輸入節點i和輸出節點n之間權係數改變,如下所示:

alpha * s'(a(p,n)) * sum(d(j) * W(n,j)) * X(p,i,n)

這裡每個從n接收輸入的輸出節點j都不同。關於反向傳播演算法的基本情況大致如此。

使誤差小到適當的程度要遵循的步驟

第 1 步:輸入培訓向量。

第 2 步:隱藏節點計算它們的輸出

第 3 步:輸出節點在第 2 步的基礎上計算它們的輸出。

第 4 步:計算第 3 步所得的結果和期望值之間的差。

第 5 步:把第 4 步的結果填入培訓規則的第 1 部分。

第 6 步:對於每個隱藏節點 n,計算 d(n)。

第 7 步:把第 6 步的結果填入培訓規則的第 2 部分。

通常把第 1 步到第 3 步稱為 正向傳播,把第 4 步到第 7 步稱為 反向傳播。反向傳播的名字由此而來。

參考資料: