人工神經網絡的由來
爲什麼要使用神經網絡?
我們知道使用線性迴歸和邏輯迴歸可以解決線性可分問題,對於有些線性不可分的問題,也可以通過增加多項式來解決,但是對於決策邊界較爲複雜的情況:
此時,往往需要引入較多的多項式,對於變量較多的情況極爲複雜,甚至容易出現過擬合。
由於大量數據的湧入和收集(大數據的驅動)我們有了新的算法:人工神經網絡(ANN),它的研究是由試圖模擬生物神經系統而激發的。
從人體神經網絡系統到人工神經網絡
人的大腦主要由稱爲神經元(節點)的神經細胞組成,神經元通過突觸的纖維絲連在一起。當神經元受到刺激時,神經脈衝(輸入)通過軸突從一個神經元傳到另一個神經元。一個神經元的樹突連接到其他神經元的軸突,其連接點稱爲神經建(權重)。
神經學家發現,人的大腦通過在同一個脈衝(輸入)反覆刺激下改變神經元之間的神經建連接強度(權值)來進行學習
。
PS.以一個例子來看人工神經網絡的運作方式:
這裏借用朱江老師上課所講的例子——《甄嬛傳》高潮部分:滴血認親
看過甄嬛傳的同學應該不會忘了這一集,劇情是相當刺激~內容是這樣的,祺嬪張羅一羣人來指認甄嬛腹中雙生子並非皇上的,而是太醫溫實初的。
(PS.圖片爲博主原創,轉載請註明出處,謝謝!)
如上圖,開始有祺嬪、丫鬟佩兒、侍女玢兒、尼姑淨白被幕後主使召集起來,分別指認甄嬛腹中並非龍種,此時,這四個人作爲信息的輸入(input)
作爲幕後主使的皇后,和當事人甄嬛分別對輸入信息加權彙總
找出對自己有利的信息,並適當爲收集信息“添油加醋”
。上圖連接線的粗細表示信息的權重(Weights)
,作爲皇上,自然擔心自己孩子血統是否純正,因此對於皇后觀點權重較大,此時皇上作爲對全部信息的彙總輸出,可能得出結論:孩子不是自己的。但是根據不斷的信息湧入和轉換,對權重進行調整,最終的結果是皇上認爲:孩子是自己的。
以上就是一個人工神經網絡傳遞信息的例子。由上可知,人工神經網絡的一些組成是:⎩⎪⎪⎪⎨⎪⎪⎪⎧輸入Input:x1,x2,...,xn(n個特徵)權值Weights:w1,w2,...,w3激活函數f(x)[可想象爲皇後對輸入信息“添油加醋”]輸出Output:對加權和套用激活函數的結果
下面,我們從最簡單的神經網絡:感知機出發,詳細捋一捋神經網絡的知識。
最簡單的神經網絡——感知機
感知機是二分類的線性分類模型,其輸入是實例的特徵向量,輸出爲實例的類別。感知器是最簡單的神經網絡,它只有輸入層和輸出層兩層結構,沒有中間層。
感知機的構造
如上圖,每個神經元都是多輸入,單輸出的信息處理單元,輸入信號通過帶權重的連接傳遞,和閾值對比後得到總輸入值,再通過激活函數的處理產生單個輸出。
PS.激活函數的意義就是通過進行映射,解決非線性可分問題,激活函數有:
其中,常用的激活函數爲:sigmoid函數、tanH函數和強大的ReLU函數。
此時,從激活函數到輸出有:
輸入:w1x1+w2x2+x3x3
輸出:O=f(w1x1+w2x2+x3x3+閾值)
爲了方便計算,我們常將偏置因子b作爲w0,引入偏置神經元:x0=−1
將閾值也看做加權和的一部分——w0x0(+閾值或-閾值),即引入了x0列
x0:取值1或-1
w0:閾值
輸出:f(w0x0+w1x1+w2x2+...+wnxn)
和我們剛纔所說人腦的神經網絡系統一樣,我們的人工神經網絡也是:輸入一定,通過調整權重來影響輸出。下面,我們看一看感知器的權值更新計算過程。
感知機權值更新的概念和計算
感知機的權值更新
感知器是怎樣更新權值的呢?它通過輸入信息的加權彙總,帶入激活函數中,計算的輸出值與target目標值(原本的標籤)進行對比,若有差異,則調整權重,直到滿足一定的迭代次數或者達到預設的最小誤差值時停止。
簡要理解感知器的權值更新過程(具體的推導請參考:《統計學習方法》第二章)
首先,我們要明瞭,感知機的權值更新同樣採用梯度下降
的方法:
當感知機採用sigmoid函數作爲激活函數時,此時相當於邏輯迴歸!採用同樣的決策邊界,可以得到:
Oj={−1,1,Xw<0Xw>0 注意:此時採用雙極性閾值,取值在-1~1!
i)當t=O=sign(Xw)時,無需更新權值;
ii)當t=O=sign(Xw)時,{O<0,O>0,Xw<0,Δw=η(t−O)X=2ηX>0,O不斷向t=1靠近Xw>0,Δw=η(t−O)X=−2ηX<0,O不斷向t=−1靠近
從而實現權值更新。
感知機詳細計算過程
下面,我們用一個例子來說明感知機的計算過程:
某計算節點感知器有3個輸入。給定樣本:X1=(1,−2)T,X2=(0,1.5)T,X3=(−1,1)T輸入向量中需要加入第一個恆等於-1的分量。期望輸出向量d=(−1,−1,1)T。初始權向量w=(0.5,1,−1)T,學習率η=0.1,激活函數採用雙極性閾值函數。
解:
增加hidden layer的神經網絡——BP神經網絡
引入:本文一開始“滴血認親”的例子就是屬於含有一層隱層的神經網絡。隱層的甄嬛和皇后這兩個“神經元”對輸入層信息進行加權彙總並帶入激活函數,所得的輸出作爲輸出層的輸入。
(PS.圖片爲博主原創,轉載請註明出處,謝謝!)
爲什麼要增加隱層?
沒有隱層的神經網絡可以看做對輸入信息的線性組合。單層感知機即是其中一個例子,但是單層感知機的侷限是:它只能解決線性可分的“與”,“或”,“非”問題,不能解決線性不可分的"異或"問題。這個時候,增加隱層相當於相當於在第一次sigmoid變換的基礎上再次進行sigmoid轉換,對數據進行兩次映射,可以轉換爲線性可分問題。可以推廣到:通過增加隱層可以解決各種情形的線性不可分問題。有如下圖:
PS.關於“或”,“與”,“非”問題大家可以自行百度,或者直接理解爲:線性可分問題。
BP(back propagation)神經網絡是1986年由Rumelhart和McClelland爲首的科學家提出的概念,是一種按照誤差逆向傳播算法訓練的多層前饋神經網絡,是目前應用最廣泛的神經網絡。它的基本思想是梯度下降法,利用梯度搜索技術,以期使網絡的實際輸出值和期望輸出值的誤差均方差爲最小
。
delta學習規則
δ學習規則是一種利用梯度下降法的一般性的學習規則。
首先,BP神經網絡的損失函數(Cost Function):E=21(t−O)2其中,t爲數據原始標籤,即爲target。O爲我們的預測輸出。delta學習規則即是通過梯度下降法,使我們的預測輸出和目標標籤的誤差平方和最小。
使用梯度下降法來最小化E的值:Δw=−η∂w∂E=−ηXT(t−O)∂w∂f(Xw)=ηXTδ,(δ=−(t−y)∂w∂f(Xw)) w:=w+Δw
BP神經網絡權值更新的梯度下降法推導過程
對於三層網絡,推導輸出層和隱層權值更新公式。(實質是基於delta規則的鏈式法則)
具體推導如下:
例:下圖爲三層神經網絡,隱層三節點,使用激活函數爲sigmoid函數。
PS.在進行後續運算前,對數據向量化處理。輸入數據爲矩陣:X,第一層權重爲向量:W(1),第二層權重爲向量:W(2),隱層輸出矩陣:Z(2),輸出層輸入矩陣:a(2)。
已知,E=21(t−O)2在本例(上圖)中可得E=21(t−a1(3))2
Step1′輸出層—>隱層權值更新:∂w(2)∂E=∂a1(3)∂E⋅∂z1(3)∂a1(3)⋅∂w(2)∂z1(3)=−(t−a1(3))⋅a1(3)(1−a1(3))⋅a(2) 記:δL=−(t−a1(3))⋅a1(3)(1−a1(3))
梯度下降更新權值:w:=w+Δw=w+η⋅δL⋅a(2)
Step2′隱層—>輸入層權值更新:∂w(1)∂E=∂a1(3)∂E⋅∂z1(3)∂a1(3)⋅∂a(2)∂z1(3)⋅∂z(2)∂a(2)⋅∂w(1)∂z(2) =−(t−a1(3))⋅a1(3)(1−a1(3))⋅w(2)⋅a(2)(1−a(2))⋅X =δL⋅w(2)⋅a(2)(1−a(2))⋅X 記:δl=−(t−a1(3))⋅a1(3)(1−a1(3))⋅w(2)⋅a(2)(1−a(2))
梯度下降更新權值:w:=w+Δw=w+η⋅δL⋅w(2)⋅a(2)(1−a(2))⋅X
BP神經網絡計算實例
基本BP算法包括信號的前向傳播和誤差的反向傳播兩個過程,我們通過一個例子詳細計算BP神經網絡的信號前向傳播
、誤差反向反饋
過程。
以上圖爲例,
Step1′信號向前傳播
第一層——數據輸入爲:X1,X2,X3即a1(1),a2(1),a3(1)
中間層——a1(2)=g(z1(2)),z1(2)=w01(1)x0+w11(1)x1+w21(1)x2+w31(1)x3 a2(2)=g(z2(2)),z2(2)=w02(1)x0+w12(1)x1+w22(1)x2+w32(1)x3 a3(2)=g(z3(2)),z3(2)=w03(1)x0+w13(1)x1+w23(1)x2+w33(1)x3 輸出層——O=hw(x)=a1(3)=g(z1(3)),z1(3)=w01(2)a0(2)+w11(2)a1(2)+w21(2)a2(2)+w31(2)a3(2)
Step2′誤差反向反饋
輸出層—>隱層δL=−(t−a1(3))⋅a1(3)(1−a1(3)) 隱層—>輸入層δl=δL⋅w(2)⋅a(2)(1−a(2))
Step3′權值更新 W(2):=W(2)+η⋅δL⋅a(2) W(1):=W(1)+η⋅δl⋅X
notes:感知機和線性迴歸、邏輯迴歸的關聯
① 感知機+sigmoid/logit函數——>邏輯迴歸
② 感知機+f(x)=wx+b線性函數——>線性迴歸
③ 三層網絡+sigmoid/logit函數——>非線性迴歸
總結
本文主要介紹了神經網絡入門必須要瞭解的兩個算法:感知機和BP神經網絡。從人工神經網絡的由來到感知機算法的原理、BP算法的原理及推導。
python實現——sklearn葡萄酒分類
- 導入所需庫
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report,confusion_matrix
import numpy as np
- 導入所需數據
data = np.genfromtxt('data/wine_data.csv', delimiter=',')
data
- 數據轉化——區分X和Y
x_data = data[:,1:]
y_data = data[:,0]
- 數據分割
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data)
- 數據標準化
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.fit_transform(x_test)
- 調用神經網絡包並傳入參數,擬合模型
mlp = MLPClassifier(hidden_layer_sizes=(100, 50),max_iter=500)
mlp.fit(x_train, y_train)
- 模型預測並輸出混淆矩陣
predictions = mlp.predict(x_test)
print(classification_report(y_test, predictions))
print(confusion_matrix(y_test,predictions))