【剪枝算法】通过网络瘦身学习高效的卷积网络Learning Efficient Convolutional Networks through Network Slimming论文翻译
此論文翻譯僅僅用于自己方便學習。譯文來自其他處。
在許多實際應用中部署深度卷積神經網絡(CNN)很大程度上受到其計算成本高的限制。在本文中,我們提出了一種新的CNNs學習方案,能同時1)減小模型大小; 2)減少運行時內存占用; 3)在不影響準確率的情況下降低計算操作的數量。這種學習方案是通過在網絡中進行通道層次稀疏來實現,簡單而有效。與許多現有方法不同,我們所提出的方法直接應用于現代CNN架構,引入訓練過程的開銷最小,并且所得模型不需要特殊軟件/硬件加速器。我們將我們的方法稱為網絡瘦身(network slimming),此方法以大型網絡作為輸入模型,但在訓練過程中,無關緊要的通道被自動識別和剪枝,從而產生精度相當但薄而緊湊(高效)的模型。在幾個最先進的CNN模型(包括VGGNet,ResNet和DenseNet)上,我們使用各種圖像分類數據集,憑經驗證明了我們方法的有效性。對于VGGNet,網絡瘦身后的多通道版本使模型大小減少20倍,計算操作減少5倍。
近年來,卷積神經網絡(CNN)已成為各種計算機視覺任務的主要方法,例如圖像分類[22],物體檢測[8],語義分割[26]。 大規模數據集,高端現代GPU和新的網絡架構允許開發前所未有的大型CNN模型。 例如,從AlexNet [22],VGGNet [31]和GoogleNet [34]到ResNets [14],ImageNet分類挑戰賽冠軍模型已經從8層發展到100多層。
然而,大型CNN雖然具有更強的代表(表現,提取特征,表征)能力,卻也更耗費資源。 例如,一個152層的ResNet [14]具有超過6000萬個參數,在推測(處理)分辨率為224×224的圖像時需要超過20個Giga的浮點運算(FLOP)-即20G flop的運算量。這在資源受限的情況下不可能負擔得起,如在移動設備,可穿戴設備或物聯網(IoT)設備等平臺上。
CNN在實際應用中的部署主要受以下因素的限制:1)模型大小:CNN的強大表現力來自其數百萬可訓練參數。這些參數以及網絡結構信息需要存儲在磁盤上并在推理期間加載到內存中。例如,存儲一個ImageNet上訓練的典型CNN會占用超過300MB的空間,這對嵌入式設備來說是一個很大的資源負擔。
2)運行時內存(占用情況):在推理期間,即使批量大小為1,CNN的中間激活/響應占用的內存空間甚至可以比存儲模型的參數更多.這對于高端GPU來說不是問題,但是對于許多計算能力低的應用而言是無法承受的。
3)計算操作的數量:在高分辨率圖像的卷積操作上是計算密集的。大型CNN在移動設備上處理單個圖像可能需要幾分鐘,這使得在實際應用中采用大型CNN是不現實的。
許多工作已經提出了壓縮大型CNN或直接學習更有效的CNN模型以進行快速推理。 這些工作包括低秩逼近(這么翻譯正確嗎?)[7],網絡量化[3,12]和網絡二值化[28,6],權重剪枝[12],動態推理[16]等。但是,這些方法大多數只能解決一個或兩個上面提到的挑戰。 此外,一些技術需要專門設計的軟件/硬件加速器來實行加速[28,6,12]。
減少大型CNN資源消耗的另一個方向是稀疏化網絡。 可以對不同級別的結構施加稀疏性[2,37,35,29,25],這產生了相當大的模型大小壓縮和推理加速。 盡管它比[12]中的非結構化稀疏權重矩陣更容易,然而,這些方法通常需要特殊的軟件/硬件加速器來獲得內存增益或節省時間。
在本文中,我們提出了網絡瘦身,這是一種簡單而有效的網絡訓練方案,它解決了在有限資源的條件下應用大型CNN時所面臨的所有挑戰。我們的方法對批量歸一化(BN)層中的縮放因子強加L1正則化,因此很容易實現,而不會對現有CNN架構進行任何更改。通過L1正則化將BN縮放因子的值逼近零使得我們能夠識別不重要的通道(或神經元),因為每個縮放因子對應于特定的卷積通道(或完全連接的層中的神經元)。這有助于在隨后的步驟中進行通道層次的修剪。額外的正則化術語很少會影響性能。實際上,在某些情況下,它會導致更高的泛化精度。修剪不重要的通道有時會暫時降低性能,但是這種影響可以通過修剪網絡的后續調整來補償。修剪后,與初始的大型網絡相比,由此產生的輕量化網絡在模型大小,運行時內存和計算操作方面更加緊湊。上述過程可以重復多次以產生多通道網絡瘦身方案,這能產生更緊湊的網絡。
在幾個基準數據集和不同網絡架構上的實驗表明,我們獲得的CNN模型,其大小壓縮高達20倍,原始計算操作減少5倍,同時實現了相同甚至更高的精度。此外,我們的方法利用傳統硬件和深度學習軟件包實現模型壓縮和推理加速,因此得到的輕量化模型不需要任何稀疏存儲格式或特殊的計算操作。
在本節中,我們將從五個方面討論相關工作。用奇異值分解(SVD)等技術使具有較低秩的矩陣去逼近神經網絡中的權重矩陣[7]。 這種方法在全連接的層上工作得特別好,產生~3倍模型大小的壓縮,但沒有明顯的速度加速,因為CNN中的計算操作主要來自卷積層。
權重量化。 HashNet [3]建議量化網絡權重。 在訓練之前,網絡權重被散列到不同的組,并且在每個組內共享該權重值。 這樣,只需要存儲共享權重和哈希索引,從而可以節省大量的存儲空間。 [12]在深度壓縮流程中使用改進的量化技術,在AlexNet和VGGNet上實現35x到49x的壓縮率。 但是,這些技術既不能節省運行時內存也不能節省推理時間,因為在推理期間,需要將共享權重恢復到其原始位置。
[28,6]將實值權重量化為二進制/三進制權重(權重值限制為{-1,1}或{-1,0,1})。 這樣可以節省大量的模型空間,并且在給定按位運算庫的情況下也可以獲得顯著的加速。 然而,這種積極的(意思是壓縮力度過大?)低位近似方法通常具有一定的精度損失。
權重剪枝/稀疏。 [12]提出在訓練好的神經網絡中修剪不重要的小權重連接。 由此產生的網絡權重大多為零,可以通過以稀疏格式存儲模型來減少存儲空間。 但是,這些方法只能通過專用的稀疏矩陣運算庫和/或硬件實現加速。 運行時內存節省也非常有限,因為大多數內存空間被激活映射(仍然密集)而不是權重消耗。
在[12]中,沒有關于訓練期間如何稀疏的指導。 [32]通過使用額外的門變量明確地對每個權重施加稀疏約束來克服此限制,并通過修剪具有零門值的連接來實現高壓縮率。 該方法實現了比[12]更好的壓縮率,但也存在同樣的缺點。
結構化修剪/稀疏化。 最近,[23]提出在訓練好的CNN中修剪具有較小輸入權重的信道,然后對網絡進行微調以恢復準確性。 [2]通過在訓練之前在卷積層中隨機停用輸入 - 輸出信道連接的方式來引入稀疏性,這能產生具有中等精度損失的較小網絡。 與這些工作相比,我們在訓練期間明確地在優化目標中強加了通道方式稀疏性,導致更平滑的通道修剪過程和很少的準確性損失。
[37]在訓練期間強加神經元水平的稀疏性,因此可以修剪一些神經元以獲得緊湊的網絡。 [35]提出了一種結構化稀疏度學習(SSL)方法,用于稀疏CNN中不同級別的結構(例如濾波器,信道或層)。 兩種方法都在訓練期間利用群組稀疏性規則化來獲得結構化稀疏性。 我們的方法不是在卷積權重上采用群稀疏度,而是在通道方面的縮放因子上強加簡單的L1稀疏性,因此優化目標要簡單得多。
由于這些方法修剪或稀疏網絡結構的一部分(例如,神經元,信道)而不是單獨的權重,它們通常需要較少的專用庫(例如,用于稀疏計算操作)以實現推理加速和運行時存儲器節省。 我們的網絡瘦身也屬于這一類,完全不需要特殊的庫來獲得增益。
神經結構學習。 雖然最先進的CNN通常由專家[22,31,14]設計,但也有一些關于自動學習網絡架構的探索。 [20]引入了用于給定資源預算的網絡架構搜索的子模塊/超模塊優化。 最近的一些工作[38,1]提出通過強化學習自動學習神經結構。 這些方法的搜索空間非常大,因此需要訓練數百個模型來區分好與壞。 網絡瘦身也可以被視為架構學習的一種方法,盡管選擇僅限于每層的寬度。 然而,與上述方法相比,網絡瘦身僅通過一個訓練過程來學習網絡架構,這符合我們的效率目標。
我們的目標是提供一個簡單的方案來實現深度CNN中的信道層次的稀疏。 在本節中,我們首先討論了信道層次稀疏的優勢和挑戰,并介紹了如何利用批量規范化中的擴展層(縮放因子)來有效地識別和修剪網絡中不重要的信道。
通道層次稀疏性的優勢。如在先前的工作[35,23,11]中所討論的,稀疏性可以在不同的層次實現,例如,權重級,內核級,通道級或層級。細粒度級別(例如,權重級別)稀疏性提供最高的靈活性和通用性導致更高的壓縮率,但它通常需要特殊的軟件或硬件加速器來對稀疏模型進行快速推理[11]。相反,粗糙層級稀疏性不需要特殊的包來獲得推理加速,而它不太靈活,因為需要修剪一些整個層。實際上,去除整層僅在模型深度足夠大時才有效,例如,超過50層[35,18]。相比之下,通道層次稀疏性提供了靈活性和易于實現之間的良好折衷。它可以應用于任何典型的CNN或全連接的網絡(將每個神經元視為信道),并且所得到的網絡本質上是未修整網絡的“稀疏”版本,其可以在傳統CNN平臺上被有效地推斷。
挑戰。 實現通道層次稀疏性需要修剪與通道關聯的所有傳入和傳出連接,這使得在預訓練模型上直接修剪權重的方法無效,因為通道的輸入或輸出端處的所有權重不可能恰好具有接近零的值。 如[23]所述,預訓練的ResNets上的通道修剪只能減少參數數量的~10%才不會導致精度損失。 [35]通過將稀疏正規化強制納入訓練目標來解決這個問題。 具體而言,他們采用組LASSO在訓練期間將所有對應于同一通道的濾波器權重同時逼近零。 然而,這種方法需要相對于所有濾波器權重來計算附加正則化項的梯度,這是非常重要的。 我們引入一個簡單的想法來解決上述挑戰,詳情如下。
縮放因素和稀疏性懲罰。 我們的想法是為每個通道引入一個比例因子γ,它乘以該通道的輸出。 然后我們聯合訓練網絡權重和這些比例因子,并對后者施加稀疏正則化。 最后,我們修剪這些小因子通道,并調整修剪后的網絡。 具體而言,我們的方法的訓練目標是:
其中(x,y)表示訓練輸入和目標,W表示可訓練的權重,第一個和項對應于CNN的正常訓練損失,g(·)是比例因子的稀疏性引起的懲罰,以及 λ平衡這兩個損失。 在我們的實驗中,我們選擇g(s)= | s |,它被稱為L1范數并廣泛用于實現稀疏性。 采用次梯度下降作為非光滑L1懲罰項的優化方法。 另一種選擇是將L1懲罰替換為平滑L1懲罰[30],以避免在非平滑點使用子梯度。
修剪一個通道基本上對應于刪除該通道的所有傳入和傳出連接,我們可以直接獲得一個輕量化的網絡(見圖1),而不需要使用任何特殊的稀疏計算包。 縮放因子充當頻道選擇的代理。 由于它們與網絡權重共同優化,因此網絡可以自動識別無關緊要的通道,這些通道可以安全地移除而不會極大地影響泛化性能。
利用BN圖層中的縮放因子。 批量歸一化[19]已被大多數現代CNN采用作為實現快速收斂和更好的泛化性能的標準方法。 BN規范化激活的方式促使我們設計一種簡單有效的方法來合并通道方式的縮放因子。 特別地,BN層使用小批量統計來標準化內部激活。 令zin和zout為BN層的輸入和輸出,B表示當前的小批量,BN層執行以下轉換:
其中μB和σB是B上輸入激活的平均值和標準偏差值,γ和β是可以通過訓練變換的參數(比例和偏移),這提供了將歸一化激活線性轉換到任何尺度的可能性。
通常的做法是在卷積層之后插入BN層,保留通道縮放/移位參數。因此,我們可以直接利用BN層中的γ參數作為網絡瘦身所需的比例因子。它具有不向網絡引入任何開銷的巨大優勢。事實上,這也許是我們學習有用的通道修剪縮放因子的最有效方法。 1),如果我們將縮放層添加到沒有BN層的CNN,則縮放因子的值對于評估通道的重要性沒有意義,因為卷積層和縮放層都是線性變換。通過放大卷積層中的權重的同時減小縮放因子值,可以獲得相同的結果。 2),如果我們在BN層之前插入縮放層,縮放層的縮放效果將被BN中的歸一化處理完全取消。 3),如果我們在BN層之后插入縮放層,則每個通道有兩個連續的縮放因子。
通道剪枝和微調。 在通道層次稀疏誘導正則化訓練之后,我們獲得了一個模型,其中許多比例因子接近于零(見圖1)。 然后我們可以通過刪除所有傳入和傳出連接以及相應的權重來修剪具有接近零比例因子的通道。 我們使用全局閾值在所有層上修剪通道,其被定義為所有比例因子值的特定百分位數。 例如,我們通過選擇百分比閾值為70%來修剪具有較低縮放因子的70%通道。 通過這樣做,我們獲得了一個更緊湊的網絡,具有更少的參數和運行時內存,以及更少的計算操作。當修剪比例高時,修剪可能暫時導致一些精確度損失。 但是,這可以通過修剪網絡上的后續微調過程得到很大程度的補償。 在我們的實驗中,在許多情況下,微調的輕量化網絡甚至可以實現比原始未修網絡更高的精度。
多通道方案。 我們還可以將所提出的方法從單程學習方案(具有稀疏正則化,修剪和微調的訓練)擴展到多程方案。 具體而言,網絡瘦身過程導致網絡狹窄,我們可以再次應用整個訓練程序來學習更緊湊的模型。 這由圖2中的虛線說明。實驗結果表明,這種多次通過方案可以在壓縮率方面產生更好的結果。
處理跨層連接和預激活結構。 上面介紹的網絡瘦身過程可以直接應用于大多數簡單的CNN架構,如AlexNet [22]和VGGNet [31]。 當它應用于具有跨層連接的現代網絡和預激活設計(如ResNet [15]和DenseNet [17])時,需要進行一些調整。 對于這些網絡,層的輸出可以被視為多個后續層的輸入,其中BN層被放置在卷積層之前。 在這種情況下,在層的輸入端實現稀疏性,即,該層選擇性地使用它接收的通道子集。 為了在測試時獲得參數和計算節省,我們需要設置一個通道選擇層來屏蔽我們識別出的無關緊要的通道。
我們經驗性地證明了網絡瘦身對幾個基準數據集的有效性。 我們基于[10]的ResNets的公開可用的Torch 版本[5]實現來驗證我們的方法。 該代碼可在https://github.com/liuzhuang13/slimming獲得
總結
以上是生活随笔為你收集整理的【剪枝算法】通过网络瘦身学习高效的卷积网络Learning Efficient Convolutional Networks through Network Slimming论文翻译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程环境检测系统中是否存在死锁
- 下一篇: 自定义configureMessageC