侯小毛,馬 凌,趙月愛
(1.湖南信息學院 電子信息學院,湖南 長沙 410151;2.太原師范學院 計算機系,山西 晉中 030619)
深度神經網絡是一種多層的非線性映射深層網絡結構,能夠完成復雜的非線性函數逼近[1]。在許多工程領域中,深度學習技術的實際性能超越了傳統的機器學習技術[2]。深度神經網絡(deep neural networks, DNN)主要有前饋神經網絡和遞歸神經網絡兩種結構,前饋神經網絡[3]通過逐層學習獲取輸入數據的主要驅動變量,該結構對分類問題和目標檢測問題的性能較好;遞歸神經網絡[4]的每層均含有反饋回路,能夠學習時間無關的數據,如自然語言理解。雖然深度神經網絡具有巨大的性能優勢,但是深度神經網絡含有許多結構參數,針對特定的應用場景確定合適的網絡模型是一個難題。
通過試錯法搜索深度神經網絡的參數需要消耗大量的時間[5],因此快速準確地搜索深度神經網絡的參數成為目前的一個研究熱點。進化神經網絡(evolutionary neural networks, ENN)[6]是將進化計算和神經網絡兩者融合產生的一種全新神經網絡模型,ENN能夠成功實現神經網絡的權重進化處理,但其計算時間較長。拓撲加權進化神經網絡(topology and weight evolving artificial neural network, TWEANN)[7]支持對網絡結構和權重參數同時進行進化處理,該網絡一般包含兩個循環體:測試新網絡結構的結果搜索程序和優化權重的結構開發程序。ENN和TWEANN優化深度神經網絡的過程均需要較長的處理時間。近期文獻[8,9]在保證深度神經網絡性能的前提下,成功降低了網絡參數的搜索時間。evoCNN[8]使用遺傳算法搜索卷積神經網絡(convolutional neural networks, CNN)的網絡結構,該算法設計了新的交叉算子和變異算子,加快了參數搜索的過程。EUDNN[9]使用一個基礎向量編碼神經網絡的權重和連接,在每次迭代中需要對編碼進行多次轉化,導致該算法對于高維數據的處理速度依然較慢。
文獻[10]的研究成果表明,采用粒子群優化算法(particle swarm optimization, PSO)訓練ANN的速度快于遺傳算法,而引力搜索算法(gravitational search algorithm, GSA)的收斂速度優于PSO[11],受此啟發,本文利用GSA訓練CNN網絡。GSA具有收斂速度快的優勢,但是容易陷入局部最優,因此本文設計了GSA的增強機制,采用對數衰減函數建模引力常量,并且設計了交叉算子和變異算子防止陷入局部極值。此外,解的編碼格式對于訓練的效率具有極大的影響,本文設計了直接的深度神經網絡表示形式,并且給出了agent各個屬性的更新方法。最終將訓練的深度卷積神經網絡應用于圖像分類問題,實驗結果表明本文方法在實現較高分類精度的情況下,成功加快了深度神經網絡的訓練速度。
CNN的數學模型定義為
(1)
式中:i為神經網絡的深度,X為輸入數據,fi()為第i層的激活函數,gi()為第i層的加權算子,Zi為第i層加權運算的結果,Wi為第i層的權重向量,Oi為第i層的輸出。深度神經網絡主要有3種網絡層:卷積層、池化層和全連接層,3種網絡層的輸出為
(2)
卷積層的輸出是輸入和權重卷積(“*”)運算的結果,卷積層一般由卷積核或者卷積濾波器實現。池化層包括最大池化和平均池化兩種類型,對r×c的池化窗口做下采樣處理,減少輸出參數。全連接層的輸出為權重向量和輸入相乘的結果。
訓練神經網絡的目標是最小化訓練目標和網絡預測輸出之間的誤差。卷積神經網絡大多采用交叉熵損失作為評價指標,使用梯度下降法和后向傳播法對交叉熵損失進行最小化處理。CNN存在大量的結構參數,通過試錯法確定CNN結構需要極高的時間成本。
假設一個n維的搜索空間內包含N個agent,第i個解的位置表示為向量Xi
(3)
式中:i=1,2,…,N,每個向量的值表示agenti在該維度的位置。agenti的質量和適應度之間滿足以下的關系
(4)
式中:Mi(t)和fiti(t)分別為第t次迭代agenti的質量和適應度,Agwor(t)表示第t次迭代適應度最低的agent。
GSA根據當前位置和下一次迭代的速度計算agent下一次迭代的位置,計算方法為
Xi(t+1)=Xi(t)+vi(t+1)
(5)
式中:下一次迭代的速度計算為
vi(t+1)=r×vi(t)+ai(t)
(6)
式中:r是(0,1)范圍內的一個隨機變量。agenti的加速度計算為agenti所受的總引力除以其質量
(7)
式中:q為(0,1)范圍內的隨機變量,Fij(t)表示在第t次迭代agentj對agenti的引力。Fij計算為
(8)
式中:G為引力常量,R為agentj和agenti間的距離。G一般設為衰減函數,其初值記為G(G0,t)。算法1所示是GSA的偽代碼。
算法1:GSA優化算法
輸入:Tser[],d,τ,h
輸出:Tpdf[]
(1)初始化候選目標Xi(i=1,2,…,N)
(2)while 未達到結束條件 do
(3) 計算所有目標的適應度
(4) 計算最優解目標Mi和最差目標Mj
(5) 更新重引力因子G(t)
(6) 計算引力Fij; //式(8)
(7) 更新加速度; //式(7)
(8) 更新速度; //式(6)
(9) 更新位置; //式(5)
(10)endwhile
為增強GSA的局部開發能力和全局搜索能力,本文對GSA提出3點修改:①采用對數衰減函數代替GSA引力常量的線性遞減函數。②設計了交叉算子強化GSA的全局搜索能力。③設計了變異算子防止GSA收斂于局部極值。
(1)加速收斂過程
GSA中引力常量G的作用是權衡全局搜索和局部開發,式(9)是GSA的G值線性變化函數
(9)
開始階段G值較大,agent以較大的步長移動,在迭代過程中逐漸縮小agent的移動步長。迭代次數越多,agent的質量增加,搜索速度變慢,該性質對GSA的收斂速度具有負面的影響。為了解決該問題,采用對數衰減函數
(10)
式中:G0為初始化的引力常量,Gmin和Gmax分別為引力常量的最小值和最大值,ΔG=Gmax-Gmin,a為加速度,t為當前的迭代次數,T為總迭代次數。
(2)交叉算子設計
GSA利用目標質量控制搜索的趨勢,質量大的agent慢于質量小的agent,優質解的移動慢于劣質解,所以低適應度agent搜索未知區域的能力更強。為了提高GSA對未知區域的搜索能力,引入交叉算子來產生新解,增強GSA的全局搜索能力。
首先,為GSA設立一個全局最優agent,記為gopt,gopt類似于灰狼優化算法的頭狼α。每次迭代按適應度值將agent降序排列,將后一半(N/2)的所有agent均和gopt進行交叉操作,產生N/2個新解,種群規模變為N+N/2。然后從(N+N/2)個解中選擇N個最優解作為下一次迭代的種群。交叉算子能夠增強GSA算法的搜索能力,降低早熟收斂的概率,交叉算子的流程如圖1所示,圖中虛線框是本文主要修改的模塊。

