[轉] 神經網絡編程學習


神經網絡編程入門

本文主要內容包括:

1、 介紹神經網絡基本原理

2、 Matlab 實現前向神經網絡的方法

3、 AForge.NET實現前向神經網絡的方法

第0節 引例

本文以Fisher的Iris數據集作為神經網絡程序的測試數據集。Iris數據集簡介:有一批Iris花,已知這批Iris花可分為3個品種,現需要對其進行分類。不同品種Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度會有差異。我們現有一批已知品種的Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度的數據。

一種解決的方法是用已有的數據訓練一個神經網絡用作分類器。

第一節 神經網絡基本原理

1. 人工神經元(Artificial Neuron)模型

人工神經元是神經網絡的基本元素,其原理可以用下圖表示:

clip_image001

圖1. 人工神經元模型

圖中x1~xn是從其他神經元傳來的輸入信號,wij表示從神經元i到神經元j的連接權值,θ表示一個閾值(threshold),或稱為偏倚(bias)。則神經元i的輸入與輸出的關系表示為:

clip_image003

clip_image005

上面公式中,yi表示神經元的輸出,函數f稱為激活函數(Activation Function)或轉移函數(Transfer Function),net稱為凈激活(Net Activation)。若將閾值看成神經元i的一個輸入x0的權重wi0,則上面的式子可以簡化為:

clip_image007

clip_image005[1]

若用X表示輸入向量,用W表示權重向量,即

clip_image009

clip_image011

則神經元的輸出可以表示為向量相乘的形式:

clip_image013

clip_image015

若神經元的凈激活net為正,則該神經元處於激活狀態或興奮狀態(fire),若凈激活net為負,則稱該神經元處於抑制狀態。圖1中的這種“閾值加權和”的神經元模型稱為M-P模型(McCulloch-Pitts Model),也稱為神經網絡的一個處理單元(PE, Processing Element)。

2. 常用激活函數

激活函數的選擇是構建神經網絡過程中的重要環節,下面簡要介紹常用的激活函數:

(1)線性函數(Liner Function)

clip_image017

(2)斜面函數(Ramp Function)

clip_image019

(3)閾值函數(Threshold Function)

clip_image021

以上三個激活函數都屬於線性函數,下面介紹兩個常用的非線性激活函數:

(4)S形函數(Sigmoid Function)

clip_image023

該函數的導函數:

clip_image025

(5)雙極S形函數

clip_image027

該函數的導函數為:

clip_image029

S形函數與雙極S形函數的圖像如下:

clip_image031

圖3. S形函數與雙極S形函數圖像

雙極S形函數與S形函數主要區別在於函數的值域,雙極S形函數值域是(-1,1),而S形函數值域是(0,1)。由於S形函數與雙極S形函數都是可導的(函數是連續函數),因此適合用於BP神經網絡中(BP算法要求激活函數可導)。

3. 神經網絡模型

神經網絡是由大量的神經元互聯而構成的網絡。根據網絡中神經元的互聯方式,常見網絡結構主要可分為以下三類:

(1)前饋神經網絡(Feedforward Neural Networks)

前饋神經網絡也稱為前向網絡,這種網絡只在訓練過程中有反饋信號,而在分類過程中數據只能向前傳送,直至輸出層,層間沒有向后的反饋信號,因此被稱為前饋網絡。感知機(Perceptron)與BP神經網絡就屬於前饋網絡。

clip_image032

圖4. 前饋神經網絡

圖4中是一個三層前饋神經網絡,其中第一層是輸入單元,第二層稱為隱含層,第三層稱為輸出層(輸入單元不是神經元,因此圖中有兩層神經元)。

對於一個三層的前饋神經網絡N,若用X表示網絡的輸入向量,W1~W3表示網絡各層的連接權向量,F1~F3表示神經網絡三層的激活函數,則神經網絡第一層神經元的輸出為:

clip_image034

第二層的輸出為:

clip_image036

輸出層的輸出為:

clip_image038

若激活函數F1~F3都選用線性函數,那么神經網絡的輸出O3將是輸入X的線性函數。因此,若要做高次函數的逼近就應該選用適當的非線性函數作為激活函數。

(2)反饋神經網絡(Feedback Neural Networks)

反饋神經網絡是一種從輸出到輸入具有反饋連接的神經網絡,其結構比前饋神經網絡要復雜的多。典型的反饋神經網絡有:Elman網絡和Hopfield網絡。

clip_image039

圖5. 反饋神經網絡

(3)自組織神經網絡(SOM, Self-Organizing Neural Networks)

自組織神經網絡是一種無監督學習網絡。它通過自動尋找樣本中的內在規律和本質屬性,自組織、自適應地改變網絡參數與結構。

clip_image041

圖6. 自組織網絡

4. 神經網絡工作方式

神經網絡運作過程分為學習和工作兩種狀態:

(1)神經網絡的學習狀態

網絡的學習主要是指使用學習算法來調整神經元間的連接權,使得網路輸出更加符合實際。學習算法分為監督學習(Supervised Learning)與無監督學習(Unsupervised Learning)兩類。

