matlab 神经网络编程入门系列(1)
本文主要內容包括: (1) 介紹神經網絡基本原理,(2) ?Matlab實現前向神經網絡的方法 。
第0節、引例?
?????? 本文以Fisher的Iris數據集作為神經網絡程序的測試數據集。
由于英文的類無法識別,故需要把對應的類用數字標識,數據集變成:
。這里簡要介紹一下Iris數據集:有一批Iris花,已知這批Iris花可分為3個品種,現需要對其進行分類。不同品種的Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度會有差異。我們現有一批已知品種的Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度的數據。一種解決方法是用已有的數據訓練一個神經網絡用作分類器。
第一節、神經網絡基本原理?
1.?人工神經元( Artificial Neuron )模型?
?????? 人工神經元是神經網絡的基本元素,其原理可以用下圖表示:
圖1 :神經元
?圖中x1~xn是從其他神經元傳來的輸入信號,wij表示表示從神經元j到神經元i的連接權值,θ表示一個閾值 ( threshold ),或稱為偏置( bias )。則神經元i的輸出與輸入的關系表示為:
?
圖中 yi表示神經元i的輸出,函數f稱為激活函數?( Activation Function )或轉移函數 ( Transfer Function ) ,net稱為凈激活(net activation)。若將閾值看成是神經元i的一個輸入x0的權重wi0,則上面的式子可以簡化為:
?
若用X表示輸入向量,用W表示權重向量,即:
X = [ x0 , x1 , x2 , ....... , xn ]
則神經元的輸出可以表示為向量相乘的形式:
?
?
?????? 若神經元的凈激活net為正,稱該神經元處于激活狀態或興奮狀態(fire),若凈激活net為負,則稱神經元處于抑制狀態。
?????? 圖1中的這種“閾值加權和”的神經元模型稱為M-P模型?( McCulloch-Pitts Model ),也稱為神經網絡的一個處理單元( PE, Processing Element )。
?
2.?常用激活函數?
?????? 激活函數的選擇是構建神經網絡過程中的重要環節,下面簡要介紹常用的激活函數。
(1)?線性函數?( Liner Function )
? ? ??
(2)?斜面函數?( Ramp Function )
? ? ??
(3)?閾值函數?( Threshold Function )
? ? ??
?????? 以上3個激活函數都屬于線性函數,下面介紹兩個常用的非線性激活函數。
(4) S形函數?( Sigmoid Function )
該函數的導函數:
(5)?雙極S形函數?
該函數的導函數:
S形函數與雙極S形函數的圖像如下:
圖3. S形函數與雙極S形函數圖像
雙極S形函數與S形函數主要區別在于函數的值域,雙極S形函數值域是(-1,1),而S形函數值域是(0,1)。
由于S形函數與雙極S形函數都是可導的(導函數是連續函數),因此適合用在BP神經網絡中。(BP算法要求激活函數可導)
3.?神經網絡模型?
?????? 神經網絡是由大量的神經元互聯而構成的網絡。根據網絡中神經元的互聯方式,常見網絡結構主要可以分為下面3類:
(1)?前饋神經網絡 ( Feedforward Neural Networks )
?????? 前饋網絡也稱前向網絡。這種網絡只在訓練過程會有反饋信號,而在分類過程中數據只能向前傳送,直到到達輸出層,層間沒有向后的反饋信號,因此被稱為前饋網絡。感知機( perceptron)與BP神經網絡就屬于前饋網絡。
?????? 圖4 中是一個3層的前饋神經網絡,其中第一層是輸入單元,第二層稱為隱含層,第三層稱為輸出層(輸入單元不是神經元,因此圖中有2層神經元)。
圖4. 前饋神經網絡?
對于一個3層的前饋神經網絡N,若用X表示網絡的輸入向量,W1~W3表示網絡各層的連接權向量,F1~F3表示神經網絡3層的激活函數。
那么神經網絡的第一層神經元的輸出為:
O1 = F1( XW1 )
第二層的輸出為:
O2 = F2 ( F1( XW1 ) W2 )
輸出層的輸出為:
O3 = F3( F2 ( F1( XW1 ) W2 ) W3 )
?????? 若激活函數F1~F3都選用線性函數,那么神經網絡的輸出O3將是輸入X的線性函數。因此,若要做高次函數的逼近就應該選用適當的非線性函數作為激活函數。
(2)?反饋神經網絡 ( Feedback Neural Networks )
?????? 反饋型神經網絡是一種從輸出到輸入具有反饋連接的神經網絡,其結構比前饋網絡要復雜得多。典型的反饋型神經網絡有:Elman網絡和Hopfield網絡。
圖5. 反饋神經網絡?
(3)?自組織網絡?( SOM ,Self-Organizing Neural Networks )
?????? 自組織神經網絡是一種無導師學習網絡。它通過自動尋找樣本中的內在規律和本質屬性,自組織、自適應地改變網絡參數與結構。
圖6. 自組織網絡?
4.?神經網絡工作方式?
?????? 神經網絡運作過程分為學習和工作兩種狀態。
(1)神經網絡的學習狀態?
?????? 網絡的學習主要是指使用學習算法來調整神經元間的聯接權,使得網絡輸出更符合實際。學習算法分為有導師學習( Supervised Learning )與無導師學習( Unsupervised Learning )兩類。
???????有導師學習算法將一組訓練集 ( training set )送入網絡,根據網絡的實際輸出與期望輸出間的差別來調整連接權。有導師學習算法的主要步驟包括:
1)? 從樣本集合中取一個樣本(Ai,Bi);
2)? 計算網絡的實際輸出O;
3)? 求D=Bi-O;
4)? 根據D調整權矩陣W;
5) 對每個樣本重復上述過程,直到對整個樣本集來說,誤差不超過規定范圍。
BP算法就是一種出色的有導師學習算法。
???????無導師學習抽取樣本集合中蘊含的統計特性,并以神經元之間的聯接權的形式存于網絡中。
?????? Hebb學習律是一種經典的無導師學習算法。
(2)?神經網絡的工作狀態?
?????? 神經元間的連接權不變,神經網絡作為分類器、預測器等使用。
下面簡要介紹一下Hebb學習率與Delta學習規則 。
(3)?無導師學習算法:Hebb學習率?
Hebb算法核心思想是,當兩個神經元同時處于激發狀態時兩者間的連接權會被加強,否則被減弱。?
?????? 為了理解Hebb算法,有必要簡單介紹一下條件反射實驗。巴甫洛夫的條件反射實驗:每次給狗喂食前都先響鈴,時間一長,狗就會將鈴聲和食物聯系起來。以后如果響鈴但是不給食物,狗也會流口水。
?
圖7. 巴甫洛夫的條件反射實驗?
受該實驗的啟發,Hebb的理論認為在同一時間被激發的神經元間的聯系會被強化。比如,鈴聲響時一個神經元被激發,在同一時間食物的出現會激發附近的另一個神經元,那么這兩個神經元間的聯系就會強化,從而記住這兩個事物之間存在著聯系。相反,如果兩個神經元總是不能同步激發,那么它們間的聯系將會越來越弱。
Hebb學習律可表示為:
?????? 其中wij表示神經元j到神經元i的連接權,yi與yj為兩個神經元的輸出,a是表示學習速度的常數。若yi與yj同時被激活,即yi與yj同時為正,那么Wij將增大。若yi被激活,而yj處于抑制狀態,即yi為正yj為負,那么Wij將變小。
(4)?有導師學習算法:Delta學習規則
Delta學習規則是一種簡單的有導師學習算法,該算法根據神經元的實際輸出與期望輸出差別來調整連接權,其數學表示如下:
?????? 其中Wij表示神經元j到神經元i的連接權,di是神經元i的期望輸出,yi是神經元i的實際輸出,xj表示神經元j狀態,若神經元j處于激活態則xj為1,若處于抑制狀態則xj為0或-1(根據激活函數而定)。a是表示學習速度的常數。假設xi為1,若di比yi大,那么Wij將增大,若di比yi小,那么Wij將變小。
?????? Delta規則簡單講來就是:若神經元實際輸出比期望輸出大,則減小所有輸入為正的連接的權重,增大所有輸入為負的連接的權重。反之,若神經元實際輸出比期望輸出小,則增大所有輸入為正的連接的權重,減小所有輸入為負的連接的權重。這個增大或減小的幅度就根據上面的式子來計算。
(5)有導師學習算法:BP算法?
采用BP學習算法的前饋型神經網絡通常被稱為BP網絡。
圖8. 三層BP神經網絡結構?
BP網絡具有很強的非線性映射能力,一個3層BP神經網絡能夠實現對任意非線性函數進行逼近(根據Kolrnogorov定理)。一個典型的3層BP神經網絡模型如圖8所示。
?
第二節、神經網絡實現??
首先先將一些基本的知識用于理解網絡:
關于BP網絡的整體簡述
? ? ?BP神經網絡,全程為前饋神經網絡,它被用到監督學習中的主體思想是(我們假定我們這里各個層Layer次間采用的是全鏈接): 通過各個Layer層的激勵和權值以及偏置的處理向前傳遞,最終得到一個預期的值,然后通過標簽值和預期的值得到一個殘差值,殘差值的大小反映了預期值和殘差值的偏離程度,然后使用反向傳播算法(見下文),然后對上一層的推倒公式進行梯度(就是對應每一個變量x1,x2,x3,x4,x5,.....,xn求解偏導,見下文)求解,然后代入各個變量x,得到各個變量x 當前層Layer對應的權值w'(這個w'其實就是當前w偏離真實的w的殘差值),然后依次的向上一層反向傳播,最終到達Input層,這時候我們會就會得到各個層Layer相對應的權值w的偏離值,然后我們可以設定一個學習率(在caffe中是用l_r表示的),也就是步長,來設置我們參數更新的大小其實就是各個層layer當前的權值w加上對應的w的偏離值乘上這個步長即 w+=w‘*l_r,這樣就達到了參數的更新,然后通過數次迭代調整好w,b參數,特別需要強調一下的是,b可以是固定的,也可以設置成跟w權值相關的,比如b=w/2 等等,視情況而定。
關于梯度
? ? ?對于梯度,我們這里就從這幾個角度進行一下解釋,什么是梯度,梯度在BP網絡中的作用,或者說為什么BP網絡中要采用梯度.?
? 1.1什么是梯度?
? ? ? 梯度,即求偏導,比如我們有這樣一個函數,f = 2a +3b ?,如果我們求解a的梯度,fa?= 2,如果我們求解b的梯度,f_b?= 3
以上就是對梯度最簡單的描述,那個也是只有一層神經網絡時的參數求解,但是在實際的網絡模型中,我們基本上不會用那么簡單的模型,我們一般用層數較多(大于2層的模型進行)的模型來解決我們所面臨的問題,對于多層神經網絡
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?如圖,這是一個三層的神經網絡
? ? ? ?我們一般將其等化成數學中的復合函數,比如上圖中這個三層的(全鏈接的)神經網絡,其實用復合函數的公式表示就是這樣:
? ? ?對于第一層
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?f1 = x1*w1_11 + x2*w1_12 +b1_1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?f2 = x1*w1_21 + x2*w1_22 +b1_2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?f3 = x1*w1_31 + x2*w1_32 +b1_3
? ? ?然后進入到第二層
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? f4 = f1*w2_11 + f2*w2_12 + f3*w2_13 + b2_1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? f5 = f1*w2_21 + f2*w2_22 + f3*w2_23 + b2_2
? ? ?然后第三層
?f6 = f4*w3_11 + f5*w3_12 + b3_1
? ? 這個其實就和 f = (1-x^2)^3 改寫成 g =x^2 , t = 1-x , f = x^3 是一個道理
? ? ? ? ?第一層: g = x^2
? ? ? ? ?第二層: t =1-g ?
? ? ? ? ?第三層: ?f = t^3 ? ? ?
? ? ?我們對于這種復合函數求解梯度的步驟,如下:
? ? ? ? ? ?f' = 3t^2*t' 對t求偏導數?
? ? ? ? ? ?t' = -g' ? ? ? 對g求偏導數
? ? ? ? ? ?g' = 2x ? ? ?對x求偏導數
? ? ?這就是求解梯度的過程,以上就是對于梯度的一個描述
? ?1.2 那么梯度在BP網路中起到何種作用?
? ? ? ? ?梯度在求解的過程中,其實就是對逐個變量進行求導,比如f =a(bx),我們將其改成復合函數f=ag ,g = bx ,對x進行求導,那么我們會得到變量的系數. 而我們所做的這一切就是為了得到這個,得到每一層Layer的各個變量對應的系數,這個系數非常重要,我們來舉個例子說明一下,比如這個函數,f = a(bx),假設我們剛開始的時候隨機的設定一個值給a = 0.23 , b=1 ,x去一系列值[1,2,3],我們都事先知道f的值對應[0.5,1,1.5],假定我們無法直接計算得到a的值為0.5,我們來一步步的估算a的,步驟如下:
? ? ? ? ? ? 不妨假定函數的真實值用ft表示,預估值用fp表示,殘差用fre.
? ? ? ? ? ? 當 ?x = 1 , ft = 0.5
? ? ? ? ? ? 而我們用公式得到fp =0.23 ,fre = ?ft - fp =0.27,然后得到: are = 0.27*a,注 are為a的偏差值
? ? ? ? ? ?,得到bre = b*are=1*0.27*a?
? ? ? ? ? ?然后我們再求解b的更新值 b_n = b + l_r*bre*b(g求關于x的梯度)*1 (l_r為我們設定的學習率)
? ? ? ? ? ? ? ? ? ? ? ?再更新 a_n = a + l_r*are*ab(f求關于x梯度的值)*1
? ? ? ? ?這樣 我們就對參數a,b進行了更新.
? ? ?然后當x =2 ,ft=1 .....依次這樣迭代更新 a,b
我們就是通過這種方式來進行參數更新的....
2 關于梯度的反向傳播.
? ? ? 反向傳播就是將殘差反推到各個參數上,求解各個參數的誤差值,最后在每一個變量的梯度的方向上對誤差進行修正,修正的幅度依據學習率而定.
?
1.?數據預處理?
?????? 在訓練神經網絡前一般需要對數據進行預處理,一種重要的預處理手段是歸一化處理。下面簡要介紹歸一化處理的原理與方法。
(1)?什么是歸一化??
? ? ? ?數據歸一化,就是將數據映射到[0,1]或[-1,1]區間或更小的區間,比如(0.1,0.9) 。
(2)?為什么要歸一化處理??
<1>輸入數據的單位不一樣,有些數據的范圍可能特別大,導致的結果是神經網絡收斂慢、訓練時間長。
<2>數據范圍大的輸入在模式分類中的作用可能會偏大,而數據范圍小的輸入作用就可能會偏小。
<3>由于神經網絡輸出層的激活函數的值域是有限制的,因此需要將網絡訓練的目標數據映射到激活函數的值域。例如神經網絡的輸出層若采用S形激活函數,由于S形函數的值域限制在(0,1),也就是說神經網絡的輸出只能限制在(0,1),所以訓練數據的輸出就要歸一化到[0,1]區間。
<4>S形激活函數在(0,1)區間以外區域很平緩,區分度太小。例如S形函數f(X)在參數a=1時,f(100)與f(5)只相差0.0067。
(3)?歸一化算法?
一種簡單而快速的歸一化算法是線性轉換算法。線性轉換算法常見有兩種形式:
?????? <1>? y = ( x - min )/( max - min )
其中min為x的最小值,max為x的最大值,輸入向量為x,歸一化后的輸出向量為y 。上式將數據歸一化到 [ 0 , 1 ]區間,當激活函數采用S形函數時(值域為(0,1))時這條式子適用。
?????? <2>? y = 2 * ( x - min ) / ( max - min ) - 1
?????? 這條公式將數據歸一化到 [ -1 , 1 ] 區間。當激活函數采用雙極S形函數(值域為(-1,1))時這條式子適用。
(4) Matlab數據歸一化處理函數?
Matlab中歸一化處理數據可以采用premnmx , postmnmx , tramnmx 這3個函數。
<1> premnmx
語法:[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)
參數:
pn: p矩陣按行歸一化后的矩陣
minp,maxp:p矩陣每一行的最小值,最大值
tn:t矩陣按行歸一化后的矩陣
mint,maxt:t矩陣每一行的最小值,最大值
作用:將矩陣p,t歸一化到[-1,1] ,主要用于歸一化處理訓練數據集。
<2> tramnmx
語法:[pn] = tramnmx(p,minp,maxp)
參數:
minp,maxp:premnmx函數計算的矩陣的最小,最大值
pn:歸一化后的矩陣
作用:主要用于歸一化處理待分類的輸入數據。
<3> postmnmx
語法: [p,t] = postmnmx(pn,minp,maxp,tn,mint,maxt)
參數:
minp,maxp:premnmx函數計算的p矩陣每行的最小值,最大值
mint,maxt:premnmx函數計算的t矩陣每行的最小值,最大值
作用:將矩陣pn,tn映射回歸一化處理前的范圍。postmnmx函數主要用于將神經網絡的輸出結果映射回歸一化前的數據范圍。
2.?使用Matlab實現神經網絡?
使用Matlab建立前饋神經網絡主要會使用到下面3個函數:
newff :前饋網絡創建函數
train:訓練一個神經網絡
sim :使用網絡進行仿真
?下面簡要介紹這3個函數的用法。
(1) newff函數
<1>newff函數語法?
?????? newff函數參數列表有很多的可選參數,具體可以參考Matlab的幫助文檔,這里介紹newff函數的一種簡單的形式。
語法:net = newff ( A, B, {C} ,‘trainFun’)
參數:
A:一個n×2的矩陣,第i行元素為輸入信號xi的最小值和最大值;
B:一個k維行向量,其元素為網絡中各層節點數;
C:一個k維字符串行向量,每一分量為對應層神經元的激活函數;
trainFun :為學習規則采用的訓練算法。
<2>常用的激活函數
常用的激活函數有:
a)?線性函數?(Linear transfer function)
? ? ? ?f(x) = x
該函數的字符串為’purelin’。
? ? ? b)?對數S形轉移函數( Logarithmic sigmoid transfer function )
? ? ? ? ? ? ? ? ?
??? 該函數的字符串為’logsig’。
c)?雙曲正切S形函數?(Hyperbolic tangent sigmoid transfer function )
? ? ? ? ? ? ? ? ?
也就是上面所提到的雙極S形函數。?
該函數的字符串為’ tansig’。
Matlab的安裝目錄下的toolbox\nnet\nnet\nntransfer子目錄中有所有激活函數的定義說明。
<3>常見的訓練函數
??? 常見的訓練函數有:
traingd :梯度下降BP訓練函數(Gradient descent backpropagation)
traingdx :梯度下降自適應學習率訓練函數
<4>網絡配置參數
一些重要的網絡配置參數如下:
net.trainparam.goal ?:神經網絡訓練的目標誤差
net.trainparam.show ??: 顯示中間結果的周期
net.trainparam.epochs :最大迭代次數
net.trainParam.lr ?? : 學習率
(2) train函數
??? 網絡訓練學習函數。
語法:[ net, tr, Y1, E ]? = train( net, X, Y )
參數:
X:網絡實際輸入
Y:網絡應有輸出
tr:訓練跟蹤信息
Y1:網絡實際輸出
E:誤差矩陣
(3) sim函數
語法:Y=sim(net,X)
參數:
net:網絡
X:輸入給網絡的K×N矩陣,其中K為網絡輸入個數,N為數據樣本數
Y:輸出矩陣Q×N,其中Q為網絡輸出個數
?
(4) Matlab BP網絡實例?
?????? 我將Iris數據集分為2組,每組各75個樣本,每組中每種花各有25個樣本。其中一組作為以上程序的訓練樣本,另外一組作為檢驗樣本。為了方便訓練,將3類花分別編號為1,2,3 。
使用這些數據訓練一個4輸入(分別對應4個特征),3輸出(分別對應該樣本屬于某一品種的可能性大小)的前向網絡。
clc close all clear data = xlsread('Iris.csv'); % 打亂數據 flag = length(data); order = randperm(flag); nbertrain = round(0.7*flag);% 提取訓練和驗證數據 70% 訓練,30% 驗證 XTrain = data(order(1:nbertrain),2:5); YTrain = data(order(1:nbertrain),7); XValidation = data(order(nbertrain+1:flag),2:5); YValidation = data(order(nbertrain+1:flag),7);%特征值歸一化 [input,minI,maxI] = premnmx( XTrain') ;%構造輸出矩陣 s = length( YTrain) ; output = zeros( s , 3 ) ; for i = 1 : s output( i , YTrain( i ) ) = 1 ; end%創建神經網絡 % logsig:對數S形轉移函數;purelin:線性函數 % traingdx :梯度下降自適應學習率訓練函數 net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ; %設置訓練參數 net.trainparam.show = 50 ; net.trainparam.epochs = 500 ; net.trainparam.goal = 0.01 ; net.trainParam.lr = 0.01 ;%開始訓練 net = train( net, input , output') ;%測試數據歸一化 testInput = tramnmx ( XValidation' , minI, maxI ) ;%仿真 Y = sim( net , testInput );%統計識別正確率 [s1 , s2] = size( Y ) ; hitNum = 0 ; for i = 1 : s2[m , Index] = max( Y( : , i ) ) ;if( Index == YValidation(i) ) hitNum = hitNum + 1 ; end end sprintf('識別率是 %3.3f%%',100 * hitNum / s2 )% 定制開發需求:qq 1762016542?
(5)參數設置對神經網絡性能的影響?
?????? 在實驗中通過調整隱含層節點數,選擇不通過的激活函數,設定不同的學習率,
<1>隱含層節點個數?
隱含層節點的個數對于識別率的影響并不大,但是節點個數過多會增加運算量,使得訓練較慢。
<2>激活函數的選擇?
?????? 激活函數無論對于識別率或收斂速度都有顯著的影響。在逼近高次曲線時,S形函數精度比線性函數要高得多,但計算量也要大得多。?
<3>學習率的選擇?
?????? 學習率影響著網絡收斂的速度,以及網絡能否收斂。學習率設置偏小可以保證網絡收斂,但是收斂較慢。相反,學習率設置偏大則有可能使網絡訓練不收斂,影響識別效果。
歡迎關注公眾號:算法工程師的學習日志
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的matlab 神经网络编程入门系列(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 字符串处理(string替
- 下一篇: MATLAB做离散傅里叶变换DFT