SqueezeNet
雖然網絡性能得到了提高,但隨之而來的就是效率問題(AlexNet VGG GoogLeNet Resnet DenseNet)?
效率問題主要是模型的存儲問題和模型進行預測的速度問題.
Model Compression:
- 從模型權重數值角度壓縮
- 從網絡架構角度壓縮
對于效率問題,通常的方法即在已經訓練好的模型上進行壓縮,使得網絡攜帶更少的網絡參數,從而解決內存問題,同時解決速度問題。
相比于在已經訓練好的模型上進行處理,輕量化模型模型設計則是另辟蹊徑。輕量化模型設計主要思想在于設計更高效的「網絡計算方式」(主要針對卷積方式),從而使網絡參數減少的同時,不損失網絡性能。
- 已訓練好的模型上做裁剪 (剪枝、權值共享、量化、神經網絡二值化)
- 新的卷積計算方法(SqueezeNet MobileNet ShuffleNet Xception)
一、SqueezeNet (AlexNet-level accuracy with 50x fewer parameters and < 0.5MB model size)
該網絡能在保證不損失精度的同時,將原始AlexNet壓縮至原來的510倍左右(< 0.5MB)。
1.1 設計思想
1.將3x3卷積核替換為1x1卷積核?(1個1x1卷積核的參數是3x3卷積核參數的1/9,這一改動理論上可以將模型尺寸壓縮9倍。)?
2.減小輸入到3x3卷積核的輸入通道數?
3.盡可能將下采樣放在網絡后面的層中?(分辨率越大的特征圖(延遲降采樣)可以帶來更高的分類精度,而這一觀點從直覺上也可以很好理解,因為分辨率越大的輸入能夠提供的信息就越多.)?
以上,前兩個策略都是針對如何降低參數數量而設計的,最后一個旨在最大化網絡精度。
1.2 網絡架構
基于以上三個策略,提出了一個類似inception的網絡單元結構,取名為fire module。一個fire module 包含一個squeeze 卷積層(只包含1x1卷積核)和一個expand卷積層(包含1x1和3x3卷積核)。其中,squeeze層借鑒了inception的思想,利用1x1卷積核來降低輸入到expand層中3x3卷積核的輸入通道數。?
其中,定義squeeze層中1x1卷積核的數量是s1x1,類似的,expand層中1x1卷積核的數量是e1x1, 3x3卷積核的數量是e3x3。令s1x1 < e1x1+ e3x3從而保證輸入到3x3的輸入通道數減小。SqueezeNet的網絡結構由若干個 fire module 組成,另外文章還給出了一些架構設計上的細節:
- 為了保證1x1卷積核和3x3卷積核具有相同大小的輸出,3x3卷積核采用1像素的zero-padding和步長
- squeeze層和expand層均采用RELU作為激活函數
- 在fire9后采用50%的dropout
- 由于全連接層的參數數量巨大,因此借鑒NIN的思想,去除了全連接層而改用GAP
1.3 實驗結果
上表顯示,相比傳統的壓縮方法,SqueezeNet能在保證精度不損(甚至略有提升)的情況下,達到最大的壓縮率,將原始AlexNet從240MB壓縮至4.8MB,而結合Deep Compression后更能達到0.47MB,完全滿足了移動端的部署和低帶寬網絡的傳輸。
此外,作者還借鑒ResNet思想,對原始網絡結構做了修改,增加了旁路分支,將分類精度提升了約3%。
1.4 速度考量
盡管文章主要以壓縮模型尺寸為目標,但毋庸置疑的一點是,SqueezeNet在網絡結構中大量采用1x1和3x3卷積核是有利于速度的提升的,對于類似caffe這樣的深度學習框架,在卷積層的前向計算中,采用1x1卷積核可避免額外的im2col操作,而直接利用gemm進行矩陣加速運算,因此對速度的優化是有一定的作用的。然而,這種提速的作用仍然是有限的,另外,SqueezeNet采用了9個fire module和兩個卷積層,因此仍需要進行大量常規卷積操作,這也是影響速度進一步提升的瓶頸。
二、Deep Compression(Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding)
改文章獲得了ICLR 2016的最佳論文獎,引領了CNN模型小型化與加速研究方向的新狂潮
2.1 算法流程
"權值壓縮派"?
Deep Compression的算法流程包含三步:?
?
1. Pruning(權值剪枝)?
圖3是MNIST上訓練得到的LeNet conv1卷積層中的參數分布,可以看出,大部分權值集中在0處附近,對網絡的貢獻較小,在剪值中,將0值附近的較小的權值置0,使這些權值不被激活,從而著重訓練剩下的非零權值,最終在保證網絡精度不變的情況下達到壓縮尺寸的目的。
實驗發現模型對剪枝更敏感,因此在剪值時建議逐層迭代修剪,另外每層的剪枝比例如何自動選取仍然是一個值得深入研究的課題。?
2. Quantization(權值量化)?
此處的權值量化基于權值聚類,將連續分布的權值離散化,從而減小需要存儲的權值數量。?
初始化聚類中心,實驗證明線性初始化效果最好;?
利用k-means算法進行聚類,將權值劃分到不同的cluster中;?
在前向計算時,每個權值由其聚類中心表示;?
在后向計算時,統計每個cluster中的梯度和將其反傳。
3. Huffman encoding(霍夫曼編碼)?
霍夫曼編碼采用變長編碼將平均編碼長度減小,進一步壓縮模型尺寸。
2.2 模型存儲
前述的剪枝和量化都是為了實現模型的更緊致的壓縮,以實現減小模型尺寸的目的。?
對于剪枝后的模型,由于每層大量參數為0,后續只需將非零值及其下標進行存儲,文章中采用CSR(Compressed Sparse Row)來進行存儲,這一步可以實現9x~13x的壓縮率。?
對于量化后的模型,每個權值都由其聚類中心表示(對于卷積層,聚類中心設為256個,對于全連接層,聚類中心設為32個),因此可以構造對應的碼書和下標,大大減少了需要存儲的數據量,此步能實現約3x的壓縮率。?
最后對上述壓縮后的模型進一步采用變長霍夫曼編碼,實現約1x的壓縮率。
2.3 實驗結果
通過SqueezeNet+Deep Compression,可以將原始240M的AlexNet壓縮至0.47M,實現約510x的壓縮率。
總結
以上是生活随笔為你收集整理的SqueezeNet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于VS2013下制作和使用静态库和动态
- 下一篇: Fast R-CNN论文详解 - CSD