趙朝鳳, 令曉明
(蘭州交通大學(xué) 光電技術(shù)與智能控制教育部重點(diǎn)實(shí)驗(yàn)室,甘肅 蘭州 730070)
人大腦信息的傳遞、對外界刺激產(chǎn)生反應(yīng)都由神經(jīng)元控制的,人腦就是由上百億個的這樣神經(jīng)元構(gòu)成。每個神經(jīng)元平均與幾千個神經(jīng)元相連接,構(gòu)成了人腦的神經(jīng)網(wǎng)絡(luò),如圖1所示。一個神經(jīng)元并非每次接到其他神經(jīng)元傳遞過來的刺激都產(chǎn)生反應(yīng)。它首先會與其相鄰的神經(jīng)元傳來的刺激進(jìn)行積累,到一定的時(shí)候產(chǎn)生自己的刺激將其傳遞給一些相鄰的神經(jīng)元。這樣工作的百億個神經(jīng)元構(gòu)成了人腦對外界進(jìn)行的反應(yīng)。而人腦對外界刺激的學(xué)習(xí)的機(jī)制就是通過調(diào)節(jié)這些神經(jīng)元之間聯(lián)系以及其強(qiáng)度。當(dāng)然,實(shí)際上以上說的是對人腦真正神經(jīng)工作的一種簡化的生物模型,利用這種簡化的生物模型可以將它推廣至機(jī)器學(xué)習(xí)中來,并把它描述成人工神經(jīng)網(wǎng)絡(luò)[1]。
圖1 神經(jīng)網(wǎng)絡(luò)中神經(jīng)元示意
神經(jīng)元積累的刺激是由其它神經(jīng)元傳遞過來的刺激量和對應(yīng)的權(quán)重之和,用 Xi表示這種積累,Yi表示某個神經(jīng)元傳遞過來的刺激量,Wi表示鏈接某個神經(jīng)元刺激的權(quán)重,得到公式:
Xj=(Y1×W1)+(Y2×W2)+…+(Yi+Wi)+…+(Yn+Wn)。
當(dāng)Xj完成積累后,完成積累的神經(jīng)元本身對周圍的一些神經(jīng)元傳播刺激,將其表示為yj得到如下所示:
神經(jīng)元根據(jù)積累后Xj的結(jié)果進(jìn)行處理,對外傳遞刺激 yj。用 f函數(shù)映射來表示這種處理,將它稱之為激活函數(shù)。
BP神經(jīng)網(wǎng)絡(luò)組成網(wǎng)絡(luò)后的情形,用圖形來說明是最直觀的方法,如圖2所示。
圖2 BP神經(jīng)網(wǎng)絡(luò)示意
對第一區(qū)域來說,它們相當(dāng)于外界的刺激,是刺激的來源并且將刺激傳遞給神經(jīng)元,因此把第一區(qū)域命名為輸入層。第二區(qū)域,表示神經(jīng)元相互之間傳遞刺激相當(dāng)于人腦里面,因此把第二區(qū)域命名為隱藏層。第三區(qū)域,表示神經(jīng)元經(jīng)過多層次相互傳遞后對外界的反應(yīng),因此把第三區(qū)域命名為輸出層。
輸入層將刺激傳遞給隱藏層,隱藏層通過神經(jīng)元之間聯(lián)系的強(qiáng)度(權(quán)重)和傳遞規(guī)則(激活函數(shù))將刺激傳到輸出層,輸出層整理隱藏層處理后的刺激產(chǎn)生最終結(jié)果。若有正確的結(jié)果,那么將正確的結(jié)果和產(chǎn)生的結(jié)果進(jìn)行比較,得到誤差,再逆推對神經(jīng)網(wǎng)絡(luò)中的鏈接權(quán)重進(jìn)行反饋修正,從而來完成學(xué)習(xí)的過程。這就是BP神經(jīng)網(wǎng)絡(luò)的反饋機(jī)制。
從神經(jīng)網(wǎng)絡(luò)的生物模型中,可以得到關(guān)于 BP神經(jīng)網(wǎng)絡(luò)的公式(1)[1-2]:
對于神經(jīng)元本身的輸出的激活函數(shù),一般來說選取Sigmoid函數(shù),那么可以得到公式(2):
通過以上兩個公式,可以分析出來 BP神經(jīng)網(wǎng)絡(luò)中輸出結(jié)果的計(jì)算過程。每個神經(jīng)元收到刺激yi,然后加權(quán)積累(權(quán)重Wji)完成后產(chǎn)生xj,再通過激活函數(shù)產(chǎn)生刺激 yj,向下一層與它相連的神經(jīng)元傳遞,依次類推得到最終的輸出結(jié)果。
要修正 Wji就需要得到誤差量。首先用 dj來表示真實(shí)的正確結(jié)果,并且設(shè)誤差為E,那么(yj– dj)對應(yīng)的就是E對于yj的微分增量,即yj減去(yj– dj)后就能得到正確值,得到公式(3):
然后,需要知道的是對于權(quán)重Wji的誤差量,也就是的值。而由公式(1)中知道Wji與xj相關(guān),那么可以推導(dǎo)出公式(4):的值了。它的推導(dǎo)如下:
需要求得Wji的誤差量,轉(zhuǎn)換為需要求
所以最終得到的誤差量的值為:
這樣完成了運(yùn)用神經(jīng)網(wǎng)絡(luò)的輸出值yj和正確值dj對最后一層隱藏層Wji的修正。
這樣所有的誤差量的都可以同理推導(dǎo)完成。
最后一步修正jiW ,設(shè)置一個l(0 到 1 之間)學(xué)習(xí)率。
首先,介紹些下文中描述的程序里面的一些重要數(shù)據(jù)的定義。
#define Data 820
#define In 2
#define Out 1
#define Neuron 45
#define TrainC 5500
Data用來表示已經(jīng)知道的數(shù)據(jù)樣本的數(shù)量,也就是訓(xùn)練樣本的數(shù)量。In表示對于每個樣本有多少個輸入變量;Out表示對于每個樣本有多少個輸出變量。Neuron表示神經(jīng)元的數(shù)量,TrainC來表示訓(xùn)練的次數(shù)。
接下來是對神經(jīng)網(wǎng)絡(luò)描述的數(shù)據(jù)定義,圖3里面的數(shù)據(jù)類型都是double型。
圖3 神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)定義圖
d_in[Data][In]存儲Data個樣本,每個樣本的In個輸入。d_out[Data][Out]存儲Data個樣本,每個樣本的Out個輸出。用鄰接表法來表示圖3中的網(wǎng)絡(luò),w[Neuron][In]表示某個輸入對某個神經(jīng)元的權(quán)重,v[Out][Neuron]來表示某個神經(jīng)元對某個輸出的權(quán)重;與之對應(yīng)的保存它們兩個修正量的數(shù)組dw[Neuron][In]和 dv[Out][Neuron]。數(shù)組 o[Neuron]記錄的是神經(jīng)元通過激活函數(shù)對外的輸出,Output[Data][Out] 存儲BP神經(jīng)網(wǎng)絡(luò)的輸出。
程序的流程用偽代碼來表示,如下:
主函數(shù)
int main{
讀取樣本數(shù)ReadData();
//初始化BP神經(jīng)網(wǎng)絡(luò)
InitBPNework(){
包括數(shù)據(jù)的歸一,神經(jīng)元的初始化w[Neuron][In]、v[Out][Neuron]等;
}
//BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練
TrainNetwork(){
do{
for(i小于樣本容量Data)
{
計(jì)算按照第 i 個樣本輸入,產(chǎn)生的BP神經(jīng)網(wǎng)絡(luò)的輸出ComputO(i);
累記誤差精度;
反饋調(diào)節(jié) BP神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元,完成第i個樣本的學(xué)習(xí)BackUpdate(i);
}
}while(達(dá)到訓(xùn)練次數(shù)或者符合誤差精度);
}
存儲訓(xùn)練好的神經(jīng)元信息WriteNeuron();
用一些數(shù)據(jù)來測試,訓(xùn)練出來的BP神經(jīng)網(wǎng)絡(luò)的結(jié)果;
return 0;
}
以上是處理的流程,其中函數(shù) ComputO(i)(O是output縮寫)是計(jì)算BP神經(jīng)網(wǎng)絡(luò)預(yù)測第i個樣本的輸出,也就是第一個過程。BackUpdate(i)是根據(jù)預(yù)測的第i個樣本輸出對神經(jīng)網(wǎng)絡(luò)的權(quán)重進(jìn)行更新。
3.3.1 初始化BP神經(jīng)網(wǎng)絡(luò)
初始化主要是涉及2個方面的功能:
1)是對讀取的訓(xùn)練樣本數(shù)據(jù)進(jìn)行歸一化處理,歸一化處理就是指的就是將數(shù)據(jù)轉(zhuǎn)換成0~1之間。由于理論模型沒考慮到 BP神經(jīng)網(wǎng)絡(luò)收斂的速率問題,但是實(shí)際實(shí)踐過程中,歸一化處理是不可或缺的。一般來說神經(jīng)元的輸出對于0~1之間的數(shù)據(jù)非常敏感,歸一化能夠顯著提高訓(xùn)練效率??梢杂靡韵鹿絹韺ζ溥M(jìn)行歸一化,其中加個常數(shù)A是為了防止出現(xiàn) 0的情況(0不能為分母)。y=(x–nMin Value+A)/(nMaxValue–nMinValue+A)。
2)是對神經(jīng)元的權(quán)重進(jìn)行初始化了,數(shù)據(jù)歸一到了(0~1)之間,那么權(quán)重初始化為(-1~1)之間的數(shù)據(jù),另外對修正量賦值為0。
3.3.2 BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練
BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練是整個BP神經(jīng)網(wǎng)絡(luò)形成的引擎,驅(qū)動著樣本訓(xùn)練過程的執(zhí)行。由 BP神經(jīng)網(wǎng)絡(luò)的基本模型知道,反饋學(xué)習(xí)機(jī)制包括2個部分:①是 BP神經(jīng)網(wǎng)絡(luò)產(chǎn)生預(yù)測的結(jié)果;②是通過預(yù)測的結(jié)果和樣本的準(zhǔn)確結(jié)果進(jìn)行比對,然后對神經(jīng)元進(jìn)行誤差量的修正。因此,用兩個函數(shù)來表示這樣的兩個過程,訓(xùn)練過程中還對平均誤差e進(jìn)行監(jiān)控,如果達(dá)到了設(shè)定的精度即可完成訓(xùn)練。由于不一定能夠到達(dá)預(yù)期設(shè)定的精度要求,添加一個訓(xùn)練次數(shù)的參數(shù),如果次數(shù)達(dá)到也退出訓(xùn)練。
利用神經(jīng)網(wǎng)絡(luò)的生物模型來講述 BP神經(jīng)網(wǎng)絡(luò)的數(shù)學(xué)推導(dǎo)過程。在用偽代碼模擬神經(jīng)網(wǎng)絡(luò)的基本模型中,主要分析了 BP神經(jīng)網(wǎng)絡(luò)的初始化函數(shù)和訓(xùn)練函數(shù)。其中初始化函數(shù)中采用的歸一化處理原因是實(shí)踐中需要考慮的訓(xùn)練效率,另一方面又初始化了神經(jīng)元的權(quán)重;而 BP神經(jīng)網(wǎng)絡(luò)的訓(xùn)練則是神經(jīng)網(wǎng)絡(luò)形成的引擎,在這里用了兩個函數(shù)來表示反饋學(xué)習(xí)機(jī)制的兩部分。由此模擬了 BP神經(jīng)網(wǎng)絡(luò)的基本模型。
[1] ANDERSON J A. An Introduction to Neural Networks[M].[s.l.]:Massachusetts Institute of Technology,1995:7-60.
[2] RUMELHART D E,HINTON G E,WILLIAMS R J.Learning Representations by Back-propagating Errors[J].Nature,323(08):533-536.
[3] 高雋.人工神經(jīng)網(wǎng)絡(luò)原理及仿真實(shí)例[M].北京:機(jī)械工業(yè)出版社,2003:49-70.
[4] 郭艷兵,齊占慶,王雪光.一種改進(jìn)的 BP網(wǎng)絡(luò)學(xué)習(xí)算法[J].自動化技術(shù)與應(yīng)用,2002(02):13-14.
[5] 韓力群.人工神經(jīng)網(wǎng)絡(luò)理論、設(shè)計(jì)及應(yīng)用[M].北京:化學(xué)工業(yè)出版社,2002:1-29.
[6] 唐建鋒,張登玉,羅湘南.一種基于多尺度小波變換的自適應(yīng)濾波新算法[J].通信技術(shù),2008,42(12):405-407.
[7] 史志舉,康桂華,胡波,等.解碼協(xié)作分集技術(shù)研究[J].通信技術(shù),2010,43(06):38-40.
[8] 董楊鑫,鄭建宏.編碼協(xié)作通信技術(shù)的研究[J].通信技術(shù),2007,40(11):65-67.
[9] 王陽艷,蔡皖東.一種基于串行代理的重路由匿名通信系統(tǒng)[J].信息安全與通信保密,2008(06):123-125.