趙建民, 王雨萌
(東北石油大學 計算機與信息技術學院, 大慶 163318)
1943年,Warren Mc Culloch 和 Walter Pitts 提出了神經網絡層次結構模型[1],確立為神經網絡的計算模型理論,從而為機器學習的發展奠定了基礎。1950年“人工智能之父”圖靈發提出了著名的“圖靈測試”,使人工智能成為了計算機科學領域一個重要的研究課題[2]。
人工智能已成為全球新一輪科技革命和產業變革的著力點[3],其推廣和應用獲得了極大的成功,并逐漸成為一種極其重要的工程技術[4]。隨著人工智能技術的日益成熟和不斷深入,研究人員發現神經網絡愈發體現出其優越的性能,神經網絡是人工智能發展中所使用的重要方法,也是當前類腦智能研究中的有效工具[5]。而BP神經網絡(Back Propagation Neural Networks,BPNN)[6]則是應用普及程度最高的一項神經網絡內容[7-8],BP神經網絡已廣泛應用于非線性建摸、函數逼近、系統辨識等方面[9]。
本文將對標準的BP神經網絡算法進行改進,通過驗證異或問題并結合模式識別[10]中的手寫模式識別[11],將變化學習率應用于經典的BP神經網絡,用以解決固定學習率在訓練模型時所出現的易越過全局極小值點、模型收斂速度慢[12]的問題。
BP神經網絡是一種信號由正向傳播,誤差按逆傳播算法訓練的多層前饋神經網絡,BP神經網絡具有非線性映射能力強,容錯能力強,泛化能力強等優點。標準的BP神經網絡模型包含三層,分別是輸入層、隱藏層和輸出層.在正向傳播過程中,輸入樣本從輸入層傳入,傳向輸出層。中間過程為,輸入信號經隱層逐層傳遞,根據輸出層的實際輸出是否與期望輸出不符的判別條件,轉入誤差的反向傳播[13],其目的為將誤差分攤給各層所有單元,用各層單元的誤差信號修正各單元的權值,BP神經網絡模型如圖1所示。
1) 定義BP訓練所需函數:
損失函數,定義為式(1)。

(1)
其中,E表示損失函數,l表示樣本總數,Yk表示輸出值,Dk表示輸出值。
激活函數,定義為式(2)。

圖1 BP神經網絡模型
(2)
激活函數的作用是將每一層的輸出轉換成為非線性元素,本文實驗選擇的是傳統的三層BP神經網絡,激活函數選取的是Sigmoid激活函數[14],Sigmoid函數的優點在于輸出的取值范圍為(0,1),故函數可以將每層加權后的輸出映射到(0,1)的區間,可以很容易的抑制相差比較大的誤差,并且在神經網絡反向傳播誤差優化參數時,需要對激活函數進行求導,Sigmoid函數導數可以用自身函數表達式來表示,Sigmoid函數導數表達式,為式(3)。
f′(x)=f(x)(1-f(x))
(3)
Sigmoid函數圖像如圖2所示。

圖2 Sigmoid函數
2) BP神經網絡定義如下:
輸入層的輸入向量為:X=(X1,X2,… ,Xn);
隱藏層輸出向量為:H=(H1,H2,… ,Hm);
輸出層輸出向量為:Y=(Y1,Y2,… ,Yl);
期望輸出向量為:D=(D1,D2,… ,Dl);
輸入層到隱藏層權值矩陣為:V=(V1,V2,…,Vj,…,Vm);
隱藏層到輸出層權值矩陣為:W=(W1,W2,…,Wk,…,Wl)。
3) 正向傳播輸入信號過程
隱藏層輸入為式(4)—式(7)。
(i=1,2,…,n)
(4)
隱藏層輸出為:
Hj=f(netj) (j=1,2,…,m)
(5)
輸出層輸入為:
(j=1,2,…,m)
(6)
輸出層輸出為:
Yk=f(netk) (k=1,2,…,l)
(7)
4) 誤差的反向傳播過程
輸出層損失函數為式(8)。
(8)
將損失函數反向傳播回隱藏層為式(9)。
(9)
將誤差反向傳播回輸入層為式(10)。
(10)
誤差對輸出層各神經元權值的偏導數為式(11)。

(11)
誤差對隱藏層各神經元權值的偏導數為式(12)。

(12)
設置學習率為η,對隱藏層到輸出層權重進行更新為式(13)、(14)。

(13)

(14)
對輸入層到隱藏層權重進行更新為式(15)、(16)。

(15)

