AutoDL論文解讀(四):權值共享的搜索

自動化機器學習(AutoML)最近變得越來越火,是機器學習下個發展方向之一。其中的神經網絡結構搜索(NAS)是其中重要的技術之一。人工設計網絡需要豐富的經驗和專業知識,神經網絡有衆多的超參數,導致其搜索空間巨大。NAS即是在此巨大的搜索空間裏自動地找到最優的網絡結構,實現深度學習的自動化。自2017年穀歌與MIT各自在ICLR上各自發表基於強化學習的NAS以來,已產出200多篇論文,僅2019年上半年就有100多篇論文。此係列文章將解讀AutoDL領域的經典論文與方法,筆者也是剛接觸這個領域,有理解錯誤的地方還請批評指正!
此係列的文章:

本次介紹的兩篇論文是谷歌的《Efficient Neural Architecture Search via Parameter Sharing》和自動化所、圖森的《You Only Search Once: Single Shot Neural Architecture Search via Direct Sparse Optimization》。一般自動生成的網絡模型龐大而冗餘,且搜索過程耗時耗力,這次的論文是用權值共享的辦法來加速模型搜索。

一、Efficient Neural Architecture Search via Parameter Sharing

1、總覽

這篇論文也是基於NAS的框架,對其進行了改進,稱之爲ENAS。NAS搜索到的圖是一個更大的圖的子圖,也就是說NAS的搜索空間可以用一個有向無環圖(DAG)來表示。下圖給出了一個例子:
在這裏插入圖片描述
上面的圖是整個搜索空間,紅色的線連起來的子圖是控制器發現的模型。ENAS的DAG是NAS搜索空間裏所有可能子模型的疊加,圖中的結點表示具體的計算操作,邊表示信息流動。每個節點都有其自己的參數,這些參數在所有的子模型中都可以共享。其實ENAS要學習的就是節點之間的連線關係,通過不同的連線產生大量的模型。

2、生成RNN的cell

爲了生成RNN的cell,作者使用一個有N個節點的DAG。ENAS的控制器是個RNN,它決定兩個方面:(1)哪個邊被激活;(2)DAG中的結點選擇哪種操作。原NAS論文裏的RNN生成,cell的結構被固定爲二叉樹結構,只決定樹上每個節點的操作。而這裏ENAS即設計節點操作也設計cell的結構。以下圖爲例說明控制器生成cell的過程:
在這裏插入圖片描述
假設有N=4個節點,xtx_{t}是cell的輸入,ht1h_{t-1}是前一個時間步的輸出。採樣過程如下:

  • 在節點1:控制器採樣一個激活函數。圖中例子選擇了tanh,那麼節點1的計算爲h1=tanh(xtWx+ht1W1h)h_{1}={\rm tanh}(x_{t} \cdot W^{x}+h_{t-1} \cdot W_{1}^{h})
  • 在節點2:控制器採樣之前節點的編號和激活函數。例子中選擇了編號1和ReLU,則節點2的計算爲h2=ReLU(h1W2,1h)h_{2}={\rm ReLU}(h_{1} \cdot W_{2,1}^{h})
  • 在節點3:控制器再次採樣之前節點的編號和激活函數。例子中選擇了編號2和ReLU,則節點3的計算爲:h3=ReLU(h2(W3,2h))h_{3}={\rm ReLU}(h_{2} \cdot (W_{3,2}^{h}))
  • 在節點4:控制器再次採樣之前節點的編號和激活函數。例子中選擇了編號1和tanh,則節點3的計算爲:h4=tanh(h1(W4,2h))h_{4}={\rm tanh}(h_{1} \cdot (W_{4,2}^{h}))
  • 對於輸出,將那麼沒有被選做其他任何節點輸入的結點取平均。例子中,節點3和節點4沒有被選爲其他節點的輸入,那麼ht=(h3+h4)/2h_{t}=(h_{3}+h_{4})/2

