Learning Efficient Convolutional Networks through Network Slimming 論文學習

Abstract

由於計算資源消耗過高,在許多現實的應用上部署深度卷積網絡就受到了限制。在這篇論文中,作者提出了一個新的CNN學習機制:1)降低模型的大小;2)降低運行時內存佔用;3)減少計算操作的數量,而不會損失精度。作者通過一個簡單但有效的方法,將網絡的各個通道變得稀疏。和許多現有方法不同,此方法可以直接用在當前的CNN結構上,將訓練過程中的額外開支降到最低,最終的模型也不需要任何特殊的軟件或硬件來充當加速器。作者將此方法稱作“網絡裁剪”,它將大網絡作爲輸入模型,在訓練過程中,它會自動識別不重要的通道,並將之裁剪掉,這樣輸出的模型就會很小,而準確率相似。作者在多個SOTA CNN 模型(包括 VGGNet、ResNet、DenseNet等)上進行了裁剪,非常有效。對於 VGGNet,網絡裁剪後,模型大小降低了20多倍,計算量降低了5倍多。

1. Introduction

近些年,CNN在計算機視覺任務上成爲了主流方法,如圖像分類、目標檢測、語義分割等。大規模數據集、高端的GPU以及新的網絡結構使得網絡模型越來越大。例如,從 AlexNet,VGGNet 、GoogleNet 到 ResNet,ImageNet 分類挑戰賽的冠軍模型已經從8層網絡演變到了100多層。

CNN 越大,雖然其表現能力會越強,但是也更消耗資源。例如,若輸入圖像分辨率爲 224×224224\times 224,152層的ResNet 就會有超過6000萬個參數,需要200億次的浮點計算。這對於移動端、穿戴設備來說想都不要想。

在實際應用中部署CNN受以下條件制約:1)模型大小:數以百萬計的參數造就了 CNN強大的表現能力。這些參數,以及模型的結構信息,需要存儲在磁盤上,在推理時被加載入內存中。比如,存儲一個ImageNet 上常見的CNN模型需要至少300MB的空間,這對嵌入式設備來說太沉重了。2) 運行時內存:在推理時,CNN中間的激活與響應所消耗的內存空間甚至要比模型參數的存儲還要大,即便 batch 大小爲1。3)計算操作的數量:在高分辨率圖像上,卷積操作對算力的消耗更加嚴峻。在移動設備上,一個較大的CNN模型可能要花費數分鐘的時間來處理一張圖片,這對實際應用是無法接受的。

人們提出了很多方法來壓縮大型卷積網絡,或直接學習一個更有效的CNN模型,用於快速推理。這些方法包括低秩近似、網絡量化與二元化、權重剪枝、動態推理等。但是,這些方法只能解決上述一個或兩個挑戰。而且,部分方法需要特別設計的軟件或硬件來進行加速。

另一個降低CNN資源消耗的方向就是網絡稀疏化。我們可以在不同的網絡層級上進行稀疏化,實現非常顯著的壓縮效果以及推理速度。但是這些方法通常需要特別的硬件或軟件加速器的支持,儘管這要比非結構化的稀疏權重矩陣要容易些。

本文提出了一個簡單而有效的訓練機制 — 網絡裁剪,它可以解決前面提到的挑戰,在有限的資源下也可以部署大型CNN。本文的方法對 BN 層的縮放因子進行 L1 正則化,因而實現起來很簡單,且不會對現有的CNN結構做額外的變動。通過 L1 正則化將 BN 層縮放因子的值變爲0,使我們可以識別出那些不重要的通道(或神經元),因爲每個縮放因子都對應着一個卷積通道(或全連接層中的神經元)。這就使我們接下來可以進行通道剪枝。該額外的正則項幾乎不會損害模型性能。實際上,在一些案例中,它反而能提升模型的泛化能力。把不重要的通道裁剪掉,可能在短時間內會降低模型的表現,但我們可以對剪枝後的網絡進行模型微調來補償。剪枝後,網絡的大小、運行時內存消耗以及計算操作個數會降低許多。我們可以多次重複上述步驟,最終得到一個 multi-pass 的網絡裁剪方案,輸出更緊湊小巧的網絡。

