---
# System prepended metadata

title: Constrained Evolutionary Piecemeal Training to Design Convolutional Neural Networks
tags: [論文]

---

---
title: Constrained Evolutionary Piecemeal Training to Design Convolutional Neural Networks 
tags: 論文
---

# Constrained Evolutionary Piecemeal Training to Design Convolutional Neural Networks

## Abstract
---
* 神經結構搜索（NAS）可以自動發現高效的神經網絡，它在實現各種領域的最先進性能方面顯示了巨大的潛力 如圖像分類和語言理解。在大多數NAS技術中，神經網絡的訓練被認為是一項單獨的任務，或者是執行架構搜索的性能估計策略。

* 我們證明了網絡架構及其係數可以通過在基於群體的傳統訓練過程中統一進化搜索的概念來共同學習。這種整合是通過將**訓練過程分割成幾塊，然後與基於進化的結構搜索運算符結合在一起實現的**。我們通過使用兩個不同領域的數據集來展示這一概念的能力和多功能性。

* 來自兩個不同領域的數據集：用於圖像分類的CIFAR-10和用於人類活動識別的PAMAP2。搜索是使用架構參數的最小和最大界限來限制神經網絡的大小，使其不至於變得太大。開始時 從隨機的未經訓練的模型開始搜索，它實現了一個具有合格架構的完全訓練的模型，在CIFAR-10和PAMAP2上的準確率分別達到92.5%和94.36%

---

## 1.Introduction
---
* 最近，自動發現高效神經網絡的工作已被證明是非常有效的方法。是非常有效的方法，發現的神經網絡架構比手工製作的要好。流行的神經 架構搜索（NAS）的流行方法使用強化學習[26, 37]和進化算法[23, 27]。然而，他們需要幾十到幾千個GPU天來準備、搜索和收斂。這些方法中的大多數都依賴大量資源訓練 來指導搜索過程。在本文中，我們從一個不同的角度來看待NAS，探索在訓練過程中尋找最佳架構的可能性訓練過程本身，而不是作為一個單獨的準確性預測或訓練性能估計策略。

* 此外，最近 NAS 技術的大部分工作都集中在圖像分類任務上，例如 CIFAR-10 [18] 和 Imagenet [11]，導致對高度適合視覺任務的複雜搜索空間的創新研究，這些搜索空間來自於手工製作的先前最先進的技術，如剩餘連接[16]，基於單元的設計，如inception[32]，dense net[17]。或以類似圖形的方式生成，雖然這些搜索空間已被證明是非常有效的，但並不總是容易理解、訓練和實施。

* ，如人類活動識別、地球科學和天文研究，都部署了普通卷積網絡，因為它們被認為是足夠的，而且非人工智能背景的科學家也容易理解。

* 一個能在幾個GPU天內找到高效的捲積神經網絡（CNN）的工具，並能讓非AI專家在任何領域使用，這也是簡化和民主化AI的一個進步。

* 在本文中，我們用PAMAP2[29]數據集研究了人類活動識別（HAR）領域，來自多個穿戴式傳感器的輸入被用來預測穿戴者正在進行的活動。我們還使用一個非常不同的CIFAR-10數據集來證明我們方法的通用性用於圖像分類

* 本文的主要貢獻是一種新穎的NAS算法，它為一個給定的任務搜索一個有效的CNN架構，並在幾個GPU小時內收斂。我們的工作利用了基於群體的計算技術，**它允許一組CNN並行訓練。在這個訓練過程中，進化算子定期應用於一些隨機的CNN，這導致了架構的修改，從而對搜索空間進行探索**。像這樣得出的新架構總是已經部分訓練過了，因為它是從另一個正在訓練的架構中修改而來的。在隨後的迭代中，衍生的架構繼續訓練。在這個算法的最後，從群體中選出最好的候選者，然後如果需要的話，可以對其進行後處理或進一步訓練。所有在搜索過程中生成和修改的CNN都被**每個架構參數的最小值和最大值所約束**。
* 這些約束是為了確保架構不會變得太大，並限制最終神經網絡的資源消耗。這對於打算在嵌入式系統上使用的任務來說，這是一個需要考慮的重要因素。系統上使用的任務，如HAR任務中的可穿戴設備。

---

## 2.Related Work
* NAS大致分為三組
    1. reinforcement learning based
    2. evolutionary
    3. one-shot architecture search