圖1 交叉算子的流程
(3)變異算子設計
本文GSA算法記錄每個最優解的迭代次數,檢查是否陷入局部最優。本文設計了變異算子使gopt跳出局部最優,變異算子的流程如圖2所示。變異算子生成一個新的變異解,變異算子對變異agent的處理方式分為3種情況:如果它的適應度超過gopt,那么變異agent變為當前的gopt。每次迭代將種群按照agent的適應度升序排列,X(1)為最優解,X(N)為最差解。變異算子有助于GSA跳出局部極值點,防止陷入早熟收斂。

圖2 變異算子的流程
算法2是本文GSA_DNN的總程序,算法的輸入數據包括:訓練數據集和CNN的結構參數。GSA_DNN將GSA的全局最優解作為CNN的結構參數,是一種自動參數優化算法。訓練程序的網絡參數并未重新初始化,而是將優質的參數集由全局最優agent傳遞至下一次迭代中。GSA_DNN包含6個關鍵的模塊:CNN的表示、種群初始化、適應度評價函數、兩個agent間的差異度量、計算agent的速度和更新agent的位置。
算法2:GSA_DNN算法
輸出:CNN的最優網絡結構。
(1)S={P1,…,PN}=initswarm(N,lmax,kmax,nmax,nout);
(2)P1_popt=P1;
(3)P1_loss=computeloss(P1,X,etrain);
(4)P1_popt_loss=computeloss(P1,X,etrain);
(5)gopt=P1; //初始化全局最優解
(6)gopt_loss=P1_loss;
(7)fori=2 toNdo
“您所撥打的手機實名登記機主已被人民法院發布為失信被執行人,請督促其盡快履行生效法律文書確定的義務。”最近,只要有人撥打南昌市民黃某的電話,就會聽到法院為黃某“量身訂制”的彩鈴。
(8)P1_popt=Pi;
(9)P1_loss=computeloss(P1,X,etrain);
(10)P1_popt_loss=computeloss(P1,X,etrain);
(11) ifPi_loss≤goptlossthen
(12)gopt=Pi;
(13) endif
(14)endfor
(15)foriter=1 toitermaxdo
(16) fori=1 toNdo
(17)Pi_vel=update_velocity( );
(18)Pi=updateAgent(Pi);
(19)Pi_loss=computeLoss(Pi,X,etrain);
(20) ifPi_loss≤Pi_popt_lossthen
(21)Pi_popt=Pi;
(22)Pi_popt_loss=Pi_loss;
(23) ifPi_popt_loss≤gopt_lossthen
(24)gopt=Pi;
(25)gopt_loss=Pi_loss;
(26) endif
(27) endif
(28) endfor
(29)endfor
(30)gopt=computeloss(gopt,X,etest);
(31)returngopt;
設計了直接的CNN結構編碼方案。CNN有4種分層:卷積層、最大池化層、平均池化層和全連接層。本文GSA_DNN是4層的神經網絡模型,如圖3所示。