作者在多個基準數據集和網絡結構上進行實驗,此方法可以將CNN模型的大小縮小20多倍,浮點運算數量降低5倍多,而精度不變甚至要更高。而且,本文的方法只用了傳統的硬件和深度學習框架,不需要用任何稀疏存儲格式或計算操作。

2. Related Work

這一節中,作者從五個方面討論相關的工作。

低秩分解 就是在神經網絡中通過奇異值分解(SVD)等方法來近似一個低秩矩陣。這個方法對全連接層特別管用,可以將模型的大小縮小約3倍,但是卻不會帶來任何明顯的加速,這是因爲CNN絕大多數操作都來自於卷積層。

權重量化。HashNet 提出了量化網絡權重的方法。在訓練之前,將網絡的權重進行哈希化,分爲不同的組,然後在每組內,權重值是共享的。這樣,我們只需存儲共享的權重和哈希索引,就可以節省大量的存儲空間。[12] 使用了一個改進版的量化方法,將 AlexNet 和 VGGNet 壓縮了35到49倍。但是,這些方法不會節約任何的運行時內存佔用或推理時間,因爲在推理時,我們需要將這些共享參數還原至原來的位置。

[28, 6] 將實數權重值量化爲二進制或三進制權重(權重值僅爲{1,1}\{-1,1\}{1,0,1}\{-1,0,1\})。由於我們只有按位(bitwise)操作,極大地降低了模型大小,並可以取得速度的顯著提升。但是,這種 low-bit 近似方法通常會造成一些準確率損失。

權重裁剪/稀疏化。[12] 提出了在網絡中,用較小的權重來裁剪那些不重要的網絡連接。裁剪後的網絡權重大部分都是0,因此我們就能以稀疏的格式來存儲模型,降低存儲空間。但是,該方法必須要用到特殊的稀疏矩陣庫或硬件支持才能實現加速。而且,運行時內存佔用的節省也非常有限,因爲激活函數映射消耗了絕大多數的內存空間,而非權重。

論文 [12] ,在訓練過程中並沒有任何針對稀疏的指導意見。[32] 利用額外的 gates 變量對每個權重進行稀疏化約束,通過0 gate 值來裁剪網絡連接,取得了較高的壓縮率。該方法取得的壓縮率要好於[12],但是缺陷是一樣的。

結構化裁剪/稀疏化。最近,[23] 提出了在CNN中用小權重來裁剪通道,然後再微調來提升準確率。[2] 在訓練之前,對各通道間的連接進行隨機失效處理,以此帶來稀疏性,網絡模型要小一些,但是也會造成一部分精度的損失。與這些方法相比,本文方法在訓練過程中對各通道進行稀疏化,通道裁剪要更加平滑,精度損失要小得多。

[37] 在訓練過中進行神經元級別的稀疏化,因此一些神經元可能會被裁剪掉。[35] 提出了結構化稀疏性學習(SSL)方法,對CNN結構的不同級別(濾波器、通道或層)進行稀疏化。這些方法在訓練過程中都利用了分組稀疏正則化(group sparsity regularization)操作,來實現結構化的稀疏。本文方法並沒有藉助分組稀疏操作,而是對各通道的縮放因子進行簡單的 L1 稀疏化,因而實現起來更簡單。

因爲這些方法只對網絡結構的部分(如神經元、通道)進行裁剪或稀疏化,而非網絡的權重,所以它們通常不需要什麼特別的庫(進行稀疏運算)來加快推理速度、節約運行時內存。本文的網絡裁剪方法也屬於這一類,無需特殊的庫來實現。

