DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN CODING 論文筆記
- 摘要
神經網絡既是計算密集型又是內存密集型,使得它們難以部署在具有有限硬件資源的嵌入式系統上。為了解決這個限制,我們引入了“深度壓縮”,一個三階段流水線:修剪,訓練量化和霍夫曼編碼,它們協同工作以減少神經網絡的存儲需求,在不影響他們的準確性的基礎上能夠壓縮35到49倍。我們的方法首先通過僅學習重要的連接來修剪網絡。接下來,我們量化權重以強制權重共享,最後,我們應用霍夫曼編碼。在前兩步之後,我們重新訓練網絡以微調剩余的連接和量化的質心。修剪,減少連接數量9到13倍。量化,然後將表示每個連接的位數從32減少到5.在ImageNet數據集上,我們的方法將AlexNet所需的存儲空間減少了35倍,從240MB減少到6.9MB,而不會降低精度。我們的方法將VGG-16的尺寸縮小了49倍,從552MB到11.3MB,再次沒有損失準確性。這允許將模型擬合到片上SRAM緩存而不是片外DRAM存儲器。我們的壓縮方法還有助於在應用程序的大小和下載帶寬受限的移動應用程序中使用復雜的神經網絡。基於CPU,GPU和移動GPU的基準測試,壓縮網絡能做到3到4倍分層加速和3到7倍更好的能源效率。
- 網絡剪枝
網絡修剪已被廣泛研究以壓縮CNN模型。 在早期工作中,網絡修剪被證明是降低網絡復雜性和過度擬合的有效方法(LeCun等,1989; Hanson&Pratt,1989; Hassibi等,1993; Strom,1997)。 最近Han等人(2015年)修剪了最先進的CNN模型,沒有損失準確性。 我們建立在這種方法之上。 如圖1左側所示(圖請見論文),我們首先通過正常的網絡訓練學習連接。 接下來,我們修剪小權重連接:從網絡中刪除權重低於閾值的所有連接。 最後,我們重新訓練網絡以了解剩余稀疏連接的最終權重。 對於AlexNet和VGG-16模型,修剪將參數數量減少了9和13倍。
我們使用壓縮稀疏行(CSR)或壓縮稀疏列(CSC)格式存儲由修剪產生的稀疏結構,該格式需要2a + n + 1個數字,其中a是非零元素的數量,n是行或列的數量。
為了進一步壓縮,我們存儲索引差而不是絕對位置,用卷積層的8位和fc層的5位來編碼差值。 當我們需要一個大於界限的索引差時,我們的零填充解決方案如圖2所示(圖請見論文):如果差值超過8,最大的3位(作為示例)無符號數,我們添加填充零。
- 訓練量化和權重共享
網絡量化和權重共享通過減少表示每個權重所需的比特數來進一步壓縮修剪的網絡。 我們通過讓多個連接共享相同的權重來限制我們需要存儲的有效權重的數量,然後微調這些共享權重。
權重分配如圖3所示。假設我們有一個有4個輸入神經元和4個輸出神經元的層,權重是4X4矩陣。 在左上方是4X4權重矩陣,在左下方是4X4梯度矩陣。 權重被量化為4個區間(用4種顏色表示),同一個區間中的所有權重共享相同的值,因此對於每個權重,我們需要僅將小的索引存儲到共享權重表中。 在更新期間,所有漸變按顏色分組並且相加在一起,乘以學習速率並從上次叠代中的共享質心中減去。 對於經過修剪的AlexNet,我們能夠為每個CONV層量化為8位(256個共享權重),並為每個FC層量化5位(32個共享權重),而不會有任何精度損失。
為了計算壓縮率,給定k個簇,我們只需要log2(k)位來編碼索引。 通常,對於具有n個連接的網絡,並且每個連接用b比特表示,將連接約束為僅具有k個共享權重將導致以下壓縮率:(公式見論文)
例如,圖3顯示了具有四個輸入單元和四個輸出單元的單層神經網絡的權重。 最初有4X4 = 16個權重,但只有4個共享權重:類似的權重被組合在一起以共享相同的值。 最初我們需要存儲16個權重,每個權重有32位,現在我們只需要存儲4個有效權重(藍色,綠色,紅色和橙色),每個有32位,再加上16個2位索引,壓縮率為16X32 =(4X32 + 2X16)= 3.2
- 權重共享
我們使用k均值聚類來識別訓練網絡的每個層的共享權重,以便落入同一群集的所有權重將共享相同的權重。 權重不是跨層共享的。 我們分割n個原始權重W 到k個聚類中心,以便最小化參數與聚類中心的平方和(WCSS):(公式見論文)
與HashNet不同(Chen et al。,2015),哈希的權重共享是在網絡看到任何訓練數據之前由哈希函數確定的,我們的方法在網絡完全訓練之後確定權重共享,使得共享權重接近原始網絡。
- 初始化共享權重
質心初始化會影響聚類的質量,從而影響網絡的預測準確性。 我們研究了三種初始化方法:Forgy(隨機),基於密度和線性初始化。 在圖4中,我們繪制了AlexNet中的conv3層的原始權重分布(CDF為藍色,PDF為紅色)。 網絡修剪後,權重形成雙峰分布。 在底部,它用3種不同的初始化方法繪制有效權重(質心)(以藍色,紅色和黃色顯示)。 在此示例中,有13個集群。
Forgy(隨機)初始化從數據集中隨機選擇k個觀測值並將其用作初始質心。 初始化的質心以黃色顯示。 由於雙峰分布中存在兩個峰,因此Forgy方法傾向於集中在這兩個峰周圍。
基於密度的初始化線性地將權重的CDF在y軸上間隔開,然後找到與CDF的水平交點,最後在x軸上找到垂直交點,其變為質心,如藍點所示。 這種方法使質心在兩個峰值周圍更密集,但比Forgy方法更加分散。
線性初始化線性地將原始權重的[min,max]之間的質心隔開。 這種初始化方法對於權重的分布是不變的,並且與前兩種方法相比是最分散的。
較大的重量比較小的重量起著更重要的作用(Han et al。,2015),但這些較大的重量較少。 因此,對於Forgy初始化和基於密度的初始化,非常少的質心具有大的絕對值,這導致這些少量大權重的不良表示。 線性初始化不會遇到此問題。 實驗部分比較了聚類和微調後不同初始化方法的準確性,表明線性初始化效果最好。
- 前向傳播和反向傳播
一維k均值聚類的質心就是是“共享權重”。 在前饋階段和反向傳播階段期間存在一級間接查找權重表。 為每個連接存儲共享權重表的索引。 在反向傳播期間,計算每個共享權重的梯度並用於更新共享權重。 該過程如圖3所示。(圖見論文)
- 哈夫曼編碼
霍夫曼代碼是通常用於無損數據壓縮的最佳前綴代碼(Van Leeuwen,1976)。 它使用可變長度碼字來編碼源符號。 哈夫曼表來自每個符號的發生概率。 更常見的符號用更少的比特表示。
圖5顯示了AlexNet中量化權重的概率分布和最後一個完全連接層的稀疏矩陣索引。 兩種分布都是有偏差的:大多數量化權重分布在兩個峰值周圍; 稀疏矩陣索引差異很少超過20.實驗表明,對這些非均勻分布值進行編碼的霍夫曼可以節省20%~30%的網絡存儲量。
- 實驗
我們修剪,量化和霍夫曼編碼了四個網絡:兩個在MNIST上,兩個在ImageNet數據集上。 修剪前後的網絡參數和精度如表1(見論文)所示。壓縮管道在不同網絡中將網絡存儲空間節省35到49,而不會降低精度。 AlexNet的總大小從240MB減少到6.9MB,這足夠小,可以放入SRAM上,無需將模型存儲在耗能的DRAM內存中。
使用Caffe框架進行訓練(Jia et al。,2014)。 通過向blob添加掩碼來實現修剪,以掩蓋已修剪連接的更新。 通過維護存儲共享權重的碼本結構以及在計算每個層的梯度更新索引之後來實現量化和權重共享。 每個共享權重都使用與之相關的所有梯度進行更新。 霍夫曼編碼不需要訓練,並且在完成所有微調之後離線實施。
- MNIST數據集上的LENET-300-100和LENET-5框架
我們首先使用LeNet-300-100和LeNet-5網絡對MNIST數據集進行了實驗(LeCun等,1998)。 LeNet-300-100是一個完全連接的網絡,有兩個隱藏層,分別有300和100神經元,在mnist數據集上只有1.6%的錯誤率。
LeNet-5是一個卷積網絡,具有兩個卷積層和兩個完全連接的層,在Mnist上只有0.8%的錯誤率。 表2和表3顯示了壓縮過程的統計信息。 壓縮率包括碼本和稀疏索引的開銷。 大部分節省來自修剪和量化(壓縮32X),而霍夫曼編碼提供邊際增益(壓縮40X)
- IMAGENET數據集上的ALEXNET框架
我們在ImageNet ILSVRC-2012數據集上進一步檢查深度壓縮的性能,該數據集具有1.2M訓練樣例和50k驗證樣例。 我們使用AlexNet Caffe模型作為參考模型,該模型具有6100萬個參數,並且實現了top1精度57.2%和top5精度80.3%。 表4(見論文)顯示,AlexNet可以壓縮到其原始大小的2.88%,而不會影響準確性。 每個CONV層中有256個共享權重,它們用8比特編碼,每個FC層有32個共享權重,僅用5比特編碼。 相對稀疏的索引用4位編碼。 壓縮的霍夫曼編碼額外壓縮了22%,總共壓縮了35倍。
- IMAGENET數據集上的VGG-16框架
看到在AlexNet上的有希望的結果,我們還在同一個ILSVRC-2012數據集上驗證了更大更新的網絡VGG-16(Simonyan&Zisserman,2014)。 VGG-16具有更多的卷積層,但仍然只有三個完全連接的層。 按照類似的方法,我們積極壓縮卷積層和完全連接層,以實現有效權重數量的顯著減少,如表5所示(見論文)。
VGG16網絡整體壓縮了49倍。 CONV層中的權重用8bits表示,FC層使用5bits,這不會影響精度。 兩個最大的完全連接層每個都可以修剪到其原始尺寸的不到1.6%。 這種減少對於實時圖像處理至關重要,在圖像處理中這些圖層的重復使用很少(與批處理不同)。 這對於快速物體檢測算法也很關鍵,其中許多FC通道使用一個CONV通道。 減少的層將適合在SRAM上使用並滿足適度的帶寬要求。 如果沒有減少,帶寬要求就會受到限制。
- 討論
- 剪枝和量化協同工作
圖6(見論文)顯示了在一起或單獨進行修剪和量化的不同壓縮率下的精度。 當單獨工作時,如紫色和黃色線所示,當壓縮到原始尺寸的8%以下時,修剪網絡的準確度開始顯著下降; 當壓縮低於其原始大小的8%時,量化網絡的準確度也開始顯著下降。 但是當組合時,如紅線所示,網絡可以壓縮到原始大小的3%而不會損失準確性。 在最右側比較了SVD的結果,這是方便實現但壓縮率差的。
圖7中的三個圖顯示了CONV層(左),FC層(中)和所有層(右)的每個連接的bits減少時精度如何下降。 每個圖都報告了top1和top5的準確度。 虛線僅應用量化但沒有修剪; 實線同時進行量化和修剪。 兩者之間差別很小。 這表明修剪和量化協同工作得很好。
量化在修剪網絡上運行良好,因為未經修剪的AlexNet有6000萬個權重進行量化,而被修剪的AlexNet只有670萬個權重進行量化。 給定相同數量的質心,後者具有較少的誤差。
圖7中的前兩個圖表顯示CONV層比FC層需要更多的精度。 對於CONV層,精度顯著下降到4bits以下,而FC層更穩健:直到2bits才能顯著降低精度。
- 中心初始化
圖8比較了三種不同初始化方法相對於top1精度(左)和top5精度(右)的準確性。 如x軸所示,網絡被量化為2~8bits。 除了在3bits外,線性初始化在所有情況下都優於密度初始化和隨機初始化。
線性初始化的初始質心在x軸上均勻分布,從最小值到最大值。 這有助於保持較大的權重,因為較大的權重比較小的權重發揮更重要的作用,這也在Han等人(2015年)的網絡修剪工作中顯示。 隨機和基於密度的初始化都不保留大的質心。 使用這些初始化方法,大權重被聚集到小質心,因為很少有大權重。 相反,線性初始化允許大權重更好地形成大質心。
- 速度和能源效率
Deep Compression針對在移動設備上運行的極其看重延遲的應用程序,這需要實時推斷,例如在自動駕駛汽車內的嵌入式處理器上進行行人檢測。 等待批處理組裝會顯著增加延遲。 因此,在對性能和能效進行基準測試時,我們考慮批量大小為1的情況。批量處理的情況見附錄A.
完全連接層是模型大小的主要部分(超過90%)並且通過深度壓縮這部分(在VGG-16中修剪的96%權重)得到最大壓縮。 在諸如快速R-CNN(Girshick,2015)的最先進的目標檢測算法中,在未壓縮模型上的FC層上消耗高達38%的計算時間。 因此,對FC層進行基準測試很有意思,看看深度壓縮對性能和能量的影響。 因此,我們在AlexNet和VGG-16的FC6,FC7,FC8層上設置了我們的基準。 在非批處理的情況下,激活矩陣是僅具有一列的向量,因此計算分別歸結為原始/修剪模型的密集/稀疏矩陣 - 向量乘法。 由於CPU和GPU上的當前BLAS庫不支持間接查找和相對索引,因此我們沒有對量化模型進行基準測試。
我們比較了三種不同的現成硬件:NVIDIA GeForce GTX Titan X和Intel Core i7 5930K作為臺式機處理器(與NVIDIA Digits Dev Box相同)和NVIDIA Tegra K1作為移動處理器。 為了在GPU上運行基準測試,我們使用cuBLAS GEMV作為原始密集層。 對於修剪的稀疏層,我們以CSR格式存儲稀疏矩陣,並使用cuSPARSE CSRMV內核,該內核針對GPU上的稀疏矩陣向量乘法進行了優化。 為了在CPU上運行基準測試,我們使用MKL CBLAS GEMV作為原始密集模型,使用MKL SPBLAS CSRMV作為修剪後的稀疏模型。
為了比較不同系統之間的功耗,以一致的方式測量功率非常重要(NVIDIA,b)。 對於我們的分析,我們正在比較整個應用處理器(AP)/ SOC和DRAM組合的預調節功率。 在CPU上,基準測試使用單個Haswell-E類Core i7-5930K處理器在單個插槽上運行。 CPU插槽和DRAM電源由英特爾提供的pcm-power實用程序報告。 對於GPU,我們使用nvidia-smi實用程序來報告Titan X的功能。對於移動GPU,我們使用Jetson TK1開發板並使用功率計測量總功耗。 我們假設15%的AC到DC轉換損耗,85%的穩壓器效率以及外圍組件(NVIDIA,a)消耗15%的功率來報告Tegra K1的AP + DRAM功率。
DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN CODING 論文筆記