完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>
標(biāo)簽 > BP網(wǎng)絡(luò)
BP神經(jīng)網(wǎng)絡(luò)是1986年由Rumelhart和McClelland為首的科學(xué)家提出的概念,是一種按照誤差逆向傳播算法訓(xùn)練的多層前饋神經(jīng)網(wǎng)絡(luò),是目前應(yīng)用最廣泛的神經(jīng)網(wǎng)絡(luò)。
BP(back propagation)神經(jīng)網(wǎng)絡(luò)是1986年由Rumelhart和McClelland為首的科學(xué)家提出的概念,是一種按照誤差逆向傳播算法訓(xùn)練的多層前饋神經(jīng)網(wǎng)絡(luò),是目前應(yīng)用最廣泛的神經(jīng)網(wǎng)絡(luò)。
基本原理
人工神經(jīng)網(wǎng)絡(luò)無需事先確定輸入輸出之間映射關(guān)系的數(shù)學(xué)方程,僅通過自身的訓(xùn)練,學(xué)習(xí)某種規(guī)則,在給定輸入值時得到最接近期望輸出值的結(jié)果。作為一種智能信息處理系統(tǒng),人工神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)其功能的核心是算法。BP神經(jīng)網(wǎng)絡(luò)是一種按誤差反向傳播(簡稱誤差反傳)訓(xùn)練的多層前饋網(wǎng)絡(luò),其算法稱為BP算法,它的基本思想是梯度下降法,利用梯度搜索技術(shù),以期使網(wǎng)絡(luò)的實(shí)際輸出值和期望輸出值的誤差均方差為最小?;綛P算法包括信號的前向傳播和誤差的反向傳播兩個過程。即計算誤差輸出時按從輸入到輸出的方向進(jìn)行,而調(diào)整權(quán)值和閾值則從輸出到輸入的方向進(jìn)行。正向傳播時,輸入信號通過隱含層作用于輸出節(jié)點(diǎn),經(jīng)過非線性變換,產(chǎn)生輸出信號,若實(shí)際輸出與期望輸出不相符,則轉(zhuǎn)入誤差的反向傳播過程。誤差反傳是將輸出誤差通過隱含層向輸入層逐層反傳,并將誤差分?jǐn)偨o各層所有單元,以從各層獲得的誤差信號作為調(diào)整各單元權(quán)值的依據(jù)。通過調(diào)整輸入節(jié)點(diǎn)與隱層節(jié)點(diǎn)的聯(lián)接強(qiáng)度和隱層節(jié)點(diǎn)與輸出節(jié)點(diǎn)的聯(lián)接強(qiáng)度以及閾值,使誤差沿梯度方向下降,經(jīng)過反復(fù)學(xué)習(xí)訓(xùn)練,確定與最小誤差相對應(yīng)的網(wǎng)絡(luò)參數(shù)(權(quán)值和閾值),訓(xùn)練即告停止。此時經(jīng)過訓(xùn)練的神經(jīng)網(wǎng)絡(luò)即能對類似樣本的輸入信息,自行處理輸出誤差最小的經(jīng)過非線形轉(zhuǎn)換的信息。
BP(back propagation)神經(jīng)網(wǎng)絡(luò)是1986年由Rumelhart和McClelland為首的科學(xué)家提出的概念,是一種按照誤差逆向傳播算法訓(xùn)練的多層前饋神經(jīng)網(wǎng)絡(luò),是目前應(yīng)用最廣泛的神經(jīng)網(wǎng)絡(luò)。
基本原理
人工神經(jīng)網(wǎng)絡(luò)無需事先確定輸入輸出之間映射關(guān)系的數(shù)學(xué)方程,僅通過自身的訓(xùn)練,學(xué)習(xí)某種規(guī)則,在給定輸入值時得到最接近期望輸出值的結(jié)果。作為一種智能信息處理系統(tǒng),人工神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)其功能的核心是算法。BP神經(jīng)網(wǎng)絡(luò)是一種按誤差反向傳播(簡稱誤差反傳)訓(xùn)練的多層前饋網(wǎng)絡(luò),其算法稱為BP算法,它的基本思想是梯度下降法,利用梯度搜索技術(shù),以期使網(wǎng)絡(luò)的實(shí)際輸出值和期望輸出值的誤差均方差為最小?;綛P算法包括信號的前向傳播和誤差的反向傳播兩個過程。即計算誤差輸出時按從輸入到輸出的方向進(jìn)行,而調(diào)整權(quán)值和閾值則從輸出到輸入的方向進(jìn)行。正向傳播時,輸入信號通過隱含層作用于輸出節(jié)點(diǎn),經(jīng)過非線性變換,產(chǎn)生輸出信號,若實(shí)際輸出與期望輸出不相符,則轉(zhuǎn)入誤差的反向傳播過程。誤差反傳是將輸出誤差通過隱含層向輸入層逐層反傳,并將誤差分?jǐn)偨o各層所有單元,以從各層獲得的誤差信號作為調(diào)整各單元權(quán)值的依據(jù)。通過調(diào)整輸入節(jié)點(diǎn)與隱層節(jié)點(diǎn)的聯(lián)接強(qiáng)度和隱層節(jié)點(diǎn)與輸出節(jié)點(diǎn)的聯(lián)接強(qiáng)度以及閾值,使誤差沿梯度方向下降,經(jīng)過反復(fù)學(xué)習(xí)訓(xùn)練,確定與最小誤差相對應(yīng)的網(wǎng)絡(luò)參數(shù)(權(quán)值和閾值),訓(xùn)練即告停止。此時經(jīng)過訓(xùn)練的神經(jīng)網(wǎng)絡(luò)即能對類似樣本的輸入信息,自行處理輸出誤差最小的經(jīng)過非線形轉(zhuǎn)換的信息。[3]
結(jié)構(gòu)
BP網(wǎng)絡(luò)是在輸入層與輸出層之間增加若干層(一層或多層)神經(jīng)元,這些神經(jīng)元稱為隱單元,它們與外界沒有直接的聯(lián)系,但其狀態(tài)的改變,則能影響輸入與輸出之間的關(guān)系,每一層可以有若干個節(jié)點(diǎn)。[4]
計算過程
BP神經(jīng)網(wǎng)絡(luò)的計算過程由正向計算過程和反向計算過程組成。正向傳播過程,輸入模式從輸入層經(jīng)隱單元層逐層處理,并轉(zhuǎn)向輸出層,每~層神經(jīng)元的狀態(tài)只影響下一層神經(jīng)元的狀態(tài)。如果在輸出層不能得到期望的輸出,則轉(zhuǎn)入反向傳播,將誤差信號沿原來的連接通路返回,通過修改各神經(jīng)元的權(quán)值,使得誤差信號最小。1.網(wǎng)絡(luò)狀態(tài)初始化2.前向計算過程[4]
優(yōu)劣勢
BP神經(jīng)網(wǎng)絡(luò)無論在網(wǎng)絡(luò)理論還是在性能方面已比較成熟。其突出優(yōu)點(diǎn)就是具有很強(qiáng)的非線性映射能力和柔性的網(wǎng)絡(luò)結(jié)構(gòu)。網(wǎng)絡(luò)的中間層數(shù)、各層的神經(jīng)元個數(shù)可根據(jù)具體情況任意設(shè)定,并且隨著結(jié)構(gòu)的差異其性能也有所不同。但是BP神經(jīng)網(wǎng)絡(luò)也存在以下的一些主要缺陷。①學(xué)習(xí)速度慢,即使是一個簡單的問題,一般也需要幾百次甚至上千次的學(xué)習(xí)才能收斂。②容易陷入局部極小值。③網(wǎng)絡(luò)層數(shù)、神經(jīng)元個數(shù)的選擇沒有相應(yīng)的理論指導(dǎo)。④網(wǎng)絡(luò)推廣能力有限。對于上述問題,目前已經(jīng)有了許多改進(jìn)措施,研究最多的就是如何加速網(wǎng)絡(luò)的收斂速度和盡量避免陷入局部極小值的問題。[5]
應(yīng)用
目前,在人工神經(jīng)網(wǎng)絡(luò)的實(shí)際應(yīng)用中,絕大部分的神經(jīng)網(wǎng)絡(luò)模型都采用BP網(wǎng)絡(luò)及其變化形式。它也是前向網(wǎng)絡(luò)的核心部分,體現(xiàn)了人工神經(jīng)網(wǎng)絡(luò)的精華。BP網(wǎng)絡(luò)主要用于以下四個方面。1)函數(shù)逼近:用輸入向量和相應(yīng)的輸出向量訓(xùn)練一個網(wǎng)絡(luò)逼近一個函數(shù)。2)模式識別:用一個待定的輸出向量將它與輸入向量聯(lián)系起來。3)分類:把輸入向量所定義的合適方式進(jìn)行分類。4)數(shù)據(jù)壓縮:減少輸出向量維數(shù)以便于傳輸或存儲。
BP算法的基本思想
上一次我們說到,多層感知器在如何獲取隱層的權(quán)值的問題上遇到了瓶頸。既然我們無法直接得到隱層的權(quán)值,能否先通過輸出層得到輸出結(jié)果和期望輸出的誤差來間接調(diào)整隱層的權(quán)值呢?BP算法就是采用這樣的思想設(shè)計出來的算法,它的基本思想是,學(xué)習(xí)過程由信號的正向傳播與誤差的反向傳播兩個過程組成。
正向傳播時,輸入樣本從輸入層傳入,經(jīng)各隱層逐層處理后,傳向輸出層。若輸出層的實(shí)際輸出與期望的輸出(教師信號)不符,則轉(zhuǎn)入誤差的反向傳播階段。
反向傳播時,將輸出以某種形式通過隱層向輸入層逐層反傳,并將誤差分?jǐn)偨o各層的所有單元,從而獲得各層單元的誤差信號,此誤差信號即作為修正各單元權(quán)值的依據(jù)。
這兩個過程的具體流程會在后文介紹。
BP算法的信號流向圖如下圖所示
BP網(wǎng)絡(luò)特性分析——BP三要素
我們分析一個ANN時,通常都是從它的三要素入手,即
1)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu);
2)傳遞函數(shù);
3)學(xué)習(xí)算法。
每一個要素的特性加起來就決定了這個ANN的功能特性。所以,我們也從這三要素入手對BP網(wǎng)絡(luò)的研究。
3.1 BP網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)
上一次已經(jīng)說了,BP網(wǎng)絡(luò)實(shí)際上就是多層感知器,因此它的拓?fù)浣Y(jié)構(gòu)和多層感知器的拓?fù)浣Y(jié)構(gòu)相同。由于單隱層(三層)感知器已經(jīng)能夠解決簡單的非線性問題,因此應(yīng)用最為普遍。三層感知器的拓?fù)浣Y(jié)構(gòu)如下圖所示。
一個最簡單的三層BP:
3.2 BP網(wǎng)絡(luò)的傳遞函數(shù)
BP網(wǎng)絡(luò)采用的傳遞函數(shù)是非線性變換函數(shù)——Sigmoid函數(shù)(又稱S函數(shù))。其特點(diǎn)是函數(shù)本身及其導(dǎo)數(shù)都是連續(xù)的,因而在處理上十分方便。為什么要選擇這個函數(shù),等下在介紹BP網(wǎng)絡(luò)的學(xué)習(xí)算法的時候會進(jìn)行進(jìn)一步的介紹。
單極性S型函數(shù)曲線如下圖所示。
f(x)=11+e−x
雙極性S型函數(shù)曲線如下圖所示。
f(x)=1−e−x1+e−x
3.3 BP網(wǎng)絡(luò)的學(xué)習(xí)算法
BP網(wǎng)絡(luò)的學(xué)習(xí)算法就是BP算法,又叫 δ 算法(在ANN的學(xué)習(xí)過程中我們會發(fā)現(xiàn)不少具有多個名稱的術(shù)語), 以三層感知器為例,當(dāng)網(wǎng)絡(luò)輸出與期望輸出不等時,存在輸出誤差 E ,定義如下
E=12(d−O)2=12∑?κ=1(dk−ok)2
將以上誤差定義式展開至隱層,有
E=12∑?κ=1[dκ−f(netκ)]2=12∑?κ=1[dκ−f(∑mj=0ωjκyj)]2
進(jìn)一步展開至輸入層,有
E=12∑?κ=1dκ−f[∑mj=0ωjκf(netj)]2=12∑?κ=1dκ−f[∑mj=0ωjκf(∑nj=0υijχi)]2
由上式可以看出,網(wǎng)絡(luò)輸入誤差是各層權(quán)值ωjκ、υij的函數(shù),因此調(diào)整權(quán)值可改變誤差 E。 顯然,調(diào)整權(quán)值的原則是使誤差不斷減小,因此應(yīng)使權(quán)值與誤差的梯度下降成正比,即
Δωjκ=−η∂E∂ωjκj=0,1,2,…,m;κ=1,2,…,?
Δυij=−η∂E∂υiji=0,1,2,…,n;j=1,2,…,m
對于一般多層感知器,設(shè)共有 h 個隱層,按前向順序各隱層節(jié)點(diǎn)數(shù)分別記為 m1,m2,…,mh,各隱層輸出分別記為 y1,y2,…,yh,各層權(quán)值矩陣分別記為 W1,W2,…,Wh,Wh+1,則各層權(quán)值調(diào)整公式為
輸出層
Δωh+1jκ=ηδκh+1yhj=η(dκ−oκ)oκ(1−oκ)yκj(j=0,1,2,…,mh;κ=1,2,…,?)
第 h 隱層
Δωhij=ηδhjyhi−1=η(∑lκ=1δoκωh+1jκyκj(1−ykjappa)yhi−1(i=0,1,2,…,m(h−1);j=1,2,…,mh)
按以上規(guī)律逐層類推,則第一隱層權(quán)值調(diào)整公式
Δω1pq=ηδ1qχp=η(∑m2r=1δ……2——rω2qr)y1q(1−y1q)χp(p=0,1,2,…,n;j=1,2,…,m1)
容易看出,BP學(xué)習(xí)算法中,各層權(quán)值調(diào)整公式形式上都是一樣的,均由3個因素決定,即:
學(xué)習(xí)率 η本層輸出的誤差信號δ本層輸入信號 Y(或X)
其中輸入層誤差信號與網(wǎng)絡(luò)的期望輸出與實(shí)際輸出之差有關(guān),直接反應(yīng)了輸出誤差,而各隱層的誤差信號與前面各層的誤差信號有關(guān),是從輸出層開始逐層反傳過來的。
可以看出BP算法屬于δ學(xué)習(xí)規(guī)則類,這類算法常被稱為誤差的梯度下降算法。δ學(xué)習(xí)規(guī)則可以看成是Widrow-Hoff(LMS)學(xué)習(xí)規(guī)則的一般化(generalize)情況。LMS學(xué)習(xí)規(guī)則與神經(jīng)元采用的變換函數(shù)無關(guān),因而不需要對變換函數(shù)求導(dǎo),δ學(xué)習(xí)規(guī)則則沒有這個性質(zhì),要求變換函數(shù)可導(dǎo)。這就是為什么我們前面采用Sigmoid函數(shù)的原因。
綜上所述,BP三要素如下圖所示。
下面我們會介紹BP網(wǎng)絡(luò)的學(xué)習(xí)訓(xùn)練的具體過程。
BP網(wǎng)絡(luò)的訓(xùn)練分解
訓(xùn)練一個BP神經(jīng)網(wǎng)絡(luò),實(shí)際上就是調(diào)整網(wǎng)絡(luò)的權(quán)重和偏置這兩個參數(shù),BP神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程分兩部分:
前向傳輸,逐層波浪式的傳遞輸出值;
逆向反饋,反向逐層調(diào)整權(quán)重和偏置;
我們先來看前向傳輸。
前向傳輸(Feed-Forward前向反饋)
在訓(xùn)練網(wǎng)絡(luò)之前,我們需要隨機(jī)初始化權(quán)重和偏置,對每一個權(quán)重取[−1,1]的一個隨機(jī)實(shí)數(shù),每一個偏置?。?,1]的一個隨機(jī)實(shí)數(shù),之后就開始進(jìn)行前向傳輸。
神經(jīng)網(wǎng)絡(luò)的訓(xùn)練是由多趟迭代完成的,每一趟迭代都使用訓(xùn)練集的所有記錄,而每一次訓(xùn)練網(wǎng)絡(luò)只使用一條記錄,抽象的描述如下:
while 終止條件未滿足:
for record:dataset:
trainModel(record)123
首先設(shè)置輸入層的輸出值,假設(shè)屬性的個數(shù)為100,那我們就設(shè)置輸入層的神經(jīng)單元個數(shù)為100,輸入層的結(jié)點(diǎn)Ni為記錄第i維上的屬性值xi。對輸入層的操作就這么簡單,之后的每層就要復(fù)雜一些了,除輸入層外,其他各層的輸入值是上一層輸入值按權(quán)重累加的結(jié)果值加上偏置,每個結(jié)點(diǎn)的輸出值等該結(jié)點(diǎn)的輸入值作變換
前向傳輸?shù)妮敵鰧拥挠嬎氵^程公式如下:
Ij=∑i=1ωijoi+θj
oj=f(Ij)=11+eIj
對隱藏層和輸出層的每一個結(jié)點(diǎn)都按照如上圖的方式計算輸出值,就完成前向傳播的過程,緊接著是進(jìn)行逆向反饋。
逆向反饋(Backpropagation)
逆向反饋從最后一層即輸出層開始,我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)作分類的目的往往是希望最后一層的輸出能夠描述數(shù)據(jù)記錄的類別,比如對于一個二分類的問題,我們常常用兩個神經(jīng)單元作為輸出層,如果輸出層的第一個神經(jīng)單元的輸出值比第二個神經(jīng)單元大,我們認(rèn)為這個數(shù)據(jù)記錄屬于第一類,否則屬于第二類。
還記得我們第一次前向反饋時,整個網(wǎng)絡(luò)的權(quán)重和偏置都是我們隨機(jī)取,因此網(wǎng)絡(luò)的輸出肯定還不能描述記錄的類別,因此需要調(diào)整網(wǎng)絡(luò)的參數(shù),即權(quán)重值和偏置值,而調(diào)整的依據(jù)就是網(wǎng)絡(luò)的輸出層的輸出值與類別之間的差異,通過調(diào)整參數(shù)來縮小這個差異,這就是神經(jīng)網(wǎng)絡(luò)的優(yōu)化目標(biāo)。對于輸出層:
Ej=Oj(1−Oj)(Tj−Oj)
其中Ej表示第j個結(jié)點(diǎn)的誤差值,Oj表示第j個結(jié)點(diǎn)的輸出值,Tj記錄輸出值,比如對于2分類問題,我們用01表示類標(biāo)1,10表示類別2,如果一個記錄屬于類別1,那么其T1=0,T2=1。
中間的隱藏層并不直接與數(shù)據(jù)記錄的類別打交道,而是通過下一層的所有結(jié)點(diǎn)誤差按權(quán)重累加,計算公式如下:
Ej=Oj(1−Oj)∑kEkWjk
其中Wjk表示當(dāng)前層的結(jié)點(diǎn)j到下一層的結(jié)點(diǎn)k的權(quán)重值,Ek下一層的結(jié)點(diǎn)k的誤差率。
計算完誤差率后,就可以利用誤差率對權(quán)重和偏置進(jìn)行更新,首先看權(quán)重的更新:
其中λ表示表示學(xué)習(xí)速率,取值為0到1,學(xué)習(xí)速率設(shè)置得大,訓(xùn)練收斂更快,但容易陷入局部最優(yōu)解,學(xué)習(xí)速率設(shè)置得比較小的話,收斂速度較慢,但能一步步逼近全局最優(yōu)解。
更新完權(quán)重后,還有最后一項(xiàng)參數(shù)需要更新,即偏置:
至此,我們完成了一次神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程,通過不斷的使用所有數(shù)據(jù)記錄進(jìn)行訓(xùn)練,從而得到一個分類模型。不斷地迭代,不可能無休止的下去,總歸有個終止條件
訓(xùn)練終止條件
每一輪訓(xùn)練都使用數(shù)據(jù)集的所有記錄,但什么時候停止,停止條件有下面兩種:
設(shè)置最大迭代次數(shù),比如使用數(shù)據(jù)集迭代100次后停止訓(xùn)練
計算訓(xùn)練集在網(wǎng)絡(luò)上的預(yù)測準(zhǔn)確率,達(dá)到一定門限值后停止訓(xùn)練
BP網(wǎng)絡(luò)運(yùn)行的具體流程
網(wǎng)絡(luò)結(jié)構(gòu)
輸入層有n個神經(jīng)元,隱含層有p個神經(jīng)元,輸出層有q個神經(jīng)元。
變量定義
輸入變量:
x=(x1,x2,…,xn)
隱含層輸入變量:
hi=(hi1,hi2,…,hip)
隱含層輸出變量:
ho=(ho1,ho2,…,hop)
輸出層輸入變量:
yi=(yi1,yi2,…,yiq)
輸出層輸出變量:
yo=(yo1,yo2,…,yoq)
期望輸出向量:
do=(d1,d2,…,dq)
輸入層與中間層的連接權(quán)值:
wih
隱含層與輸出層的連接權(quán)值:
who
隱含層各神經(jīng)元的閾值:
bh
輸出層各神經(jīng)元的閾值:
bo
樣本數(shù)據(jù)個數(shù):
k=1,2,…,m
激活函數(shù):
f(⋅)
誤差函數(shù):
e=12∑o=1q(do(k)−yoo(k))2
第一步:網(wǎng)絡(luò)初始化
給各連接權(quán)值分別賦一個區(qū)間(−1,1)內(nèi)的隨機(jī)數(shù),設(shè)定誤差函數(shù)e,給定計算精度值ε和最大學(xué)習(xí)次數(shù)M。
第二步:隨機(jī)選取
隨機(jī)選取第k個輸入樣本以及對應(yīng)的期望輸出
x(k)=(x1(k),x2(k),…,xn(k))do(k)=(d1(k),d2(k),…,dq(k))
第三部:隱含層計算
計算隱含層各神經(jīng)元的輸入和輸出
hih(k)=∑i=1nwihxi(k)−bh(h=1,2,…,p)
hih(k)=f(hih(k))(h=1,2,…,p)
yio(k)=∑h=1pwhohoh(k)−bo(o=1,2,…,q)
yoo(k)=f(yio(k))(o=1,2,…,q)
第四步:求偏導(dǎo)數(shù)
利用網(wǎng)絡(luò)期望輸出和實(shí)際輸出,計算誤差函數(shù)對輸出層的各神經(jīng)元的偏導(dǎo)數(shù)δo(k)
第六步:修正權(quán)值
利用輸出層各神經(jīng)元的δo(k)和隱含層各神經(jīng)元的輸出來修正連接權(quán)值who(k)。
第七部:修正權(quán)值
利用隱含層各神經(jīng)元的δh(k)和輸入層各神經(jīng)元的輸入修正連接權(quán)值。
第八步:計算全局誤差
E=12m∑k=1m∑o=1q(do(k)−yo(k))2
第九步:判斷模型合理性
判斷網(wǎng)絡(luò)誤差是否滿足要求。
當(dāng)誤差達(dá)到預(yù)設(shè)精度或者學(xué)習(xí)次數(shù)大于設(shè)計的最大次數(shù),則結(jié)束算法。
否則,選取下一個學(xué)習(xí)樣本以及對應(yīng)的輸出期望,返回第三部,進(jìn)入下一輪學(xué)習(xí)。
BP網(wǎng)絡(luò)的設(shè)計
在進(jìn)行BP網(wǎng)絡(luò)的設(shè)計是,一般應(yīng)從網(wǎng)絡(luò)的層數(shù)、每層中的神經(jīng)元個數(shù)和激活函數(shù)、初始值以及學(xué)習(xí)速率等幾個方面來進(jìn)行考慮,下面是一些選取的原則。
1.網(wǎng)絡(luò)的層數(shù)
理論已經(jīng)證明,具有偏差和至少一個S型隱層加上一個線性輸出層的網(wǎng)絡(luò),能夠逼近任何有理函數(shù),增加層數(shù)可以進(jìn)一步降低誤差,提高精度,但同時也是網(wǎng)絡(luò) 復(fù)雜化。另外不能用僅具有非線性激活函數(shù)的單層網(wǎng)絡(luò)來解決問題,因?yàn)槟苡脝螌泳W(wǎng)絡(luò)解決的問題,用自適應(yīng)線性網(wǎng)絡(luò)也一定能解決,而且自適應(yīng)線性網(wǎng)絡(luò)的 運(yùn)算速度更快,而對于只能用非線性函數(shù)解決的問題,單層精度又不夠高,也只有增加層數(shù)才能達(dá)到期望的結(jié)果。
2.隱層神經(jīng)元的個數(shù)
網(wǎng)絡(luò)訓(xùn)練精度的提高,可以通過采用一個隱含層,而增加其神經(jīng)元個數(shù)的方法來獲得,這在結(jié)構(gòu)實(shí)現(xiàn)上要比增加網(wǎng)絡(luò)層數(shù)簡單得多。一般而言,我們用精度和 訓(xùn)練網(wǎng)絡(luò)的時間來恒量一個神經(jīng)網(wǎng)絡(luò)設(shè)計的好壞:
?。?)神經(jīng)元數(shù)太少時,網(wǎng)絡(luò)不能很好的學(xué)習(xí),訓(xùn)練迭代的次數(shù)也比較多,訓(xùn)練精度也不高。
(2)神經(jīng)元數(shù)太多時,網(wǎng)絡(luò)的功能越強(qiáng)大,精確度也更高,訓(xùn)練迭代的次數(shù)也大,可能會出現(xiàn)過擬合(over fitting)現(xiàn)象。
由此,我們得到神經(jīng)網(wǎng)絡(luò)隱層神經(jīng)元個數(shù)的選取原則是:在能夠解決問題的前提下,再加上一兩個神經(jīng)元,以加快誤差下降速度即可。
3.初始權(quán)值的選取
一般初始權(quán)值是取值在(−1,1)之間的隨機(jī)數(shù)。另外威得羅等人在分析了兩層網(wǎng)絡(luò)是如何對一個函數(shù)進(jìn)行訓(xùn)練后,提出選擇初始權(quán)值量級為s√r的策略, 其中r為輸入個數(shù),s為第一層神經(jīng)元個數(shù)。
4.學(xué)習(xí)速率
學(xué)習(xí)速率一般選取為0.01−0.8,大的學(xué)習(xí)速率可能導(dǎo)致系統(tǒng)的不穩(wěn)定,但小的學(xué)習(xí)速率導(dǎo)致收斂太慢,需要較長的訓(xùn)練時間。對于較復(fù)雜的網(wǎng)絡(luò), 在誤差曲面的不同位置可能需要不同的學(xué)習(xí)速率,為了減少尋找學(xué)習(xí)速率的訓(xùn)練次數(shù)及時間,比較合適的方法是采用變化的自適應(yīng)學(xué)習(xí)速率,使網(wǎng)絡(luò)在 不同的階段設(shè)置不同大小的學(xué)習(xí)速率。
5.期望誤差的選取
在設(shè)計網(wǎng)絡(luò)的過程中,期望誤差值也應(yīng)當(dāng)通過對比訓(xùn)練后確定一個合適的值,這個合適的值是相對于所需要的隱層節(jié)點(diǎn)數(shù)來確定的。一般情況下,可以同時對兩個不同 的期望誤差值的網(wǎng)絡(luò)進(jìn)行訓(xùn)練,最后通過綜合因素來確定其中一個網(wǎng)絡(luò)。
BP網(wǎng)絡(luò)的局限性
BP網(wǎng)絡(luò)具有以下的幾個問題:
?。?)需要較長的訓(xùn)練時間:這主要是由于學(xué)習(xí)速率太小所造成的,可采用變化的或自適應(yīng)的學(xué)習(xí)速率來加以改進(jìn)。
(2)完全不能訓(xùn)練:這主要表現(xiàn)在網(wǎng)絡(luò)的麻痹上,通常為了避免這種情況的產(chǎn)生,一是選取較小的初始權(quán)值,而是采用較小的學(xué)習(xí)速率。
(3)局部最小值:這里采用的梯度下降法可能收斂到局部最小值,采用多層網(wǎng)絡(luò)或較多的神經(jīng)元,有可能得到更好的結(jié)果。
BP網(wǎng)絡(luò)的改進(jìn)
P算法改進(jìn)的主要目標(biāo)是加快訓(xùn)練速度,避免陷入局部極小值等,常見的改進(jìn)方法有帶動量因子算法、自適應(yīng)學(xué)習(xí)速率、變化的學(xué)習(xí)速率以及作用函數(shù)后縮法等。 動量因子法的基本思想是在反向傳播的基礎(chǔ)上,在每一個權(quán)值的變化上加上一項(xiàng)正比于前次權(quán)值變化的值,并根據(jù)反向傳播法來產(chǎn)生新的權(quán)值變化。而自適應(yīng)學(xué)習(xí) 速率的方法則是針對一些特定的問題的。改變學(xué)習(xí)速率的方法的原則是,若連續(xù)幾次迭代中,若目標(biāo)函數(shù)對某個權(quán)倒數(shù)的符號相同,則這個權(quán)的學(xué)習(xí)速率增加, 反之若符號相反則減小它的學(xué)習(xí)速率。而作用函數(shù)后縮法則是將作用函數(shù)進(jìn)行平移,即加上一個常數(shù)。
BP網(wǎng)絡(luò)實(shí)現(xiàn)
由于BP網(wǎng)絡(luò)具有出色的非線性映射能力、泛化能力和容錯能力,因此BP網(wǎng)絡(luò)成了至今為止應(yīng)用最廣泛的人工神經(jīng)網(wǎng)絡(luò)。下圖是Matlab下用BP網(wǎng)絡(luò)做線性擬合的結(jié)果,效果很好。
% BP網(wǎng)絡(luò)函數(shù)逼近實(shí)例
% 1.首先定義正弦函數(shù),采樣率為20Hz,頻率為1Hz
k = 1; % 設(shè)定正弦信號頻率
p = [0:0.05:4];
t = cos(k*pi*p) + 3*sin(pi*p);
plot(p, t, ‘-’), xlabel(‘時間’); ylabel(‘輸入信號’);
% 2.生成BP網(wǎng)絡(luò)。用newff函數(shù)生成前向型BP網(wǎng)絡(luò),設(shè)定隱層中神經(jīng)元數(shù)目為10
% 分別選擇隱層的傳遞函數(shù)為 tansig,輸出層的傳遞函數(shù)為 purelin,
% 學(xué)習(xí)算法為trainlm。
net =
newff(minmax(p),[10,10,1],{‘tansig’,‘tansig’,‘purelin’},‘trainlm’);
% 3.對生成的網(wǎng)絡(luò)進(jìn)行仿真并做圖顯示。
y1 = sim(net,p); plot(p, t, ‘-’, p, y1, ‘--’)
% 4.訓(xùn)練。對網(wǎng)絡(luò)進(jìn)行訓(xùn)練,設(shè)定訓(xùn)練誤差目標(biāo)為 1e-5,最大迭代次數(shù)為300,
% 學(xué)習(xí)速率為0.05。
net.trainParam.lr=0.05;
net.trainParam.epochs=1000;
net.trainParam.goal=1e-5;
?。踤et,tr]=train(net,p,t);
%5.再次對生成的網(wǎng)絡(luò)進(jìn)行仿真并做圖顯示。
y2 = sim(net,p);
plot(p, t, ‘-’, p, y2, ‘--’)12345678910111213141516171819202122
這是用C語言寫的:用BP神經(jīng)網(wǎng)絡(luò)擬合函數(shù):Y=sin(X)#include “math.h”
#include “time.h”
#include “stdio.h”
#include “stdlib.h”
#include “ctype.h”
#define Ni 1
#define Nm 4
#define No 1
#define L 100
#define Enom 0.02
#define loopmax 100000
#define e 2.71828
double E;
double a,u,n;
double W1[Ni][Nm],D1[Ni][Nm],W2[Nm][No],D2[Nm][No];
double D22[Nm][No],D11[Ni][No];
double a1[Ni][Nm],a2[Nm][No];
double Pi[L][Ni],Pm[L][Nm],Po[L][No],T[L][No];
double Xm[L][Nm],Xo[L][No];
double Qm[L][Nm],Qo[L][No];
void proceed();
void proceedR();
void forQ();
void amend();
void initiate();
double newa(double a,double D);
double cal(double d);
double vcal(double d);
main()
{
long int i;
int flag;
char choice;
for(;;)
{
flag=0;
initiate();
for(i=0;;i++)
{
proceed();
if( E 《 Enom )
{
flag=1;
break;
}
if( i 》= loopmax)
{
flag = -1;
break;
}
if(i%2500==0)
printf(“第%10d輪誤差:%20f,學(xué)習(xí)速率:%10f\n”,i,E,a1[0][0]);
forQ();
amend();
}
if(flag》0)proceedR();
else printf(“訓(xùn)練失敗!\n”);
for(;;)
{
choice=getchar();
printf(“是否繼續(xù)?(Y/N)\n”);
choice=getchar();
choice=toupper(choice);
if(choice==‘Y’)break;
if(choice==‘N’)exit(0);
}
}
}
void initiate()
{
int i,j;
int random;
double x;
double step;
int stime;
long ltime;
ltime=time(NULL);
stime=(unsigned)ltime/2;
srand(stime);
a=0.02;
u=1;
n=1;
printf(“本程序?qū)⒂肂P神經(jīng)網(wǎng)絡(luò)擬合函數(shù):Y=sin(X)\n\n”);
for( i=0; i《Nm; i++)
{
for( j=0; j《Ni; j++)
{
random=rand()%100-50;
x=random;
x=x/100;
W1[j][i]=x;
D11[j][i]=0;
D1[j][i]=0;
a1[j][i]=0.01;
}
for( j=0; j《No; j++)
{
random=rand()%100-50;
x=random;
x=x/100;
W2[i][j]=x;
D22[i][j]=0;
D2[i][j]=0;
a2[i][j]=0.01;
}
}
step=1.0/L;
for(i=0;i《L;i++)
{
x=i;
Pi[i][0]=x*step;
T[i][0]=sin(Pi[i][0]);
}
printf(“初始化成功!\n\n下面將對神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練請稍候。\n”);
}
void proceed()
{
int i, j, k;
E=0 ;
for( i=0; i《L; i++ )
{
for( j=0; j《Nm; j++ )
{
Pm[i][j] = 0;
for( k=0; k《Ni; k++ )
{
Pm[i][j] = Pi[i][k] * W1[k][j] + Pm[i][j];
}
Xm[i][j] = cal( Pm[i][j] );
}
for( j=0; j《No; j++)
{
Po[i][j] = 0;
for( k=0; k《Nm; k++)
{
Po[i][j] = Xm[i][k] * W2[k][j] + Po[i][j];
}
Xo[i][j] = cal( Po[i][j] );
E = E + ( Xo[i][j] - T[i][j] ) * ( Xo[i][j] - T[i][j] ) / 2;
}
}
}
void forQ()
{
int i,j,k;
for( i=0; i《L; i++ )
{
for( j=0; j《No; j++)
{
Qo[i][j] = ( T[i][j] - Xo[i][j] )* vcal( Xo[i][j] );
}
for(j=0; j《Nm; j++)
{
Qm[i][j]=0;
for( k=0; k《No; k++)
{
Qm[i][j] = Qo[i][k] * W2[j][k] + Qm[i][j];
}
Qm[i][j] = Qm[i][j] * vcal( Xm[i][j] );
}
}
}
void amend()
{
int i,j,k;
double D;
for( i=0; i《Nm; i++)
{
for( j=0; j《Ni; j++)
{
D1[j][i]=0;
}
for( j=0; j《No; j++)
{
D2[i][j]=0;
}
}
for( i=0; i《Ni; i++)
{
for( j=0; j《Nm; j++)
{
for( k=0; k《L; k++)
{
D1[i][j] = Qm[k][j] * Pi[k][i] + D1[i][j];
}
D = D1[i][j] * D11[i][j] ;//為D11付初值
a1[i][j] = newa( a1[i][j] , D ); // a 付初值
W1[i][j] = W1[i][j] + a1[i][j] * ( n * D1[i][j] + ( 1 - n ) * D11[i][j] );
D11[i][j] = D1[i][j];
}
}
for( i=0; i《Nm; i++)
{
for( j=0; j《No; j++)
{
for( k=0; k《L; k++)
{
D2[i][j] = Qo[k][j] * Xm[k][i] + D2[i][j];
}
D = D2[i][j] * D22[i][j] ;//為D11付初值
a2[i][j] = newa( a2[i][j] , D );
W2[i][j] = W2[i][j] + a2[i][j] * ( n * D2[i][j] + ( 1 - n ) * D22[i][j] );
D22[i][j] = D2[i][j];
}
}
}
void proceedR()
{
int i, j;
float x;
double input,output;
char choice;
for(;;)
{
for(;;)
{
printf(“在此輸入需要計算的值(0,1):\n”);
scanf(“%f”,&x);
input=(double)x;
if((input》=0)&(input《=1))break;
printf(“注意輸入值應(yīng)介于0、1之間!\n”);
for(;;)
{
choice=getchar();
printf(“是否繼續(xù)?(Y/N)\n”);
choice=getchar();
choice=toupper(choice);
if(choice==‘Y’)break;
if(choice==‘N’)exit(0);
}
}
for(i=0;i《Nm;i++)
{
Pm[0][i]=0;
for( j=0; j《Ni; j++ )
{
Pm[0][i] = input* W1[j][i]+Pm[0][i] ;
}
Xm[0][i] = cal( Pm[0][i] );
}
for( i=0; i《No; i++)
{
Po[0][i] = 0;
for( j=0; j《Nm; j++)
{
Po[0][i] = Xm[0][j] * W2[j][i]+Po[0][i];
}
}
output=cal( Po[0][0] );
printf(“輸入值為%20f對應(yīng)的結(jié)果為%f\n”,input,output);
printf(“輸入值為%20f對應(yīng)的正常結(jié)果為%f\n”,input,sin(input));
for(;;)
{
choice=getchar();
printf(“是否繼續(xù)?(Y/N)\n”);
choice=getchar();
choice=toupper(choice);
if(choice==‘Y’)break;
if(choice==‘N’)exit(0);
}
}
}
double newa(double a, double D)
{
if( D 》 0 )
{
{
if(a《=0.04)
a = a * 2;
else a=0.08;
}
}
else
if ( D 《 0)
{
if(a》=0.02)
{
a = a / 2;
}
else a=0.01;
}
return a;
}
double cal(double d)
{
d = - (d * u); // chushihua
d = exp( d );
d = 1 / ( 1 + d );
return d;
}
double vcal(double d)
{
return u * d * ( 1 - d );
}
BP網(wǎng)絡(luò)的基本概念和訓(xùn)練原理
BP網(wǎng)絡(luò) ,全稱為 反向傳播神經(jīng)網(wǎng)絡(luò)(Backpropagation Neural Network) ,是一種基于誤差反向傳播算法(Error Back...
2024-07-19 標(biāo)簽:神經(jīng)網(wǎng)絡(luò)BP網(wǎng)絡(luò)機(jī)器學(xué)習(xí) 1647 0
用TensorFlow2.0框架實(shí)現(xiàn)BP網(wǎng)絡(luò)
首先是為什么要使用激活函數(shù)?這要回顧一下我們在學(xué)習(xí)BP之前學(xué)習(xí)的感知器模型。它模仿的是人類體內(nèi)的信號傳導(dǎo)的過程,當(dāng)信號達(dá)到一定的閾值時,就可以繼續(xù)向后傳播。
BP網(wǎng)絡(luò)在蓄電池電壓監(jiān)測模塊設(shè)計與應(yīng)用
浮充電壓對蓄電池的容量及壽命有直接影響。高于推薦的極限浮充電壓會降低電池使用壽命及容量。低于推薦的浮充電壓會導(dǎo)致電池容量不足。蓄電池容量的減少將導(dǎo)致UP...
2017-12-01 標(biāo)簽:蓄電池bp網(wǎng)絡(luò) 1569 0
基于BP網(wǎng)絡(luò)的結(jié)冰傳感器非線性校正方法
0引言 結(jié)冰傳感器是用于探測結(jié)冰厚度的設(shè)備。它是基于振動原理設(shè)計的,振動體采用振管形式。當(dāng)振管垂直立于環(huán)境中時,激振電路為振管提供交變磁場,振管在
2010-12-20 標(biāo)簽:傳感器非線性bp網(wǎng)絡(luò) 955 0
幾種典型神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的比較與分析立即下載
類別:電子資料 2021-04-28 標(biāo)簽:神經(jīng)網(wǎng)絡(luò)BP網(wǎng)絡(luò)
類別:電子資料 2021-04-21 標(biāo)簽:神經(jīng)網(wǎng)絡(luò)BP網(wǎng)絡(luò)
【下載】采用VC++對話框?qū)崿F(xiàn)BP網(wǎng)絡(luò)數(shù)字字符圖像的識別資料分享立即下載
類別:C/C++語言編程 2017-12-20 標(biāo)簽:圖像識別BP網(wǎng)絡(luò)
RBF_BP網(wǎng)絡(luò)在火電廠氮氧化物濃度檢測的應(yīng)用_嚴(yán)玥立即下載
類別:模擬數(shù)字論文 2017-03-19 標(biāo)簽:BP網(wǎng)絡(luò)RBF
基于BP網(wǎng)絡(luò)的電渦流傳感器非線性補(bǔ)償_李蓮立即下載
類別:模擬數(shù)字論文 2017-01-30 標(biāo)簽:BP網(wǎng)絡(luò)電渦流傳感器非線性補(bǔ)償
基于神經(jīng)網(wǎng)絡(luò)的某型飛機(jī)發(fā)動機(jī)故障診斷研究立即下載
類別:電子書籍 2012-07-12 標(biāo)簽:神經(jīng)網(wǎng)絡(luò)BP網(wǎng)絡(luò)L-M算法
基于BP網(wǎng)絡(luò)的小麥腥黑穗病害分類診斷立即下載
類別:網(wǎng)絡(luò)協(xié)議論文 2011-12-22 標(biāo)簽:BP網(wǎng)絡(luò)
類別:網(wǎng)絡(luò)協(xié)議論文 2011-11-11 標(biāo)簽:BP網(wǎng)絡(luò)
BP網(wǎng)絡(luò)在數(shù)學(xué)模型數(shù)據(jù)處理中的應(yīng)用立即下載
類別:通信網(wǎng)絡(luò) 2011-05-14 標(biāo)簽:數(shù)據(jù)處理BP網(wǎng)絡(luò)
類別:通信網(wǎng)絡(luò) 2010-09-25 標(biāo)簽:BP網(wǎng)絡(luò)
基于BP網(wǎng)絡(luò)的字母識別 摘 要: 介紹了用BP神經(jīng)網(wǎng)絡(luò)方法對英文字母進(jìn)行識別,并在識別過程中考慮了噪聲干擾及非線性因素的存在,使網(wǎng)絡(luò)具有一定的容
2009-11-07 標(biāo)簽:BP網(wǎng)絡(luò) 1541 0
編輯推薦廠商產(chǎn)品技術(shù)軟件/工具OS/語言教程專題
電機(jī)控制 | DSP | 氮化鎵 | 功率放大器 | ChatGPT | 自動駕駛 | TI | 瑞薩電子 |
BLDC | PLC | 碳化硅 | 二極管 | OpenAI | 元宇宙 | 安森美 | ADI |
無刷電機(jī) | FOC | IGBT | 逆變器 | 文心一言 | 5G | 英飛凌 | 羅姆 |
直流電機(jī) | PID | MOSFET | 傳感器 | 人工智能 | 物聯(lián)網(wǎng) | NXP | 賽靈思 |
步進(jìn)電機(jī) | SPWM | 充電樁 | IPM | 機(jī)器視覺 | 無人機(jī) | 三菱電機(jī) | ST |
伺服電機(jī) | SVPWM | 光伏發(fā)電 | UPS | AR | 智能電網(wǎng) | 國民技術(shù) | Microchip |
Arduino | BeagleBone | 樹莓派 | STM32 | MSP430 | EFM32 | ARM mbed | EDA |
示波器 | LPC | imx8 | PSoC | Altium Designer | Allegro | Mentor | Pads |
OrCAD | Cadence | AutoCAD | 華秋DFM | Keil | MATLAB | MPLAB | Quartus |
C++ | Java | Python | JavaScript | node.js | RISC-V | verilog | Tensorflow |
Android | iOS | linux | RTOS | FreeRTOS | LiteOS | RT-THread | uCOS |
DuerOS | Brillo | Windows11 | HarmonyOS |