神經結構學習。儘管SOTA 的CNN 通常是由專家設計的,目前也有一些在自動網絡結構學習上的探索。[20] 提出了在給定資源預算的前提下,進行網絡結構搜索的優化方法。[38, 1] 提出了用增強學習的方法來自動地學習神經網絡結構。這些方法的搜索空間都非常大,因此我們需要訓練上百個模型來分辨好模型和壞模型。本文的網絡裁剪方法也可以看作爲一個網絡結構學習的方法,儘管其選擇的餘地只侷限於每層的寬度內。但是,和前面的方法不同,網絡裁剪僅需訓練一次,就可以學習網絡結構,這和我們對效率的追求是一致的。

3. 網絡裁剪

本文目的是提供一個實現CNN通道稀疏化的簡單方法。這一節中,作者首先探討了通道稀疏化的好處和挑戰,然後討論瞭如何利用 BN 中的縮放因子來高效地識別不重要的通道,並對之進行裁剪。

通道稀疏化的優勢。如[35,23,11]中所述,我們可以在不同的級別上實現稀疏化,如權重級別、卷積核級別、通道級別或網絡層級別。細粒度級別越高(如權重級別),稀疏化越能給我們帶來更高的靈活度和泛化能力,壓縮率也會更高,但是這通常需要特殊的軟件或硬件支撐,來在稀疏化的模型上進行快速推理。相反,細粒度越低(如網絡層級別)就不需要特殊的庫來實現加速,儘管它可能靈活性上差一些,因爲有些層一整層都會被裁剪掉。事實上,移除掉某一層僅當網絡很深時纔有效,比如超過50層。然而,通道級別的稀疏化就在靈活度和實現難度上提供了一個平衡方案。它可以應用在任一CNN或全連接網絡上(將每個神經元看作爲一個通道),這樣裁剪後的網絡就可以看作爲原網絡的一個“減肥”後的版本,在常用的深度學習框架上就可以進行高效率的推理。

挑戰。實現各通道的稀疏化需要對一個通道所有的連接進行裁剪。這就使得直接在預訓練模型上裁剪權重沒用,因爲一個通道的輸入端和輸出端不太可能都是接近0的值。如[23]裏所說的,在預訓練的 ResNet 上進行通道裁剪,在不損失精度的前提下,只能降低約10%10\%的參數量。[35] 通過在訓練過程中加入稀疏正則化解決了這個問題。特別地,他們在訓練時採用了分組 LASSO 方法,將所有對應通道濾波器的權重縮小爲0。但是,該方法需要計算正則項對於所有濾波器權重的梯度,這並不輕鬆。作者提出了一個非常簡單的辦法來解決上述挑戰,具體細節如下。

縮放因子與激勵稀疏的懲罰。本文的想法就是對每個通道都引入一個縮放因子γ\gamma,該因子與其對應通道的輸出相乘。然後我們一起訓練網絡權重和縮放因子,並對後者進行稀疏歸一化。最後,我們對那些因子值較小的通道進行裁剪,並對裁剪後的網絡進行微調。本方法訓練的目標函數爲:

L=(x,y)l(f(x,W),y)+λγTg(γ)L = \sum_{(x,y)} l(f(x, W), y) + \lambda \sum_{\gamma \in \Tau} g(\gamma)

其中(x,y)(x,y)表示訓練的輸入和真值,WW表示訓練權重,第一項對應着CNN的訓練損失,g()g(\cdot) 是對縮放因子進行的稀疏化懲罰,λ\lambda 用於平衡前後項。在實驗中,作者令g(s)=sg(s)=|s|,就是 L1-範數,用於獲取稀疏性。作者使用次梯度下降作爲non-smooth L1 懲罰項的優化方法。我們也可以將 L1 懲罰替換爲 smooth L1 懲罰,這樣在non-smooth 點就可避免使用次梯度。

