CondenseNet: An Efficient DenseNet using Learned Group Convolutions

1. 摘要

作者提出了一個前所未有高效的新奇網絡結構,稱之爲 CondenseNet,該結構結合了密集連接性和可學習的分組卷積模塊。

密集連接性有利於網絡中的特徵複用,而可學習的分組卷積模塊則可以移除多餘的特徵複用之間的連接。在測試的時候,訓練好的模型可以使用標準的分組卷積來實現,在實際中計算非常高效。

2. 介紹和相關工作

深度學習模型一般都是在多個 GPU 上進行訓練,然後再在計算資源有限的移動設備上進行部署。因此,一個好的網絡結構應該允許訓練階段可以快速並行,而在測試的時候可以壓縮。

一層一層堆疊卷積層的結構會使得網絡需要通過學習來複制前面層的特徵,而 DenseNet 通過直接將前面層的特徵連接到後面的層來產生特徵複用。儘管這很高效,但其實會產生一些冗餘,也就是前面的一些特徵在後面並不需要。因此,作者提出了一個方法來在訓練階段對這些多餘的連接進行剪除,而在測試階段則可以高效地通過分組卷積來實現。具體來說,作者將一層網絡的卷積核分爲幾個組,然後逐漸移除每個組內不重要特徵之間的連接。更重要的是,這些組不是預先定義好的,而是網絡自己學出來的。

相較於以前的權重剪枝和量化,CondenseNet 有兩個不同的地方:它是在訓練的早期階段進行剪枝的,這比在整個過程中使用 L1 正則化更加高效;訓練好的 CondenseNet 具有更高的稀疏度,然而依舊可以產生高效的分組卷積。

標準的卷積層通過應用一個卷積核到所有的 RR 個輸入特徵圖來得到一個輸出特徵圖,而分組卷積則將輸入特徵圖分爲 GG 個組,一個輸出特徵圖只與一個組內的輸入特徵圖有關。

3. CondenseNet

下圖左邊爲 DenseNet 中的一層,我們可以將分組卷積應用到 3×3 的卷積層,但是實驗發現如果簡單地將分組卷積應用到 1×1 的卷積層會導致準確率有很大的降低。輸入到 1×1 卷積層的特徵是上一層輸出特徵的拼接,它們有一個內在的順序而且是非常多樣化的,所以直接硬分組對特徵複用是不利的。

因此,作者提出了一個方法,讓網絡在訓練階段自己學習對輸入特徵自動分組,讓每個組的卷積核自己選取最相關的輸入特徵。而且,允許一個輸入特徵被多個組共享,也允許一個輸入特徵被所有組都忽略。

3.1. 可學習的分組卷積

分組卷積是通過多個階段學習到的,如下圖所示。訓練的前一半迭代過程由 condensing 階段組成的,我們重複地訓練網絡來修剪掉權值比較小的不重要卷積核,也就是針對某些輸入特徵的權重置爲零。訓練的後一半是優化階段,我們固定學習到的分組卷積來學習卷積核參數。當進行剪枝的時候,我們確保同一組的稀疏模式相同,也就是同一個組的輸入特徵圖是一樣的。這樣,在測試階段,稀疏化的層就可以通過標準的分組卷積來實現,這可以大大地降低計算代價。

針對 1×1 的卷積,卷積核大小爲 O×1×1×RO×1×1×R 的矩陣 FFOO 是輸出通道數,RR 是輸入通道數。在訓練之前,我們將卷積核或者說是輸出特徵分爲 GG 個大小相同的組,每個組的卷積核表示爲 F1,,FGF^1, \cdots, F^G ,每個 FgF^g 大小爲 OG×R\frac{O}{G}×RFijgF^g_{ij} 代表負責從第 j 個輸入產生第 i 個輸出的權重。

那麼,第 j 個輸入對當前分組內輸出特徵的重要性可以通過某一列權重的平均絕對值來表示,也即 i=1O/GFijg\textstyle \sum^{O/G}_{i=1}|F^g_{ij}|。也就是說,我們移除 FgF^g 中的某一列(將這一列置爲零),如果這一列的 L1L_1 範數比其它列的都小,實際上也就是第 j 個輸入對當前組的輸出特徵不那麼重要。這也就產生了結構上的稀疏性:同一個組內的卷積核接受同樣的輸入特徵。

爲了減少權重剪枝對網絡的準確性帶來的負面影響,通常使用 L1L_1 正則化來產生稀疏性。針對 CondenseNet ,作者提出了一個組級別(group-level)的稀疏性,來在訓練過程中加上一個正則項,這個正則項會讓 FgF^g 中的某一列元素趨向於零。

在實際中,一個組內使用的輸入特徵比例不一定要是 1/G1/G,作者定義了一個 condensation 因子 $C $,每個分組卷積的輸入特徵數目爲 RC\lfloor \frac{R}{C}\rfloor

在訓練階段,每個組的卷積核最後只會有 1/C1/C 得以保留,所以我們有 C1C-1 個 condensing 階段,在每個階段的最後面,我們修剪掉 1/C1/C 的權重。修剪的操作是通過一個 mask 來實現的,那些修剪掉的權重在 mask 中對應的元素爲 0 ,然後通過 mask 與權重進行一個逐元素的相乘,這樣可以在 GPU 上高效地實現。作者在實驗中設置每個 condensing 階段的 epochs=M2(C1)epochs=\frac{M}{2(C-1)},這樣總訓練次數的前一半就用來產生稀疏的分組卷積。

作者採用餘弦形狀的學習率,一個訓練過程中的損失函數和學習率變化情況如下圖所示。迭代次數爲 150 時損失函數的突然上升是因爲移除了餘下權重的一半,但是模型可以在優化階段又逐漸恢復。

在測試階段,我們需要一個 index layer 來對輸入特徵圖進行一個選擇和重新排序,從而使得分組卷積能夠實現,如上圖 3 右邊所示。

3.2. 網絡結構

作者對 DenseNet 做了兩個改變,來更簡化網絡結構改進計算效率。

  • 指數增加的增長率

在原來的 DenseNet 中,每一層會產生 kk 個特徵圖,kk 是一個常數稱之爲增長率。網絡中更深的層會更依賴一些高層信息,因此我們應該使得更近的特徵圖之間有更多的連接,也就是來自靠後面層特徵的比例應該比來自更早層特徵的比例多一些。作者設置更深的層增長率更大,k=2m1k0k=2^{m-1}k_0,其中 mm 代表第幾個密集塊,k0k_0 是一個常數。

  • 全密集連接

爲了更加鼓勵特徵複用,作者連接輸入層到其後面的所有層,甚至是不同塊的也進行連接。如果特徵圖的空間大小不一樣,則對分辨率較大的特徵圖進行平均池化下采樣。

另外,可學習的分組卷積只應用在每一個基本層的第一個 1×1 卷積上,然後會進行一個通道打亂操作,讓特徵圖均勻分佈在每一個組中,緊接着的 3×3 卷積是一個標準的分組卷積。

4. 實驗結果

在 DenseNet 的基礎上引入可學習的分組卷積後,測試誤差大大降低,然後再加上指數級增加的增長率策略,模型的表現還可以進一步提高。

在 CIFAR 和 ImageNet 數據集上的表現分別如下所示。

分組卷積的組數和 condensation 因子的對比試驗如下所示。

獲取更多精彩,請關注「seniusen」!

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