在上面的例子中可以看出,對於每個節點對j<lj<l都有獨立的參數矩陣Wl,jhW_{l,j}^{h},通過選擇前面節點的標號,控制器也選擇了使用哪個參數矩陣,因此搜索空間裏所有的cell都共享同樣的參數集合。如果一個cell有N個節點,選擇4種激活函數(tahn,ReLU,identity,sigmoid),那麼搜索空間有4N×N!4^{N} \times N!種配置。

3、訓練ENAS、導出網絡結構

這裏控制器LSTM有100個節點,通過softmax分類器進行採樣。在ENAS中,有兩類需要學習的參數:控制器LSTM的參數θ\theta和子模型共享的參數ω\omega。訓練過程也包括兩個階段,第一個階段用整個數據集訓練ω\omega,第二個階段是訓練θ\theta,兩個階段輪流訓練,具體細節如下:

  • 訓練ω\omega。這步中,控制器的策略π(m;θ)\pi(m;\theta)被固定,用SGD去最小化交叉熵損失函數Em π[L(mi,ω)]{\Bbb E}_{m ~ \pi}[L(m_{i}, \omega)]mm是從π(m;θ)\pi (m; \theta)中採樣得到的一個模型。梯度使用蒙特卡洛估計:
    ωEmπ(m;θ)[L(m;ω)]1Mi=1MωL(mi,ω) \nabla_{\omega} \mathbb{E}_{\mathbf{m} \sim \pi(\mathbf{m} ; \theta)}[\mathcal{L}(\mathbf{m} ; \omega)] \approx \frac{1}{M} \sum_{i=1}^{M} \nabla_{\omega} \mathcal{L}\left(\mathbf{m}_{i}, \omega\right)
    上式是對梯度的無偏估計,有較大的方差。但作者發現當M=1M=1的時候效果就比較好,也就是說使用從π(m;θ)\pi (m; \theta)採樣到的任意一個模型mm上計算到的梯度就可以更新ω\omega

  • 訓練參數θ\theta。在這步中固定ω\omega來更新θ\theta,以最大化期望獎勵Em π(m;θ)[R(m,ω)]{\Bbb E}_{m ~ \pi(m; \theta)}[\mathcal R(m, \omega)]。獎勵R(m,ω)\mathcal R(m,\omega)是在驗證集上計算得到的。

  • 導出網絡結構。首先從訓練的策略π(m,θ)\pi (m, \theta)採樣幾個模型,對於每個採樣的模型,直接在驗證集上計算獎勵,然後選擇獎勵最高的模型從頭訓練。實際上這個過程會進行很多次,共享的權重也會在一段時間後更新。

4、設計卷積網絡

在生成CNN時,控制器作出兩個方面的決定:(1)連接前面的那個些節點;(2)使用哪種操作。這兩個決策構造了一個卷積層。選擇連接到前面的那些節點可以用來產生跨連接,在第kk層,前面最多有k1k-1個可選的結點,這會有2k12^{k-1}種可能的決策。舉例如下圖:
在這裏插入圖片描述
上圖中,在第k=4k=4層,控制器選擇了前面的第1、3個節點,所以第1、3層的輸出在深度這個軸連接起來送到第4層。

對於可選的操作,一共有6種:3x3大小卷積、5x5大小卷積、3x3大小的可分離卷積、5x5大小可分離卷積、3x3的最大池化、3x3的平均池化。做這樣的決策一共L次,可以得到一個L層的網絡,在搜索空間裏一共有6L×2L(L1)/26^{L} \times 2^{L(L-1)/2}種網絡。

5、設計卷積cell