圖3 GSA_DNN的神經網絡模型
假設C、P和FC分別表示卷積層、池化層和全連接層,將神經網絡結構表示為向量形式,向量的每個位置包含了該層的類型及其超參數。向量中卷積層的超參數為輸出特征圖(feature map)的數量,全連接層的超參數為神經元的數量,卷積層或池化層的超參數均為核的大小。本文所設計的agent編碼方法無需將編碼信息轉化為數值形式,直接描述了神經網絡的結構和超參數。
算法2的initswarm()函數為種群初始化方法,initswarm()函數產生N個隨機CNN結構作為初始化agent。算法3所示是initswarm()函數的偽代碼,每個agent的網絡層數為隨機值,其范圍為[3,lmax]。每個agent的第1層和最后1層分別為卷積層和全連接層。卷積層和池化層之間包含FC層會增加CNN的參數數量,所以初始化程序需要保證FC層之后的每層都是FC層。池化層能夠有效地減少輸出的規模,因此池化層和FC層連接,能夠有效地減少FC層的神經元數量。
算法3:初始化種群算法
輸入:種群大小N,最大層數lmax,特征圖最大數量fmapmax,卷積核大小kmax,全連接層神經元數量nmax,輸出層節點數量nout。
輸出: agent集合S={P1,…,PN}
(1)fori=1 toNdo
(2)Pi_depth=random(3,depth); //隨機確定特征圖數量
(3) forj=1 toPi_depthdo
(4) ifj==1 then
(5)layerlist[j]=addConv(kmax,fmapmax);
(6) else ifj==Pi_depththen
(7)layerlist[j]=addFC(nout);
(8) else iflayerlist[j-1]為全連接層 then
(9)layerlist[j]=addFC(nmax);
(10) else
(11)layertype=random(1, 3);
(12) iflayertype==1 then
(13)layerlist[j]=addConv(kmax,fmapmax);
(14) else iflayertype==2 then
(15)layerlist[j]=addPool();
(16) else
(17)layerlist[j]=addFC(nmax);
(18) endif
(19) endif
(20) endfor
(21)Pi_layerlist=layerlist;
(22)endfor
算法3的addConv()函數對agent的網絡結構增加一個卷積層,特征圖的數量是[1,fmapmax]范圍的隨機值,卷積核大小是[3×3,kmax×kmax]范圍的隨機值,kmax表示卷積核的最大值,卷積核的滑動步長固定為1×1。add-Pool()函數隨機選擇一個最大池化層或者平均池化層加入agent的網絡結構,池化窗口大小為3×3,滑動步長為2×2。addFC()函數對agent的網絡結構增加一個全連接層,隱藏神經元的數量為[1,nmax]范圍的隨機值。所有層的激活函數均采用線性整流函數(rectified linear unit, ReLU),池化層的層數受輸入數據的大小約束,如果輸入大小為28×28,最多增加3層池化層。
算法2的computeloss()函數為適應度的評價函數。將agent的網絡結構實現具體的CNN,訓練CNN的所有epo-ch,計算每個agent的損失函數來評價其適應度。本文采用交叉熵損失作為損失函數,算法目標是搜索損失最小的agent。使用Adam方法[12]訓練CNN網絡,使用Xavier方法[13]初始化CNN的權重。
針對本文的直接編碼方法設計了專門的agent差異度量方法。圖4是比較agent Ag1和Ag2之間差異,圖中P表示池化層,C表示卷積層,F表示全連接層,0表示無差異,-1表示刪除該層,+F表示增加F層。因為agent網絡結構的卷積層、池化層和全連接層可能不對齊,所以獨立地比較agent的全連接層。考慮4種不同的情況:①如果兩個agent的第2層均為卷積層,那么兩者的差異為0,說明在agent結構的更新過程中,該層的位置不會改變,并且保留兩個agent的超參數。②如果兩個agent的網絡層類型不同,那么將保留前一個agent的超參數。③如果前一個agent的神經層數少于后一個agent,那么對最終的差異-1,表示該位置應當被刪除。④如果前一個agent的神經層數多于后一個agent,那么對最終的差異+L,L表示增加的神經層類型。

