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