何 平,劉紫燕
(貴州大學 大數據與信息工程學院,貴州 貴陽 550025)
手寫數字識別是光學字符識別(Optical Character Recognition,ORC)技術的分支之一,研究的對象是如何利用計算機自動辨識寫在紙張上的阿拉伯數字(0~9)[1]。手寫數字識別在財務報表、郵政編碼、銀行票據等方面有著廣泛應用。實際應用中,對數字識別技術中單字識別正確率的要求比文字識別技術更苛刻。這是因為數字沒有上下文關系,每個單字的識別都非常重要,而且數字識別通常會涉及到金融、財會等領域,重要性不言而喻。手寫數字識別是將測試樣本的特征與訓練樣本的特征進行模式匹配,以最大相似度(Maximum Similarity,MS)為度量原則輸出識別結果。其中,最關鍵的是特征提取和分類器的設計。但是,由于手寫數字隨意性大,經常出現斷筆、連筆等現象,導致識別精度及效率不高。近年來,國內外研究學者提出了一些識別方法[2]。Guo Mingzhao等人提出將KNN算法及決策樹算法用于手寫數字識別問題的研究,對于一些書寫不規范的數字能較為準確的識別。張紅、馬靜等人提出的共軌梯度BP算法、自適應BP算法、LM-BP算法,能有效加快BP算法的訓練速度,提高識別效率。趙朋成、馮玉田等人對傳統深度殘差網絡進行改進,通過對卷積核大小、移動步長等參數進行調整,使其適合手寫體數字識別。在池化層使用重疊池化方案,以有效保留上一層有用信息,可以有效提高識別準確率。Yutao等人提出把稀疏自編碼器無監督學習得到的權值矩陣應用于卷積神經網絡,并利用提取的特征訓練分類器,最終得到的網絡分類效果較理想,對圖像的平移具有一定的容忍能力,且不容易出現過擬合等。這些方法要么只提高了識別準確率,要么只提高了識別效率,沒有同時提高準確率及效率[3-4]。用戶的要求不僅是高準確率,更重要的是極低的誤識率。此外,大量數據處理對系統速度又有較高要求,許多理論上非常完美,但速度過低的方法通常是行不通的。因此,研究高性能的手寫數字識別算法是一個相當具有挑戰性的任務[5-6]。
雖然專家學者對手寫數字識別算法做了大量研究,取得了很大成功,但這些方法存在局限性,無法適應各種各樣的字符特征。針對這一問題,本文對傳統的多層感知機模型進行改進,引入Dropout解決過擬合問題,Adagrad優化參數調試過程,ReLU解決梯度彌散問題,提出了用于手寫數字識別的MLP網絡模型,并將該模型在TensorFlow平臺下實現構建。在進行網絡結構的性能調優后,相比基本的MLP模型,該改進模型具有較高的識別精度和識別效率,節省了大量處理時間。
手寫數字的寫法帶有明顯的民族性和區域性。因此,選擇一個可供模型訓練和測試使用的樣本庫,是進行手寫數字識別算法研究的重要基礎,對識別模型的性能也有重要影響。通常,對所需的樣本庫有兩種選擇:一是根據需要建立專用的樣本庫,二是選擇其他機構做好的樣本庫。前者的優點是貼近自己的應用,缺點是耗費精力且難以保證代表性,與他人的研究結果不好比較。因此,目前的趨勢是使用具有權威性的通用樣本庫[7]。目前,樣本數量較大、比較有代表性的手寫數字樣本庫有由美國國家標準與技術局收集的MNIST數據庫。本文選取MNIST數據庫進行算法驗證。
作為一個識別系統(Recognition System),最終要用某些參數來評價其性能的高低,手寫數字識別同樣如此。評價指標除了借用一般文字識別的指標外,還需要根據數字識別的特點進行相應補充及修改。對于手寫數字識別系統,通常可用3方面的指標表征其性能。
(1)正確識別率

(2)誤識率(替代率)

(3)拒識率

三者關系為:

在數字識別應用中,最重要的指標為“識別精度(RecognitionAccuracy)”,即在所有識別字符中除去拒識字符,正確識別的比例大小。定義識別精度為:

一個理想的系統應是S、R盡量小,而P、A盡可能大。然而,在一個實際系統中,S、R通常是相互制約的。因此,在評價手寫數字識別系統時,必須綜合考慮以上幾個指標。另外,由于手寫數字的工整程度、書寫風格可能不盡相同,因此必須明白評價指標是在何種樣本集合下獲得的。
多層感知機(Multi-Layer Perceptron,MLP)通常也稱為人工神經網絡,除了輸入、輸出層外,中間還可以有很多個隱層(Hidden Layers)[8-9]。其中,最簡單的MLP模型只含有一個隱層,即為三層結構,如圖1所示。