圖4 比較agent Ag1和Ag2之間差異
基于全局最優gopt和局部最優lopt之間的差異決定agentAg的速度,因此每次迭代需要計算兩個差異值gopt-Ag和popt-Ag。算法2的update_velocity()函數為agent的速度計算方法。圖5是一個計算agent速度,圖中P表示池化層,C表示卷積層,F表示全連接層,0表示無差異,-1表示刪除該層,+F表示增加F層。第1行和第2行列表分別為gopt-Ag和lopt-Ag。產生一個[0,1)范圍的隨機數r,比較r和閾值Cg的大小,如果r≤Cg,則選擇gopt-Ag,否則,選擇lopt-Ag。閾值Cg的作用是控制agent的收斂速度。

圖5 計算agent速度
因為速度的計算過程僅僅比較了神經層的類型,而一個agent的神經層類型可能和gopt和lopt均完全相同,本文方法計算的速度結果將為一個全0的列表。該情況下本文算法基于Cg從gopt和lopt選擇速度,并將gopt的超參數作為agent的超參數。
算法2的updateagent()函數為更新agent的方法。圖6是更新agent結構,圖中P表示池化層,C表示卷積層,F表示全連接層,0表示無差異,-1表示刪除該層,+F表示增加F層。算法根據agent的速度對agent的網絡結構增加或者刪除神經層。更新過程中需要檢查池化層的數量,使其滿足輸入數據的約束,如果更新的結果中池化層的數量大于約束值,則從最后一個池化層依次刪除,使其滿足約束的層數。

圖6 更新agent結構
采用GPU處理器Nvidia GTX 1080測試GSA_DNN,GPU的顯存為8 GB,該顯存足夠容納兩百萬個神經網絡的參數。采用分類準確率和分類錯誤率作為圖像分類性能的評價指標。
采用4個基于深度學習的圖像分類算法作為對比方法:RandNet-2[14]、evoCNN[15]、MCCNN[16]、HEp-2[17],Rand-Net-2和evoCNN是兩個經典的神經網絡參數優化算法,MCCNN和HEp-2則是近期圖像分類領域性能較為突出的兩個神經網絡模型。RandNet-2將主成分分析和卷積神經網絡結合,具有較強的非線性學習能力,本文模型也以卷積神經網絡為基礎,通過RandNet-2能夠反映本文方法對卷積神經網絡的優化效果。evoCNN是一種基于遺傳算法的卷積神經網絡演化優化方法,該方法得到了廣泛的應用。MCCNN設計了多通道的卷積神經網絡來提取具有時空域不變性的特征,對圖像進行分類處理。HEp-2針對細胞圖像設計了半自動的CNN參數搜索方案,并且在一般的圖像分類數據集上也完成了性能驗證。
采用5個圖像分類領域內常用的公開數據集完成仿真實驗:MNIST、MNIST-RD、MNIST-RB、MNIST-BI、MNIST-Fashion。圖7是5個圖像數據集的實例,表1是5個數據集的基本屬性。MNIST數據集由250個人手寫的數字構成,MNIST-RD數據集由旋轉的手寫數字構成,MNIST-RB數據集的背景加入了隨機噪聲,MNIST-BI數據集在背景加入了圖像,MNIST-Fashion數據集包含了10種不同的服裝。