* RL
    * 每次迭代都必須完全訓練神經網絡以評估其性能
    * RL代理(agent)的獎勵取決於訓練架構的驗證性能。通過不斷地保護代理，搜索被引導到性能更好的神經網絡
    * agent本身通常是另一個神經網絡，其優化也需要在設計和微調方面付出相當大的努力。

* Evolutionary
    * 每次迭代都必須完全訓練神經網絡以評估其性能 
    * 使用 GA 來優化神經架構
    * 下一代神經網絡的選擇是基於它們的預測準確性和整個群體的平均性能隨著時間的推移而增加，從而導致在收斂時發現高效的神經網絡架構。

* One Shot Architecture Search
    * 為了減少過去 NAS 所耗費的大量時間
    * 透過將 search space 當中的所有 neural architectures 結合成為一個 over-parameterized 的 neural network，即**supernet**
    * 好處在於當 supernet 訓練完畢之後，透過 activate supernet 當中不同的 candidate blocks，我們可以進而 approximate 在 search space 當中的任何一個 neural architecture (如下圖最右邊的部分)。因此 one-shot NAS 之所以稱為 “one-shot” 的原因在於，**我們只需要訓練一個 neural network (supernet) ，便可以藉此評估整個 search space 當中的任一個 neural architecture。**
    * ![](https://i.imgur.com/w4mn52i.png)
## 3.Methodlogy
---

* 訓練方法叫**Evolutionary Piecemeal Training**，零散訓練參考了CNN的訓練，指的是從整個數據集隨機抽取大小為**δ~k~**的小**數據片**來訓練神經網路，大約為5%~20%，傳統的連續訓練是由進化算子定期介入的，介入的時間間隔由 **δ~k~** 決定。
* 一個進化的操作者修改了結構，訓練進一步繼續，這個過程是針對多個神經網絡形成的群體進行的，訓練過程中不能達到高精確的候選人將從群體中退出，這也可以當作表現不佳的候選人提早停止訓練。

### 3.1 Search Space
* 我們的算法的搜索空間集中在普通CNN上，由convolutional,fully-connected and pooling layers without residual connections，Batch normalization 和 non-linear activations是可配置的，可以增加到網路上。
* CNN架構是由 a group of blocks所組成，每個block都有特定的類型，每一層都有限制最大和嘴小，此外，每層的每一個參數都有上下限。
* 例如:convolutional layer的單元數，kernel sizes and stride sizes進行限制。

* 第4.2節定義了架構搜索空間，分別為CIFAR-10和PAMAP2的架構搜索空間，搜索空間的規格及其界限被編碼為genes的集合，也稱為"genotype"，所有可能的參數組合共同構成了基因庫，單個神經網絡就是從這個基因庫中創建和訓練的

### 3.2 Population based training

* 我們採用了PBT process，定義了gene pool中隨機創造在神經網路的初始族群

* 每次iteration中，族群中的候選人分散訓練，然後使用validation set(驗證集)評估，取決於現有的資源，所有的候選人可以以平行、順序的任何方式進行組合。

* 此Algorithm中，族群的大小保持不變，儘管族群中的候選人不斷變化，因為他們通過每個iterations中應用的進化算子(Evolutionary operators)而被改變，族群中的候選者數量要足夠大，以保持群體CNN架構的多樣性，同時滿足約束條件

### 3.3 Evoutionary operators

* EA是基於群體iteration算法，在隨後的iteration進化出更好的群體，每個進化步驟中，CNN的群體會透過recombination and mutation 的進化算子進行改變。

* **重組(Recombination)** 對兩個神經網路起作用，並交換相同類型的gene block的所有layer，在這種替換中，被交換的layer大致處於特徵提取的同一階段，在兩個選定的網路中，被交換的block的input and oupput feature map大小相同，Fig.1 解釋了用於交換兩個網路 convolutional layer的重組操作，Recombination不是一個保留算子，但在實驗中發現，它們對於通過交換來改變候選層的總數，從而在群體中引入多樣性非常重要 

* 為了減少因為recombination所造成的loss影響，對recombination rate採用"cooling-down"的方法，在training loss已經很高的早期迭代(iteration)，發生的交換要比在training loss很低的迭代後期要多。

![](https://i.imgur.com/tjCskR5.png)

* **變異(Mutation)** 改變了一個層的參數，如kernel size or kernel的數量被設計為保留功能。

* 我們應用 [Net2Wider operator](https://blog.csdn.net/weixin_37993251/article/details/88349603) 來增加單元的數量，並應用[剪枝](https://zhuanlan.zhihu.com/p/63779916)來減少filters的數量。Filters的尺寸改變時，利用"centrally cropped" or "zero-padded"，每一次突變(Mutation)會破壞正在訓練的突變候選者，訓練過程中會產生一些額外的loss。

* 然而，選擇這些特定的operator是因為這些operators在本質上是完全或部分保留功能，這意味著這些operators要盡可能小，並且可以在往後**零散訓練(piecemeal-training)** 中恢復。

### 3.4 Algorithm

* 目標是尋找神經網路以滿足架構限制、最小預測誤差的小的神經網路。
* **InitalizePopulation()**:使用genotype的工廠模式產生大小為N~p~的神經網路族群，並通過training 1 epoch對其進行初始化，之後，這個 iterative algorithm 運行了N~g~次。

* 每次第 i 次迭代的Population為簡稱℘i




* **PiecemealTrain()**:使用τ~params~訓練參數，隨機選擇大小為 **δ~k~** 的數據訓練所有個體
* **τparams**:提供了包括優化器選擇、學習率、批量大小等在內的訓練參數 τparams，以及用於確定用於分段訓練的數據子集大小的 δk
* **ValidationPopulation(**:使用驗證集(validation set)對族群進行評估
* **BestSelection()**:使用至今為止在驗證集上實現的準確度選擇 α 個最佳個體
* α 被保持在非常高的比率，大於 0.95 * N~p~，所以在每次iteration只有少數的候選者被拒絕，通過這樣做，重點是能拒絕性能差的架構，而不是推廣一個學習速度快，但最後可能無法達到高度精確的架構。
* 族群大小 => N~p~，透過從倖存者(survivors)隨機選擇(non-elitist random selection policy)1 - α(℘r)個網路且增加到pool中來保持不變

* 通過用 ℘best 和 ℘r 替換總體來更新總體 ℘i。隨機選擇確保後續世代不會因為只有一個父架構而變得擁擠，由於訓練的隨機性，這種父架構偶然獲得了更高的準確性。

* 隨機選擇確保子代(children generations)不會因為一種可能通過運氣達到高精確的架構所淹沒
* **Recombine()** and **Mutate()** 是evolutionary operators，它們分別以P~m~和P~r~的選擇機率從族群中選擇個體，P~r~從初始值線性下降到趨近0
* 該算法從最終種群中返回 CNN 的最佳候選者。最佳候選者可以根據需要在此算法之外進行進一步處理、修改或訓練

---

## 4.Experiments
* **Java based Jenetics library**  for 進化計算(evolutionary computation)
  
* **Python based Caffe2** library for training and testing.
* **ONNX** 格式來表示和跨越不同模塊傳輸神經網絡
* 只用一顆GPU跑實驗

### 4.1 DataSets

* **CIFAR-10** dataset for image classification:60,000福尺寸為32×32×3的標記圖像組成。包括50,000福訓練圖像和10,000福測試圖像，分為10個類別。
* 使用訓練集的5000張圖片當作驗證集，只使用這些驗證集來指導(guide)搜索過程
* 測試集只用來檢查網路的最終正確率
* 使用標準的數據增強，如[14，30]中描述的小平移、裁剪、旋轉和水平翻轉。
* **Piecemeal-training**:**δ~k~** 個隨機圖像是從訓練集中挑選出來的，大缺50%是增強圖像(augmented images)

* **PAMAP2** dataset of humman activity recogition:
* PAMAP2 數據集提供來自三個慣性測量單元 (IMU) 和一個心率監測器的記錄。總之，輸入數據是來自 40 個通道的時間序列形式。在這個數據集中，九名受試者進行了十二種不同的家庭、運動和日常生活活動。我們不考慮某些科目執行的可選活動。在 [15] 之後，參與者 5 和 6 的錄音分別用作驗證集和測試集。 IMU 的記錄被下採樣到 30 Hz，並使用窗口大小為 3s（100 個樣本）和步長為 660ms（22 個樣本）的滑動窗口方法來分割序列。為了增加數據，滑動窗口移動了不同的步長，同時保持窗口大小相同，為 3 秒。

### 4.2 Search pace

* CIFAR-10和PAMAP2的總設計點數分別為10^8^和 10^5^。
* 對於CIFAR-10來說，每層的單元數可以是16的倍數，對於PAMAP2來說是8的倍數。

![](https://i.imgur.com/QN7oGb7.png)

### 4.3 Training Setup

* **CIFAR-10**: 80 generations 和 族群大小為80，零散訓練 **δ~k~** 被設定為4000個隨機圖像
* 每個 Convolution 和 fully connected layer 都有ReLu activation
* 使用**Adam optimizer**進行訓練，Batch size是80，初始學習率是5e^-4^，且逐漸衰減。
* 每20次 iterations後，學習率降低1e^-4^，進化選擇機率**P~m~**、**P~r~** 初始為0.3，**P~m~** 保持不變，**P~r~** 則線性衰減，直到最後一次iteration降至0.01
* **PAMAP2** 訓練了 30 代，族群大小為 50。用於零散訓練的 **δ~k~** 設置為 20,000 隨機傳感器樣本。每個卷積和全連接層之後都是 ReLu 激活。訓練使用 Adam 優化器和 100 的批量大小，初始學習率為 1e^-4^，學習率不變。進化選擇機率 **P~m~** 和 **P~r~** 初始化皆為 0.3，與 CIFAR 10 實驗一樣，P~m~ 保持不變，P~r~ 線性衰減

* **CIFAR-10** 的神經網絡比 **PAMAP2** 的大，用一個具有11GB內存的GPU，**CIFAR 10** 的4個平行訓練過程和7個平行訓練過程可以同時運行。
* 對平行度的限制是由GPU上的可用內存決定的。此外，為了加快搜索速度，沒有使用 "批量歸一化(Batch normalization)"，因為它消耗更多的內存並減少可能的平行性。在搜索之後，最好的候選者被修改，每個卷積層都被附加了一個"批量歸一化(Batch normalization)"層，並進一步訓練了100個epochs

![](https://i.imgur.com/6rDvtFR.png)


### 4.4 Results

* 圖2顯示了在**CIFAR-10**和**PAMAP2**上實驗的訓練曲線

* ![](https://i.imgur.com/81kS3O1.png)
    * **Average Accuracy** : 給定的搜索迭代中整個群體的平均性能
    * **Best Accuracy** : 從族群中發現單個模型的最佳性能

* 隨著每次迭代，群體的平均精度以及群體中個體的最佳精度普遍增加。
* 所有迭代結束時發現的最佳模型被進一步訓練以達到最終的準確度。
* 對於**CIFAR-10**，搜索耗時 2 個 GPU 天，在測試集上發現最佳預測準確率為 92.5%。表 3 顯示了與其他進化方法的比較。我們知道，與其他已發表的作品相比，92.5% 相對較低，但這是在一個非常簡單明了的 CNN 上，沒有任何架構增強或像 **mixup** 這樣的高級數據增強[36] or 切口(cutout)[12]
* 其他方法使用混合搜索空間，其中使用不同的架構塊或單元模塊以及任意跳過連接
* 在實驗中發現的最佳模型有 13 個卷積層，然後是 2 個全連接層。

* ![](https://i.imgur.com/MO1HbiO.png)

* **PAMAP2 dataset**: 分類準確 和 加權F1-score(F1~w~)、平均F1-score(F1~m~)，導致不平衡的集合，並且考慮以下**每個類別**的
    * 正確分類(correct classification)
    * 使用精確度(precision)
    * 召回率(recall)
    * 數據集中(proportion)
* ![](https://i.imgur.com/e10IhG6.png)

    * **n~i~** 是每個類別k∈K的樣本數 

    * N是數據集的樣本總數
* F1 分數更便於在高度不平衡的數據集上評估網絡的性能。
* 搜索只用了 10 個 GPU 小時，最佳預測準確率為 94.36%
* 同時通過評估少得多的設計點來提高資源效率
* 在一個有7個卷積層的神經網絡上發現了最好的性能，其次是3個全連接層
* ![](https://i.imgur.com/UI0tp1L.png)


---


## 5.Conclusion

* 在本文中，我們提出了一種新的方法，稱為進化的零散訓練，它遍歷了普通CNN的搜索空間，為給定的任務在合理的約束條件下找到一個有效的架構。我們在兩個不同的數據集上驗證了我們的算法，這證明了我們方法的通用性、方法的多功能性。

* 我們表明，對於中等複雜度的任務，如PAMAP2數據集，我們的方法比隨機或網格搜索方法更好、更有效。我們認為這個過程可以很容易地擴展到執行多目標優化，這允許神經網絡在其性能的同時對資源利用率進行優化。

* 作為未來的工作，我們的目標是修改這種搜索算法，以納入硬件指標並減少在指定的嵌入式系統上減少神經網絡的資源使用。
---

## 知識

* fully-connected layer
    * 顧名思義他會與前一層的**每個 unit**做連結計算，因此所需要的記憶體通常不小，而convolution layer也是提出用來更有效、使用**較少的變數**達到一樣的計算擬合能力的 tool。
    * ![](https://i.imgur.com/mpsTShX.png)
--- 
* pooling layer
    * 降低採樣數，也就是縮小feature map的大小。i.e.Max pooling，選max value 
    * 減少記憶體用量、減少計算量防止overfitting
    * ![](https://i.imgur.com/uNHXJkS.png)
---
* activation function layer
    * 在每層 convolution layer 之後，讓output的值經過一個 non-linear 轉換，可以讓我們的 Model 去擬合更複雜、**非線性的資料**。i.e. **Relu、sigmoid** 等等
    * 需選擇可微分之function，因為在誤差反向傳遞(Back Propagation)運算時，需要進行一次微分計算。
    * 隱藏層(hidden layer)過多時，Vanishing Gradient,Exploding Gradient可能會發生 => saddle point?
    * ![](https://i.imgur.com/8pWIZSS.png)
---
* residual connections
    * 輸入為X，輸出為F（x），F通常包括了卷積，啟動等操作。
    * 當我們強行將一個輸入添加到函數的輸出的時候，雖然我們仍然可以用G（x）來描述輸入輸出的關係，但是這個G（x）卻可以明確的拆分為F（x）和X的線性疊加。
    *  ![](https://i.imgur.com/xh6UN3N.png)
---
* Batch normalization
    * 克服深度神經網絡難以訓練的問題 => 優點在於
      1.快速學習（能增加學習率）
      2.不會過度依賴預設值（不會對預設值產生過度反應）
      3.控制過度學習（減少 Dropout 等必要性）
    * Batch Normalization 的使用時機
      1.遇到收歛速度很慢，或梯度爆炸等無法訓練的狀況時可以嘗試
      2.在一般使用情况下也可以加入，用來加快訓練速度，提高模型效能
    * http://violin-tao.blogspot.com/2018/02/ml-batch-normalization.html
---
* Population based training
    * 提出的一種異步的自動超參數調節優化方法 
    * parallel search , sequential optimisation
    * https://www.codeprj.com/zh/blog/a0826e1.html
--- 
* pruning
    * 我們直接移除對於CNN精度影響很小的卷積核。 通過將網路的這些卷積核以及它們的feature map移除掉，可以極大的減少計算成本 
    * [19](https://zhuanlan.zhihu.com/p/63779916)
---
* [7]Net2Wider operator =>
    * 將一個神經網路中的知識快速轉移到另一個神經網路中 
    * https://ppfocus.com/0/diefece24.html
---
* centrally cropped
    * 圖像擴增
---
* zero-padded
    * Filter計算到邊界時，input image多餘的部分補0
    * ![](https://i.imgur.com/7EUhcov.png)
--- 
* Java based Jenetics library
    * Jenetics是一個使用現代的Java面向物件程式設計語言的高級的遺傳演算法庫
---
* Python based Caffe2
    * [Caffe2](https://www.796t.com/content/1545124157.html)
---
* Adam optimizer
    * [Adam](https://medium.com/%E9%9B%9E%E9%9B%9E%E8%88%87%E5%85%94%E5%85%94%E7%9A%84%E5%B7%A5%E7%A8%8B%E4%B8%96%E7%95%8C/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92ml-note-sgd-momentum-adagrad-adam-optimizer-f20568c968db)
---
* mixup
    * 一種數據增強方法
    * [mixup](https://blog.csdn.net/zzc15806/article/details/80696787)
* cutout
    * 一種數據增強的方法，主要應用於分類任務中 
    * 在圖像中隨機選取一個點作為中心點，覆蓋一個固定大小的方形zero-mask
    * [cutout](https://blog.csdn.net/qq_19784349/article/details/107325616) 

