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