圖7 5個實驗圖像數據集的實例

表1 實驗數據集的基本屬性
GSA_DNN的參數分為3組:GSA相關參數、CNN初始化參數和CNN訓練的相關參數。表2是本文實驗的具體參數取值。

表2 實驗的參數設置
本文GSA_DNN模型獨立地訓練10次,將10次的CNN模型對測試數據集獨立地進行分類實驗,統計10次實驗結果的平均分類準確率和平均分類錯誤率。RandNet-2、evoCNN、MCCNN和HEp-2均提供了平均分類錯誤率結果,因此首先比較了GSA_DNN的分類錯誤率,如圖8所示。本文方法對于MNIST、MNIST-RD、MNIST-RB、MNIST-BI這4個數據集的錯誤率均明顯地低于RandNet-2、MCCNN和HEp-2這3個模型,略低于evoCNN模型。MNIST-Fashion數據集類別之間的界限更為明顯,所以5個深度神經網絡對MNIST-Fashion數據集的分類錯誤率均較低,其中GSA_DNN和evoCNN的結果幾乎相等,可見本文方法獲得了理想的分類性能。

圖8 圖像平均分類錯誤率
根據相關研究人員的分析[18],分類錯誤率即可以反映圖像分類的準確性,RandNet-2、evoCNN、MCCNN和HEp-2未提供圖像分類準確率的數據,因此本文僅統計了GSA_DNN的分類準確率,如圖9所示。圖中可看出,GSA_DNN對MNIST、MNIST-RD、MNIST-RB和MNIST-Fashion的分類準確率均高于0.97,對MNIST-BI數據集的分類準確率接近0.94,實現了理想的分類性能。

圖9 GSA_DNN的圖像平均分類準確率
表3是本文GSA算法訓練5個數據集所獲得的最佳網絡結構參數。

表3 GSA_DNN搜索的最佳網絡參數
運用群體智能算法搜索CNN的最佳參數是一個極為耗時的任務,因此,本文的核心目標是在保證優化效果的前提下,提高CNN模型的訓練效率。文獻[19]的實驗結果顯示,evoCNN訓練MNIST數據集需要大約4天,該實驗采用的NVIDIA Tesla P100 GPU是極為強大的服務器集群處理器。本文GSA_DNN對MNIST數據集獨立地完成了10次訓練,最優訓練時間、平均訓練時間和最差運行時間分別為9.67 h、14.89 h和22.33 h,而且本文實驗的Nvidia GTX 1080 GPU計算能力也大幅度地弱于NVIDIA Tesla P100 GPU,所以本文設計的GSA_DNN方法成功加快了深度神經網絡的訓練時間。
本文為GSA設計了交叉算子和變異算子,利用增強的GSA解決深度卷積神經網絡的訓練問題。本文為CNN結構設計了直接編碼策略,使其和GSA算法實現了較好地結合。實驗結果表明,本文的GSA_DNN僅需要30個agent和20次迭代即可搜索出最佳的CNN結構,明顯快于基于遺傳算法的evoCNN方法。雖然本文實驗在圖像分類問題上進行了驗證,但是GSA_DNN能夠應用于其它的復雜學習任務。
GSA_DNN中每個agent均需要對全部的訓練集進行完整訓練,這是導致訓練時間長的關鍵原因。未來將研究把本文GSA應用于殘差神經網絡、遞歸神經網絡等模型的訓練工作,并針對不同類型的網絡,調節每個agent的訓練量,從而進一步降低訓練的時間。