上述的搜索是從頭搜索整個網絡,也稱作macro搜索。也可以只搜索卷積cell,然後將它們連接起來組成整個網絡,這稱爲micro搜索。在每個cell裏有B個節點,節點1和節點2作爲cell的輸入,是前兩個cell的輸出。對於剩下的B-2個節點,使用控制器取做兩個決策:(1)選擇兩個前驅節點作爲當前節點的輸入;(2)選擇兩個操作作用在這兩個前驅節點上。上述操作之後,將兩個節點相加。可能的操作有5種:identity,3x3和5x5的可分離卷積,3x3的最大池化和平均池化。以B=4舉例,如下圖所示:
在這裏插入圖片描述

  • 對於節點1、2,其作爲輸入,控制器不對此作決策。用h1h_{1}h2h_{2}表示。
  • 在節點3,控制器選擇兩個前驅節點和兩種操作。這裏選擇了節點2和節點2,選擇的操作爲5x5可分離卷積和identity,所以h3=sep_conv_5x5(h2)+id(h2)h_{3}={\rm sep\_conv\_5x5}(h_{2})+{\rm id}(h_2)
  • 在節點4,控制器選擇了節點3和節點1,選擇的操作爲3x3可分離卷積和3x3可分離卷積,所說h4=sep_conv_3x3(h3)+sep_conv_3x3(h1)h_{4}={\rm sep\_conv\_3x3}(h_{3})+{\rm sep\_conv\_3x3}(h_{1})
  • 最終除了h4h_{4}其他節點都作爲了其他節點的輸入,所以h4h_{4}作爲cell的輸出

從此搜索空間中還可以生成reduction cell,只需:(1)採樣一個卷積cell;(2)應用步長爲2的操作。卷積cell和reduction cell同時採樣,則控制器RNN一共作2(B2)2(B-2)種決策。在節點i(3iB)i(3 \leq i \leq B),控制器從前i1i-1個節點任意選擇2個節點,從5種操作中任意選擇2個,所以總共有(5×(B2))2(5 \times (B-2))^{2}種可能的cell,算上reduction cell,一共有(5×(B2))4(5 \times (B-2))^{4}種可能的cell。

二、You Only Search Once: Single Shot Neural Architecture Search via Direct Sparse Optimization

1、總覽

在這篇論文裏,作者將NAS重新表述爲從一個大型網絡中剔除無用的連接,因此只需一個模型被訓練。由於模型在訓練階段就直接被優化了,作者稱之爲直接稀疏優化NAS(Direct Sparse Optimization NAS, DSO-NAS)。作者進一步論證了這個稀疏正則化可以被改進的加速近端梯度(proximal gradient)方法優化,不需要任何的控制器、性能預測或者搜索空間鬆弛(搜索空間鬆弛是可微分方法的內容)。DSO-NAS也第一次論證了NAS可以直接在大型數據集上使用而沒有塊結構的共享。

2、Motivation

DSO-NAS通用是根據神經網絡的結構空間可以用有向無環圖DAG表示,在此空間的任何結構都是其子圖。也就是說一個特定的結構可以從整個圖中選擇節點和邊來得到。這裏作者用完整的圖來表示單個block的搜索空間,整個網絡是由這些block用跨連接堆疊起來。

對於一個有T個節點的DAG,第ii個節點的輸出h(i)h^{(i)}可以通過變換所有前驅節點輸出h(j),j<ih^{(j)},j<i的和來得到:

h(i)=O(i)(j=1i1h(j)) h^{(i)}={\mathcal O}^{(i)} \left(\sum_{j=1}^{i-1}h^{(j)} \right)

下圖展示了DAG裏的一個特定的block,節點表示操作O\mathcal O,邊表示信息流動。
在這裏插入圖片描述
上圖中節點1和節點6是輸入節點和輸出節點,虛線表示沒被連接起來的結點。那麼節點5的輸出是h(5)=O(5)(j=44h(j))h^{(5)}={\mathcal O} ^{(5)}\left(\sum_{j=4}^{4}h^{(j)} \right),也就是h(5)=O(5)(h(2)+h(4))h^{(5)}={\mathcal O} ^{(5)}(h^{(2)} + h^{(4)})

然後結構搜索問題可以看作邊裁剪問題。在搜索過程中,我們移除沒有用的邊和節點,留下最重要的結構。這裏作者對每個節點的輸出都乘上一個乘子,上式變成:

h(i)=O(i)(j=1i1λ(j)(i)h(j)) h^{(i)}={\mathcal O}^{(i)} \left(\sum_{j=1}^{i-1} \lambda_{(j)}^{(i)} h^{(j)} \right)