有監督學習算法將一組訓練集(Training Set)送入網絡,根據網絡的實際輸出與期望輸出間的差別來調整連接權。有監督學習算法的主要步驟包括:

l 從樣本集合中取出一個樣本(Ai,Bi);

l 計算網絡的實際輸出O;

l 求D = Bi – O;

l 根據D調整權矩陣W;

l 對每個樣本重復上述過程,直到對整個樣本集來說,誤差不超過規定范圍。

BP算法就是一種出色的有監督學習算法。

無監督學習抽取樣本集合中蘊含的統計特性,並以神經元之間的連接權的形式存於網絡中。Hebb學習率是一種典型的無監督學習算法。

(2)神經網絡的工作狀態

神經元間的連接權不變,神經網絡作為分類器、預測器等使用。

下面簡要介紹一下Hebb學習率與Delta學習規則:

(3)無監督學習算法:Hebb學習率

Hebb算法核心思想是,當兩個神經元同時處於激發狀態時兩者間的連接權會被加強,否則被減弱。

為了理解Hebb算法,有必要簡單介紹一下條件反射實驗。巴甫洛夫的條件反射實驗:每次給狗喂食前都先響鈴,時間一長,狗就會將鈴聲和食物聯系起來。以后如果鈴響但是不給食物,狗也會流口水。

clip_image042

圖7. 巴甫洛夫的條件反射實驗

受該實驗的啟發,Hebb的理論認為在同一時間被激發的神經元間的聯系會被強化。例如,鈴聲響時一個神經元被激發,在同一時間食物的出現會激發附近的另一個神經元,那么這兩個神經元間的聯系會被強化,從而記住這兩個事物之間存在着聯系。相反,如果兩個神經元總是不能同步激發,那么它們之間的聯系將會越來越弱。

Hebb學習率可以表示為:

clip_image044

其中wij表示神經元j到神經元i的連接權,yi與yj為兩個神經元的輸出。α是表示學習速度的常數。若yi與yj同時被激活,即yi與yj同時為正,則wij將增大。若yi被激活而yj處於抑制狀態,即yi為正yj為負,則wij將變小。

clip_image044[1]

(4)有監督學習算法:Delta學習規則

Delta學習規則是一種簡單的有監督學習算法,該算法根據神經元的實際輸出與期望輸出差別來調整連接權,其數學表示如下:

clip_image046

其中wij表示神經元j到神經元i的連接權,di是神經元i的期望輸出,yi是神經元i的實際輸出,xj表示神經元j的狀態,若神經元j處於激活狀態則xj為1,若處於抑制狀態則xj為0或-1(根據激活函數而定)。α是表示學習速度的常數。假設xj為1,若di比yi大,則wij將增大,若di比yi小則wij將變小。

Delta規則簡單來講就是:若神經元實際輸出比期望輸出大,則減小所有輸入為正的連接的權重,增大所有為負的連接的權重。反之,若神經元實際輸出比期望輸出小,則增大所有輸入為正的連接權重,減小所有輸入為負的連接的權重。這個增大或減小的幅度就是根據上面的式子來計算。

(5)有監督學習算法:BP算法

采用BP學習算法的前饋型神經網絡通常被稱為BP神經網絡。

clip_image048

圖8. 三層BP神經網絡結構

BP網絡具有很強的非線性映射能力,一個三層BP神經網絡能夠實現對任意非線性函數的逼近(根據Kolrnogorov定理)。一個典型的三層BP神經網絡模型如圖8所示。

第二節 神經網絡實現

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)在參數α=1時,f(100)與f(5)只相差0.0067。

(3)歸一化算法

一種簡單而快速的歸一化算法是線性轉換算法。線性轉換算法常見有兩種形式:

<1>

clip_image050

其中min為x的最小值,max為x的最大值,輸入向量為x,歸一化后的輸出向量為y。上式將數據歸一化得到[0,1]區間,當激活函數采用S形函數時(值域為(0,1))時這條公式適用。

<2>

clip_image052

這條公式將數據歸一化到[-1, 1]區間。當激活函數采用雙極S形函數(值域為(-1,1))時,該公式適用。

(4)Matlab 數據歸一化處理函數

Matlab 中歸一化處理數據可以采用premnmx,postmnmx,tramnmx這三個函數:

<1> premnmx 函數

語法:[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)

作用:

將矩陣p,t歸一化到[-1,1],主要用於歸一化處理訓練數據集。

參數:

pn :p矩陣按行規一化后的矩陣

minp,maxp :p矩陣每一行的最小值,最大值

tn :t矩陣按行規一化后的矩陣

mint,maxt :t矩陣每一行的最小值,最大值

<2> postmnmx 函數

語法:[pn] = tramnmx(p,minp,maxp)

作用:

主要用於歸一化處理帶分類的輸入數據。

參數:

minp,maxp :premnmx函數計算的矩陣的最小,最大值

pn :歸一化后的矩陣

<3> tramnmx 函數

語法: [p,t] = postmnmx(pn,minp,maxp,tn,mint,maxt)

作用:

將矩陣pn,tn映射回歸一化處理前的范圍。postmnmx函數主要用於將神經網絡的輸出結果映射回歸一化前的數據范圍。