由於裁剪一個通道基本上就是將它所有的輸入和輸出連接給去掉,我們就可以將網絡變窄(如圖1),而無需藉助任何特殊的稀疏計算庫。縮放因子就是幫我們進行通道選取的媒介。由於縮放因子是和網絡權重一起優化的,網絡就能自動地識別不重要的通道,並將之安全地移除而不會造成精度損失。

在BN層中使用縮放因子。批歸一化(BN)在目前的CNN中廣泛應用,可以提升收斂的速度與泛化能力。BN 對激活值進行歸一化,這啓發了我們將各通道的縮放因子利用起來,設計了一個簡單而有效的方法。BN 層使用 mini-batch 的數據來對內部激活值進行歸一化。設zinz_{in}zoutz_{out}爲BN層的輸入和輸出,BB表示當前的 mini-batch,BN 層進行如下的變換:

z^=zinμBδB2+ϵ;zout=γz^+β\hat z = \frac{z_{in} - \mu_{B}}{\sqrt{\delta^2_B + \epsilon}};\quad z_{out} = \gamma \hat z + \beta

μB\mu_BδB\delta_B 分別是BB輸入激活的平均值和標準方差,γ\gammaβ\beta是仿射變換的參數(縮放和平移),可以將歸一化後的值線性變換至任意的尺度。

在卷積層後插入一個帶有通道縮放和平移參數的 BN 層是常見的操作。因此,我們可以直接將BN層的 γ\gamma 參數作爲縮放因子,用於網絡裁剪。這樣做的優勢就是不會給網絡帶來額外的計算負擔。事實上,對通道剪枝而言,這也可能是學習縮放因子最有效的方式。

  1. 如果我們向一個沒有 BN 層的 CNN 中加入 scaling 層,縮放因子的值是沒法衡量一個通道重要性的,因爲卷積層和 scaling 層都只是線性變換。卷積層的網絡權重變大,縮放因子變小,可以得到一樣的結果。

  2. 如果我們在BN層之前加入 scaling 層,縮放層的作用就會被BN層的歸一化操作完全抵消。

  3. 如果我們在BN層之後插入 scaling 層,該通道就要面對連續兩次的縮放操作。

通道裁剪與微調。在各通道內進行了激勵稀疏的歸一化之後,模型中許多縮放因子的值就變成了0(看圖1)。然後我們就可以對縮放因子近似0的通道進行裁剪,去除其所有的連接和對應的權重。對於所有的層,我們通過一個全局閾值來裁剪通道,該閾值是根據所有縮放因子的值按照一定的比例設定的。例如,要裁剪掉70%70\%的低縮放因子,我們就將其百分比閾值設爲70%70\%。這樣之後,網絡的參數和計算操作量就要少許多,並且節約運行時內存佔用。

裁剪可能會造成一定的精度損失,尤其當裁剪比例較高時,但是我們可以通過隨後的微調來彌補。在很多實驗案例中,相較於原來未剪枝的模型,微調後的剪枝模型可以取得更高的精度。

multi-pass 方案。我們也可以將之從 single pass(訓練過程包括:稀疏正則化、剪枝、微調) 擴展到 multi-pass。裁剪後的網絡會比較窄,我們可以多次地重複該過程,學習一個非常緊湊的模型。該流程如圖2虛線部分所示。實驗結果顯示,multi-pass 方案可以取得更好的壓縮效果。

處理跨層連接與pre-activation結構。上述網絡裁剪過程可以應用在絕大多數的網絡結構上,如 AlexNet、VGGNet。但是當我們將之應用在含有跨層連接pre-activation的結構時,如 ResNet 和 DenseNet,我們就要對之進行一些改動。對於這些網絡,某一層的輸出可能是後續多個層的輸入,這樣BN層就會出現在卷積層之前。這種情況中,在這一層的輸入端就存在稀疏性,即該層有選擇地利用了部分通道。爲了在測試時減少參數量和計算量,我們需要加入一個通道選擇層來遮住那些識別出來的、不重要的通道。

4. 實驗

Pls read paper for more details.

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