祝永志,張彩廷
(曲阜師范大學(xué) 信息科學(xué)與工程學(xué)院,山東 日照 276826)
信息時(shí)代的到來(lái),使得人工智能和機(jī)器學(xué)習(xí)等學(xué)科飛速發(fā)展,出現(xiàn)了深度學(xué)習(xí),并迅速滲入各個(gè)領(lǐng)域。信息傳輸過程中,為更加方便快捷地傳輸,信息種類已不局限于文字,圖片和語(yǔ)音也成為重要的類別。所以,模式識(shí)別技術(shù)已經(jīng)應(yīng)用于各個(gè)方面。其中,使用計(jì)算機(jī)進(jìn)行手寫數(shù)字識(shí)別成為一個(gè)研究的典型案例。
對(duì)于手寫數(shù)字識(shí)別的方法有多種,如統(tǒng)計(jì)決策法、模糊判別法、句法結(jié)構(gòu)法、模板匹配法以及邏輯推理法等。但是,以上方法都存在提取特征值困難的問題,識(shí)別效果不佳。深度學(xué)習(xí)的思路,使得該問題得到了較好解決[1]。
深度學(xué)習(xí)是由機(jī)器學(xué)習(xí)進(jìn)一步發(fā)展而來(lái)的,最早提出于2006年。它的思路為通過建立類似于人腦的神經(jīng)網(wǎng)絡(luò)模型來(lái)使用電腦模擬人腦的學(xué)習(xí)分析行為。
傳統(tǒng)的機(jī)器學(xué)習(xí)需要為其定義一些特征,然后通過大量的數(shù)據(jù)對(duì)這些特征進(jìn)行識(shí)別和比較來(lái)完成分類訓(xùn)練,從而利用訓(xùn)練學(xué)習(xí)到的模型對(duì)采集到的特征集進(jìn)行識(shí)別預(yù)測(cè)其類別。深度學(xué)習(xí)不需要人為定義特征,只要輸入需要其學(xué)習(xí)的事物,它會(huì)自動(dòng)提取其認(rèn)為重要的特征,是一種特殊的機(jī)器學(xué)習(xí)。深度學(xué)習(xí)通過學(xué)習(xí)將世界表示為概念的嵌套層次結(jié)構(gòu),每個(gè)概念都與更簡(jiǎn)單的概念定義,而更抽象的表示則用不那么抽象的概念來(lái)計(jì)算。
深度學(xué)習(xí)中,卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)是第一個(gè)較為符合其定義的模型,實(shí)現(xiàn)了建立多層結(jié)構(gòu)來(lái)進(jìn)行學(xué)習(xí)[2]。在圖像識(shí)別問題中,即通過多層結(jié)構(gòu)不斷降低該數(shù)據(jù)量龐大問題的維度,以使其能夠被訓(xùn)練學(xué)習(xí)。
本文針對(duì)Minist手寫數(shù)字識(shí)別問題,介紹了Softmax模型和卷積神經(jīng)網(wǎng)絡(luò)模型,并對(duì)卷積神經(jīng)網(wǎng)絡(luò)模型的激活函數(shù)進(jìn)行了分析,最后通過對(duì)以上兩個(gè)模型的實(shí)現(xiàn),對(duì)模型識(shí)別效果進(jìn)行了比較和分析。
TensorFlow[3]是人工智能中的第二代學(xué)習(xí)系統(tǒng),在2015年由Google發(fā)布并開源。運(yùn)行原理為N維數(shù)據(jù)從流圖的一端流動(dòng)到另一端,將大量復(fù)雜的數(shù)據(jù)作為輸入,在神經(jīng)網(wǎng)絡(luò)中對(duì)數(shù)據(jù)進(jìn)行處理分析和學(xué)習(xí),完成對(duì)數(shù)據(jù)中特征的提取學(xué)習(xí)和其類別的劃分,訓(xùn)練出需要的模型以用于以后的預(yù)測(cè)。它的計(jì)算可以表示為一個(gè)有向圖[4],圖中的每個(gè)節(jié)點(diǎn)都表示一個(gè)運(yùn)算操作,操作間以邊連接,每個(gè)節(jié)點(diǎn)可以有任意個(gè)輸入和輸出。如圖1所示,M和Y作為MatMul運(yùn)算操作的輸入,有將該運(yùn)算結(jié)果的輸出和b作為Add操作的輸入,并將其結(jié)果作為后來(lái)ReLU運(yùn)算操作的輸入,隨后將其結(jié)果和其他輸入經(jīng)過若干步操作后得到輸出結(jié)果C。
圖1 TensorFlow有向圖
TensorFlow平臺(tái)得到廣泛應(yīng)用是因?yàn)槠湎啾扔谄渌髁鞯膶W(xué)習(xí)框架支持更多開發(fā)語(yǔ)言,如支持Python、C、C++等,較容易實(shí)現(xiàn)算法在不同系統(tǒng)上的移植。在目前的TensorFlow資源庫(kù)中已經(jīng)支持線性回歸、深度學(xué)習(xí)以及邏輯回歸等[5]各種常用算法,易于調(diào)用,實(shí)現(xiàn)簡(jiǎn)單。
通過TensorFlow平臺(tái)進(jìn)行開發(fā)需要經(jīng)過以下步驟。
(1)創(chuàng)建圖。TensorFlow面對(duì)所有的任務(wù)都需要將其轉(zhuǎn)化為圖的形式表示才能進(jìn)行計(jì)算,所以有任務(wù)輸入就需要為其創(chuàng)建圖。
(2)創(chuàng)建會(huì)話。第一步創(chuàng)建圖需要一個(gè)會(huì)話才能傳入到TensorFlow引擎,所以要為其創(chuàng)建會(huì)話,使任務(wù)進(jìn)入到TensorFlow引擎。
(3)啟動(dòng)圖。圖進(jìn)入TensorFlow引擎后,即此時(shí)可以啟動(dòng)任務(wù),對(duì)變量進(jìn)行初始化和其他操作的運(yùn)行,以不斷更新變量的值。
(4)結(jié)束會(huì)話。
Softmax回歸模型是由解決二分類問題的logistic回歸模型發(fā)展而成,是logistic回歸模型在多分類問題上的推廣。
假設(shè)Logistics回歸的訓(xùn)練數(shù)據(jù)集由{(x1,y1),(x2,y2),…,(xm,ym)}共m個(gè)標(biāo)記后的樣本構(gòu)成,其中的輸入特征為xi→Rn+1。因?yàn)樵撃P徒鉀Q的是二分類問題,所以yi的取值只有{0,1}。假設(shè)函數(shù)被定義為:
參數(shù)θ要經(jīng)過訓(xùn)練進(jìn)行確定,要使得定義的最小化損失函數(shù)最小化:
推廣到多分類問題,則yi的取值不再只是{0,1},yi可以取k個(gè)不同值,其訓(xùn)練集依舊為{(x1,y1),(x2,y2),…,(xm,ym)}共m個(gè)樣本,類別yi的取值集合為{1,2,3,…,k}。在不同的應(yīng)用場(chǎng)景中,k不同,如MNIST數(shù)字識(shí)別案例中k=10。
Softmax模型依舊定義假設(shè)函數(shù)計(jì)算對(duì)于測(cè)試的輸入樣本x屬于每個(gè)類別j的估算概率,即p(y=j|x)。假設(shè)函數(shù)形式為:
該模型的損失函數(shù)定義形式為:
但是,該損失函數(shù)存在冗余參數(shù),所以添加權(quán)值衰減來(lái)解決該問題。添加權(quán)值衰減后的損失函數(shù)為:
此時(shí),Softmax的損失函數(shù)為嚴(yán)格的凸函數(shù),可以有唯一的解。利用梯度下降法或LBFGS算法等都可以得到全局最優(yōu)解。
最后,用矩陣的形式描述softmax回歸模型[6]:
當(dāng)測(cè)試集輸入時(shí),Softmax模型即會(huì)按照式(6)估算每個(gè)樣本屬于各個(gè)類別的概率,然后按照概率大小預(yù)測(cè)其所屬類別。
卷積神經(jīng)網(wǎng)絡(luò)的各神經(jīng)元是分層排列的,且每個(gè)神經(jīng)元值域與上一層的神經(jīng)元相關(guān),屬于前饋神經(jīng)網(wǎng)絡(luò)。該種網(wǎng)絡(luò)一般采用多層連接方式,由輸入層、隱藏層以及輸出層組成基本結(jié)構(gòu),主要應(yīng)用于非線性處理和模式識(shí)別方面[7]。前饋神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如圖2所示。
圖2 前饋神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
卷積神經(jīng)網(wǎng)絡(luò)模型是對(duì)大量的樣本進(jìn)行學(xué)習(xí)完成模型的訓(xùn)練,主要針對(duì)二維數(shù)據(jù)的處理找到輸入和輸出之間所蘊(yùn)含的關(guān)系[8]。單層的卷積神經(jīng)網(wǎng)絡(luò)的組成包括卷積層、采樣層、Relu層和全連接層4 層[9]。
卷積神經(jīng)網(wǎng)絡(luò)具有3個(gè)重要特征——稀疏連接、權(quán)值共享和池采樣。通過這些特性可實(shí)現(xiàn)其位移識(shí)別、縮放以及扭曲的不變性。
一般的CNN都包括卷積層和池化層。卷積層的每個(gè)神經(jīng)元會(huì)與上層的某個(gè)局部相連,目的是減少網(wǎng)絡(luò)中的參數(shù)存在,主要功能是完成特征的提取。池化層的主要功能是完成特征的映射,多個(gè)特征的映射關(guān)系會(huì)組成一個(gè)計(jì)算層。
除了上述兩個(gè)基本結(jié)構(gòu)層,CNN還包括輸入層和輸出層,且在輸出層前還會(huì)包含全連接層,主要任務(wù)是連接所有的特征,將得到的結(jié)果送到分類器,以用于最后的輸出。
在卷積神經(jīng)網(wǎng)絡(luò)中,最先用于手寫字識(shí)別方面的是LeNet-5模型,模型結(jié)構(gòu)如圖3所示。
卷積神經(jīng)網(wǎng)絡(luò)中輸入和輸出之間的關(guān)系并不像普通的數(shù)據(jù)關(guān)系,可以用精確的數(shù)學(xué)表達(dá)式表示。它們只能在大量的學(xué)習(xí)中建立之間的相互映射關(guān)系。但是,訓(xùn)練過程中計(jì)算量特別大,需要不斷重復(fù)訓(xùn)練來(lái)調(diào)整參數(shù),使其通過“適應(yīng)”得到“記憶”[10]。
圖3 LeNet-5模型
卷積神經(jīng)網(wǎng)絡(luò)算法分為4步,每?jī)刹奖欢x為一個(gè)階段,具體如下。
(1)前向傳播階段
①取出訓(xùn)練樣本記為(X,Yp),X被輸入到網(wǎng)絡(luò)中;
②計(jì)算與輸入X對(duì)應(yīng)的輸出Op:
其中,Wi為各卷積層的權(quán)值,bi為對(duì)應(yīng)的偏置矩陣,F(xiàn)i表示激活函數(shù)以及在池化層的采樣函數(shù)。
該階段的主要任務(wù)是將輸入層的信息進(jìn)行每一級(jí)的轉(zhuǎn)換傳到輸出層。該階段中激活函數(shù)是一個(gè)重要的因素,包括兩類:一種為傳統(tǒng)的飽和非線性激活函數(shù),主要包括Sigmoid函數(shù)和Tanh函數(shù);另一種為更貼合生物學(xué)的不飽和的非線性激活函數(shù),主要包括ReLUs函數(shù)和Softplus函數(shù)[11]。4種激活函數(shù)的表達(dá)式如下。
(2)后向傳播階段
①計(jì)算模型的實(shí)際輸出Op與理想輸出Yp之間的誤差;
②按照使得誤差極小化的方法,反方向傳播去調(diào)整權(quán)矩陣。
MNIST數(shù)據(jù)集有訓(xùn)練數(shù)據(jù)60 000行和測(cè)試數(shù)據(jù)10 000行,且每個(gè)樣本都對(duì)應(yīng)著一個(gè)唯一的標(biāo)簽。該標(biāo)簽是對(duì)樣本數(shù)字的描述,每張圖片由28×28個(gè)像素點(diǎn)構(gòu)成[12]。數(shù)據(jù)集如圖4所示。
圖4 MNIST數(shù)據(jù)集
其中,train-images-idx3-ubyte.gz包含60 000個(gè)樣本,train-labels-idx1-ubyte.gz包含60 000個(gè)標(biāo)簽,t10k-images-idx3-ubyte.gz包含10 000個(gè)樣本,t10k-labels-idx1-ubyte.gz包含10 000個(gè)標(biāo)簽。
數(shù)據(jù)集中的每一個(gè)樣本可轉(zhuǎn)化為一個(gè)長(zhǎng)度784的向量,所以MNIST中的訓(xùn)練數(shù)據(jù)集將被轉(zhuǎn)換成[60 000,784]的張量來(lái)表示。其中,第一個(gè)維度代表的為索引圖片,第二個(gè)維度代表每張的像素點(diǎn)。它與樣本相對(duì)應(yīng)的標(biāo)簽是用0~9的數(shù)字表示的,故標(biāo)簽一般用獨(dú)熱編碼(One-hot Encoding)表示。獨(dú)熱編碼的表示形式為除了要表示的某數(shù)值的對(duì)應(yīng)位上是數(shù)字1,其他位置都是0。例如,標(biāo)簽2則用獨(dú)熱編碼表示為[0,0,1,0,0,0,0,0,0,0],于是樣本標(biāo)簽會(huì)被轉(zhuǎn)化為[60 000,10]的張量。
使用Python語(yǔ)言實(shí)現(xiàn)Softmax模型和和CNN模型,并對(duì)CNN模型使用Sigmoid函數(shù)、Tanh函數(shù)和ReLUs函數(shù)3種函數(shù)作為其不同的激活函數(shù)。對(duì)訓(xùn)練集進(jìn)行0~1 500次的訓(xùn)練,間隔為100次,對(duì)不同訓(xùn)練次數(shù)時(shí)的準(zhǔn)確率進(jìn)行記錄,并測(cè)試出訓(xùn)練后對(duì)測(cè)試集預(yù)測(cè)的準(zhǔn)確率。對(duì)于每個(gè)模型以及每種激活函數(shù)的CNN模型進(jìn)行5次重復(fù)試驗(yàn),采用5次實(shí)驗(yàn)結(jié)果的平均值作為最終的訓(xùn)練和測(cè)試的準(zhǔn)確率結(jié)果,以用于模型的分析和評(píng)價(jià)。
實(shí)驗(yàn)訓(xùn)練不同訓(xùn)練次數(shù)得出的準(zhǔn)確率對(duì)比,結(jié)果如圖5所示。可以看出,CNN模型使用Tanh函數(shù)和ReLUs函數(shù)作為激活函數(shù)時(shí),與Softmax模型相比,準(zhǔn)確率在穩(wěn)定后提高了9%左右。對(duì)于CNN模型,傳統(tǒng)的激活函數(shù)Sigmoid收斂速度較慢,并且在1 500次訓(xùn)練中,收斂后的準(zhǔn)確率與Softmax模型的準(zhǔn)確率相比幾乎沒有提高。ReLUs作為不飽和非線性激活函數(shù),在代替Sigmoid函數(shù)和Tanh函數(shù)后,收斂速度有了一定的提高。從圖5可以看出,ReLUs函數(shù)作為激活函數(shù)時(shí),在訓(xùn)練200次時(shí)實(shí)驗(yàn)結(jié)果就達(dá)到了穩(wěn)定狀態(tài),收斂速度較快。
圖5 訓(xùn)練結(jié)果
圖6為利用訓(xùn)練后的模型對(duì)測(cè)試集預(yù)測(cè)識(shí)別的準(zhǔn)確率??梢钥闯?,在CNN使用ReLUs函數(shù)時(shí)準(zhǔn)確率最高,說明該模型具有一定的先進(jìn)性。
圖6 測(cè)試結(jié)果對(duì)比
本文在TensorFlow框架上,采用Softmax模型和CNN模型對(duì)手寫體數(shù)字訓(xùn)練,分析了兩種模型的基本架構(gòu)和原理,并對(duì)CNN模型存在的局部極小點(diǎn)問題,采用在損失函數(shù)中加入權(quán)值衰減項(xiàng)給予解決,使用ReLUs作為激活函數(shù)提高其收斂速度。在實(shí)驗(yàn)設(shè)計(jì)中,對(duì)比兩個(gè)模型的識(shí)別準(zhǔn)確率和CNN模型不同激活函數(shù)的收斂速度。這些原理分析和實(shí)驗(yàn)數(shù)據(jù)對(duì)于手寫字識(shí)別的研究具有一定的參考意義。