λ(j)(i)\lambda_{(j)}^{(i)}是作用在從節點jj到節點ii的乘子,然後對這些乘子使用稀疏正則化,使其在搜索過程中有些爲0。如果λ(j)(i)\lambda_{(j)}^{(i)}爲0,則相關的邊和節點就被移除了。

3、搜索空間

DSO-NAS可以搜索block然後堆疊起來(micro-search),也可以搜索不帶block的整個網絡(macro-search)。

對於要搜索的block,設定裏面有M個層級,每個層級包含N個不同的操作(也就是節點)。每個操作將其所有前層級的節點和block的輸入連接起來,block的輸出就是將block裏的所有節點連接起來。對於每個連接,都乘上一個乘子λ\lambda。對其使用稀疏正則化,優化之後移除λ\lambda爲0的連接和節點,得到最終的block結構。整個過程如下圖所示:
在這裏插入圖片描述
圖(a)是完整的DAG,圖(b)是優化每個邊的乘子λ\lambda,圖(c)是移除了沒有用的邊和節點後最終的block。

bb個block裏第ii層級的第jj個節點h(b,i,j)h_{(b,i,j)}可以用如下公式表示:

h(b,i,j)=O(b,i,j)(m=1i1n=1Nλ(b,m,n)(i,j)h(b,m,n)+λ(b,0,0)(i,j)O(b1)) h_{(b,i,j)}={\mathcal O}_{(b,i,j)} \left(\sum_{m=1}^{i-1} \sum_{n=1}^{N} \lambda_{(b,m,n)}^{(i,j)} h_{(b,m,n)} + \lambda_{(b,0,0)}^{(i,j)} O_{(b-1)} \right)

這裏h(b,0,0)=O(b1)h_{(b,0,0)}=O_{(b-1)}h(b,M+1,0)=O(b)h_{(b, M+1,0)}=O_{(b)}分別是第bb個block的輸入節點和輸出節點。第mm個層級有(m1)N+1(m-1)N+1個輸入。第bb個block的輸出O(b)O_{(b)}是對所有連接到輸出的結點應用reduction操作(1x1的卷積)R\mathcal R得到的:

O(b)=R([λ(b,1,1)(M+1,0)h(b,1,1)],λ(b,1,2)(M+1,0)h(b,1,2),,λ(b,m,n)(M+1,0)h(b,m,n),λ(b,M,N)(M+1,0)h(b,M,N))+O(b1),m[1,M],n[1,N] \begin{aligned} O_{(b)}=\mathcal{R}\left(\left[\lambda_{(b, 1,1)}^{(M+1,0)} h_{(b, 1,1)}\right], \lambda_{(b, 1,2)}^{(M+1,0)} h_{(b, 1,2)}, \ldots, \lambda_{(b, m, n)}^{(M+1,0)} h_{(b, m, n)}, \ldots \lambda_{(b, M, N)}^{(M+1,0)} h_{(b, M, N)}\right) +O_{(b-1)}, m \in[1, M], n \in[1, N] \end{aligned}

整個由block堆疊的完整網絡如下圖所示:
在這裏插入圖片描述
整個網絡有SS個stage,每個stage有BB個卷積block。除了最後一個stage,每個stage的最後都有一個reduction block。這裏作者嘗試了兩種搜索空間:(1)λ\lambda在所有block中都共享的搜索空間;(2)每個block中λ\lambda都不同的搜索空間。

卷積操作遵循Conv-Bn-ReLU的順序,使用下面幾種操作:

  • 3x3的可分離卷積
  • 5x5的可分離卷積
  • 3x3的平均池化
  • 3x3的最大池化

對於reduction block,使用1x1和3x3大小的卷積核,步長爲2。

搜索block的任務因此可以簡化爲學習每個邊的λ\lambda,可以用下式表示:

minW,λ1Ki=1KL(yi,Net(xi,W,λ))+δWF2+γλ1 \min _{\mathbf{W}, \boldsymbol{\lambda}} \frac{1}{K} \sum_{i=1}^{K} \mathcal{L}\left(\mathbf{y}_{i}, N e t\left(\mathbf{x}_{i}, \mathbf{W}, \boldsymbol{\lambda}\right)\right)+\delta\|\mathbf{W}\|_{F}^{2}+\gamma\|\boldsymbol{\lambda}\|_{1}