參數:

minp,maxp :premnmx函數計算的p矩陣每行的最小值,最大值

mint,maxt :premnmx函數計算的t矩陣每行的最小值,最大值

2. 使用Matlab 實現神經網絡

使用Matlab 建立前饋神經網絡主要會使用到下面三個函數:

newff :前饋網絡創建函數。

train :訓練一個神經網絡。

sim :使用網絡進行仿真。

下面簡要介紹這三個函數的用法:

(1) newff函數

<1> newff函數語法

newff函數參數列表中有很多可選參數,具體可參考Matlab的幫助文檔,這里介紹newff函數的一種簡單的形式。

語法:net = newff ( A, B, {C} ,‘trainFun’)

參數:

A :一個n*2的矩陣,第i行元素為輸入信號xi的最小值和最大值;

B :一個k維向量,其元素為網絡中各層節點數;

C :一個k維字符串向量,每一分量為對應層神經網絡的激活函數;

trainFun :為學習規則采用的訓練算法。

<2> 常用的激活函數

常用的激活函數有:

1) 線性函數(Linear Transfer Function)

clip_image054

在Matlab中該函數對應的字符串為 ‘purelin’。

2) 對數S形轉移函數(Logarithmic Sigmoid Transfer Function)

clip_image056

在Matlab中該函數對應的字符串為 ‘logsig’。

3) 雙曲正切S形函數(Hyperbolic Tangent Sigmoid Transfer Function)

clip_image058

也就是上面所提到的雙極S形函數,在Matlab中該函數對應的字符串為 ‘transig’。Matlab的安裝目錄下的toolbox\nnet\nnet\nntransfer子目錄中有所有的激活函數的定義說明。

<3> 常見的訓練函數

常見的訓練函數有:

traingd :梯度下降BP訓練函數(Gradient Decent 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數據集分為兩組,每組75個樣本,每組中每個花各有25個樣本。其中一組作為上述程序的訓練樣本,另一組作為檢驗樣本。為了方便訓練,將三類花分別編號為1,2,3。

使用這些數據訓練一個四個輸入(分別對應四個特征),三個輸出(分別對應樣本屬於某一品種的可能性大小)的前向網絡。

Matlab程序如下:

image

以上程序的識別率穩定在95%左右,訓練100次左右達到收斂,訓練曲線如下圖所示:

clip_image062

圖9. 訓練性能表現

(5) 參數設置對神經網絡性能的影響

在實驗中通過調整隱含層節點數,選擇不同的激活函數,設定不同的學習率:

<1> 隱含層節點個數

隱含層節點的個數對於識別率的影響不大,但是節點個數過度會增加運算量,使得訓練速度較慢。

<2> 激活函數的選擇

激活函數無論對於識別率或收斂速度都有顯著的影響。在逼近高次曲線時,S形函數精度比線性函數要高的多,但計算量也要大的多。

<3> 學習率的選擇

學習率影響着網絡收斂的速度,已經網絡是否收斂。學習率設置偏小可以保證網絡收斂,但收斂較慢。相反,學習率設置偏大則有可能使網絡訓練不收斂,影響識別效果。

3. 使用AForge.NET 實現神經網絡

(1) AForge.NET簡介

AForge.NET是一個C#實現的面向人工智能、計算機視覺等領域的開源框架。AForge.NET源代碼下的Neuro目錄包含一個神經網絡的類庫。

AForge.NET主頁:http://www.aforgenet.com/

AForge.NET代碼下載:http://code.google.com/p/aforge/

AForge.Neuro工程的類圖如下:

clip_image064

圖10. AForge.Neuro類庫類圖

下面介紹圖10中的幾個基本的類:

Neuron :神經元的抽象基類;

Layer :層的抽象基類,由多個神經元組成;

Network :神經網絡的抽象基類,由多個層(Layer)組成;

IActivationFunction :激活函數(Activation Function)的接口;

IUnsupervisedLearning :無監督學習(Unsupervised Learning)算法的接口;

ISupervisedLearning :監督學習(Supervised Learning)算法的接口

(2) 使用AForge建立BP神經網絡

使用AForge建立BP神經網絡會用到下面的幾個類:

<1> SigmoidFunction:S形函數

構造函數:public SigmoidFunction(double alpha)

參數alpha決定S形函數的陡峭程度。

<2> ActivationNetwork:神經網絡類

構造函數:

public ActivationNetwork(IActivationFunction func, int inputsCount, params int[] neuronsCount)

: base(inputsCount, neuronsCount.Length)

public virtual double[] Compute(double[] input)

參數意義:

inputsCount :輸入個數

neuronsCount :表示各層神經元個數

<3> BackPropagationLearning:BP學習算法

構造函數:

public BackPropagationLearning( ActivationNetwork network)

參數意義:

network :要訓練的神經網絡對象;

BackPropagationLearning類需要用戶設置的屬性有以下兩個:

1) LearningRate :學習率

2) Momentum :沖量因子

下面給出AForge構建BP網絡的代碼:

image

該程序對Iris數據進行分類,識別率可達97%左右。

 

 源代碼(Matlab和C#實現)

 

原文地址:http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM