夏少杰,項 鯤
(浙江工業大學,浙江 杭州 310012)
數字識別的應用十分廣泛,尤其是手寫數字識別,由于書寫的隨意性很大,造成在識別過程中具有一定的難度。隨著近幾年人工智能的火熱發展,對于數字識別提出了很多方法,主要有統計、神經網絡和聚類分析等,本文采用的方法是BP神經網絡。這是一種前饋反向型神經網絡,具有并行處理信息、自組織、自學習信息等優點。
Mnist數據集是一個手寫體數據集,里面包含了大量的手寫體圖像,如圖1所示。

圖1 Mnist數據集示例
整個數據集包含了60000行的訓練數據集(mnist.train)和 10000 行的測試數據集(mnist.test)。每張圖片包含28×28個像素,將此數組展開成一個向量,長度是28×28=784。因此在Mnist訓練數據集中mnist.train.images是一個形狀為 [60000,784]的張量(如圖2所示),第一個維度數字用來索引圖片,第二個維度數字用來索引每張圖片中的像素點。圖片里的某個像素的強度值介于0~1之間。

圖2 Mnist訓練集數據格式
Mnist數據集的標簽是介于0~9的數字,把標簽轉化為“one-hot vectors”,一個one-hot向量除了某一位數字是1以外,其余維度數字都是0,比如標簽 0 將表示為([1,0,0,0,0,0,0,0,0,0]),標簽 3將表示為([0,0,0,1,0,0,0,0,0,0])。 因此,mnist.train.labels是一個[60000,10]的數字矩陣。如圖3所示。

圖3 Mnist訓練集標簽數據格式
人工神經網絡是20世紀80年代在生物神經系統研究的啟發下發展起來的一種信息處理方法,是由大量簡單神經元所構成的非線性動力學系統,它處理信息的方式類似于動物大腦的處理方式,即是一種利用神經元之間的突起來進行信息傳遞的數學模型。國際著名的神經網絡專家、第一個計算機公司的創始人和神經網絡實現技術的研究領導人Hecht-Nielson給神經網絡的定義是:“神經網絡是一個以有向圖為拓撲結構的動態系統,它通過對連續或斷續式的輸入作狀態響應而進行信息處理”[1]。
BP(Back Propagation)神經網絡(簡稱 BP 網絡),是一種反饋型學習網絡:輸入層各神經元負責接收來自外界的輸入信息,并傳遞給中間層各神經元;中間層是內部信息處理層,負責信息變換,根據信息變化能力的需求,中間層可以設計為單隱含層或多隱含層結構,最后一個隱含層傳遞到輸出層各神經元的信息;經進一步處理后完成一次學習的正向傳播處理過程,由輸出層向外界輸出信息處理結果。當輸出值和實際值之間的誤差大于預定誤差值時,網絡進入誤差的反向傳播階段,誤差通過輸出層,按誤差梯度下降的方式修正各層權值,向隱含層、輸入層逐層反傳[2]。周而復始的信息正向傳播和誤差反向傳播過程,是各層權值不斷調整的過程,也是神經網絡學習訓練的過程,這個過程一直持續進行,直至到網絡輸出的誤差減少到預定誤差范圍內,或訓練次數達到預先設定值[3]。
2.2.1 人工神經元模型
神經網絡的基本信號處理單元是人工神經元,是對生物神經元的近似仿真。其模型如圖4所示,表示了一種簡化的人工神經元結構。其輸入輸出關系可描述為[4]:

式中,xj(j=1,2,…,n)是從其他細胞的輸出傳來的輸入信號;θ為閾值;權系數wj表示連接的強度,就像生物細胞中突觸的負載,數值為正表示激活,數值為負表示抑制;f(I)稱為激活函數。

圖4 神經元結構模型
2.2.2 激活函數
激活函數是神經網絡中的重要組成部分,由于線性模型的表達能力不足,采用激活函數可以導入非線性因素,使神經網絡具有更好的表達能力。常見的激活函數如圖5所示。

圖5 激活函數
2.2.3 BP算法
誤差反向傳播算法(back-propagation algorithm)簡稱為 BP算法[5,6]。BP網絡含有輸入層節點、輸出層節點和隱含層節點。其激活函數通常選用連續可導的Sigmoid函數:

在系統辨識中,神經網絡模型通常選用多層并行網的形式,即多層BP網。它的工作原理如下:輸入信號經過輸入層后的輸出信號,傳遞給隱含層的節點,通過激活函數作用后,把隱含層節點的輸出信號傳遞給輸出層接點,通過激發函數作用后產生出輸出信號,即為神經網絡模型的輸出ym。如果輸出層的輸出有較大誤差,則會將誤差信號反饋到輸入端。按照誤差信號修改各層權值,當過程的輸出yp與神經網絡模型的輸出ym之間的誤差小于一定值時,停止辨識。
本文采用包含隱含層的BP網絡對數字識別進行仿真。由于樣本訓練矩陣是784維的,設定輸入層有784個神經元,通過反復試驗,隱含層設計兩層,第一層包含500個神經元,第二層包含300個神經元。對于輸出層,由于需要識別0~9共10個字符,輸出層設為10個神經元。根據Mnist數據集的標簽,輸出端采用“one hot”編碼,例如,對于輸出結果“4”,它的輸出端結果為(0,0,0,0,1,0,0,0,0,0)。
因此,本文設計的 BP網絡為 784×500×300×10的結構。按照BP網絡的一般設計原則,中間層神經元的傳遞函數為雙曲正切函數tanh。由于輸出已被歸一化到區間[0,1]中,因此輸出層神經元的傳遞函數可以設定為softmax函數。
采用以上網絡結構對Mnist數據集進行訓練得到的測試結果如圖6所示。

圖6 Mnist測試集測試結果
對于本文構建的神經網絡,可以從以下幾個方向作進一步優化。
(1)初始化權值
一般情況下構建神經網絡采用隨機采樣點的初始化方式,但是如果輸入神經元個數很多的情況下采用正態分布的隨機數初始化可以有效加速網絡的收斂。
(2)針對當前的網絡層設置Dropout
Dropout的意思是在訓練過程讓一定比例的神經元失效(取值一般是0~1之間的數),這個函數的使用場景是當網絡設計比較復雜時,容易出現過擬合現象,通過設置Dropout可以減小網絡復雜度,有效防止過擬合。
(3)選取不同的激活函數
針對不同神經網絡,激活函數也會影響網絡的優劣。tensorflow中封裝了很多激活函數,主流如relu、softmax、sign等,在調試過程中可以嘗試不同激活函數來構建網絡,有些情況下可以大幅提升模型的精度。
(4)選取不同的代價函數
代價函數的不同也會影響到模型收斂的速度與精度。本文設計的網絡通過測試發現采用交叉熵代價函數可以得到最優模型,常見的還有SSD(差值平方和)、SAD(絕對誤差和)等。在具體項目中可以根據構建網絡的特性來選擇合適的代價函數。
(5)采用不同優化器來最小化代價函數
優化器選取的不同直接影響了網絡模型收斂的速度和是否會陷入局部最優解,在tensorflow中封裝的優化器,如圖7所示。選擇不同的優化器對網絡的收斂速度和精度會有直接影響。

圖7 tensorflow中封裝的優化器
(6)學習率的設置
一般而言,學習率的設置不能過大或過小,過大會導致損失函數沒法收斂到一個極小值,而過小會使得收斂速度變慢。因此,本文在網絡優化時設置學習率隨著迭代次數的增加逐漸變小,這樣一方面可以在訓練的前期使模型快速收斂,同時又可以在訓練后期讓模型收斂到一個理想值。
下圖8是對本文設計的神經網絡優化后的測試結果。從圖6與圖8的對比可以發現,優化后的識別精度達到了98.3%,比優化前提升了1.3%左右。

圖8 優化后的測試結果
BP算法因其簡單、易行、計算量小、并行性強等優點,是目前神經網絡訓練采用最多也是最成熟的訓練算法之一。本文主要描述了BP網絡在手寫數字識別中的應用,提出了若干條優化方法,并通過實驗獲得了優化后的結果。但BP算法同樣存在學習效率低、收斂速度慢、易陷于局部最小狀態等缺點,需要進一步完善和改進。
為了進一步提升手寫數字的識別精度,作者后續會在神經網絡中引入卷積層,通過卷積層和全連接層的組合來提取圖像中的深層特征,進而訓練出識別精度更高的網絡模型。