一 BP 神經(jīng)網(wǎng)絡(luò)簡介
(1)BP神經(jīng)網(wǎng)絡(luò)在深度學(xué)習(xí)的地位
BP神經(jīng)網(wǎng)絡(luò)被稱為“深度學(xué)習(xí)之旅的開端”,是神經(jīng)網(wǎng)絡(luò)的入門算法。
各種高大上的神經(jīng)網(wǎng)絡(luò)都是基于BP網(wǎng)絡(luò)出發(fā)的,最基礎(chǔ)的原理都是由BP網(wǎng)絡(luò)而來[1],另外由于BP神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)簡單,算法經(jīng)典, 是神經(jīng)網(wǎng)絡(luò)中應(yīng)用最廣泛的一種。
(2)什么是BP神經(jīng)網(wǎng)絡(luò)
BP神經(jīng)網(wǎng)絡(luò)(back propagation neural network)全稱是反向傳播神經(jīng)網(wǎng)絡(luò)。
神經(jīng)網(wǎng)絡(luò)發(fā)展部分背景如下[2]:
開始發(fā)展——在人工神經(jīng)網(wǎng)絡(luò)的發(fā)展歷史上,感知機(jī)網(wǎng)絡(luò)曾對人工神經(jīng)網(wǎng)絡(luò)的發(fā)展發(fā)揮了極大的作用,它的出現(xiàn)曾掀起了人們研究人工神經(jīng)元網(wǎng)絡(luò)的熱潮。單層感知網(wǎng)絡(luò)(M-P模型)做為最初的神經(jīng)網(wǎng)絡(luò),具有模型清晰、結(jié)構(gòu)簡單、計算量小等優(yōu)點。
只能解決線性可分——但是,隨著研究工作的深入,人們發(fā)現(xiàn)它還存在不足,例如無法處理非線性問題,即使計算單元的作用函數(shù)不用閥函數(shù)而用其他較復(fù)雜的非線性函數(shù),仍然只能解決解決線性可分問題.不能實現(xiàn)某些基本功能,從而限制了它的應(yīng)用。
多層前饋網(wǎng)絡(luò)——增強(qiáng)網(wǎng)絡(luò)的分類和識別能力、解決非線性問題的唯一途徑是采用多層前饋網(wǎng)絡(luò),即在輸入層和輸出層之間加上隱含層。
BP神經(jīng)網(wǎng)絡(luò)登場——20世紀(jì)80年代中期,David Runelhart。Geoffrey Hinton和Ronald W-llians、DavidParker等人分別獨(dú)立發(fā)現(xiàn)了誤差反向傳播算法,簡稱BP,系統(tǒng)解決了多層神經(jīng)網(wǎng)絡(luò)隱含層連接權(quán)學(xué)習(xí)問題,并在數(shù)學(xué)上給出了完整推導(dǎo)。人們把采用這種算法進(jìn)行誤差校正的多層前饋網(wǎng)絡(luò)稱為BP網(wǎng)。
BP神經(jīng)網(wǎng)絡(luò)具有任意復(fù)雜的模式分類能力和優(yōu)良的多維函數(shù)映射能力,解決了簡單感知器不能解決的異或和一些其他問題。從結(jié)構(gòu)上講,BP網(wǎng)絡(luò)具有輸入層、隱藏層和輸出層;從本質(zhì)上講,BP算法就是以網(wǎng)絡(luò)誤差平方為目標(biāo)函數(shù)、采用梯度下降法來計算目標(biāo)函數(shù)的最小值。
為解決非線性問題,BP神經(jīng)網(wǎng)絡(luò)應(yīng)運(yùn)而生。
那么什么是BP神經(jīng)網(wǎng)絡(luò)?稍微專業(yè)點的解釋要怎么說呢?
BP神經(jīng)網(wǎng)絡(luò)是一個非常經(jīng)典的網(wǎng)絡(luò)結(jié)構(gòu)。整個網(wǎng)絡(luò)結(jié)構(gòu)包含了:一層輸入層,一到多層隱藏層,一層輸出層。它既可以處理線性問題,也可以處理非線性問題。學(xué)習(xí)過程由信號的正向傳播和誤差的反向傳播兩個過程組成。我們可以利用誤差反向傳播算法進(jìn)行迭代,使誤差逐漸減少到我們的接受范圍內(nèi)。
二 算法原理
很喜歡最簡單的神經(jīng)網(wǎng)絡(luò)--Bp神經(jīng)網(wǎng)絡(luò)一文對算法原理的解釋,語言活潑,案例簡單,由淺入深。
文中提到所謂的 AI 技術(shù),本質(zhì)上是一種數(shù)據(jù)處理處理技術(shù),它的強(qiáng)大來自于兩方面:1.互聯(lián)網(wǎng)的發(fā)展帶來的海量數(shù)據(jù)信息;2.計算機(jī)深度學(xué)習(xí)算法的快速發(fā)展。AI 其實并沒有什么神秘,只是在算法上更為復(fù)雜[3]。
我們從上面的定義出發(fā)來解釋BP神經(jīng)網(wǎng)絡(luò)的原理。
(1)網(wǎng)絡(luò)結(jié)構(gòu)
BP神經(jīng)網(wǎng)絡(luò)整個網(wǎng)絡(luò)結(jié)構(gòu)包含了:一層輸入層,一到多層隱藏層,一層輸出層。
一般說L層神經(jīng)網(wǎng)絡(luò),指的是有L個隱層,輸入層和輸出層都不計算在內(nèi)的[6]。
輸入層——神經(jīng)網(wǎng)絡(luò)中的第一層。它需要輸入信號并將它們傳遞到下一層。它不對輸入信號做任何操作,并且沒有關(guān)聯(lián)的權(quán)重和偏置值[4]
隱藏層——除輸入層和輸出層以外的其他各層叫做隱藏層。隱藏層不直接接受外界的信號,也不直接向外界發(fā)送信號。隱藏層在神經(jīng)網(wǎng)絡(luò)中的作用:中間的黑盒子,可以認(rèn)為是不同功能層的一個總稱。[5]
輸出層——網(wǎng)絡(luò)的最后一層,它接收來自最后一個隱藏層的輸入,輸出模型預(yù)測的結(jié)果值。
結(jié)構(gòu)圖
(2)正向傳播
BP神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練的學(xué)習(xí)過程由信號的正向傳播和誤差的反向傳播兩個過程組成。
什么是信號的正向傳播?顧名思義,就是結(jié)構(gòu)圖從左到右的運(yùn)算過程。
正向傳播就是讓信息從輸入層進(jìn)入網(wǎng)絡(luò),依次經(jīng)過每一層的計算,得到最終輸出層結(jié)果的過程。
我們來看看結(jié)構(gòu)圖中每個小圓圈是怎么運(yùn)作的。我們把小圈圈叫做神經(jīng)元,是組成神經(jīng)網(wǎng)絡(luò)的基本單元。
上一層的輸出數(shù)據(jù)作為小圈圈的輸入數(shù)據(jù),先加權(quán)求和加偏置b,然后代入激活函數(shù)f(x)計算,結(jié)果輸出。
先對輸入數(shù)據(jù)加權(quán)求和加偏置:
激活函數(shù)有很多選擇(relu,sigmod,tanh等),不過都不是很復(fù)雜的函數(shù),這里令,x代入函數(shù)計算結(jié)果作為神經(jīng)元的輸出。
是不是很簡單,每個小圈圈都在做這樣的“加權(quán)求和+函數(shù)代入計算”的工作。
正向傳播就是輸入數(shù)據(jù)經(jīng)過一層一層的神經(jīng)元運(yùn)算、輸出的過程,最后一層輸出值作為算法預(yù)測值y'。
(3)反向傳播/back propagation是指什么?
前面正向傳播的時候我們提到權(quán)重w、偏置b,但我們并不知道權(quán)重w、偏置b的值應(yīng)該是什么。關(guān)于最優(yōu)參數(shù)的求解,我們在線性回歸、邏輯回歸兩章中有了詳細(xì)說明。大致來講就是:
【步驟一】基于算法預(yù)測值和實際值之間的損失函數(shù)L(y',y):
【步驟二】然后基于梯度下降原理跟新參數(shù):,這里
是梯度下降學(xué)習(xí)率。
還記得高中的時候我們求曲線的極大值極小值就是對曲線求導(dǎo),求導(dǎo)值為0的點一定是個極值點。梯度下降就是通過對參數(shù)求偏導(dǎo)獲得最優(yōu)參數(shù)的方法。
BP神經(jīng)網(wǎng)絡(luò)全稱 back propagation neural network,back propagation反向傳播是什么?
反向傳播的建設(shè)本質(zhì)上就是尋找最優(yōu)的參數(shù)組合,和上面的流程差不多,根據(jù)算法預(yù)測值和實際值之間的損失函數(shù)L(y',y),來反方向地計算每一層的z、a、w、b的偏導(dǎo)數(shù),從而更新參數(shù)。
對反向傳播而言,輸入的內(nèi)容是預(yù)測值和實際值的誤差,輸出的內(nèi)容是對參數(shù)的更新,方向是從右往左,一層一層的更新每一層的參數(shù)。
BP神經(jīng)網(wǎng)絡(luò)通過先正向傳播,構(gòu)建參數(shù)和輸入值的關(guān)系,通過預(yù)測值和實際值的誤差,反向傳播修復(fù)權(quán)重;讀入新數(shù)據(jù)再正向傳播預(yù)測,再反向傳播修正,...,通過多次循環(huán)達(dá)到最小損失值,此時構(gòu)造的模型擁有最優(yōu)的參數(shù)組合。
(4)案例詳解
以一個簡單的BP神經(jīng)網(wǎng)絡(luò)為例,由3個輸入層,2層隱藏層,每層2個神經(jīng)元,1個輸出層組成。

首先做正向傳播操作。
【輸入層】傳入
【第一層隱藏層】
對于神經(jīng)元而言,傳入
,加權(quán)求和加偏置激活函數(shù)處理后,輸出
;
對于神經(jīng)元而言,傳入
,加權(quán)求和加偏置函數(shù)處理后,輸出
;
輸出:
【第二層隱藏層】
對于神經(jīng)元而言,傳入
,加權(quán)求和加偏置激活函數(shù)處理后,輸出
;
對于神經(jīng)元而言,傳入
,加權(quán)求和加偏置激活函數(shù)處理后,輸出
;
輸出:
【輸出層】
對于輸出層神經(jīng)元而言,輸入,加權(quán)求和加偏置激活函數(shù)處理后,輸出
,輸出的是一個值
第一次運(yùn)行正向傳播這個流程時隨用隨機(jī)參數(shù)就好,通過反向傳播不斷優(yōu)化。因此需要在一開始對設(shè)置一個隨機(jī)的初始值。
然后反向傳播修正參數(shù)
首先計算正向傳播輸出值與實際值的損失
,是一個數(shù)值。所謂反向是從右到左一步步來的,先回到
,修正參數(shù)
。
以此類推,通過對損失函數(shù)求偏導(dǎo)跟新參數(shù),再跟新參數(shù)
。這時又回到了起點,新的數(shù)據(jù)傳入又可以開始正向傳播了。
(5)基于keras的代碼構(gòu)建
keras可以快速搭建神經(jīng)網(wǎng)絡(luò),例如以下為輸入層包含7129個結(jié)點,一層隱藏層,包含128個結(jié)點,一個輸出層,是二分類模型。
import keras
model = keras.Sequential()
model.add(keras.layers.Dense(7129, input_dim=7129, kernel_initializer='normal', activation='tanh'))
model.add(keras.layers.Dense(128, kernel_initializer='normal', activation='tanh'))
model.add(keras.layers.Dense(2, kernel_initializer='normal', activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=6, batch_size=200, verbose=1) # 一個epoch=所有訓(xùn)練樣本的一個正向傳遞和一個反向傳遞
神經(jīng)網(wǎng)絡(luò)反向傳播的優(yōu)化目標(biāo)為loss,可以觀察到loss的值在不斷的優(yōu)化。

可以通過model.get_layer().get_weights()獲得每一層訓(xùn)練后的參數(shù)結(jié)果。通過model.predict()預(yù)測新數(shù)據(jù)。
(6)如何解決非線性問題?
至此,BP神經(jīng)網(wǎng)絡(luò)的整個運(yùn)算流程已經(jīng)過了一遍。之前提到BP神經(jīng)網(wǎng)絡(luò)是為解決非線性問題應(yīng)運(yùn)而生的,那么為什么BP神經(jīng)網(wǎng)絡(luò)可以解決非線性問題呢?
還記得神經(jīng)元里有一個激活函數(shù)的操作嗎?神經(jīng)網(wǎng)絡(luò)通過激活函數(shù)的使用加入非線性因素。
通過使用非線性的激活函數(shù)可以使神經(jīng)網(wǎng)絡(luò)隨意逼近復(fù)雜函數(shù),從而使BP神經(jīng)網(wǎng)絡(luò)既可以處理線性問題,也可以處理非線性問題。
為什么激活函數(shù)的使用可以加入非線性因素[7]?
【線性和非線性的理解】
區(qū)分線性模型和非線性模型,主要是看一個乘法式子中自變量x前的系數(shù)w,如果w只影響一個x,那么此模型為線性模型。
例如:
任意只影響一個
,所以是線性函數(shù)
任意不僅被
影響,還受到
的影響,所以是非線性函數(shù)
【激活函數(shù)加入的非線性因素】
以上述案例為例,神經(jīng)元H11輸出為(線性)
神經(jīng)元H12輸出為
(線性)
到第二層神經(jīng)元H21
此時的任意不僅被
影響,還受到
的影響,所以是非線性函數(shù)。
激活函數(shù)就是這樣加入的非線性因素的
三、算法拓展
(1)和邏輯回歸的關(guān)系
其實邏輯回歸算法可以看作只有一個神經(jīng)元的單層神經(jīng)網(wǎng)絡(luò),只對線性可分的數(shù)據(jù)進(jìn)行分類。
輸入?yún)?shù),加權(quán)求和,sigmoid作為激活函數(shù)計算后輸出結(jié)果,模型預(yù)測值和實際值計算損失Loss,反向傳播梯度下降求編導(dǎo),獲得最優(yōu)參數(shù)。

BP神經(jīng)網(wǎng)絡(luò)是比 Logistic Regression 復(fù)雜得多的模型,它的擬合能力很強(qiáng),可以處理很多 Logistic Regression處理不了的數(shù)據(jù),但是也更容易過擬合。
具體用什么算法還是要看訓(xùn)練數(shù)據(jù)的情況,沒有一種算法是使用所有情況的。
(2)和前饋型網(wǎng)絡(luò)的關(guān)系
前饋型網(wǎng)絡(luò)
各神經(jīng)元接收前一層的輸入,并輸出給下一層,沒有反饋。
節(jié)點分為兩類,即輸入節(jié)點和計算節(jié)點,每一個計算節(jié)點可有多個輸入,但只有一個輸出,通常前饋型網(wǎng)絡(luò)可分為不同的層,第i層的輸入只與第[i-1]層的輸出相連,輸入與輸出節(jié)點與外界相連,而其他中間層則稱為隱層。
常見的前饋神經(jīng)網(wǎng)絡(luò)有BP網(wǎng)絡(luò),RBF網(wǎng)絡(luò)等。
(3)BP神經(jīng)網(wǎng)絡(luò)優(yōu)缺點
BP神經(jīng)網(wǎng)絡(luò)的一個主要問題是:結(jié)構(gòu)不好設(shè)計。
網(wǎng)絡(luò)隱含層的層數(shù)和單元數(shù)的選擇尚無理論上的指導(dǎo),一般是根據(jù)經(jīng)驗或者通過反復(fù)實驗確定。
但是BP神經(jīng)網(wǎng)絡(luò)簡單、易行、計算量小、并行性強(qiáng),目前仍是多層前向網(wǎng)絡(luò)的首選算法。
參考資料
[1] 深度學(xué)習(xí)開端---BP神經(jīng)網(wǎng)絡(luò):https://blog.csdn.net/Chile_Wang/article/details/100557010
[2] BP神經(jīng)網(wǎng)絡(luò)發(fā)展歷史:https://zhuanlan.zhihu.com/p/47998728
[3] 最簡單的神經(jīng)網(wǎng)絡(luò)--Bp神經(jīng)網(wǎng)絡(luò):https://blog.csdn.net/weixin_40432828/article/details/82192709
[4] 神經(jīng)網(wǎng)絡(luò)的基本概念:https://blog.csdn.net/jinyuan7708/article/details/82466653
[5] 神經(jīng)網(wǎng)絡(luò)中的 “隱藏層” 理解:https://blog.csdn.net/nanhuaibeian/article/details/100183000
[6] AI學(xué)習(xí)筆記:神經(jīng)元與神經(jīng)網(wǎng)絡(luò):http://www.itdecent.cn/p/65eb2fce0e9e
[7] 線性模型和非線性模型的區(qū)別:https://www.cnblogs.com/toone/p/8574294.html
[8] BP神經(jīng)網(wǎng)絡(luò)是否優(yōu)于logistic回歸:https://www.zhihu.com/question/27823925/answer/38460833

