1. 程式人生 > >機器學習-神經網路NN

機器學習-神經網路NN

機器學習的神經網路是以人腦中的神經網路為啟發的,歷史上出現過很多不同的版本,其中最著名也是最常用的演算法就是本篇要講的在1980提出的backpropagation(反向傳播),它被應用於多層向前神經網路。下面先來講一下多層向前神經網路,也可以稱為BP神經網路。

多層向前神經網路由3部分組成,輸入層(input layer),隱藏層(hidden layers),輸出層(output layers),如下圖

輸入層和輸出層都只有1層,隱藏層可以有N層,每一層由若干個節點單元組成。上圖的神經網路是一個兩層的神經網路,輸入層不算在內。

將例項特徵向量傳入輸入層,經過隱藏層,一系列的計算,最終可以得到輸出層的結果。輸入層後面的每一層可以通過上一層的加權求和再進行非線性方程轉化得到。

這個加權求和是怎麼做的呢?我們可以看到前一層與後一層單元之間有一些連線,每一條連線就對應一個權重,將前一層的單元與對應 的權重相乘再相加,最後進行非線性方程轉化就能得到後一層每個單元的值。每一層的輸出是下一層的輸入。

因為加權求和之後以後計算的方程是非線性的,所以理論上講有一個很強大的功能,只要訓練集足夠大,隱藏層足夠多,可以用神經網路模擬出任何方程。90年代這個演算法被人應用,但是當時大家覺得它的功能並不是很強大,那是因為當時的計算能力不高,一旦神經網路的層數多於3層,訓練的時間就會非常長,效果也不好,而且因為網際網路不普及資料集也很有限,所以神經網路的這個演算法並不是一個很強的演算法,當時站在巔峰的是SVM支援向量機。但是今天隨著計算能力的大大增強以及資料集增大,神經網路為前身延伸出了的強大的深度學習,深度學習的強大就在於資料集和計算能力大大增強的情況下可以用更多的隱藏層模擬出更多的方程。

使用神經網路訓練資料之前,必須先設計神經網路的結構,也就是確定神經網路的層數以及每層的單元個數。

先來看輸入層單元的問題。
首先有一個問題特徵向量傳入輸入層 之前必須要先標準化到0,1之間,目的是加速學習的過程。

另外,變數的型別既可以是離散型變數,也可以是連續型變數。
比如離散型變數的可以被編碼,用幾個單元分類別對應一個特徵值可能被賦的值。舉個例子:
特徵值A可能取3個值(a0, a1, a2),可以用三個輸入單元來表示A,假如A是a0, 三個單元是1,0,0, A是a1,三個單元是0,1,0。這樣進行編碼。所以並不一定說輸入層每一個單元對應特徵向量的每一個特徵值。

再來看輸出層的問題
神經網路既可以用來做分類(classification)問題,也可以解決迴歸(regression)問題。迴歸問題與分類問題最大的區別就是它要預測的值不是像分類這樣的離散值,而是連續型變數。
神經網路主要解決的是還是分類問題,對於分類問題,假如只有兩類那麼可以用1個輸出單元表示,(分別用0,1表示兩類),如果大於兩類,那麼有幾類就用幾個輸出單元就行了。

對於隱藏層,目前沒有一個明確的規則來確定到底有幾層,一般是先確定一個層數,根據實驗測試和誤差,以及準確度來實驗,慢慢改進。

對於準確度怎麼來算呢?前面幾篇實踐中的做法都是把一組資料分成訓練集和測試集兩部分。訓練集來訓練模型。測試集輸入進去看結果是不是對的,根據正確率得到一個準確度。
不過機器學習中有一種更常用和科學的方法,交叉驗證方法(cross-validation)。下面來介紹一下這種方法。如下圖。
這裡寫圖片描述
前面我們用的方法是把資料分成2份,一份測試集一份資料集。交叉驗證方法就是把資料分成更多份,比如10份,9份訓練1份測試得到一個準確度。這樣10份中每一份都當一次測試集,其它9份當訓練集,繼續下去可以得到10個準確度,做一個均值就得到最終的準確度。這就是交叉驗證方法,這樣可以更充分的利用資料集。這個10份只是舉個例子,實際上可以分成任意的K份,所以這個方法也被稱為K-fold cross validation。

