深度神经网络模型压缩方法总结
新的卷積計算方法
這種是直接提出新的卷積計算方式,從而減少參數,達到壓縮模型的效果,例如SqueezedNet,mobileNet
1. SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size
代碼地址:https://github.com/DeepScale/SqueezeNet
下圖是論文中的Fire Module,將上一層的輸出分別輸入到1*1的卷積核3*3的卷積層中。
使用以下三個策略來減少SqueezeNet參數 :
(1)使用1?1卷積代替3?3 卷積:卷積模板的選擇,從12年的AlexNet模型一路發展到2015年底Deep Residual Learning模型,基本上卷積大小都選擇在3x3了,因為其有效性,以及設計簡潔性。本文替換3x3的卷積kernel為1x1的卷積kernel可以讓參數縮小9X。但是為了不影響識別精度,并不是全部替換,而是一部分用3x3,一部分用1x1。
(2)減少輸入3x3卷積的input feature map數量 :這一部分使用squeeze layers來實現 。參數量=通道數*filter數*卷積窗口,因此減少feature map的輸入數量就可以一定程度上的減少參數量。
(3)將欠采樣操作延后,可以給卷積層提供更大的激活圖:更大的激活圖保留了更多的信息,可以提供更高的分類準確率 。在具體實現時,只在卷積第1、4、8層做了max pooling,在conv10做了全局平均pooling
其中,(1)和(2)可以顯著減少參數數量,(3)可以在參數數量受限的情況下提高準確率。
另外論文中還使用了global average pooling代替全連接層的策略來進一步減少參數量(關于GAP要復習一下NIN)。
可以看出,Squeeze層由于使用1?1卷積極大地壓縮了參數數量,并且進行了降維操作,但是對應的代價是輸出特征圖的通道數(維數)也大大減少。之后的expand層使用不同尺寸的卷積模板來提取特征,同時將兩個輸出連接到一起,又將維度升高。但是3?3的卷積模板參數較多,遠超1?1卷積的參數,對減少參數十分不利,所以作者又針對3?3卷積進行了剪枝操作以減少參數數量。從網絡整體來看,feature map的尺寸不斷減小,通道數不斷增加,最后使用平均池化將輸出轉換成1?1?1000完成分類任務。
2.MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
這篇文章主要基于深度可分離卷積(具體參考有道云筆記)。
深度可分離卷積是基于Xception的,在Xception中是先做channelwise的卷積再做pointwise的卷積,例如:在經典的卷積操作,如果output channel是256,input channel是128,卷積核大小3*3,那么參數量為128?3?3?256=294912128?3?3?256=294912,而Spearable卷積方法,假如DM=4,這樣中間層的channel數為128*4=512,再經過1*1卷積降維到256個channel,需要的總參數為:128*3*3*4 + 128*4*1*1*256=135680,參數量相當于普通卷積的46%,還增加了通道數(128*4=512)增強了特征表達能力。
在MobileNet中,作者也是先做深度方向上的卷積,再做點卷積。
對MobileNet的參數量分析:
3.ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile
做模型壓縮的連起名字的方式都是類似的么。。。
具體講解參考:https://blog.csdn.net/u011974639/article/details/79200559,這里的關于shuffle的圖例很清晰明了。
文章的主要基于兩個點:1)深度可分離卷積;2)Group Convolution。
主要的貢獻點就是做了一個通道混洗(Channel shuffle)
已訓練好的模型上做裁剪
方法
這種就是在訓練好的模型上做一些修改,然后在fine-tuning到原來的準確率,主要有一些方法:
剪枝:神經網絡是由一層一層的節點通過邊連接,每個邊上會有權重,所謂剪枝,就是當我們發現某些邊上的權重很小,可以認為這樣的邊不重要,進而可以去掉這些邊。在訓練的過程中,在訓練完大模型之后,看看哪些邊的權值比較小,把這些邊去掉,然后繼續訓練模型;
權值共享:就是讓一些邊共用一個權值,達到縮減參數個數的目的。假設相鄰兩層之間是全連接,每層有1000個節點,那么這兩層之間就有1000*1000=100萬個權重參數。可以將這一百萬個權值做聚類,利用每一類的均值代替這一類中的每個權值大小,這樣同屬于一類的很多邊共享相同的權值,假設把一百萬個權值聚成一千類,則可以把參數個數從一百萬降到一千個。
量化:一般而言,神經網絡模型的參數都是用的32bit長度的浮點型數表示,實際上不需要保留那么高的精度,可以通過量化,比如用0~255表示原來32個bit所表示的精度,通過犧牲精度來降低每一個權值所需要占用的空間。
神經網絡二值化:比量化更為極致的做法就是神經網絡二值化,也即將所有的權值不用浮點數表示了,用二進制的數表示,要么是+1,要么是-1,用二進制的方式表示,原來一個32bit權值現在只需要一個bit就可以表示,可以大大減小模型尺寸。
論文
- XNOR-Net: ImageNet Classi?cation Using Binary Convolutional Neural Networks
網絡權重二值化、輸入二值化,從頭開始訓練一個二值化網絡,不是在已有的網絡上二值化
- Learning both Weights and Connections for Ef?cient Neural Networks
學習重要的連接,根據連接的權重進行裁剪,fine-tuning讓網絡保持稀疏的連接
- Exploiting linear structure within convolutional networks for ef?cient evaluation.
對已經訓練好的網絡應用奇異值分解
- Eie: Ef?cient inference engine on compressed deep neural network.
加速器
- Deep compression: Compressing DNNs with pruning, trained quantization and huffman coding.
裁剪(閾值)、量化(8bit,存儲方式)、哈夫曼編碼
http://blog.csdn.net/may0324/article/details/52935869
Deep Model Compression: Distilling Knowledge from Noisy Teachers
Teacher-student Framework,一個網絡指導另外一個網絡的訓練
PerforatedCNNs: Acceleration through Elimination of Redundant Convolutions
在一些稀疏位置跳過CNN求值,加速效果不明顯,且不能壓縮模型
- Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or ?1
訓練二值化網絡
https://tensortalk.com/?cat=model-compression-parameter-pruning
- PRUNING FILTERS FOR EFFICIENT CONVNETS
計算filter的L1范數,直接過濾掉較小L1范數對應的feature map, 然后再次訓練,有兩種,一是每裁剪一層訓練一下,一是直接裁剪整個網絡,然后fine-tuning. 相比權值連接的裁剪,這種比較暴力,好處就是不會引入稀疏矩陣的計算,從而也不需要稀疏矩陣庫,壞處就是可能無法恢復到最開始的準確率。
總結
以上是生活随笔為你收集整理的深度神经网络模型压缩方法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python你的人生_人生苦短:运行你的
- 下一篇: 一些琐碎+分不清的知识点