(16)
神經網絡的性能主要取決于三個因素:一是用于訓練神經網絡的樣本的特征選擇方法,二是神經網絡的優化算法,最后是神經網絡隱層節點的選擇方法[15]。
本文選取第二種因素神經網絡的優化算法對BP神經網絡進行優化改進,BP神經網絡的核心在于計算前向傳播最后的輸出結果與預期輸出的誤差的偏導數[16],利用這個偏導數和隱藏層進行加權求和,一層層向后傳播,直到傳到輸入層,最后利用每個節點求出的偏導數更新權重。而使用梯度下降法的實質,是不斷更新參數,對于步長的選取通常可以決定神經網絡的收斂速度以及結果的準確率,步長選取過大,模型易越過全局極小值點,步長選取過小,模型收斂速度慢,相比于固定學習率,變化學習率在模型訓練時體現出其極大的優勢。
在模型訓練中,當η大于0.2且為固定值時,從第一次迭代起誤差函數值就會幾乎不下降 ,且其值都很相近,原因為隨機權值與系統真實權值相差較大,由此隨機權得出的誤差值必然較大[17]。
本文針對BP神經網絡算法提出一種改進的變化學習率為式(17)。
(17)
其中Δw為誤差對各層神經元權值的偏導數。
相比于固定學習率,變化學習率不僅可以加快模型收斂速度,更可以隨著每次迭代的損失函數調整步長,有效的預防了模型發散的問題,將優化的學習率用于BP神經網絡的步驟如下:
對隱藏層到輸出層進行權重更新為式(18)。
(18)
對輸入層到隱藏層進行權重更新為式(19)。
(19)
本文采用Python編程技術,集成開發環境采用Anaconda3中的juypter notebook,Anaconda是一個主要面向科學計算的Python開源發行版本,Anaconda集成了計算、可視化和程序設計等強大的功能,預裝了大量的Python第三方庫,例如Numpy、Scipy、Matplotlib等,為本文的實驗提供了便利。
本實驗的目的是為了驗證改進的變化學習率運用在BP神經網絡算法的有效性。本文設計了兩個實驗來進行驗證,實驗一是利用BP神經網絡解決異或問題的對比實驗,實驗二是利用Python第三方模塊sklearn中的手寫數字識別數據集對固定學習率和本文提出變化學習率的對比實驗。
4.2.1 實驗一
實驗一運用三層BP神經網絡實現異或問題來證明本算法的有效性。
首先運用傳統的固定學習率的三層神經網絡進行實驗,每迭代五百次記錄一次誤差信息,實驗結果如下:
time:1500 Error:0.458404517166
time:2000 Error:0.360931277441
time:2500 Error:0.229372589968
time:3000 Error:0.155475012087
time:3500 Error:0.118675634533
time:4000 Error:0.0975626246316
time:4500 Error:0.0839069786167
time:5000 Error:0.0743082823057
time:5500 Error:0.0671542277731
time:6000 Error:0.0615890525893
time:6500 Error:0.0571173479187
time:7000 Error:0.0534323355973
time:7500 Error:0.0503336484737
time:8000 Error:0.0476846679439
time:8500 Error:0.0453888887144
從實驗結果可以看出在訓練BP神經網絡時學習率設置為固定學習率時,迭代1500次時訓練的誤差約為是45.84%,而在迭代8500次誤差達到4.53%。
進行對比試驗,對比實驗的神經網絡中的其他參數不變,步長設置為本文提出的優化后的變化學習率,實驗結果如下:
time:1500 Error:0.160769081427
time:2000 Error:0.096897464958
time:2500 Error:0.0728406727105
time:3000 Error:0.0599997421748
time:3500 Error:0.0518647863821
time:4000 Error:0.0461737143615
time:4500 Error:0.0419278562032
time:5000 Error:0.0386145218412
time:5500 Error:0.0359417347153
time:6000 Error:0.0337301230737
time:6500 Error:0.0318629342354
time:7000 Error:0.030260631329
time:7500 Error:0.0288669969007
time:8000 Error:0.0276410690144
time:8500 Error:0.0265522297624
由實驗結果可以看出,在對學習率進行優化后,迭代1500次時訓練的誤差就已經降低到16.07%,而在迭代8500次誤差降低到2.66%,模型的收斂速度有了明顯的提高。
4.2.2 實驗二
本文同時進行手寫識別實驗證明改進學習率后的BP神經網絡的泛化能力,此次實驗隱藏層定義了六十個神經元,所選用數據集來自sklearn模塊的手寫識別數據集。
同樣首先采用固定學習率的BP神經網絡進行訓練,每迭代五百次記錄數據一次訓練結果的準確率,并且手寫識別實驗采用數據分批訓練的方式在不影響模型準確率的前提下提升訓練速度,實驗結果如下:
time:11500 acc:0.848888888889
time:12000 acc:0.851111111111
time:12500 acc:0.851111111111
time:13000 acc:0.853333333333
time:13500 acc:0.853333333333
time:14000 acc:0.857777777778
time:14500 acc:0.857777777778
time:15000 acc:0.882222222222
time:15500 acc:0.966666666667
time:16000 acc:0.966666666667
time:16500 acc:0.971111111111
time:17000 acc:0.962222222222
time:17500 acc:0.964444444444
time:18000 acc:0.973333333333
time:18500 acc:0.971111111111
time:19000 acc:0.975555555556
time:19500 acc:0.975555555556
time:20000 acc:0.975555555556
從實驗結果可以看出利用BP神經網絡識別手寫數字時,學習率未優化時,迭代11500次時訓練的準確率約為84.89%,而在迭代20000次訓練的準確率才達到97.56%,模型收斂速度較慢。
將優化后的變化學習率用在BP神經網絡識別手寫數字實驗時,實驗結果如下:
time:5500 acc:0.957777777778
time:6000 acc:0.951111111111
time:6500 acc:0.962222222222
time:7000 acc:0.968888888889
time:7500 acc:0.96
time:8000 acc:0.964444444444
time:8500 acc:0.962222222222
time:9000 acc:0.962222222222
time:9500 acc:0.968888888889
time:10000 acc:0.966666666667
time:10500 acc:0.964444444444
time:11000 acc:0.982222222222
從實驗結果可以看出使用優化后的變化學習率未優化時,在迭代5500次時訓練的準確率就已經達到95.78%,模型的收斂速度相較以及準確率使用固定學習率的BP神經網絡有了較大幅度的提升。
本文運用經典的BP神經網絡,對其傳統的固定學習率進行優化改進,并通過優化后的神經網絡解決異域問題以及手寫模式識別兩個實驗,證明了改進算法確實對模型的收斂速度以及準確度有了一定程度的提高,證明了改進后算法的有效性。