尚迪雅,孫 華,洪振厚,曾慶亮
(1.新疆大學(xué) 軟件學(xué)院 軟件工程技術(shù)重點實驗室,烏魯木齊 830002; 2.深圳大學(xué) 光電工程學(xué)院 光電子器件與系統(tǒng)教育部/廣東省重點實驗室,廣東 深圳 518060)
近年來,隨著人工智能技術(shù)的快速發(fā)展,自動化機器學(xué)習(xí)(Automated Machine Learning,AutoML)[1-2]已成為機器學(xué)習(xí)領(lǐng)域[3-5]的一個熱點研究方向,并廣泛應(yīng)用于計算機視覺[6]、數(shù)據(jù)挖掘[7]、圖像分割[8]和自然語言處理[9]等領(lǐng)域。
機器學(xué)習(xí)包括統(tǒng)計機器學(xué)習(xí)和深度學(xué)習(xí)2個方面[10]。統(tǒng)計機器學(xué)習(xí)在處理問題時一般包括數(shù)據(jù)預(yù)處理[11]、特征工程[12]和模型選擇[13]等內(nèi)容,這些操作均需要手動完成。在深度學(xué)習(xí)領(lǐng)域,神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)在通常情況下也需人工設(shè)計,為了得到一個效果較好的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),往往需要耗費很多時間和精力。為解決上述問題,AutoML應(yīng)運而生。AutoML包含針對統(tǒng)計機器學(xué)習(xí)的自動化算法和針對深度學(xué)習(xí)的自動化算法2個部分。針對統(tǒng)計機器學(xué)習(xí)的自動化算法包括自動特征工程[14]和自動模型選擇[15-16]等內(nèi)容。本文的研究對象是針對深度學(xué)習(xí)的自動化算法,即自動化深度學(xué)習(xí)。自動化深度學(xué)習(xí)算法是一種特殊的機器學(xué)習(xí)算法,其可以獲得高性能且十分靈活的網(wǎng)絡(luò)結(jié)構(gòu)。自動化深度學(xué)習(xí)算法用概念組成的網(wǎng)狀層級結(jié)構(gòu)來表示網(wǎng)絡(luò)世界,每一個概念由更簡單抽象的概念相連而成,且前者可通過后者計算而得。自動化深度學(xué)習(xí)根據(jù)當(dāng)前問題的特點,通過自動搜索網(wǎng)絡(luò)結(jié)構(gòu)得到更多樣且性能更好的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),由此減少人工設(shè)計網(wǎng)絡(luò)所花費的時間和人力并提高搜索效率和神經(jīng)網(wǎng)絡(luò)的性能。
網(wǎng)絡(luò)架構(gòu)自動搜索方法包括多種搜索策略,以進化算法為搜索策略的神經(jīng)網(wǎng)絡(luò)架構(gòu)搜索(Neural network Architecture Search,NAS)算法,按照復(fù)雜程度可分為基于神經(jīng)元的神經(jīng)架構(gòu)搜索算法、基于CNN的神經(jīng)架構(gòu)搜索算法和基于DNN的神經(jīng)架構(gòu)搜索算法。本文分析并歸納這3類算法的特點和應(yīng)用現(xiàn)狀,并對神經(jīng)架構(gòu)搜索算法的未來發(fā)展方向進行展望。
隨著深度學(xué)習(xí)技術(shù)的發(fā)展,網(wǎng)絡(luò)結(jié)構(gòu)由最初的LeNet[17](7層結(jié)構(gòu))發(fā)展到后來的AlexNet[18]、VGGNet[19]、GoogLeNet[20-21](22層結(jié)構(gòu))以及ResNet[22](152層結(jié)構(gòu))。網(wǎng)絡(luò)結(jié)構(gòu)越來越深,模型也變得越來越復(fù)雜,雖然這些模型足夠靈活,但人工設(shè)計網(wǎng)絡(luò)結(jié)構(gòu)仍然需要大量的專業(yè)知識以及充足的時間,而且針對深度學(xué)習(xí)模型的調(diào)參優(yōu)化也非常繁瑣。眾多的超參數(shù)和網(wǎng)絡(luò)結(jié)構(gòu)參數(shù)會產(chǎn)生爆炸性的組合,常規(guī)的隨機搜索和網(wǎng)格搜索效率較低,因此,效率較高的NAS和模型優(yōu)化引起了學(xué)者們的廣泛關(guān)注。
NAS[23]可以針對特定數(shù)據(jù)集從初始時刻設(shè)計性能良好的模型。一般NAS問題可以被定義為搜索空間和搜索策略2個子問題。搜索空間定義了被優(yōu)化問題的變量和參數(shù)等,其代表一組可供搜索的神經(jīng)網(wǎng)絡(luò)架構(gòu)。搜索策略定義了使用什么算法可以快速、準(zhǔn)確找到最優(yōu)的網(wǎng)絡(luò)結(jié)構(gòu)參數(shù)配置。常見的搜索方法包括隨機搜索、基于貝葉斯優(yōu)化、基于進化算法、基于強化學(xué)習(xí)[24-25]和基于可微分神經(jīng)架構(gòu)搜索[26-27]等。本文以基于進化算法的NAS為研究對象,闡述進化算法、進化神經(jīng)網(wǎng)絡(luò)的發(fā)展歷程,分析近年來較受關(guān)注的若干基于進化算法的神經(jīng)架構(gòu)搜索算法的特點和應(yīng)用現(xiàn)狀。
進化算法是一類算法的統(tǒng)稱,為一個“算法簇”。進化算法借鑒與模擬生物界的多種生物現(xiàn)象來實現(xiàn)搜索過程,一般包括基因編碼、種群初始化、交叉變異算子、經(jīng)營保留機制等基本操作。進化算法簇主要包含遺傳算法(Genetic Algorithm,GA)、進化策略(Evolutionary Strategies,ES)和進化規(guī)劃(Evolutionary Programming,EP),后期又提出了遺傳規(guī)劃(Genetic Programming,GP)。
遺傳算法[28]是模擬達(dá)爾文生物進化論中自然選擇和遺傳學(xué)機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優(yōu)解的方法。
進化策略[29]是一種模仿生物進化的求解參數(shù)優(yōu)化問題的方法。與遺傳算法不同的是,進化策略采用實數(shù)值作為基因,總是遵循均值為零、方差為某值的高斯分布變化規(guī)律來產(chǎn)生新的個體,然后保留最優(yōu)的個體。
進化規(guī)劃是在人工智能技術(shù)研究過程中提出的一種有限狀態(tài)機進化模型,在此模型中機器狀態(tài)基于分布的規(guī)律進行編譯。文獻[30]對進化規(guī)劃進行改進,使其可處理實數(shù)空間的優(yōu)化問題,并在變異運算中引入正態(tài)分布變異算子,使得進化規(guī)劃成為一種優(yōu)化搜索工具并廣泛應(yīng)用于很多實際問題。進化規(guī)劃模擬生物種群層次上的進化,因此,在進化過程中主要強調(diào)生物種群行為上的聯(lián)系,即依據(jù)種群層次上的行為進化而建立父、子代間的行為鏈,優(yōu)秀的子代才有資格生存。
遺傳規(guī)劃[31]是一種自動搜索程序的算法,該算法是一種新的全局優(yōu)化搜索算法,簡單通用、魯棒性強且對非線性復(fù)雜問題展現(xiàn)出很強的求解能力,因此被廣泛應(yīng)用于許多不同的領(lǐng)域。
從適應(yīng)度的角度而言,遺傳算法可用于選擇優(yōu)秀的父代(優(yōu)秀的父代產(chǎn)生優(yōu)秀的子代),而進化規(guī)劃和進化策略則用于選擇子代(優(yōu)秀的子代才能存在)。遺傳算法與遺傳規(guī)劃強調(diào)的是基于編碼基因的鏈?zhǔn)絻?yōu)化與篩選,而進化規(guī)劃和進化策略更著重于結(jié)果選擇。
近年來,對于遺傳算法、進化策略、進化規(guī)劃和遺傳規(guī)劃的定義一直存在較多爭議,且遺傳算法的應(yīng)用較為廣泛,因此,在很多情況下,對于進化算法而言并沒有進行明確地區(qū)分,通常將遺傳算法稱為進化算法。
進化算法是一種無梯度的優(yōu)化算法,先隨機生成一個種群(N組解),然后循環(huán)執(zhí)行選擇、交叉、變異,直到滿足最終條件后停止循環(huán)。進化算法盡管有多個重要分支,但它們卻有著共同的進化框架。假設(shè)P為種群,t為進化代數(shù),P(t)為第t代種群,則進化計算的基本結(jié)構(gòu)可以描述如下:
{
確定編碼形式和搜索空間;
初始化各進化參數(shù),并設(shè)置進化代數(shù)t=0;
初始化種群P(0);
計算初始化種群的適應(yīng)度;
While(不滿足終止條件) do
{
t=t+1;
利用選擇操作從P(t-1)代中選出P(t)代群體;
對P(t)代種群執(zhí)行進化操作;
計算P(t)代種群的適應(yīng)度值;
}
}
1989年MILLER等人提出神經(jīng)進化的概念,利用遺傳算法進行神經(jīng)網(wǎng)絡(luò)的進化,通過搜索行為空間可以在特定任務(wù)中取得更好的結(jié)果[32]。
神經(jīng)網(wǎng)絡(luò)是一種對人類智能結(jié)構(gòu)的模擬方法,其通過對大量人工神經(jīng)元的廣泛并行互聯(lián),構(gòu)造人工神經(jīng)網(wǎng)絡(luò)系統(tǒng)從而模擬生物神經(jīng)系統(tǒng)的智能機理。進化計算是一種對人類智能的演化模擬方法,其通過對生物遺傳和演化過程的認(rèn)知,用進化算法去模擬人類智能的進化規(guī)律。
進化神經(jīng)網(wǎng)絡(luò)將進化算法的進化自適應(yīng)機制與神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)計算機機制有機結(jié)合在一起,實現(xiàn)對動態(tài)環(huán)境的自適應(yīng)。進化神經(jīng)網(wǎng)絡(luò)包括鏈接權(quán)值、網(wǎng)絡(luò)結(jié)構(gòu)和學(xué)習(xí)規(guī)則的進化,圖1所示為神經(jīng)網(wǎng)絡(luò)的進化過程。
圖1 神經(jīng)網(wǎng)絡(luò)的基本進化過程
基于無梯度進化的NAS按照復(fù)雜程度可以分為基于神經(jīng)元的神經(jīng)架構(gòu)搜索、基于DNN的神經(jīng)架構(gòu)搜索和基于CNN的神經(jīng)架構(gòu)搜索。
基于神經(jīng)元的神經(jīng)架構(gòu)搜索是指神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)是以神經(jīng)元為基本單元,一個節(jié)點就是一個神經(jīng)元,然后由神經(jīng)元的堆疊來構(gòu)造神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。其進化過程則是通過改變神經(jīng)元之間的鏈接權(quán)重或拓?fù)浣Y(jié)構(gòu),從最簡單的單個神經(jīng)元的結(jié)構(gòu)開始搜索,直至得到符合當(dāng)前問題的最優(yōu)結(jié)構(gòu)為止。
基于DNN的神經(jīng)架構(gòu)搜索是指當(dāng)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)越來越復(fù)雜時,為了提高搜索效率,基本單元由固定的DNN層組成,一個節(jié)點就是一個DNN層。其進化過程則是通過一種共同進化的方式,增加神經(jīng)網(wǎng)絡(luò)的可復(fù)用性和可遷移性。
基于CNN的神經(jīng)架構(gòu)搜索是指隨著CNN的廣泛應(yīng)用,為了能夠自動構(gòu)建CNN架構(gòu),而將CNN中的卷積層、池化層等操作作為基本單元,節(jié)點表示卷積操作、池化操作等操作類型。其進化過程主要采用經(jīng)典的遺傳算法,主要步驟包括初始化、選擇、變異、交叉和適應(yīng)度評估等。
經(jīng)典的基于神經(jīng)元的神經(jīng)進化方式可以分為2種,一種是固定神經(jīng)網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu),改變權(quán)重值,另一種是神經(jīng)網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)和權(quán)重值都改變,從而實現(xiàn)神經(jīng)進化。
3.1.1 神經(jīng)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)固定的方式
在神經(jīng)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)固定的方式中,通過改變權(quán)重值來進化神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。如圖2所示,在一個全鏈接的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)中,網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)是指一個隱藏的神經(jīng)元層,每個隱藏的神經(jīng)元分別鏈接到每個網(wǎng)絡(luò)的輸入和每個網(wǎng)絡(luò)的輸出,進化可以通過不斷嘗試變異的方式來修改鏈接中間的權(quán)重值和偏置值,從而改變神經(jīng)網(wǎng)絡(luò)的預(yù)測結(jié)果。
圖2 全鏈接神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
3.1.2 權(quán)重及其形態(tài)改變的方式
鏈接權(quán)重并不是影響神經(jīng)進化的唯一參數(shù),神經(jīng)網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)也會影響其效果。將遺傳算法與神經(jīng)網(wǎng)絡(luò)相結(jié)合的經(jīng)典算法之一是增強拓?fù)涞纳窠?jīng)進化網(wǎng)絡(luò)(Neuro Evolution of Augmenting Topologies,NEAT)算法[33]。當(dāng)用一個很復(fù)雜的神經(jīng)網(wǎng)絡(luò)來解決一個簡單的問題時會造成層結(jié)構(gòu)的浪費,因此,NEAT分析需要使用多少鏈接,忽略其中無用的鏈接從而構(gòu)成更小的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)并提高運行效率。NEAT包括修改權(quán)重、添加節(jié)點和鏈接3種突變方式,在現(xiàn)有鏈接中插入節(jié)點。NEAT算法的基因編碼、神經(jīng)網(wǎng)絡(luò)變異和交叉的具體過程如下:
1)NEAT的基因編碼方式
NEAT的基因編碼方式如圖3所示,其中,Node Genes是指節(jié)點類型,用于存儲網(wǎng)絡(luò)中節(jié)點的信息,包括輸入節(jié)點、隱藏節(jié)點和輸出節(jié)點;Connect.Genes是指鏈接,用于存儲節(jié)點間的信息,包括輸入節(jié)點、輸出節(jié)點、權(quán)重值(Weight)、連接方式(直接連接(Enabled)和間接連接(DISABLED))以及創(chuàng)新號(Innovation ID),其中,創(chuàng)新號在交叉過程中作為識別標(biāo)準(zhǔn)。
2)NEAT的神經(jīng)網(wǎng)絡(luò)變異方式
NEAT中的神經(jīng)網(wǎng)絡(luò)變異包括鏈接變異和節(jié)點變異2種類型。鏈接變異為添加鏈接,既鏈接2個以前未鏈接的節(jié)點,如圖4(a)所示,新增加節(jié)點3和節(jié)點5之間的鏈接。在節(jié)點變異中,現(xiàn)有的鏈接被拆分,新節(jié)點被放置在舊鏈接之間的位置,舊鏈接被禁用,既舊鏈接變?yōu)镈isable,2個新的鏈接被添加到基因組中,如圖4(b)所示,在節(jié)點3和節(jié)點4之間增加了節(jié)點6,因此,節(jié)點3到節(jié)點4的鏈接變?yōu)镈isable,新增節(jié)點3到節(jié)點6和節(jié)點6到節(jié)點4的鏈接。
3)NEAT的神經(jīng)網(wǎng)絡(luò)交叉方式
NEAT的神經(jīng)網(wǎng)絡(luò)交叉主要通過Innovation Number“對齊”父母的基因序列,若某鏈接父母都存在,則隨機選擇一個傳給子代,該基因稱為匹配基因;若某鏈接只存在父母一方,則將存在的那個基因傳給子代,該基因稱為不匹配基因。不匹配基因又分為過?;蚝筒幌嘟换?均表示基因組中不存在的結(jié)構(gòu)。孩子的基因序列應(yīng)是父母基因的并集。圖5所示為NEAT基因的交叉操作,通過Innovation ID匹配不同網(wǎng)絡(luò)拓?fù)涞幕蚪M,Parent1和Parent2在節(jié)點和鏈接上具有相似的結(jié)構(gòu),但是它們也有區(qū)別,Innovation ID(顯示在每個基因的頂部)能夠顯現(xiàn)哪些基因相匹配,對于相匹配的基因則選擇隨機遺傳,如果有不匹配的基因,則繼承具有更好適應(yīng)度的親本。這樣即使沒有任何拓?fù)浞治?也可以創(chuàng)建一個新的結(jié)構(gòu),將雙親的重疊部分以及它們不同的部分進行組合。
圖3 神經(jīng)網(wǎng)絡(luò)在NEAT中的表現(xiàn)形式
圖4 NEAT的2種神經(jīng)網(wǎng)絡(luò)變異方式
圖5 NEAT的神經(jīng)網(wǎng)絡(luò)交叉方式
NEAT算法能夠?qū)?fù)雜的問題分割成較小且可以被優(yōu)化的問題(子任務(wù))來進行解決。
隨著深度神經(jīng)網(wǎng)絡(luò)的發(fā)展,網(wǎng)絡(luò)的深度和復(fù)雜程度不斷增加,網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)也變得十分復(fù)雜,從而產(chǎn)生了數(shù)百萬的超參數(shù)。研究人員在優(yōu)化深度神經(jīng)網(wǎng)絡(luò)時不可能考慮到所有的參數(shù),只能憑借經(jīng)驗或者實驗優(yōu)化小部分的參數(shù),而那些沒有被選中的參數(shù)也有可能具有重要的地位。為解決該問題,基于DNN的神經(jīng)架構(gòu)搜索應(yīng)運而生,其通過自動搜索DNN的結(jié)構(gòu)來找到更為合適的神經(jīng)網(wǎng)絡(luò)架構(gòu)。
為了更好地優(yōu)化DNN的架構(gòu)設(shè)計,文獻[34]提出經(jīng)典CoDeepNEAT(Coevolution DeepNEAT)算法,該算法完全繼承于NEAT算法。NEAT算法主要是通過優(yōu)化拓?fù)浣Y(jié)構(gòu)和權(quán)重的方式,而CoDeepNEAT算法則采用一種結(jié)合拓?fù)浣Y(jié)構(gòu)和超參數(shù)實現(xiàn)共同進化的方式。
3.2.1 DeepNEAT算法
DeepNEAT算法與NEAT算法具有相同的進化方式,首先創(chuàng)建一個具有最小復(fù)雜度的群體,然后通過變異的方式給網(wǎng)絡(luò)結(jié)構(gòu)不斷添加節(jié)點或者邊,實現(xiàn)進化的過程;在交叉操作時,使用Innovation ID的形式,可以準(zhǔn)確地表示在拓?fù)浣Y(jié)構(gòu)多樣化的種群中基因之間的匹配關(guān)系;最后基于相似性度量將群體劃分為物種,物種再不斷進化形成新的物種,從而保證結(jié)構(gòu)的創(chuàng)新性。
DeepNEAT算法與NEAT算法的主要區(qū)別在于,NEAT算法的最小單元是基于神經(jīng)元構(gòu)成的,而DeepNEAT算法中的節(jié)點則是一個DNN層,每一個節(jié)點包含2種編碼方式:實數(shù)編碼(表示Channel數(shù)量、Kernel Size等數(shù)值參數(shù))和二進制編碼(表示節(jié)點類型和類別參數(shù))。2種算法的另一個區(qū)別在于鏈接,在NEAT算法中鏈接表示權(quán)重,而在DeepNEAT算法中則代表鏈接關(guān)系與鏈接方向。
3.2.2 CoDeepNEAT算法
DeepNEAT算法在構(gòu)造深度神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)時,會導(dǎo)致網(wǎng)絡(luò)結(jié)構(gòu)復(fù)雜,而且結(jié)構(gòu)沒有規(guī)整性。因此,文獻[34]采用一種共同進化的方式,使得網(wǎng)絡(luò)結(jié)構(gòu)簡單化并增加其復(fù)用性。
在CoDeepNEAT算法中,涉及模塊和藍(lán)圖2個新的概念。模塊表示一個小的DNN結(jié)構(gòu),藍(lán)圖表示一個圖,其中,每個節(jié)點包含指向特定模塊的指針。
CoDeepNEAT算法和DeepNEAT算法采用相同的進化方法,但是CoDeepNEAT算法同時進化2組藍(lán)圖和模塊,并且采用共同進化的方式,通過用相應(yīng)的模塊替換藍(lán)圖節(jié)點,將模塊和藍(lán)圖組裝成網(wǎng)絡(luò),從而得到一個大型的網(wǎng)絡(luò)結(jié)構(gòu),稱為集合網(wǎng)絡(luò)。
在計算適應(yīng)度時,根據(jù)藍(lán)圖中每個節(jié)點的指向,從相應(yīng)的模塊中隨機選擇一個個體加入到集合網(wǎng)絡(luò)中,如果多個藍(lán)圖節(jié)點指向相同的模塊,則在所有藍(lán)圖中使用相同的模塊。該集合網(wǎng)絡(luò)的適應(yīng)度包括其中所有的藍(lán)圖和模塊,計算包含該藍(lán)圖或模塊的所有集合網(wǎng)絡(luò)的平均適應(yīng)度作為整個集合網(wǎng)絡(luò)的適應(yīng)度。CoDeepNEAT算法的進化過程如圖6所示,由2組藍(lán)圖和模塊同時進化得到最右邊的集合網(wǎng)絡(luò)。
圖6 CoDeepNEAT算法的進化過程
在圖像分類、目標(biāo)檢測等圖像處理領(lǐng)域,為了提高深度學(xué)習(xí)的準(zhǔn)確率,研究人員提出了CNN,但是,人工設(shè)計的CNN結(jié)構(gòu)存在局限性。因此,自動構(gòu)造CNN的結(jié)構(gòu)顯得十分重要。
3.3.1 Genetic CNN算法
Genetic CNN算法于2017年被提出[35],其是一種通過自動學(xué)習(xí)來獲得最優(yōu)CNN結(jié)構(gòu)的方法,該算法將遺傳算法用于CNN架構(gòu)搜索中。在自動搜索網(wǎng)絡(luò)結(jié)構(gòu)的過程中,需要設(shè)置一些約束條件使搜索過程不會無限發(fā)展,其中一個約束條件就是CNN以池化層為界劃分為不同的層,每個層中包含一系列預(yù)定義的構(gòu)建塊(由卷積層和池化層組成),然后利用一種新的編碼方式將網(wǎng)絡(luò)結(jié)構(gòu)通過固定長度的二進制編碼進行表示,最后利用遺傳算法在一個大的搜索空間內(nèi)實現(xiàn)優(yōu)化,從而提高搜索空間的遍歷效率。Genetic CNN算法的編碼方式與進化方式具體如下:
1)Genetic CNN的編碼方式
對于Genetic CNN算法而言,編碼方式是其重要的組成部分,該算法主要使用二進制編碼方式,如圖7所示。
圖7 Genetic CNN的編碼方式
(1)默認(rèn)節(jié)點。圖7中包含2個層(Stage),每個Stage包含2個默認(rèn)節(jié)點,一個是默認(rèn)輸入節(jié)點,另一個是默認(rèn)輸出節(jié)點。輸入節(jié)點的數(shù)據(jù)來自前一個Stage的數(shù)據(jù),然后執(zhí)行卷積操作;輸出節(jié)點的數(shù)據(jù)為經(jīng)過前面卷積操作之后的結(jié)果,然后進行求和再執(zhí)行卷積操作,最后將結(jié)果輸出到池化層。在Stage1中,默認(rèn)輸入節(jié)點為A0,默認(rèn)輸出節(jié)點為A5;在Stage2中,默認(rèn)輸入節(jié)點為B0,默認(rèn)輸出節(jié)點為B6。
(2)普通節(jié)點。除默認(rèn)節(jié)點外的節(jié)點稱為普通節(jié)點,即圖7中編碼區(qū)域中的節(jié)點,它們的節(jié)點序號唯一且有序。同一Stage中的所有卷積操作具有相同的卷積核和通道數(shù)量。
(3)每一個節(jié)點均代表一個卷積操作,編碼只針對普通節(jié)點進行。
(4)孤立節(jié)點。孤立節(jié)點是為了保證具有更多節(jié)點的Stage可以模擬具有更少節(jié)點的Stage表示的所有結(jié)構(gòu),如圖7中Stage2的B2就稱為孤立節(jié)點。
在圖7中,普通節(jié)點的編碼方式為:
(1)Stage的個數(shù)為S,Stage中的節(jié)點個數(shù)為K,則S=2,K1=4,K2=5。通過簡單的排列組合計算二進制點數(shù),Stage1所需要的二進制點數(shù)為6,Stage2所需要的二進制點數(shù)為10。
(2)對節(jié)點之間的鏈接邏輯進行編碼,有鏈接表示為1,無鏈接表示為0。
Stage1中的編碼順序為:1和2;1和3、2和3;1和4、2和4、3和4,即1-00-111。
Stage2中的編碼順序為:1和2;1和3、2和3;1和4、2和4、3和4;1和5、2和5、3和5、4和5,即0-10-000-0011。
2)Genetic CNN的進化方式
Genetic CNN算法使用遺傳算法進行CNN結(jié)構(gòu)的搜索,主要分為初始化、選擇、變異、交叉以及適應(yīng)度評估等步驟。
(1)初始化。初始化操作主要用于網(wǎng)絡(luò)中個體的初始化,即創(chuàng)建初始種群。
(2)選擇。選擇操作在每一代開始時執(zhí)行,采用隨機選擇的方式,每個個體的適應(yīng)度是其被選中的概率,適應(yīng)度值越高,被選中的概率越大。
(3)變異。每一個個體根據(jù)一定的概率改變自身結(jié)構(gòu),變異操作能夠避免架構(gòu)陷入局部最優(yōu)解。
(4)交叉。交叉操作能夠使得相鄰的個體以一定的概率互換Stage結(jié)構(gòu)。
(5)適應(yīng)度評估。在個體的適應(yīng)度評估中,主要以個體的適應(yīng)度函數(shù)值為標(biāo)準(zhǔn),減少由于隨機性造成的不穩(wěn)定性,假如一個個體之前被評估過,則將其適應(yīng)度函數(shù)值的平均值作為該個體當(dāng)前的適應(yīng)度函數(shù)值。
Genetic CNN算法因其約束條件而在很大程度上減少了網(wǎng)絡(luò)結(jié)構(gòu)的搜索范圍,但是這些約束條件也導(dǎo)致很多的局限性。例如,每一層的卷積核大小和通道數(shù)量相同,這就導(dǎo)致了CNN的多樣性。
3.3.2 CGP-CNN算法
CGP-CNN算法[36-37]于2017年被提出,該算法的思想與Genetic CNN算法類似,都是通過遺傳算法進行架構(gòu)的迭代選擇與升級,兩者的主要區(qū)別在于編碼方式的不同。CGP-CNN算法主要基于有向無環(huán)圖,其基本組成單元為Datanode和Graphnode,即在CGP-CNN算法中,將多個簡單的神經(jīng)元構(gòu)成的有向無環(huán)圖作為一個進化單元進行優(yōu)化。CGP-CNN算法的節(jié)點類型、編碼方式及進化過程具體如下:
1)CGP-CNN算法的節(jié)點類型
CGP-CNN算法中包括6種節(jié)點類型,分別是ConvBlock、ResBlock、Max Pooling、Average Pooling、Concatenation和Summation。這些節(jié)點操作由行、列和通道的大小定義成三維(3D)張量。
(1)ConvBlock由標(biāo)準(zhǔn)卷積處理組成,步長為1,然后是批量歸一化和ReLU激活函數(shù),其中,卷積塊不進行降維,因此,采用零值填充來保持前后特征圖維度不變,并且具有不同大小的Kernel Size和不同的Channel數(shù)。
(2)ResBlock由卷積處理、批量歸一化、ReLU函數(shù)和張量求和組成。ResBlock架構(gòu)如圖8所示,輸入的行和列大小與卷積后的ConvBlock保持一致。在ResBlock中,M×N×C的輸入特征映射被變換為M×N×C′的輸出映射,并且具有不同大小的Kernel Size和不同的輸出Channel數(shù)。
圖8 ResBlock的結(jié)構(gòu)
(3)Pooling池化層執(zhí)行Max Pooling和Average Pooling的操作,使用2×2的Kernel,步長Stride=2。
(4)Concatenation將不同特征圖進行合并,如果特征圖大小不同,則對更大的特征圖進行Max Pooling完成下采樣,從而實現(xiàn)特征圖大小一致。
(5)Summation主要用于skip-connection的特征圖元素兩兩相加,當(dāng)特征圖大小不同時,對更大的特征圖進行最大池化完成下采樣,從而實現(xiàn)特征圖大小一致。
2)CGP-CNN的編碼方式
基于進化算法的神經(jīng)網(wǎng)絡(luò)架構(gòu)在應(yīng)用時,通常有直接編碼和間接編碼2種編碼形式。直接編碼主要將神經(jīng)元的數(shù)量和鏈接情況作為基因類型,而間接編碼主要表達(dá)網(wǎng)絡(luò)架構(gòu)的生成規(guī)則。CGP-CNN算法采用笛卡爾基因編程這種直接編碼的方式,從而表示CNN的結(jié)構(gòu)和連通性。CGP-CNN算法具有靈活性,可以表示可變長度的網(wǎng)絡(luò)結(jié)構(gòu)和跳遠(yuǎn)鏈接。
圖9所示為一種CGP-CNN的編碼方式,其中左邊是Genotype,右邊是CNN架構(gòu)圖,節(jié)點5是一個未激活的節(jié)點。
圖9 CGP-CNN的編碼方式Fig.9 Coding method of CGP-CNN
3)CGP-CNN算法的進化過程
CGP-CNN算法的變異方式有2種:第1種是強制突變,為了有效地使用計算資源,需要在每一代并行地評估一些候選解決方案,因此,在使用變異操作時,要保證至少有一個活動節(jié)點改變之后出現(xiàn)后選解,此時稱為強制突變;第2種是中性突變,為了維持對CGP進化的有效性,如果后代的適應(yīng)度值沒有得到改善,可以通過使用中性突變的方式重新對父代執(zhí)行變異操作,在中性突變過程中,只改變非活動節(jié)點的基因而不改變Phenotype。
CGP-CNN算法驗證了在自動構(gòu)建CNN架構(gòu)時,可以使用笛卡爾基因編程的方式,并且基本單元可以采用如ConvBlock、ResBlock這樣的構(gòu)建塊。但是,為了得到效果更好的網(wǎng)絡(luò)結(jié)構(gòu),在進化過程中,CGP-CNN算法需要消耗很多資源,因此,后續(xù)將重點研究降低計算資源消耗的方法,或者在進化過程中通過減少多余的CNN結(jié)構(gòu)來實現(xiàn)進化算法的優(yōu)化。
CoDeepNEAT算法、Genetic CNN算法和CGP-CNN算法在基于進化算法進行神經(jīng)網(wǎng)絡(luò)架構(gòu)搜索時,都很依賴先驗知識并基于已有的模塊進行疊加組合。此外,這些算法要求每一個個體均從初始時刻開始訓(xùn)練,這樣就需要很多的計算資源才能滿足架構(gòu)搜索任務(wù)的需求。為解決上述問題,研究人員提出Large-Scale算法[38]、Better Topologies算法[39]。為了提高搜索效率并降低搜索空間,文獻[40]提出了Hierarchical Representation算法。
Large-Scale算法和Better Topologies算法的設(shè)計思想類似,只是在具體的參數(shù)設(shè)置上存在區(qū)別,兩者都采用了非常簡單的神經(jīng)網(wǎng)絡(luò)設(shè)定方法,使得算法進化出網(wǎng)絡(luò)結(jié)構(gòu)。初始化階段從一個包含3個節(jié)點(輸入節(jié)點、中間節(jié)點和輸出節(jié)點)的簡單架構(gòu)開始。進化過程則是對internal node的連接方式進行改變,其中,在Large-Scale算法中,對internal node采用卷積、池化、批量歸一化等操作中的某一個或者多個相組合;在Better Topologies算法中,對internal node執(zhí)行卷積和池化操作。這2種算法與NEAT算法不同的是只采用了變異操作,而沒有使用交叉操作。Better Topologies算法有5個變異算子,Large-Scale算法有11個變異算子。
Hierarchical Representation算法是一種結(jié)合模型的結(jié)構(gòu)分層表示和進化策略的高效架構(gòu)搜索方法。為了降低網(wǎng)絡(luò)架構(gòu)搜索的復(fù)雜性,提高搜索效率,Hierarchical Representation算法對搜索空間進行約束,通過增加一個分層的網(wǎng)絡(luò)結(jié)構(gòu)來約束搜索空間。Hierarchical Representation算法的基本單元為基元(motif),較低層次的motif由卷積、池化等操作構(gòu)成,然后通過將這些低層次motif多次疊加的方式最終形成神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),其中,堆疊的方式由進化策略或者隨機搜索決定。這種通過堆疊的方式構(gòu)建網(wǎng)絡(luò)結(jié)構(gòu),類似于VGGNet、ResNet和Inception結(jié)構(gòu),使用模塊化進行設(shè)計。
前文提到的7種算法對比如表1所示。NEAT算法的基本單元為神經(jīng)元(Neuron),采用鏈表的方式進行編碼,有增加連接、增加節(jié)點和修改權(quán)重3種變異方式,在進行交叉操作時,根據(jù)Innovation ID決定采用交叉操作的2個基因序列。CoDeepNEAT算法的基本單元為DNN Layer,采用實數(shù)編碼和二進制編碼2種編碼方式,并且有改變連接和改變節(jié)點2種變異方式,在交叉操作階段,根據(jù)歷史標(biāo)記確定2個基因排列方式。Genetic CNN算法的基本單元是通過Block方式構(gòu)造的CNN結(jié)構(gòu),采用二進制編碼,根據(jù)每個個體的概率進行變異和交叉。CGP-CNN算法的基本單元與Genetic CNN算法相同,都是通過Block方式構(gòu)造的CNN結(jié)構(gòu),采用的變異方式為強制變異和中性變異,沒有交叉操作。Large-Scale算法和Better Topologies算法的基本單元都為Node,編碼方式分別采用DNA Graph和整數(shù)編碼,分別為11種變異方式和5種變異方式,都沒有交叉操作。Hierarchical Representation算法的基本單元是由一個三級結(jié)構(gòu)表示的有向無環(huán)圖,這個有向無環(huán)圖包括3個節(jié)點(特征圖),每2個節(jié)點的邊有6種基本操作可供選擇,在進化過程中包括增加連接、修改連接和刪除連接3種變異方式,沒有交叉操作。
表1 7種基于進化算法的神經(jīng)架構(gòu)搜索算法對比
CoDeepNEAT算法使用CIFAR-10數(shù)據(jù)集進行實驗,初始化階段生成了25個藍(lán)圖和45個模塊。在訓(xùn)練集上每個網(wǎng)絡(luò)訓(xùn)練8個epoch,然后進行評估,經(jīng)過72代的進化之后結(jié)束訓(xùn)練。將得到的最優(yōu)網(wǎng)絡(luò)在所有訓(xùn)練圖片上進行300個epoch的訓(xùn)練,最終得到錯誤率為7.3%。
Genetic CNN算法分別在MNIST數(shù)據(jù)集和CIFAR-10數(shù)據(jù)集上進行實驗,初始種群數(shù)量為20,執(zhí)行50代進化操作。在MNIST數(shù)據(jù)集上,經(jīng)過50代后,最佳個體的識別錯誤率由0.41%下降到0.34%。實驗在Titan-X GPU上進行,每個個體的訓(xùn)練時間平均為2.5 min,整個進化過程大約需要2 GPU-days。在CIFAR-10數(shù)據(jù)集上,經(jīng)過50代后,最佳個體的識別正確率從75.96%上升到77.06%,每個個體的訓(xùn)練時間平均為0.4 h,整個進化過程大約需要17 GPU-days。
CGP-CNN算法使用CIFAR-10數(shù)據(jù)集進行實驗,搜索ConvBlock和ResBlock 2種類型結(jié)構(gòu),其中,ConvSet的進化代數(shù)為500代,ResSet執(zhí)行300代,實驗在2個NVIDIA GeForce GTX 1080 GPU上進行。CGP-CNN算法使用ConvSet模型時的錯誤率為6.75%,使用ResSet模型時的錯誤率為5.98%。在ResSet上完成CNN架構(gòu)的優(yōu)化大約需要14天。
Large-Scale算法分別在CIFAR-10數(shù)據(jù)集和CIFAR-100數(shù)據(jù)集上進行實驗,并且都進行5組實驗,達(dá)到的最佳準(zhǔn)確率分別為94.6%和77%,參數(shù)數(shù)量分別為5.4 M和40.4 M。在CIFAR-10數(shù)據(jù)集上的計算成本為4×1020FLOPS,在CIFAR-100數(shù)據(jù)集上的計算成本為2×1020FLOPS。
Better Topologies算法分別在CIFAR-10數(shù)據(jù)集、CIFAR-100數(shù)據(jù)集和SVHN數(shù)據(jù)集上進行實驗。在CIFAR-10和CIFAR-100上使用了標(biāo)準(zhǔn)圖像增強(翻轉(zhuǎn)和裁剪)進行數(shù)據(jù)預(yù)處理,最大迭代次數(shù)為400 epoch,在SVHN數(shù)據(jù)集上不使用數(shù)據(jù)增強,最大迭代次數(shù)為180 epoch。當(dāng)網(wǎng)絡(luò)深度為91時,3個數(shù)據(jù)集上的錯誤率分別為5.19%、24.6%和1.85%。
Hierarchical Representation算法使用CIFAR-10數(shù)據(jù)集和ImageNet數(shù)據(jù)集進行實驗,得到的Top-1錯誤率分別為3.6%和20.3%。
通過對這7種算法的實驗設(shè)置和數(shù)據(jù)進行對比可知,隨著神經(jīng)架構(gòu)搜索算法的發(fā)展,圖像分類的準(zhǔn)確率不斷提高。為了在更大的數(shù)據(jù)集上進行實驗,同時降低計算資源消耗并保證準(zhǔn)確率,通過神經(jīng)架構(gòu)搜索算法設(shè)計的網(wǎng)絡(luò)結(jié)構(gòu)也會越來越復(fù)雜。雖然目前神經(jīng)架構(gòu)搜索算法能夠設(shè)計出與人工神經(jīng)網(wǎng)絡(luò)性能相當(dāng)甚至更好的網(wǎng)絡(luò)結(jié)構(gòu),但是在保證準(zhǔn)確率的情況下,如何降低計算資源消耗仍然是一個具有挑戰(zhàn)性的任務(wù)。
目前,研究人員針對神經(jīng)架構(gòu)搜索主要探究其搜索空間和搜索策略2個方面。搜索空間決定了哪些結(jié)構(gòu)可以增加到最后的網(wǎng)絡(luò)結(jié)構(gòu)中,其通過預(yù)先設(shè)定好一些適合當(dāng)前任務(wù)的結(jié)構(gòu),以有效減小搜索空間并簡化搜索過程。但是,預(yù)先定義好的搜索空間必然會引入人為的偏好,因此,該方式限制了網(wǎng)絡(luò)搜索的程度。在后續(xù)的研究中,可以增加搜索空間的范圍,使得神經(jīng)架構(gòu)搜索可以搜索到更豐富多樣的網(wǎng)絡(luò)結(jié)構(gòu)。除此之外,減少人為的參與以及約束條件,使得神經(jīng)架構(gòu)搜索的搜索過程更加自動化,也是一個重要的研究方向。
搜索策略也是搜索算法,其決定了用何種規(guī)則或者方法來利用搜索空間,使得算法可以快速、準(zhǔn)確地找到最優(yōu)的網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù)配置。進化算法是其中一種搜索策略,雖然進化算法的種類很多,在針對不同問題時可以選用不同類型的進化算法,但是進化算法的進化策略卻大同小異,主要步驟通常是初始化(采用不同的方式對基因進行編碼)、變異、交叉、評估,直到循環(huán)至預(yù)先設(shè)定好的最優(yōu)標(biāo)準(zhǔn)時停止進化并輸出最終的結(jié)果。因為進化算法是一個迭代的過程,每迭代一次都會消耗很長的時間,所以提高搜索效率并減少時間和資源的消耗是該過程中需要面臨的一個重要問題。為了提高進化算法的搜索效率,可以將進化算法和其他搜索策略(如強化學(xué)習(xí))相結(jié)合,組合時學(xué)習(xí)強化學(xué)習(xí)中的獎勵機制,通過與環(huán)境的交互獲得獎勵,然后通過獲得的獎勵大小學(xué)習(xí)行為,使得算法能夠獲得更大的獎勵,將強化學(xué)習(xí)中與環(huán)境交互的形式運用在進化過程中,從而提高搜索效率。因此,在后續(xù)的研究中,將進化算法和其他多種搜索策略相結(jié)合也是一個重要的研究熱點。
除了上述2種問題及其解決方案之外,算法未來的發(fā)展方向也是一個很重要的研究內(nèi)容。一方面,本文根據(jù)復(fù)雜程度將算法分為基于神經(jīng)元的NAS、基于DNN的NAS和基于CNN的NAS,這種分類方式是根據(jù)神經(jīng)網(wǎng)絡(luò)的發(fā)展過程而進行的分析和總結(jié)。因此,在后續(xù)的研究過程中,也可以根據(jù)神經(jīng)網(wǎng)絡(luò)的后續(xù)發(fā)展來擴展NAS的多樣性,如針對RNN的神經(jīng)架構(gòu)搜索或者基于更復(fù)雜、更深層的神經(jīng)網(wǎng)絡(luò)的NAS等;另一方面,目前基于自動化深度學(xué)習(xí)的有關(guān)圖像方面的問題大多是關(guān)于圖像分類的,因此,如何將自動化深度學(xué)習(xí)擴展到其他圖像處理方面,如圖像補全、圖像修復(fù)等,甚至語音處理以及自然語言處理等領(lǐng)域,也是今后一個非常重要的研究熱點。
本文闡述進化算法在神經(jīng)網(wǎng)絡(luò)架構(gòu)搜索中的應(yīng)用,根據(jù)構(gòu)成神經(jīng)網(wǎng)絡(luò)最小單元的不同對神經(jīng)網(wǎng)絡(luò)架構(gòu)搜索算法進行簡單的分類,并介紹7種具有代表性的基于進化算法的神經(jīng)架構(gòu)搜索算法的特點和應(yīng)用現(xiàn)狀?;跓o梯度進化的神經(jīng)架構(gòu)搜索算法具有廣闊的發(fā)展前景,針對特定數(shù)據(jù)集設(shè)計的網(wǎng)絡(luò)結(jié)構(gòu)性能可以達(dá)到與人工設(shè)計的神經(jīng)網(wǎng)絡(luò)相同的水平。但是,搜索網(wǎng)絡(luò)結(jié)構(gòu)需要耗費大量的計算資源,因此,如何在大數(shù)據(jù)集上降低基于進化算法的神經(jīng)架構(gòu)搜索算法的計算資源消耗,將是下一步的主要研究方向。