xi\mathbf{x}_{i}yi\mathbf{y}_{i}是輸入數據和標籤,KK表示訓練樣本的數目,W\mathbf{W}表示網絡的權重,δ\deltaλ\lambda表示正則化權重。可以設G(λ)=1Ki=1KL(yi,Net(xi,W,λ)){\mathcal G}(\lambda)=\frac{1}{K} \sum_{i=1}^{K} \mathcal{L}\left(\mathbf{y}_{i},N e t\left(\mathbf{x}_{i}, \mathbf{W}, \boldsymbol{\lambda}\right)\right)

4、優化、訓練

正則化參數λ\lambda優化起來非常困難,尤其在有隨機性的深度神經網絡裏,雖然啓發式的閾值方法可行,但優化是不穩定的。不過使用稀疏結構選擇(Sparse Structure Selection,SSS)可以解決這個問題,SSS通過修改理論上合理的優化方法加速近端梯度(Accelerated proximal Gradient,APG)方法,重寫公式避免在計算梯度時重複地前向和反向計算:

z(t)=λ(t1)η(t)G(λ(t1))v(t)=Sη(t)γ(z(t))λ(t1)+μ(t1)v(t1)λ(t)=Sη(t)γ(z(t))+μ(t)v(t) \begin{array}{l}{\mathbf{z}_{(t)}=\boldsymbol{\lambda}_{(t-1)}-\eta_{(t)} \nabla \mathcal{G}\left(\boldsymbol{\lambda}_{(t-1)}\right)} \\ {\mathbf{v}_{(t)}=S_{\eta_{(t)} \gamma}\left(\mathbf{z}_{(t)}\right)-\boldsymbol{\lambda}_{(t-1)}+\mu_{(t-1)} \mathbf{v}_{(t-1)}} \\ {\boldsymbol{\lambda}_{(t)}=\mathcal{S}_{\eta_{(t)} \gamma}\left(\mathbf{z}_{(t)}\right)+\mu_{(t)} \mathbf{v}_{(t)}}\end{array}

tt是迭代地輪數,Sη(t)γ{\mathcal S}_{\eta_{(t)} \gamma}表示軟閾值操作Sα(z)i=sign(zi)(ziα)+{\mathcal S}_{\alpha}(\mathbf{z})_{i}={\rm sign}(z_{i})(|z_{i}|-\alpha)_{+}η(t){\eta}_{(t)}表示梯度步長,μ\mu是動量大小。這種方法稱之爲APG-NAG。W\mathbf{W}λ\mathbf{\lambda}使用NAG(Nesterov Accelerated Gradient )和APG-NAG同時被更新。然而APG-NAG不能直接用在這裏,裁剪的搜索空間是有限的,會導致一定程度的過擬合。這裏作者將訓練數據分成兩部分,一部分用來更新W\mathbf{W},另一部分用來更新λ\mathbf{\lambda}

整個方法包括三個階段:

  • 訓練DAG全部連接的網絡,得到好的權重初始化
  • 從預訓練的模型中搜索結構
  • 從頭訓練最終的網絡

在前兩個階段,BN層的參數被固定爲1,爲了避免影響λ\mathbf{\lambda}的學習。在第二步之後,作者通過一個全局寬度乘法器來調整每個操作中的濾波器數量,以滿足計算預算。

參考文獻

[1] Pham H, Guan M Y, Zoph B, et al. Efficient Neural Architecture Search via Parameter Sharing[J]. 2018.
[2] Zhang X , Huang Z , Wang N . You Only Search Once: Single Shot Neural Architecture Search via Direct Sparse Optimization[J]. 2018.
[3] 你想要的神經網絡自動設計,谷歌大腦幫你實現了:用參數共享高效地搜索神經網絡架構(ENAS)
[4] https://blog.csdn.net/weixin_34319817/article/details/89581856
[5] Huang Z , Wang N . Data-Driven Sparse Structure Selection for Deep Neural Networks[J]. 2017.
[6] 《深入理解AutoML和AutoDL》

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章