張 婷
(山西大學(xué)商務(wù)學(xué)院,山西 太原 030001)
在工程應(yīng)用中,有一些復(fù)雜問題需要解決時(shí),我們經(jīng)常會(huì)用簡(jiǎn)單的方法去替代它。在復(fù)雜計(jì)算中,也希望能有簡(jiǎn)單的函數(shù)來替代負(fù)載的函數(shù),并且能夠達(dá)到和復(fù)雜函數(shù)類似的效果,越類似稱為誤差越小。這種替代的方法稱之為函數(shù)逼近,很多應(yīng)用場(chǎng)合,比如人工智能,再比如圖像處理等領(lǐng)域都會(huì)用到函數(shù)逼近算法。隨著人工智能和計(jì)算機(jī)技術(shù)的發(fā)展,人工神經(jīng)網(wǎng)絡(luò)又迎來了它的春天。神經(jīng)網(wǎng)絡(luò)算法根據(jù)人體大腦結(jié)構(gòu)的復(fù)雜神經(jīng)元結(jié)構(gòu),進(jìn)行層層傳導(dǎo)而建立。依靠神經(jīng)元和神經(jīng)元之間的相互連接,實(shí)現(xiàn)信息的傳遞處理。神經(jīng)網(wǎng)絡(luò)算法應(yīng)用廣泛,比如生物領(lǐng)域、圖像處理、信號(hào)處理、模式識(shí)別、人工智能等。隨著其廣泛應(yīng)用,各種實(shí)現(xiàn)方法較多,比如python編程實(shí)現(xiàn),MATLAB編程實(shí)現(xiàn)等,都能快速調(diào)用函數(shù)或者工具解決函數(shù)逼近問題。本文利用MATLAB工具箱,快速方便地實(shí)現(xiàn)了神經(jīng)網(wǎng)絡(luò)算法。神經(jīng)網(wǎng)絡(luò)和別的技術(shù)結(jié)合,比如小波分析、混沌神經(jīng)網(wǎng)絡(luò)、粗糙集理論、分形理論等,也是其發(fā)展方向。其中BP神經(jīng)網(wǎng)絡(luò)有較強(qiáng)的映射能力,主要用于函數(shù)逼近、函數(shù)壓縮等。本文通過MATLAB仿真來分析BP網(wǎng)絡(luò)在函數(shù)逼近中的應(yīng)用。通過調(diào)節(jié)信號(hào)的頻率、隱含節(jié)點(diǎn)的層數(shù),分析它們對(duì)函數(shù)逼近的影響。
BP神經(jīng)網(wǎng)絡(luò)的信息傳導(dǎo)主要是兩個(gè)方向:一是正向傳導(dǎo),是指信號(hào)的傳導(dǎo),從輸入到輸出。另一方面是反向傳導(dǎo),是指誤差的傳播,方向從輸出到輸入。BP網(wǎng)絡(luò)是一種前饋神經(jīng)網(wǎng)絡(luò),由輸入層、隱含層和輸出層組成。圖1所示的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖,一共有3層。圖中可以看出,只有相鄰層的神經(jīng)元之間會(huì)直接連接,同一層神經(jīng)元節(jié)點(diǎn)之間沒有連接[1]。神經(jīng)元網(wǎng)絡(luò)也可以包含多層隱含層。
圖1 三層BP神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖
圖1中,xj表示輸入層的節(jié)點(diǎn);Φ表示隱含層的激勵(lì)函數(shù);Ψ表示輸出層的激勵(lì)函數(shù);wi,j表示隱含層到輸出層的權(quán)值,其中i表示隱含層的節(jié)點(diǎn)位置,j表示輸出層的節(jié)點(diǎn)位置;wk,i表示輸出層到隱含層之間的權(quán)值,其中k表示輸出層的節(jié)點(diǎn)位置,i表示隱含層的節(jié)點(diǎn)位置;θi表示隱藏層的第i個(gè)節(jié)點(diǎn)的閾值;ak表示輸出層第k個(gè)節(jié)點(diǎn)的閾值[2]。
神經(jīng)網(wǎng)絡(luò)需要不斷地訓(xùn)練、學(xué)習(xí)才能有更強(qiáng)的適應(yīng)性。根據(jù)實(shí)際環(huán)境的變化,對(duì)權(quán)值進(jìn)行調(diào)整,從而改善系統(tǒng)的性能。最初由于計(jì)算機(jī)發(fā)展技術(shù)的局限性,神經(jīng)網(wǎng)絡(luò)的層數(shù)復(fù)雜度以及訓(xùn)練程度、學(xué)習(xí)時(shí)間等較為不理想,導(dǎo)致算法最終效果并不太離想?,F(xiàn)在隨著計(jì)算機(jī)技術(shù)的發(fā)展,人工神經(jīng)網(wǎng)絡(luò)算法可以通過長時(shí)間、高精度的訓(xùn)練學(xué)習(xí)、以及增加節(jié)點(diǎn)數(shù)、層數(shù)等方法來提高計(jì)算的精度。
根據(jù)圖1標(biāo)示,BP神經(jīng)網(wǎng)絡(luò)算法的計(jì)算過程如下[3]:
1) 信號(hào)的正向傳導(dǎo)
隱含層的每個(gè)節(jié)點(diǎn)輸入輸出以及輸出層的每個(gè)節(jié)點(diǎn)輸入輸出如何計(jì)算。
隱含層輸入Hi:
隱含層輸出Oi:
(2)
輸出層的輸入Hk:
輸出層的輸出Ok:
(4)
2) 誤差的反向傳導(dǎo)
首先,輸出層計(jì)算輸出誤差,然后隱藏層開始計(jì)算輸出誤差,直到輸入層。通過不斷計(jì)算誤差,并不斷調(diào)整各層的權(quán)值和閾值,直到最終的計(jì)算輸出和原始目標(biāo)在誤差范圍內(nèi)。
對(duì)每一個(gè)訓(xùn)練樣本p來計(jì)算它們的二次型誤差準(zhǔn)則函數(shù)Ep:
(5)
因此,總誤差準(zhǔn)則函數(shù)如下:
(6)
根據(jù)誤差梯度下降法,依次修正,輸出層權(quán)值的修正量Δwki:
(7)
輸出層閾值的修正量Δak:
(8)
隱藏層權(quán)值的修正量Δwij:
(9)
隱含層閾值的修正量Δθi:
(10)
BP神經(jīng)算法,首先對(duì)權(quán)值、閾值進(jìn)行初始化,接著提出訓(xùn)練樣本,分別依次計(jì)算隱含層、輸出層、各個(gè)神經(jīng)元的輸入和輸出;再計(jì)算誤差,分別依次計(jì)算輸出層、隱含層誤差。修正從輸出層到隱含層的權(quán)值、閾值。接著判斷樣本是否全部訓(xùn)練完成,如果沒有則接著從輸入訓(xùn)練樣本開始進(jìn)一步訓(xùn)練。如果訓(xùn)練完成判斷誤差是否小于某個(gè)值,如果不小于則跟新訓(xùn)練總步長,重新從輸入訓(xùn)練樣本開始新一輪循環(huán),如果小于則本輪訓(xùn)練結(jié)束。
利用MATLAB工具箱或者編程都可以構(gòu)建BP神經(jīng)網(wǎng)絡(luò)函數(shù)算法。本文利用MATLAB編寫m文件來實(shí)現(xiàn)對(duì)神經(jīng)網(wǎng)絡(luò)函數(shù)以及各個(gè)參數(shù)屬性值的修改。并通過MATLAB基本圖形可視化語句來實(shí)現(xiàn)函數(shù)逼近效果曲線的顯示。從而可以十分簡(jiǎn)單直觀地看到各個(gè)參數(shù)對(duì)于函數(shù)逼近效果的影響,是非常方便的研究學(xué)習(xí)方法。相對(duì)于完全編程方法來說,更加簡(jiǎn)單直觀的了解利用不同函數(shù)建立網(wǎng)絡(luò)的效果,而不需花費(fèi)大量的時(shí)間在公式編輯上。而是利用更多的精力去尋找合適參數(shù),合適方法,合適函數(shù)對(duì)不同目標(biāo)進(jìn)行擬合,甚至尋找不同算法結(jié)合出新的算法。本文通過MATLAB對(duì)簡(jiǎn)單函數(shù)的擬合逼近來掌握BP神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu),并了解哪些參數(shù)會(huì)對(duì)函數(shù)逼近效果產(chǎn)生影響。
設(shè)計(jì)一個(gè)BP神經(jīng)網(wǎng)絡(luò),來逼近函數(shù)(11):
首先,設(shè)參數(shù)k=2。用newff函數(shù)來建立BP網(wǎng)絡(luò)結(jié)構(gòu)。利用newff函數(shù)建立的神經(jīng)網(wǎng)絡(luò)為一個(gè)隱含層。隱含層的神經(jīng)元數(shù)目為n,是可以改變的。暫設(shè)設(shè)置為n=3,輸出層有一個(gè)神經(jīng)元。設(shè)置隱含層的傳遞函數(shù)為tansig函數(shù),輸出層的傳遞函數(shù)為purelin函數(shù),網(wǎng)絡(luò)訓(xùn)練采用Levenberg-Marquardt算法trainlm,關(guān)鍵代碼如下:
n=5;
net=newff(minmax(p),[n,1],{' tansig' 'purelin'},' trainlm');
結(jié)果如圖2所示,網(wǎng)絡(luò)一開始建立的函數(shù),權(quán)值、閾值的值是隨機(jī)變化的,所以導(dǎo)致網(wǎng)絡(luò)輸出的結(jié)果很差,基本上不能實(shí)現(xiàn)原函數(shù)的逼近,而且會(huì)發(fā)現(xiàn)每次在MATLAB里運(yùn)行程序時(shí)輸出的曲線也不一樣,正是由于在此過程中權(quán)值、閾值是隨機(jī)變化的。
圖2 網(wǎng)絡(luò)輸出曲線與原函數(shù)的比較
由于只建立網(wǎng)絡(luò)并不能達(dá)到函數(shù)逼近的效果,所以需要選擇訓(xùn)練方式來對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練。本例利用MATLAB例的train()來對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練。將訓(xùn)練的時(shí)間設(shè)為200,訓(xùn)練精度設(shè)為0.2,其余參數(shù)采用默認(rèn)值。
經(jīng)過設(shè)定參數(shù)的訓(xùn)練后,得到了如圖3所示的結(jié)果。從圖中可以看出,和沒有訓(xùn)練之前的曲線相比,訓(xùn)練之后的曲線和原函數(shù)的逼近效果更好。
圖3 k=2,n=3網(wǎng)絡(luò)輸出
函數(shù)中的k為頻率,改變k和神經(jīng)網(wǎng)絡(luò)中隱含層的節(jié)點(diǎn)數(shù)目,會(huì)對(duì)神經(jīng)網(wǎng)絡(luò)對(duì)函數(shù)的逼近效果產(chǎn)生一定的影響。
假設(shè)參數(shù)k=2,n=10時(shí),用之前同樣的參數(shù)進(jìn)行訓(xùn)練。輸出結(jié)果如圖4所示。
圖4 k=2,n=10網(wǎng)絡(luò)輸出
從圖4可以看出,當(dāng)n=10時(shí),經(jīng)過訓(xùn)練后的曲線基本和目標(biāo)曲線重合。和圖3相比效果明顯。說明增加隱含層的神經(jīng)元數(shù)可以增加BP神經(jīng)網(wǎng)絡(luò)函數(shù)逼近的準(zhǔn)確性[4]。
假設(shè)參數(shù)k=3時(shí),隱含層神經(jīng)網(wǎng)絡(luò)數(shù)分別取值n=3、n=10,用同樣的方法進(jìn)行訓(xùn)練。假設(shè)參數(shù)k=6時(shí),隱含層神經(jīng)網(wǎng)絡(luò)數(shù)分別取值n=3、n=10,用同樣的方法進(jìn)行訓(xùn)練。各個(gè)輸出結(jié)果如圖5所示。
圖5 不同參數(shù)網(wǎng)絡(luò)輸出
通過觀察仿真結(jié)果,可知,相同頻率時(shí)n=10時(shí)BP神經(jīng)網(wǎng)絡(luò)對(duì)于n=3時(shí)對(duì)函數(shù)的逼近效果較好。相同BP神經(jīng)網(wǎng)絡(luò)隱含層節(jié)點(diǎn)數(shù)時(shí),k值越小對(duì)目標(biāo)函數(shù)的逼近效果越好[5]。
本文通過構(gòu)建BP神經(jīng)網(wǎng)絡(luò),并對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練學(xué)習(xí)。研究了不同參數(shù)變化對(duì)神經(jīng)網(wǎng)絡(luò)對(duì)函數(shù)逼近的影響。通過MATLAB編寫程序,對(duì)基本的BP神經(jīng)網(wǎng)絡(luò)逼近函數(shù)進(jìn)行了仿真,通過結(jié)果圖顯然可見,神經(jīng)網(wǎng)絡(luò)通過訓(xùn)練之后的曲線比沒有訓(xùn)練的曲線對(duì)原始函數(shù)的逼近效果好。改變函數(shù)的頻率和隱含層神經(jīng)元數(shù)目會(huì)影響函數(shù)逼近的結(jié)果。網(wǎng)絡(luò)非線性程度越高,對(duì)于BP網(wǎng)絡(luò)的要求就越高,也就是如果采用相同的網(wǎng)絡(luò),逼近效果就要差一些。一般來說,BP神經(jīng)網(wǎng)絡(luò)中,隱含層神經(jīng)元數(shù)目越多,則逼近非線性函數(shù)的效果就會(huì)越好。
BP神經(jīng)網(wǎng)絡(luò)算法,其實(shí)是讓誤差盡可能地變小。由于此種算法中采用的下降方法會(huì)導(dǎo)致網(wǎng)絡(luò)學(xué)習(xí)效率較低、收斂速度也不夠快,可以采用一些別的比如RBF、自適應(yīng)學(xué)習(xí)等方法來改進(jìn)算法。這也是后續(xù)函數(shù)逼近時(shí)需要進(jìn)一步改進(jìn)的地方。