基于遗传算法的卷积神经网络架构搜索
論文推薦:基于遺傳算法的卷積神經網絡架構搜索
來自文章 《Evolving Deep Convolutional Neural Networks for Image Classification》
這篇文章于2019年發表在IEEE Transactions on Evolutionary Computation上,文章提出了一種使用遺傳算法來進行卷積神經網架構搜索的方法。文章主要可以分為三個部分:第一部分介紹卷積神經網絡發展背景以及一些基本知識,第二部分提出了基于遺傳算法的神經網絡架構搜索的具體實現細節,第三部分設計實驗驗證自己的算法并在主要的一些數據集上與當前一些主流算法做了對比。
第一部分
在這部分作者闡述了一些有關卷積神經網絡的一些基礎知識,比如卷積層,池化層,全連接層等我在這里就不再贅述了,以后如果有機會的話我也許會專門寫一篇文章來講一講這些東西。需要注意的是,在這一部分作者還提出了使用遺傳算法來設計卷積神經網絡架構時會遇到的一些問題:
(1)在對一個架構進行性能評估之前是無法判斷一個架構的好壞的,然而性能評估需要很長的時間。如果是對整個群體進行性能評估,那所需要的的時間和算力更是巨大的。
(2)卷積神經網絡的深度是不確定的,因此很難約束搜索空間。
(3)神經網絡的權重初始化值嚴重影響已確定的網絡架構結構的性能,解決這一問題需要良好的基因編碼策略并完成成百上千個決策變量的優化。
廢話不多,下面直接上算法。
第二部分 基于遺傳算法的卷積神經網絡架構搜索
Gene Encoding Strategy
作者將卷積神經網絡按塊分為3類,即卷積層,池化層和全連接層。染色體由這三類塊平行編碼組成。考慮到卷積神經網絡的深度是不可知的,作者采用了可變長的編碼策略。下圖給出的是三條不同長度的染色體。在卷積層和全連接層存在著大量的連接權重,染色體不可能表示所有參數并且對其進行優化。針對這一問題,作者指出僅使用連接權重的平均值和標準差這兩個統計量來表示大量的權重參數。當我們得到最佳的平均值和標準差之后,可以在相應的高斯分布中取樣以獲取對應的連接權重。作者還給出了每一模塊所需要表示的信息:
Population Initialization
在進行種群初始化時,作者將每一個染色體分成兩個部分,第一個部分包括卷積層和池化層,第二部分是全連接層。作者的策略是首先初始化第一部分,第一部分初始化完成后再初始化第二部分。
在初始化第一部分時,首先向第一部分中加入一個所有參數都隨機初始化的卷積層,然后不斷隨機以1/2概率向向第一部分中加入一個所有參數都是隨機初始化的卷積層或者所有參數都是隨機初始化的池化層,直至第一部分塊的數量達到預定數量。
在初始化第二部分時,不斷向向第二部分中加入一個所有參數都是隨機初始化的全連接層,直至第二部分塊的數量達到預定數量。
當著兩部分都完成之后,將這兩部分組合起來得到一個染色體。算法的偽代碼如下所示:
Input: The population size NNN, the maximal number of convolutional and pooling layers NcpN_{cp}Ncp?, and the maximal number of full connection layers NfN_{f}Nf? .
Output: Initialized population P0P_{0}P0?.
P0←?P_{0}\leftarrow\varnothingP0?←?
while ∣P0∣≤N\left | P_{0}\right |\leq N∣P0?∣≤N do
part1←?\qquad part_{1}\leftarrow\varnothingpart1?←?
ncp←\qquad n_{cp}\leftarrowncp?←Uniformaly generate an integer between[1,Ncp]\left [1,N_{cp} \right][1,Ncp?]
\qquadwhile∣part1∣≤ncp\left |part_{1}\right|\leq n_{cp}∣part1?∣≤ncp? do
r←\qquad \qquad r\leftarrowr←Uniformly generated a number between[0,1]\left [0,1\right][0,1];
\qquad \qquadif r≤0.5r\leq0.5r≤0.5then
l←\qquad \qquad \qquad l\leftarrowl←Initialize a convolutional layer with random settings;
\qquad \qquadelse
l←\qquad \qquad \qquad l\leftarrowl← Initialize a pooling layer with random settings;
\qquad \qquadend
part1←part1∪l\qquad \qquad part_{1}\leftarrow part_{1}\cup lpart1?←part1?∪l
\qquadend
part2←?\qquad part_{2}\leftarrow\varnothingpart2?←?
nf←\qquad n_{f}\leftarrownf?←Uniformaly generate an integer between[1,Nf][1, Nf ][1,Nf];
\qquadwhile∣part2∣≤nf|part_{2}|\leq n_{f}∣part2?∣≤nf? do
l←\qquad \qquad l\leftarrowl← Initialize a full connection layer with randomsettings;
part2←part2∪l\qquad \qquad part_{2}\leftarrow part_{2}\cup lpart2?←part2?∪l
\qquadend
P0←P0∪(part1∪part2)\qquad P_{0}\leftarrow P{0}\cup(part_{1}\cup part_{2})P0?←P0∪(part1?∪part2?)
end
Return P0P_{0}P0?
fitness evaluation
在該算法中,作者采取了三個指標來衡量每條染色體的質量。即卷積網絡用于圖像分類時的誤差的平均值,誤差的標準差和卷積神經網絡中連接權值的數量。
為了節省時間和計算資源,作者對于每一條染色體(一個卷積神經網絡)僅訓練5個或者10個epochs。按照作者的說法,如果一個神經網絡在最初的幾個epochs內表現出了良好的性能,那么在以后的訓練中,該神經網絡仍然會保持優良的性能,關于原理,作者并未解釋。
因為一次同時處理的數據有限,所以驗證時validation dataset被分成多份依次處理,作者計算訓練后的神經網絡在每一個batch上的誤差的平均值和標準差作為衡量染色體性能的指標,除此之外作者還將神經網絡中連接權值的數量作為一個指標,作者提出更少的連接權重對于智能設備來說是十分重要的。算法的偽代碼如下所示:
Input: The population ptp_{t}pt?, the training epoch number kkk for measuring the accuracy tendency, the training set DtrainD_{train}Dtrain?, the fitness evaluation dataset DfitnessD_{fitness}Dfitness?, and the batch size num_of_batchnum\_of\_batchnum_of_batch.
Output: The population with fitness Pt.
for eachindividualsinPteach\ individual\ s\ in P_{t}each?individual?s?inPt? do
i←1\qquad i\leftarrow 1i←1;
eval_steps←∣Dfitness∣/num_of_batch\qquad eval\_steps\leftarrow |D_{fitness}|/num\_of\_batcheval_steps←∣Dfitness?∣/num_of_batch;
\qquadwhile i≤ki\leq ki≤k do
\qquad \qquadTrain the connection weights of the CNN
represented by individual sss;
\qquad \qquadIf i==ki==ki==k then
acccy_list←?\qquad \qquad \qquad acccy\_list\leftarrow\varnothingacccy_list←?
j←1\qquad \qquad \qquad j\leftarrow 1j←1
\qquad \qquad \qquadwhile j≤eval_stepsj\leq eval\_stepsj≤eval_steps do
accyj←\qquad \qquad \qquad \qquad accy_{j}\leftarrowaccyj?←Evaluate the classification error
on the jjj-th batch data from DfitnessD_{fitness}Dfitness?;
accy_list←accy_list∪accyj\qquad \qquad \qquad \qquad accy\_list\leftarrow accy\_list \cup accy_{j}accy_list←accy_list∪accyj?
j←j+1\qquad \qquad \qquad \qquad j\leftarrow j+1j←j+1
\qquad \qquad \qquadend
\qquad \qquad \qquadCalculate the number of parameters in sss, the mean value and \qquad \qquad \qquadstandard derivation from accylistaccy_{list}accylist?, assign them to individual s\qquad \qquad \qquad ss, and update s from PtP_{t}Pt?;
\qquad \qquadend
i←i+1\qquad \qquad i\leftarrow i+1i←i+1;
\qquadend
end
Return PtP_{t}Pt?
Slack Binary Tournament Selection
作者采用Slack Binary Tournament Selection來選擇下一代個體的雙親。適應度有三個方面:連接權重矩陣參數個數,分類的平均錯誤率和其標準差。選擇的時候要兼顧。
在選擇時首先考慮分類誤差,如果兩條染色體的分類誤差之差大于給定的閾值,那么就將分類誤差較低的一條染色體放入交配池,否則考慮權值參數的數量,如果兩條染色體的權值參數的數量之差大于給定的閾值,那么就將參數數量較少的一條染色體放入交配池,最后考慮分類誤差的標準差,優先選擇標準差小的那條染色體。偽代碼如下:
Input: Two compared individuals, the mean value threshold α\alphaα, and the paramemter number threshold β\betaβ.
Output: The selected individual.
s1s_{1}s1?:The individual with larger mean value;
s2s_{2}s2? ← The other individual;
μ1,μ2\mu_{1},\mu_{2}μ1?,μ2?← The mean values of s1,s2s_{1},s_{2}s1?,s2?;
std1,std2std_{1},std_{2}std1?,std2? ← The standard derivations of s1,s2s_{1},s_{2}s1?,s2?;
c1,c2c_{1},c_{2}c1?,c2? ← The parameter numbers of s1,s2s_{1},s_{2}s1?,s2?;
if μ1?μ2>α\mu_{1}-\mu_{2}>\alphaμ1??μ2?>α then
\qquad Return s1s_{1}s1?.
else
\qquadif c1?c2>βc_{1}-c_{2}>\betac1??c2?>β then
\qquad \qquad Return s2s_{2}s2?.
\qquadelse
\qquad \qquadif std1<std2std_{1}<std_{2}std1?<std2? then
\qquad \qquad \qquadReturn s1s_{1}s1?
\qquad \qquadelse if std1>std2std_{1}>std_{2}std1?>std2? then
\qquad \qquad \qquadReturn s2s_{2}s2?
\qquad \qquadelse
\qquad \qquad \qquad**Return*random one from s1,s2{s_{1},s_{2}}s1?,s2?.
\qquad \qquadend
\qquadend
end
Offspring Generation
分為四步:
crossover
由于不同的染色體長度是不同的,作者提出了一種新的交叉運算方法,該方法主要分為3步:
3. Unit Restore (UR),完成交叉操作后,兩條染色體按照原來排列順序組裝成兩條新的染色體。
Mutation
對于選定的基因,分別按照1/3的概率進行刪除,修改或者增加一個新的基因。
Environmental Selection
作者綜合考慮了種群中的精英部分和種群的多樣性,自然選擇由兩部分組成。第一部分首先按照給定的參數選選出一部分最優的染色體放入種群。第二部分是在剩下的染色體之中使用改進的二元錦標賽選擇法選擇染色體放入種群。
實驗設計與驗證
首先介紹使用的數據集,作者將9個數據集分為三類:
手寫數字識別MNIST 及其變種:
識別圖形形狀
在第一類數據集上,作者與其他10個網絡做了對比,作者給出了下面的數據:
好像也只有VGG16和GooleNet的準確率好于作者提出的算法的平均準確率,但是他們的參數數量都要遠遠大于EvoCNN,這樣看來,EvoCNN是一個綜合性能很不錯的網絡了。
對于其他兩類數據集作者也與另外12個常見網絡做了對比,總體來說性能還是很不錯的。值得注意的是,作者還進一步研究了初始化方法對于網絡分類精度的影響。對于同一個網絡架構,做個采用了兩種初始化方法,一種是作者提出的EvoCNN approach方法,另一種是目前比較常用的 Xavier initializer,在一些主要的數據集上,作者得到了下面的結果。
由此可見,權值初始化對于分類精度也是有影響的,但其影響程度遠不如網絡架構對分類精度來的明顯。而作者提出的算法無論在網絡架構還是權值初始化上都有著比較優異的性能。
ok,以上就是這篇論文的主要內容,最后作者提出了他的論文的三大特色:
總結
以上是生活随笔為你收集整理的基于遗传算法的卷积神经网络架构搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于STM32的智能车/平衡小车/蓝牙小
- 下一篇: DMP解算