轉載自:https://blog.csdn.net/h__ang/article/details/89376079
亮點:ICCV 2017
論文連結:https://arxiv.org/abs/1708.06519
官方代碼(Torch實作):https://github.com/liuzhuang13/slimming
第三方代碼(PyTorch實作):https://github.com/foolwood/pytorch-slimming
摘要
在許多現實應用中,深度神經網絡的部署由于其高額的計算成本變得很困難。在這篇論文中,我們提出了一種新穎的CNNs學習方案,它同時滿足:
減小模型大小;
減少運作時的記憶體占用;
在不影響精度的同時,降低計算操作數;
利用通道稀疏化這樣一個簡單但卻有效的方法,上面的條件很容易獲得。不同于許多已經存在的方法,我們的方法可以直接應用到現代CNN網絡架構中,在訓練過程引入最小的花銷,而且不需要其他特殊的軟硬體加速器。我們将我們的方法稱為“網絡瘦身”,輸入模型是一個寬大的網絡,但是在訓練期間不重要的通道可以被自動鑒别,随後删除,進而在幾乎沒有精度損失的情況下得到一個瘦且緊湊的網絡。我們通過幾個最先進的CNN模型,包括VGGNet、ResNet、DenseNet,在幾種不同的圖像分類資料集上展示了我們的方法的有效性。對于VGGNet,網絡瘦身的Muti-pass方案(實質上就是将網絡瘦身這個過程多重複幾次)使得在模型大小上壓縮了20x,在計算量上面壓縮了5x。
1. Introduction
CNN網絡在現實應用中的部署主要面臨三大挑戰:
- 模型大小:CNN優異的性能表現來源于上百萬可訓練的參數。那些參數和網絡結構資訊需要被存儲到硬碟,然後在推理期間加載到記憶體中。舉個例子,一個在ImageNet上預訓練好的模型需要超過300M空間,這對于嵌入式裝置來說是一個很大的負擔;
- 運作時間占用記憶體:在推理期間,CNN的中間激活值/響應存儲空間甚至需要比存儲模型參數的大,即使batchsize是1.這對于高性能的GPU來說不是問題,但對于低計算能力的許多應用來說這是不可承擔的;
-
計算量:在高分辨率圖檔上卷積操作可能會計算密集,一個大的CNN在嵌入式裝置上可能要花費幾分鐘來處理一張單個圖檔,這使得在真實應用中采用很不現實;
許多工作都已經被提出來壓縮大的CNN模型,使其可以直接學習更高效的模型來做快速推理。這些方法包括低秩近似、網絡量化、二值化、權重剪枝、動态推理等。然而,它們都隻能解決上面提到的一到兩個挑戰,而且,這些技術需要特别設計專門的軟硬體加速器來執行加速。
減少大的CNN資源消耗的另一個方向就是稀疏化網絡,在不同結構層次上稀疏化,會産生可觀的模型大小壓縮和推理的加速。然而,這些方法通常需要特别的軟硬體加速器來獲得記憶體和時間上的節省,盡管這已經比非結構稀疏化權重矩陣容易的多。
在這篇論文中,我們提出了網絡瘦身,它解決了前面提到的所有挑戰。我們的方法是将L1正則化施加到BN層的縮放因子上,L1正則化推動BN層的縮放因子趨向于零,這使得我們能夠鑒别出不重要的通道或者神經元,因為每一個縮放因子都和一個特定的CNN卷積通道(或者全連接配接層的一個神經元)相關聯。這有助于後續的通道剪枝,另外正則化也很少損傷性能,甚至一些情況下它會導緻更高的泛化準确率,剪掉不重要的通道有時候雖然會暫時降低性能,但是通過之後對剪枝網絡的微調可以對精度補償。在剪枝之後,更窄的網絡會在模型大小、運作階段的記憶體占用、計算量方面都會更顯得緊湊。将上面的過程重複幾次,就可以通過多階段的網絡瘦身獲得更緊湊的模型。
在幾個基準資料集和不同的網絡架構上的實驗表明我們可以将CNN模型大小壓縮20倍、計算量壓縮5倍,同時實作相同甚至更高的準确度。而且,我們的方法使用傳統硬體和深度學習軟體包實作模型壓縮和推理加速。
2. 相關工作
在本節我們将從五個方面讨論相關工作:
- 低秩分解:“Exploiting linear structure within convolutional networks for efficient evaluation”這篇工作中使用像奇異值分解(SVD)這樣的低秩近似技術,但是這種方法主要是在全連接配接層的表現比較好,可以将模型大小壓縮3倍,但是沒有明顯的速度加速,因為CNN的計算量主要是來自卷積層;
-
權重量化:“Compressing neural networks with the hashing trick”這篇工作中的HashNet提出了量化網絡權重,在訓練之前,網絡權重被分為不同的組,在每一個組内的權重共享權值。按照這種方法,隻有共享的權重值和哈希索引需要被存儲,是以可以節省大量的存儲空間。在深度壓縮中使用提高的量化技術在AlexNet和VGGNet上實作了 35x-49x 的壓縮比。然而,這些技術既不能節省運作時的記憶體,又不能節省推理時間,因為在推理期間,共享的權重需要被恢複到原來的位置(相當于還多了個解碼的過程)。
“Imagenet classification using binary convolutional neural networks” 和“Training deep
neural networks with weights and activations constrained to+1 or-1”将真實的權重值量化為二值/三值化權重(即将真實值限制為{-1,1}或{-1,0,1}),這極大的壓縮了模型大小,同時由于位操作庫的使用速度也很快。然而,這種激進的低位近似方法通常會伴随着相當的精度損失。
-
權重剪枝/稀疏化:韓松之前的“Learning both weights and connections for efficient neural network.”這篇工作中,提出了在訓練網絡中剪枝掉不重要的連接配接關系,這樣的話網絡中的權重大多數變成了0,可以使用一種稀疏的模式存儲模型。然而,這些方法需要專門的稀疏矩陣運算庫或硬體來做加速,運作時的記憶體占用節省非常有限,因為産生的激活值仍然是密集的。
韓松的這篇工作在訓練期間沒有給稀疏化任何指導,“Training sparse neural networks”這篇工作中通過給每個權重引入額外的門變量強加了稀疏限制,實作了更高的壓縮比率。但是其仍然沒有解決上面的缺點。
-
結構剪枝/稀疏化:目前,"Pruning filters for efficient convnets"提出了在訓練CNNs時剪枝通道,然後通過微調來恢複精度;"The power of sparsity in convolutional neural networks"在訓練之前,通過随機抛棄channel-wise的連接配接引入稀疏化,也得到了一個更小的網絡;與這些網絡相比,我們是在訓練過程中将channel-wise稀疏化強加到優化目标函數中,導緻了一種更平滑的通道剪枝過程和比較的小的精度損失。
"Towards compact cnns"在訓練期間引入神經元級别的稀疏化,是以一些神經元會被剪掉進而獲得緊湊的網絡。"Learning structured sparsity in deep neural networks"提出了一種SSL方法來對結構的不同層級稀疏化。這兩種方法都在訓練時使用了"組稀疏正則化"來獲得結構稀疏化,與前面的方法不同,我們的方法将簡單的L1稀疏化強加到channel-wise的縮放因子上,優化目标更加簡單。
由于這些方法都是對網絡結構的(channels,neurons等)一部分做剪枝或稀疏化,而不是對個别權重,是以它們不太需要特别的庫來實作推理加速和運作時的記憶體節省。我們的網絡瘦身就屬于這個類别,完全不需要其他的特定庫支撐。
- 神經結構學習:最先進的模型比如VGG、GoogleNet、ResNet等通常都是由專家設計的,也有一些在自動學習網絡結構方面的探索,"Neural network architecture optimization through submodularity and supermodularity"在有限的資源預算下,為網絡結構搜尋引入了子子產品/超子產品;"Neural architecture search with reinforcement learning"和"Designing neural network architectures using reinforcement learning"這兩篇工作提出了使用強化學習自動學習神經網絡結構,這些方法的搜尋空間非常大,是以常常需要從上百個模型中辨識好壞,網絡瘦身可以看作是一種結構學習的方法,盡管對于每個層的寬度選擇非常有限,然而,與前面的方法相比,網絡瘦身僅通過單個訓練過程就學習到網絡結構,這是十分高效的。
-
網絡瘦身
我們提供了一種簡單的方案來實作通道級稀疏化。在本節,我們首先讨論通道級稀疏化的優勢和遇到的挑戰,然後介紹我們利用BN的縮放層來高效鑒别和剪枝不重要的層。
channel-wise稀疏化的優勢:正如之前讨論的,稀疏化可以在不同級别實作(weight-level,kernel-level,channel-level,layer-level)。細粒度的稀疏化(weight-level)由最高的靈活性和泛化性能,也能獲得更高的壓縮比率,但是它通常需要特殊的軟硬體加速器才能在稀疏模型上快速推理。相反,粗粒度 layer-level稀疏化不需要特殊的包做推理加速,但是它靈活性上不如細粒度。事實上,隻有深度足夠深(超過50層),移除某些層才會很高效。相比之下,channel-wise稀疏化在靈活性和實作上做了一個平衡,它可以被應用到任何典型的CNN或者全連接配接層(将每個神經元看作一個通道),由此得到的網絡本質上也是一個瘦的網絡,可以在卷積CNN平台上快速推理。
挑戰:實作通道稀疏化需要将和一個通道有關聯的所有輸入和輸出的連接配接都剪掉,但是對于已經預訓練好的一個模型來說,不太可能做大這點,是以這個對已經預訓練好的模型做通道剪枝效率不高,比如對預訓練好的ResNet做通道剪枝,在不損傷準确率的情況下,隻能減少10%的參數量。"Learning structured sparsity in deep neural networks"這篇文章中通過将稀疏正則化強加到訓練目标函數中,具體來講,就是采用group Lasso來使得所有filters的同一個通道在訓練時同時趨于0。然而,這個方法需要額外計算新引入的和所有filters有關的梯度項,這是一個問題。
縮放因子和稀疏性懲罰:我們的注意是對每一個通道都引入一個縮放因子γ ,然後與通道的輸出相乘。接着聯合訓練網絡權重和這些縮放因子,最後将小縮放因子的通道直接剪除,微調剪枝後的網絡。特别地,我們的方法的目标函數定義為:
(x,y)是訓練輸入和目标,W是網絡中可訓練參數,第一項是CNN網絡的訓練損失函數,g(.)是在縮放因子上的懲罰項,λ是兩項的平衡因子。在我們的實驗中,我們選擇g(s)=|s|,即L1-正則化,被廣泛地用于稀疏化。次梯度下降法作為不平滑(不可導)的L1懲罰項的優化方法,另一個建議是使用平滑的L1正則項取代L1懲罰項,盡量避免在不平滑的點使用次梯度。
次梯度的介紹連結:https://blog.csdn.net/qq_32742009/article/details/81704139
剪掉一個通道的本質是要剪掉所有與這個通道相關的輸入和輸出連接配接關系,我們可以直接獲得一個窄的網絡(Figure 1),而不需要借用任何特殊的稀疏計算包。縮放因子扮演的是通道選擇的角色,因為我們縮放因子的正則項和權重損失函數聯合優化,網絡自動鑒别不重要的通道,然後移除掉,幾乎不影響網絡的泛化性能。
利用BN層的縮放因子:BN層已經被大多數現代CNN網絡采用,作為一種标準的方法來使得網絡快速收斂并獲得更好的性能。BN歸一化激活值的方法給了我們設計一種簡單高效的方法的靈感,即與channel-wise縮放因子的結合。尤其是,BN層使用mini-batch的統計特性對内部激活值歸一化。zin和zout分别是BN層的輸入和輸出,B指代現在的minibatch,BN層執行下面的轉換:
通常的做法是在卷積層之後插入一個BN層,引入channel-wise的縮放/平移參數。是以,我們直接将BN層的γ 參數作為我們網絡瘦身的縮放因子,這樣做的一個優勢在于沒有給網絡帶來額外的花銷。事實上,這也可能是我們能夠學習到的最有意義的做通道剪枝的縮放因子:
- 如果我們不使用BN層,而在卷積層之後加入一個縮放層,縮放因子的值對于評估一個通道的重要性沒有任何意義,因為卷積層和縮放層就是一種線性變換而已。我們可以通過一方面降低縮放因子的值一方面方法卷積層的權重來使最終的結果保持不變;
- 如果我們在BN層之前插入一個縮放層,縮放層的影響将完全被BN層所掩蓋;
- 如果在BN層之後插入一個縮放層,那麼對于每個通道将會有兩個連續的縮放因子;
通道剪枝和微調:引入縮放因子正則項之後,我們得到的模型中許多縮放因子都會趨于0(如Figure 1所示)。然後我們剪掉接近零的縮放因子對應的通道,這裡說的再清楚一點,假設經過卷積之後的feature map 的次元為 h x w x c,h和w分别為特征圖的高和寬,c為通道數,将其送入BN層會得到歸一化之後的特征圖,c個feature map中的每一個都對應一組γ 和λ ,前面所說的剪掉小的γ對應的通道實質上就是直接剪掉這個feature map對應的卷積核。至于什麼樣的γ 算小的呢?這個取決于我們為整個網絡所有層設定的一個全局門檻值,它被定義為所有縮放因子值的一個比例,比如我們将剪掉整個網絡中70%的通道,那麼我們先對縮放因子的絕對值排個序,然後取從小到大排序的縮放因子中70%的位置的縮放因子為門檻值,通過這樣做,我們就可以得到一個較少參數、運作時占記憶體小、低計算量的緊湊網絡。
Muti-pass方案:我們可以将我們提出的方法從單階段的學習方案擴充到多階段,what meaning?通俗來講,就是多次進行“網絡瘦身”,這樣可以得到一個更緊湊的模型。如Figure 2所示:
處理跨層的連接配接和預激活結構:上面介紹的網絡瘦身過程可以直接用到大多數比較簡單的CNN結構,如AlexNet、VGGNet等。但是對于有跨層連接配接和預激活設計的網絡ResNet和DenseNet等,又應該如何使用這個方法呢?對于這些網絡,每一層的輸出會作為後續多個層的輸入,且其BN層是在卷積層之前,在這種情況下,稀疏化是在層的輸入末端得到的,一個層選擇性的接受所有通道的子集去做下一步的卷積運算。為了在測試時節省參數和計算量,我們需要放置一個通道選擇層鑒别出重要的通道。
4. 實驗
4.1 CIFAR和SVHN上的結果
4.2 Parameter and FLOP reductions
4.3 Results on ImageNet and MNIST
Results for Multi-pass Scheme
5. 分析
在網絡瘦身中有兩個關鍵的超參數,剪枝百分比t 和 稀疏正則項系數γ \gammaγ,下面我們來具體分析它們的影響:
剪枝百分比的影響:t設定的過小,節省的資源會很有限,設定的過大,剪掉太多的通道會給準确率帶來永久性損傷,無法通過後續的微調恢複;我們在CIFAR-10上訓練了一個DenseNet-40模型,γ=10-5 ,Figure 5展示了結果:
通道稀疏正則化的影響:Figure 4展示的時不同的γ \gammaγ取值下,縮放因子值的分布情況。可以看到λ=10-4時,幾乎所有的縮放因子值都掉到了一個接近零的區域,這個過程中可以看成是一種類似于網絡中間層的選擇過程,隻有不可忽視的縮放因子對應的通道才會被選擇。我們進一步通過熱力圖對這個過程可視化,Figure 6展示的是VGGNet的某一層縮放因子的幅值随疊代次數的變化情況,每個通道開始的初始權重相同,縮放因子值也相同,随着訓練的進行,一些通道的縮放因子會逐漸變大(變亮),一些變小(變暗)。