圖1 多層感知機模型
MLP層與層之間是全連接的。最底層是輸入層,中間是隱藏層,最后是輸出層。輸入層神經元負責接收信息,如輸入一個n維向量,就有n個神經元。隱藏層神經元負責對輸入信息的加工處理。首先,它與輸入層之間是全連接的。假設輸入層由向量X來表示,則隱含層輸出的計算形式為:

式中,W1為連接系數(也叫權重矩陣),b1為偏置向量,函數f(Function)可以是函數Sigmoid,即sigmoid(a)=1/(1+e-a),或者函數tanh即tanh(a)=(ea-e-a)/(ea+e-a)。
輸出層神經元負責計算機對輸入信息的認知,隱含層到輸出層可以看作是一個多類別的邏輯回歸(也即Softmax回歸),所以輸出層的輸出為Softmax(W2X1+b2),X1表示隱含層的輸出f(W1X+b1)。上述三層MLP模型可總結為:

式中,f是函數Softmax。所以,MLP模型的所有參數就是各個層之間的連接權重W矩陣和偏置b向量,其中包含b1、W1、b2、W2。對于具體的問題,這些參數的確定,其實就是求解最佳參數的最優化問題(Optimalization Problem)。解決最優化問題,通常最簡單的方法是隨機梯度下降法(Stochastic Gradient Descent,SGD),即首先隨機初始化所有參數,然后進行迭代訓練,不斷計算梯度和更新參數,直到滿足某個條件(比如誤差足夠小或迭代次數足夠多)為止。該過程常常會涉及代價函數、規則化、學習速率和梯度計算等[10-11]。
2.2.1 引入Dropout解決過擬合問題
過擬合是機器學習中的一個常見問題,是指模型預測準確率在訓練集上升高,但是在測試集上反而下降,通常意味著泛化性不好。模型只是記憶了當前數據的特征,不具備推廣能力[12-13]。Dropout的基本思想是在每次訓練時以一定的概率P使部分節點(Nodes)的輸出值變為0,即相當于在這次訓練中把該部分節點從整個網絡中“刪除(Cut Out)”,這樣在反向傳播時就不會更新其對應的參數。而在測試階段,使用完整的網絡進行測試。圖2為Dropout的原理。
Dropout在每次訓練時,都相當于訓練完整網絡的一個子網絡。假設網絡共有M個節點,則可用的子網數為2M個。當M足夠大時,每次訓練使用的子網基本不會相同,整個網絡可以看作是對多個子網模型求平均,從而可以避免訓練集在某個子網上出現過擬合(Overfitting)現象,增強網絡的泛化能力。

圖2 Dropout原理
2.2.2 引入Adagrad優化參數調試
參數難以調試,是神經網絡的另一大痛點,尤其是隨機梯度下降法(Stochastic Gradient Descent,SGD)的參數。對SGD設置不同的學習速率,最后得到的結果可能差異巨大。神經網絡通常不是凸優化問題,存在局部最優。SGD本身也不是一個比較穩定的算法,結果可能會在最優解附近波動,而不同的學習速率可能導致神經網絡落入截然不同的局部最優中。Adagrad自適應方法可以減輕調試參數的負擔。Adagrad是對學習率進行了一個約束,即:

式中,對gt從1到t進行遞推,形成一個約束項正則化矩陣(Regularizer),即:

式中,ε用來保證分母非0。Adagrad具有如下特點:(1)前期gt較小時,regularizer較大,能夠放大梯度;(2)后期gt較大時,regularizer較小,能夠約束梯度;(3)適合處理稀疏梯度。對于Adagrad優化算法,通常使用其默認參數設置,就可以取得一個較好的效果。
2.2.3 引入ReLU解決梯度彌散問題
梯度彌散(Gradient Vanishment)是另一個影響神經網絡訓練的問題[14]。傳統的神經網絡訓練用Sigmoid作為激活函數。但是,當神經網絡層數較多時,Sigmoid函數在反向傳播中梯度值會逐漸減小,經過多層傳遞后呈指數級急劇減小。因此,梯度值在傳遞到前面幾層時會變得非常小。這種情況下,根據訓練數據的反饋更新神經網絡的參數將會非常緩慢,基本起不到訓練作用。而ReLU能比較完美地解決該問題。ReLU是一個簡單的非線性函數,即:

式中,當x≤0時,y=0;當x>0時,y=x。它在坐標軸上是一條折線,非常類似于人腦的閾值響應機制。在信號超過某個閾值時,神經元才會進入興奮和激活狀態,平時則處于抑制狀態。ReLU可以很好地傳遞梯度,經過多層的反向傳播,梯度依舊不會大幅縮小,因此非常適合訓練神經網絡。
從信號方面來看,即神經元同時只對輸入信號的少部分選擇性響應,大量信號被刻意屏蔽了,以提高學習精度,更好更快地提取稀疏特征(SparseFeatures)。ReLU函數相對于Sigmoid函數,一方面大大降低了運算量,另一方面在輸入信號較強時,仍然能夠保留信號之間的差別。
在TensorFlow軟件平臺下構建出用于手寫數字識別的改進MLP網絡模型,并使用Dropout解決過擬合問題,使用自適應學習速率的Adagrad優化參數調試過程,使用激活函數ReLU解決梯度彌散問題。改進的MLP模型實現流程的詳細描述如下:步驟1:載入TensorFlow并加載MNIST數據集,創建一個TensorFlow默認的Session;
步驟2:定義算法公式(隱含層使用ReLU作為激活函數);
步驟3:定義損失函數和選擇優化器來優化Loss;這里的損失函數使用交叉信息熵,優化器選擇自適應的優化器Adagrad,并把學習率設為0.3;
步驟4:訓練網絡模型;加入keep_prob(即引入Dropout規則)作為計算圖的輸入,并且在訓練時設為0.75,即保留75%的節點,其余的25%置為0;
步驟5:對模型進行準確率和識別效率評測;這里需要加入一個keep_prob作為輸入。因為是預測部分,所以直接令keep_prob等于1即可,這樣可使模型達到最好的效果。
整個測試過程中使用的操作系統為Windows,深度學習框架為TensorFlow,開發軟件為Python3.0x,主要硬件配置:處理器為I7-7700CPU@3.30 GHz;內存為16 GB;硬盤為Intel 600p 256G;GPU為GTX 1050TI 4G。
選擇測試的數據集為標準手寫數據集(MNIST數據庫),MNIST數據集來自美國國家標準與技術研究所。訓練集(training set)由來自250個不同人手寫的數字構成,其中50%是高中學生,50%來自人口普查局(the CensusBureau)的工作人員。測試集(test set)也是同樣比例的手寫數字數據。
訓練完成后,將測試樣本輸入到網絡模型中進行測試。測試樣本是10 000例手寫數字圖片。在測試過程中,測試樣本通過的是同樣的網絡結構,但是網絡中的偏置參數b向量及權值參數W矩陣是由訓練部分進行訓練得到。本文選取一組具有代表性的手寫數字圖片測試識別結果(包括識別效率及識別精度),結果如表1所示。

表1 傳統MLP、CNN與改進MLP實驗結果
對比表1中的數據,在相同的實驗條件下,改進MLP模型在測試集上可以達到98.04%的準確率。相比傳統的MLP模型,準確率由91.19%上升到98.04%,識別效率由39.3s提升到了12.0s,對識別銀行賬單這種精確度要求很高的場景,是飛躍性的提高。
對比表1中后兩行數據可知,在相同的實驗條件下,雖然卷積神經網絡(Convolutional Neural Network,CNN)在識別精度上有一定優勢,但這是以增加網絡層數和運行時間為代價得到的。因此,實際應用中,改進的MLP網絡模型更具實時性。
對比圖3中SGD及Adagrad優化效果曲線可知,隨著迭代次數(Steps)的增加,使用Adagrad優化方法的識別誤差(Loss)比使用SGD更小,優化效果更好,從而能有效地提高識別精度和識別效率。

圖3 SGD及Adagrad優化效果對比
對比圖4及圖5中訓練及測試誤差曲線可知,當訓練中keep_prob=1時,出現了過擬合(Overfitting)問 題。keep_prob=0.75( 即 drop掉 25%) 時,Dropout發揮了作用。

圖4 keep_prob=1時,train、test誤差

圖 5 keep_prob=0.75,train、test誤差
對比圖4中訓練及測試誤差曲線可知,當keep_prob=1時,模型對訓練數據的適應性優于測試數據,存在過擬合。
對比圖5中訓練及測試誤差曲線可知,當keep_prob=0.75(即drop掉25%)時,效果好了很多,基本不存在過擬合問題。
本文提出利用TensorFlow軟件平臺實現基于MLP模型的手寫數字識別,同時引入Dropout、Adagrad、ReLU等改進MLP模型結構,采用MNIST標準數據集設計相應實驗,并驗證了該改進算法的有效性。實驗結果表明,相對傳統的MLP模型,改進的MLP模型能夠自動學習有效特征并進行識別,識別準確率提高了將近7.0%,識別效率提高了27.3 s;自適應學習速率的Adagrad相比SGD具有更好的優化效果,顯著提高了識別效率,節省了大量處理時間;Dropout在解決過擬合方面具有良好的效果;ReLU有效解決了梯度彌散問題,從而能夠有效提高識別率。