這樣就簡單講了多層向前神經網路這個結構,下面介紹應用在上面的backpropagation演算法。

1.backpropagation演算法通過迭代性處理訓練集中的例項,也就是說需要一波一波的將訓練集喂的輸入層中。
2.通過對比神經網路後輸入層預測值(predicted value)與真實值(target value)之間的差距,反方向(從輸出層=>隱藏層=>輸入層)倒推回來,通過一定的法則,方程,以最小化誤差為目標更新每個連線的權重Wij以及每個單元的偏向b。這樣就完成了一輪先正方向輸入得到結果,再比對結果倒推修正網路的過程,這樣一輪一輪的將訓練集喂到神經網路模型中,最終就能得到一個訓練好的神經網路。

對於最開始的權重和偏向可以隨機的賦一個(-1,1)或者(-0.5, 0.5)之間的值

這裡寫圖片描述.

這裡寫圖片描述

如上圖所示n個單元,加權求和加上一個偏向後得到一個值,再代入非線性轉化方程方程
這裡寫圖片描述
得到輸出結果。

這個非線性的方程是一個sigmoid函式。

通過這樣的方式就能夠一步一步正向的計算出最後輸出,那麼怎麼倒推回去修正優化神經網路呢?

是利用誤差來反向傳送,先來看一下誤差的計算方式:
對於輸出層,假設單元的真實值是T,已經得到單元的預測值為P,那麼誤差 E =P*(1-P)*(T-P)

對於隱藏層誤差計算稍有不同,設當前單元的值是P,前一層的誤差已經計算出了為E1,那麼當前誤差 E = P*(1-P)*∑E1*W , 這裡的E1和W指的是對應的前一層一組誤差和權重,對應的相乘求和。

得到了誤差怎麼來更新權重和偏向呢?
這裡是用梯度爬行的方法來更新權重和偏向。
權重更新:
更新量 Δw = L*E*P
W = w+Δw
這裡W是更新後的權重,w是原權重,Δw是更新量,E是當前單元算出的誤差,P是當前單元值, L是學習率。
學習率L是個0到1之間的數,就好比是逼近目的地的步伐的步長,是我們手動設定的一個值,學習率越大,跨度越大,但是可能跨過目的地,越小越精細但可能就需要很多很多步。所以比較好的方式是開始的時候L比較大,越靠近目的地L越小,我們可以設定一個比率根據每一輪的結束讓L有一個從大到小的漸變。

偏向更新:
Δb = L*E
B = b + Δb
這樣就完成了反向權重與偏向的更新。

一輪一輪的訓練,終止條件是什麼呢?
我們可以設定多種方式,比如權重的更新低於某個閾值,預測的錯誤率低於某個閾值,或者達到預設一定的迴圈次數來終止。

這樣,根據一個神經網路模型,一組訓練集資料,還有學習率L,通過上述的方法一輪輪的訓練最終就可以得到一個訓練好的神經網路。訓練好的神經網路的每條線上都有一個好的權重,每個單元都有一個好的偏向。

下面舉一個簡單例子,一個2層神經網路完成一輪的計算過程。
這裡寫圖片描述
如上圖,假設輸入層1,2,3輸入資料1,0,1 ,初始化的權重和偏向都已經隨機的給出,則正向計算,單元4,5,6先加權求和,再代入非線性方程轉化的過程結果都已給出。

那麼反向更新呢,代入公式,從後往前求出6,5,4的誤差,在將其代入權重偏向更新公式,這裡選取學習率為0.9, 計算過程如下圖
這裡寫圖片描述

這樣就完成了一輪的計算。