張 爍 張 榮
1(山西青年職業(yè)學(xué)院計(jì)算機(jī)系 山西 太原 030024)2(山西醫(yī)科大學(xué)計(jì)算機(jī)教學(xué)部 山西 太原 030001)
手寫數(shù)字辨識(shí)技術(shù)是指機(jī)器自動(dòng)識(shí)別手寫阿拉伯?dāng)?shù)字技術(shù),是機(jī)器學(xué)習(xí)、模式識(shí)別等領(lǐng)域非常重要的一個(gè)研究方向[1]。1998年,LeCun等[2]提出了一種基于梯度學(xué)習(xí)的CNN算法(LeNet-5),并應(yīng)用于手寫數(shù)字辨識(shí)中。鑒于此,LeNet網(wǎng)絡(luò)當(dāng)時(shí)應(yīng)用于整個(gè)美國的郵政系統(tǒng)中,通過識(shí)別手寫郵政編碼來分類郵件。目前,在郵政編號(hào)識(shí)別、銀行單據(jù)自動(dòng)錄入、財(cái)務(wù)報(bào)表自動(dòng)錄入等識(shí)別系統(tǒng)中,都使用了手寫數(shù)字辨識(shí)技術(shù)[3]。近年來隨著大數(shù)據(jù)和人工智能技術(shù)的快速發(fā)展,人們不但對(duì)手寫數(shù)字的識(shí)別率提出了更高的要求,而且對(duì)算法訓(xùn)練模型的時(shí)間也提出了更高的要求[4]。
目前,手寫數(shù)字辨識(shí)的方法[5]主要包括:結(jié)構(gòu)識(shí)別法、統(tǒng)計(jì)識(shí)別法、深度學(xué)習(xí)法。結(jié)構(gòu)識(shí)別法對(duì)相似數(shù)字有較強(qiáng)的識(shí)別能力,但是對(duì)于環(huán)境復(fù)雜的脫機(jī)數(shù)字識(shí)別往往識(shí)別正確率不高。統(tǒng)計(jì)識(shí)別法是指從大量的統(tǒng)計(jì)數(shù)據(jù)中提取出特征,然后通過決策函數(shù)進(jìn)行分類。統(tǒng)計(jì)識(shí)別法通常有很強(qiáng)的抗干擾能力,但是往往識(shí)別的正確率也不理想。深度學(xué)習(xí)法的出現(xiàn)解決了識(shí)別率低的問題,并且通過改進(jìn)深度學(xué)習(xí)網(wǎng)絡(luò)加快模型的訓(xùn)練速度。在手寫數(shù)字辨識(shí)問題領(lǐng)域,深度學(xué)習(xí)法是目前理想的選擇。
卷積神經(jīng)網(wǎng)絡(luò)(CNN)是深度學(xué)習(xí)模型中最為成功的網(wǎng)絡(luò)之一,并且在圖像識(shí)別領(lǐng)域有很好的識(shí)別效果。深度學(xué)習(xí)(包括CNN、RNN等)是端到端的學(xué)習(xí),傳統(tǒng)機(jī)器學(xué)習(xí)往往通過模塊化的方法解決此類問題,分為圖像預(yù)處理、特征提取、設(shè)計(jì)分類器等子步驟完成任務(wù)。模塊化的基本思想是:將一個(gè)復(fù)雜、繁瑣的問題分成幾個(gè)簡(jiǎn)單的子問題模塊來處理。但是,在處理每個(gè)子問題時(shí),每個(gè)子問題都可能存在最優(yōu)解,將這些子問題組合起來后,從全局來看,并不一定會(huì)得到最優(yōu)解。對(duì)于深度學(xué)習(xí)是基于端到端的深層次網(wǎng)絡(luò)學(xué)習(xí)方式,整個(gè)流程并不進(jìn)行子模塊的劃分,可以直接將原始數(shù)據(jù)輸入到模型中,整個(gè)學(xué)習(xí)過程完全交給深層次網(wǎng)絡(luò)模型,這樣最大的優(yōu)點(diǎn)就是可以統(tǒng)籌全局獲得最優(yōu)解。
卷積神經(jīng)網(wǎng)絡(luò)由輸入層、卷積層、池化層、全連接層、輸出層構(gòu)成,多個(gè)層可以看成一個(gè)復(fù)雜的函數(shù)fCNN,損失函數(shù)由參數(shù)正則化損失和數(shù)據(jù)損失構(gòu)成,在訓(xùn)練整個(gè)網(wǎng)絡(luò)時(shí),按照損失函數(shù)將參數(shù)誤差反向傳播給整個(gè)模型的各個(gè)層次,達(dá)到參數(shù)更新的目的。整個(gè)訓(xùn)練過程可以看成從原始數(shù)據(jù)向最終目標(biāo)的直接擬合,中間各層次的作用為特征學(xué)習(xí)。CNN原理圖如圖1所示。可以看出,卷積層和池化層是整個(gè)CNN網(wǎng)絡(luò)的核心。
在卷積層中,通過可訓(xùn)練的卷積核對(duì)上一層的輸入數(shù)據(jù)進(jìn)行卷積操作,通常卷積核為3×3或5×5的矩陣,確定大小的卷積核按照規(guī)定的步長在上一層輸入數(shù)據(jù)做從左到右、從上到下的“滑動(dòng)”操作,并輸出特征圖,每次卷積操作都可以提取出一種特征。如果在CNN網(wǎng)絡(luò)訓(xùn)練時(shí)有n個(gè)卷積核就可以提取出圖像的n個(gè)特征。一般地,若一個(gè)三維張量xk為第k卷積層的輸入,滿足xk∈RHk×Wk×Dk,該層的卷積核為wk∈RH×W×Dk,卷積核有D個(gè),則在同一數(shù)據(jù)位置上可以得到D維的卷積輸出,即在k+1層的特征矩陣輸入xk+1的通道數(shù)為D,可表示為:
(1)
在池化層中,主要的任務(wù)是對(duì)上一層特征圖進(jìn)行下采樣處理,這是一種采樣較少的數(shù)據(jù)還保持原有重要信息的一種操作。常用的池化操作類型[6]分為平均池化(Average-Pooling)、最大池化(Max-Pooling)等。平均池化是在每次數(shù)據(jù)操作時(shí),將池化核覆蓋區(qū)域的數(shù)值取平均值,可表示為:
(2)
最大池化是在每次對(duì)數(shù)據(jù)操作時(shí),將池化核覆蓋區(qū)域的數(shù)據(jù)取最大值,可表示為:
(3)
如圖1所示,卷積層和池化層通常交替設(shè)置,圖像數(shù)據(jù)每經(jīng)過一次卷積層和池化層后,都會(huì)提取出圖像特征。隨著交替次數(shù)的增大,提取的圖像特征逐步由低級(jí)特征到高級(jí)特征,最終形成對(duì)圖像的特征描述。最后通過CNN網(wǎng)絡(luò)的一個(gè)或多個(gè)全連接層輸出分類結(jié)果。
本文設(shè)計(jì)的CNN網(wǎng)絡(luò)有8層構(gòu)成,分別是1個(gè)輸入層、2個(gè)卷積層、2個(gè)池化層、2個(gè)全連接層、1個(gè)輸出層。除去整個(gè)網(wǎng)絡(luò)的輸入層和輸出層,中間的2個(gè)卷積層、2個(gè)池化層、2個(gè)全連接層可以看成網(wǎng)絡(luò)的隱含層。CNN網(wǎng)絡(luò)結(jié)構(gòu)如圖2所示。
圖2 CNN網(wǎng)絡(luò)結(jié)構(gòu)圖
本文設(shè)計(jì)的CNN網(wǎng)絡(luò)結(jié)構(gòu)中,輸入層INPUT包含28×28×1個(gè)神經(jīng)元。C1層為卷積層,卷積核大小為5×5,32個(gè)卷積通道數(shù),每個(gè)通道為14×14的矩陣。P1為池化層,包括32個(gè)池化通道,每個(gè)通道為14×14的矩陣,每個(gè)池化通道是由C1層經(jīng)過大小為2×2、步長為2的最大池化后,通過ReLU激活函數(shù)進(jìn)行非線性變化得到的。C2為卷積層,包括64個(gè)卷積通道數(shù),每個(gè)通道為7×7的矩陣。P2為池化層,包括64個(gè)7×7的池化通道。每個(gè)池化通道是由C2層經(jīng)過大小為2×2、步長為2的窗口進(jìn)行最大池化后,通過ReLU激活函數(shù)進(jìn)行非線性變化得到的。FC1為全連接層,有1 024個(gè)神經(jīng)元,每個(gè)神經(jīng)元和P2層的每個(gè)神經(jīng)元相連接。FC2為全連接層,有10個(gè)神經(jīng)元,每個(gè)神經(jīng)元和FC1層的每個(gè)神經(jīng)元相連接。最后通過SoftMax函數(shù)輸出分類結(jié)果。
一個(gè)理想的學(xué)習(xí)率要求一開始學(xué)習(xí)率的數(shù)值較大,并且有較快的收斂速度,然后隨著迭代次數(shù)的增加,學(xué)習(xí)率的數(shù)值慢慢衰減,最后達(dá)到最優(yōu)解。本文設(shè)計(jì)的CNN網(wǎng)絡(luò)模型定義一個(gè)學(xué)習(xí)率適應(yīng)這樣的過程,在實(shí)現(xiàn)批量隨機(jī)梯度下降法時(shí),實(shí)現(xiàn)學(xué)習(xí)率的指數(shù)衰減。學(xué)習(xí)率指數(shù)衰減η(t)公式如下:
(4)
式中:η0為學(xué)習(xí)率初始值;t為迭代次數(shù);r為衰減率。
為了減少全連接層網(wǎng)絡(luò)的復(fù)雜程度,本文設(shè)計(jì)的CNN網(wǎng)絡(luò)使用Dropout正則化方法。傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)中,每個(gè)神經(jīng)元之間相互聯(lián)系,每一個(gè)神經(jīng)元都會(huì)反向傳導(dǎo)后一個(gè)神經(jīng)元的梯度信息并且相互之間聯(lián)系緊密,增加了網(wǎng)絡(luò)訓(xùn)練的復(fù)雜度。Dropout可以降低神經(jīng)元之間的緊密性和相互依賴,來提高算法的“泛化能力”,防止發(fā)生“過擬合”現(xiàn)象。
Dropout的原理是:在訓(xùn)練時(shí),對(duì)于網(wǎng)絡(luò)每一層的神經(jīng)元,以p為概率隨機(jī)地丟掉一些神經(jīng)元,也就是將這些神經(jīng)元的權(quán)值w設(shè)為0;在測(cè)試時(shí),將所有的神經(jīng)元都設(shè)為激活狀態(tài),但需要將訓(xùn)練時(shí)丟掉的神經(jīng)元權(quán)值w乘以(1-p)來保證訓(xùn)練和測(cè)試階段各自權(quán)值有相同的期望。具體如圖3所示。
圖3 單個(gè)神經(jīng)元的Dropout
本文在訓(xùn)練CNN網(wǎng)絡(luò)時(shí),使用了不同的參數(shù)優(yōu)化方法來比較各個(gè)參數(shù)優(yōu)化方法在訓(xùn)練手寫數(shù)字圖像的性能。
(1) 批量隨機(jī)梯度下降法(mini-batch based SGD)SGD在進(jìn)行樣本訓(xùn)練時(shí),在每一輪的訓(xùn)練過程中,不對(duì)全部樣本進(jìn)行訓(xùn)練,只是隨機(jī)的選擇一個(gè)樣本進(jìn)行訓(xùn)練,這樣可以提高收斂速度。SGD可以分批計(jì)算訓(xùn)練集的代價(jià)函數(shù)并用梯度對(duì)θ參數(shù)進(jìn)行更新公式如下:
θ←θ-η·▽f(θ,xi,yi)
(5)
式中:f(θ,xi,yi)為代價(jià)函數(shù);▽f(θ,xi,yi)是隨機(jī)選取樣本空間(xi,yi)的一點(diǎn)對(duì)θ的梯度;η為學(xué)習(xí)率。
(2) Momentum算法 Momentum算法借助了物理中動(dòng)量的概念,模擬了運(yùn)動(dòng)物體時(shí)的慣性,在參數(shù)更新的時(shí)候在一定程度上保留了之前更新的方向,可以增加穩(wěn)定性并且有較快的學(xué)習(xí)速度,θ參數(shù)更新公式如下:
vt=γ·vt-1+η·▽f(θ,xi,yi)
(6)
θ←θ-vt
(7)
式中:γ為動(dòng)量;vi為i時(shí)的梯度變化。
(3) Adagrad算法 Adagrad算法的最大特點(diǎn)是可以在訓(xùn)練時(shí)對(duì)學(xué)習(xí)率進(jìn)行動(dòng)態(tài)調(diào)整。當(dāng)參數(shù)出現(xiàn)的頻率較低時(shí),采用較大的學(xué)習(xí)率進(jìn)行參數(shù)訓(xùn)練;相反,參數(shù)出現(xiàn)的頻率較高時(shí),采用較小的學(xué)習(xí)率進(jìn)行參數(shù)訓(xùn)練。在處理稀疏數(shù)據(jù)時(shí),Adagrad算法有較好的訓(xùn)練效果。θ參數(shù)更新公式如下:
(8)
式中:Gt為對(duì)角矩陣每個(gè)位置參數(shù)對(duì)應(yīng)從第1輪訓(xùn)練到第t輪訓(xùn)練梯度的平方和;ε為平滑項(xiàng),防止分式的分母為0,一般取值為1e-8。
(4) RMSprop算法 RMSprop算法是人工智能大師Hinton提出的一種自適應(yīng)學(xué)習(xí)率動(dòng)態(tài)調(diào)整算法,其目的是為了緩解Adagrad算法中學(xué)習(xí)率下降過快。Adagrad算法會(huì)累加之前所有的梯度平方,而RMSprop算法是計(jì)算之前所有梯度的平均值。θ參數(shù)更新公式如下:
(9)
式中:Et為對(duì)角矩陣每個(gè)位置參數(shù)對(duì)應(yīng)從第1輪訓(xùn)練到第t輪訓(xùn)練梯度的均值。
(5) Adam算法 Adam算法也是一種學(xué)習(xí)率自適應(yīng)算法,它利用梯度的一階矩陣和二階矩陣來動(dòng)態(tài)調(diào)整參數(shù)的學(xué)習(xí)率。其最大的優(yōu)點(diǎn)是校正的學(xué)習(xí)率,使每一次迭代都有一個(gè)確定的范圍,并且使參數(shù)更新比較平穩(wěn)。θ參數(shù)更新公式如下:
(10)
式中:vt和mt分別是對(duì)代價(jià)函數(shù)求梯度的一階矩陣和二階矩陣。
基于本文提出的CNN模型訓(xùn)練參數(shù)時(shí),主要包括使用動(dòng)態(tài)學(xué)習(xí)率,在網(wǎng)絡(luò)訓(xùn)練時(shí)加入了Dropout方法和分別使用了批量隨機(jī)梯度下降法、Momentum算法、Adagrad算法、RMSprop算法、Adam算法進(jìn)行參數(shù)優(yōu)化。算法整體流程圖如圖4所示。
圖4 參數(shù)訓(xùn)練算法流程圖
仿真實(shí)驗(yàn)所用的數(shù)據(jù)集是美國國家標(biāo)準(zhǔn)與技術(shù)研究所編制的MNIST數(shù)據(jù)集,該數(shù)據(jù)集有含有0~9的手寫數(shù)字圖像,其中訓(xùn)練集有60 000個(gè)樣本圖像,測(cè)試集有10 000個(gè)樣本圖像,訓(xùn)練集數(shù)據(jù)標(biāo)簽是“one-hot vector”形式,每張圖像大小為像素。每次訓(xùn)練數(shù)據(jù)時(shí),批次的大小為50,訓(xùn)練的迭代次數(shù)為101次,分別使用了本文提及的5種參數(shù)優(yōu)化方法進(jìn)行訓(xùn)練。仿真實(shí)驗(yàn)硬件環(huán)境為Windows 8操作系統(tǒng),第八代i7處理器3.60 GHz,16 GB內(nèi)存,GeForce 1080Ti獨(dú)立顯卡;軟件環(huán)境為TensorFlow 1.4+Python 3.6。
本文是基于TensorFlow開源框架來構(gòu)建CNN網(wǎng)絡(luò)模型實(shí)現(xiàn)手寫數(shù)字辨識(shí)的訓(xùn)練過程,其CNN網(wǎng)絡(luò)模型參數(shù)具體配置如表1所示。
表1 本文CNN網(wǎng)絡(luò)模型參數(shù)
使用批量隨機(jī)梯度下降法和表1的CNN網(wǎng)絡(luò)模型參數(shù)配置來優(yōu)化參數(shù),學(xué)習(xí)率為動(dòng)態(tài)指數(shù)衰減方式,實(shí)驗(yàn)分析包括測(cè)試集準(zhǔn)確率、訓(xùn)練集代價(jià)函數(shù)錯(cuò)誤率、迭代次數(shù)、訓(xùn)練時(shí)間。如圖5所示,在訓(xùn)練數(shù)據(jù)時(shí),代價(jià)函數(shù)經(jīng)過101次迭代后錯(cuò)誤率為1.80%,但是測(cè)試集準(zhǔn)確率只為75.60%,整個(gè)訓(xùn)練時(shí)間為14 min 33 s。這說明使用批量隨機(jī)梯度下降法來優(yōu)化參數(shù)時(shí),整個(gè)網(wǎng)絡(luò)模型的泛化能力不強(qiáng),發(fā)生了過擬合現(xiàn)象。
(a) 測(cè)試集正確率 (b) 訓(xùn)練集錯(cuò)誤率圖5 批量隨機(jī)梯度下降法訓(xùn)練CNN網(wǎng)絡(luò)模型
分別使用Momentum算法、Adagrad算法、RMSprop算法、Adam算法對(duì)網(wǎng)絡(luò)參數(shù)進(jìn)行優(yōu)化來比較各個(gè)算法性能,如圖6和圖7所示。
(a) Momentum優(yōu)化 測(cè)試集正確率 (b) Momentum優(yōu)化訓(xùn)練集錯(cuò)誤率
(c) Adagrad優(yōu)化 測(cè)試集正確率 (d) Adagrad優(yōu)化訓(xùn)練集錯(cuò)誤率圖6 Momentum算法和Adagrad算法訓(xùn)練CNN網(wǎng)絡(luò)模型
(c) Adam優(yōu)化測(cè)試集正確率 (d) Adam優(yōu)化訓(xùn)練集錯(cuò)誤率圖7 RMSprop算法、Adam算法訓(xùn)練CNN網(wǎng)絡(luò)模型
通過圖6可以看出,Momentum算法和Adagrad算法在訓(xùn)練數(shù)據(jù)時(shí),訓(xùn)練集經(jīng)過101次訓(xùn)練后錯(cuò)誤率分別為1.70%和1.72%,但是測(cè)試集的準(zhǔn)確率分別只有79.29%和82.20%,并且收斂速度較慢。訓(xùn)練時(shí)間分別為15 min 20 s和15 min 13 s。從圖中可以看出Adagrad算法在訓(xùn)練時(shí)震蕩劇烈。
通過圖7可以看出,RMSprop算法和Adam算法在訓(xùn)練數(shù)據(jù)時(shí),訓(xùn)練集經(jīng)過101次訓(xùn)練后錯(cuò)誤率分別為1.46%和1.47%,在測(cè)試集的準(zhǔn)確率分別為99.40%和99.70%,訓(xùn)練時(shí)間分別為15 min 58 s和15 min 42 s。這兩種算法在迭代次數(shù)較小的情況下,就已經(jīng)達(dá)到較高的準(zhǔn)確率,說明收斂速度較其他算法快??梢钥闯?,使用RMSprop算法和Adam算法在測(cè)試集的準(zhǔn)確率遠(yuǎn)遠(yuǎn)高于其他優(yōu)化器算法,并且Adam算法比RMSprop算法的準(zhǔn)確率高出0.3%,訓(xùn)練時(shí)間少16 s。
各優(yōu)化器算法總結(jié)如表2所示。
表2 各優(yōu)化器算法比較
續(xù)表2
為了分析本文CNN網(wǎng)絡(luò)在測(cè)試集的識(shí)別性能,將識(shí)別準(zhǔn)確率與其他手寫數(shù)字識(shí)別方法進(jìn)行比較,如表3所示。
表3 幾種手寫數(shù)字識(shí)別方法比較
綜上所述,基于本文設(shè)計(jì)的CNN網(wǎng)絡(luò)結(jié)構(gòu), Adam算法在訓(xùn)練集的錯(cuò)誤率、測(cè)試集的準(zhǔn)確率和收斂速度方面都優(yōu)于其他優(yōu)化器。各優(yōu)化器在訓(xùn)練集的錯(cuò)誤率都較低,但使用批量隨機(jī)梯度下降法、Momentum算法和Adagrad算法驗(yàn)證測(cè)試集準(zhǔn)確率都表現(xiàn)不佳,說明這三種算法在優(yōu)化網(wǎng)絡(luò)參數(shù)時(shí),泛化能力不強(qiáng)。批量隨機(jī)梯度下降法參數(shù)優(yōu)化時(shí)間最短,但是測(cè)試準(zhǔn)確率最低;RMSprop算法訓(xùn)練時(shí)間最長,測(cè)試準(zhǔn)確率可以達(dá)到99.40%。所有算法訓(xùn)練時(shí)間都在可接受范圍之內(nèi),并且與機(jī)器的配置有很大關(guān)系?;诒疚脑O(shè)計(jì)的CNN網(wǎng)絡(luò)和Adam參數(shù)優(yōu)化算法在相同數(shù)據(jù)集的情況下,測(cè)試集準(zhǔn)確率高于文獻(xiàn)[3-5]中數(shù)字識(shí)別方法的準(zhǔn)確率。
本文基于手寫數(shù)字辨識(shí)對(duì)CNN網(wǎng)絡(luò)模型參數(shù)優(yōu)化進(jìn)行研究。實(shí)驗(yàn)結(jié)果表明:在本文設(shè)計(jì)的CNN網(wǎng)絡(luò)模型下,使用學(xué)習(xí)率動(dòng)態(tài)衰減、Dropout正則化方法,RMSprop算法和Adam算法在參數(shù)優(yōu)化方面收斂速度快、識(shí)別準(zhǔn)確率高,測(cè)試集準(zhǔn)確率可達(dá)99.40%和99.70%。下一步將優(yōu)化CNN網(wǎng)絡(luò)模型,可將優(yōu)化的CNN網(wǎng)絡(luò)模型使用RMSprop算法和Adam算法優(yōu)化參數(shù)的方法應(yīng)用在其他圖像識(shí)別中。