2019-03-19 16:13:18git
Paper:https://openreview.net/forum?id=HylVB3AqYm github
Code:https://github.com/MIT-HAN-LAB/ProxylessNAS 算法
1. Background and Motivation: 網絡
先來看看算法的名字:ProxylessNAS,將其拆分以後是這麼個意思: Proxy(代理)Less(扣除)NAS(神經結構搜索),難麼很天然的就能夠讀懂了:不用代理的神經網絡搜索。那麼問題來了,什麼是代理呢?這就要提到本文的動機:NAS 能夠自動設計有效的網絡結構,可是因爲前期所提出算法計算量太大,難以在大型任務上執行搜索。因而,出現了可微分的NAS,大大的下降了 GPU 的運算時間,可是也有一個須要較大 GPU memory 消耗的問題(grow linearly w.r.t. candidate set size)。因此,這些算法就只能在 proxy task 上,例如在較小的數據集上訓練,或者僅用幾個 blocks 進行學習,或者僅僅訓練幾個 epoch。這就可能引出以下的問題,算法在小數據上的搜索出來的模型,可能在 target task 上並非最優的。因此,本文就提出 ProxylessNAS 來直接在 large-scale target tasks 或者 目標硬件平臺上進行結構的學習。less
本文做者將 NAS 看作是 path-level pruning process,特別的,咱們直接訓練一個 over-parameterized network,其包含全部的候選路徑(如圖 2 所示)。在訓練過程當中,咱們顯示的引入結構化參數來學習哪條路徑是冗餘的,這些冗餘的分支在訓練的最後,都被移除,以獲得一個緊湊的優化結構。經過這種方式,在結構搜索過程當中,咱們僅僅須要訓練一條網絡,而不須要任何其餘的 meta-controller (or hypernetwork)。函數
可是簡單的將全部的候選路徑都包含進來,又會引發 GPU 顯存的爆炸,由於顯存的消耗是和 選擇的個數,呈現線性增加的關係。因此,GPU memory-wise,咱們將結構參數進行二值化(1 或者 0),而且強制僅僅有一條路徑,在運行時,能夠被激活。這樣就將顯存需求將爲了與訓練一個緊湊的模型至關的級別。咱們提出一種基於 BinaryConnect 的基於梯度的方法來訓練二值化參數。此外,爲了處理不可微分的硬件目標,如 latency,在特定的硬件上,來學習特定的網絡結構。咱們將 network latency 建模成連續的函數,而且將其做爲正則化損失來進行優化。另外,咱們也提出 REINFORCE-based algorithm 做爲另一種策略來處理硬件度量。學習
2. Method:優化
做者首先描述了 over-parameterized network 的構建,而後引入如何利用 binarized architecture parameters 來下降顯存消耗。而後提出一種基於梯度的方法,來訓練這些 binarized architecture parameters。最終,提出兩種基礎來處理不可微分的目標(e.g. latency),使其能夠在特定的硬件上處理特定的神經網絡。spa
2.1 Construction of Over-Parameterized Network: .net
==