模型壓縮加速
壓縮
先將一下壓縮相關的內容吧。
壓縮這塊可以簡單分為兩部分分別是Pruning和Quantization,
Pruning
思想是將卷積層和全連接層中的權重較小的值去掉,然後finetune恢復精度,
- Deep Compression
S. Han, H. Mao, and W. J. Dally. Deep compression: Compressing deep
neural network with pruning, trained quantization and huffman coding. CoRR,abs/1510.00149, 2, 2015
Pruning很簡單,計算每個卷積層中所有權重的L1 norn,然後排序,根據預先設置的稀疏度將L1 norm 較小的值去掉,然後finetune回復精度
- Dynamic network surgery 上一篇的改進
Y. Guo, A. Yao, and Y. Chen. Dynamic network surgery for efficient dnns.
In Advances In Neural Information Processing Systems, pages 1379–1387, 2016Pruning,對Deep Compression的改進,其思想是在finetune的初始階段不斷的改變mask中的值,Deep Compression中mask的值在最開始的時候就確定下來了,finetune的整個過程是不會變的,而DNS中mask在finetune的初期是不斷變化的,通過 splicing 操作來回復上一次Pruning中刪除的重要的連接,就是把已經刪除的重要連接恢復回來,隨著迭代次數的增加,網路會變的穩定,splicing 操作相應的減少,最後通過finetune來恢復精度,這種操作可以達到加速finetune的目的,但是缺點和Deep Compression一樣,無法實現明顯加速。
- structured sparsity learning
W. Wen, C. Wu, Y. Wang, Y. Chen, and H. Li. Learning structured sparsity
in deep neural networks. In Advances In Neural Information Processing Systems,pages 2074–2082, 2016Quantization
將32位的浮點數量化成低比特的整數從而達到壓縮和加速的目的
Quantization這塊主要包括激活函數,權重以及梯度的量化。實際試驗中比特位數是激活函數>權重>梯度,並且梯度量化主要是起到了加速訓練的目的,此外如果想要達到加速的目的,需要硬體優化,定點化等操作,無法直接在現有的深度學習框架中達到加速的目的。二值化網路主要包括BNN和XNORNet,用到的一些trick主要包括:
1.網路的第一層和最後一層都不要量化;
2.網路中BN層要放在卷積層的前面;
3.從0開始訓或者finetune都可以,finetune的初始學習率為0.0001;
4.考慮激活函數加上了Prelu,其他任務可以考慮加上試下;
5.1x1卷積是二值化網路中的一個影響精度的關鍵因素,因為1x1的kernel太小了,經過二值化的其表達能力更是捉襟見肘,一般處理方法是增加其輸出channel的個數或者不二值化,但是這兩個方法都不能根本解決問題;
6.二值化網路等價於取消了乘法只保留了加法,剩下的需要工程上的優化了,問題還是那個問題,無法直接在現成的深度學習框架上運行。
- BNN
M. Courbariaux and Y. Bengio. Binarynet:
Training deep neural networks with weights and activations constrained to+1or-1. arXiv preprint arXiv:1602.02830, 2016BWN的思想是將每個權重量化成1或者-1,然後乘上一個scale factor,這個參數是通過訓練學習得到的。
- XNORNet
M. Rastegari, V. Ordonez, J. Redmon, and
A. Farhadi. Xnornet: Imagenet classification using binary convolutional neuralnetworks. In European Conference on Computer Vision, pages 525–542. Springer,2016XNORNet中包含只對權重二值化和權重,激活函數都二值化兩種,對權重和激活函數都二值化的精度下降十分明顯,
壓縮目前face++被去年的iccv收錄的He, Yihui , Zhang, Xiangyu , Sun, Jian. Channel Pruning for Accelerating
Very Deep Neural Networks arXiv:1707.06168這個做的挺不錯的knowledge distilling
將複雜模型(teacher)的知識遷移到簡單模型(student)中去,這樣相當於在保持精度的同時減少了模型的複雜度,然後簡單模型可以直接開跑,不需要像之前做量化那樣做定點化了。
Junho Yim, Donggyu Joo, Ji-Hoon Bae, Junmo Kim. A Gift from Knowledge
Distillation: Fast Optimization, Network Minimization and Transfer Learning論文解讀 Learning Efficient Convolutional Networks through Network Slimming
模型壓縮三要素:
1. Model size ,模型大小 2. Run-time memory , 模型得小,效率也得高,不能參數少,運算卻很多,還是不行滴。 3. Number of computing operations模型壓縮存在的不足:
1. 低秩分解方法:對全連接層效果可以,對卷積層不怎麼樣;模型大小可壓縮3倍,但運算速度無明顯提升。 2. Weight Quantization: HashNet雖然可採用分組、共享權值方法來壓縮所需保存的參數數量,但是在 Run-time memory上面沒有任何壓縮。 3. 二值化權值: 損失精度 4. Weight Pruning/Sparsifying: 需要專用的硬體或者代碼庫;[12]訓練過程中,沒有一個對稀疏進行「約束」「指導」(guidance) 5. Structured Pruning/Sparsifying: 本文方法所屬類型,當然沒有缺點啦。。。就算就文章中也不會提嘛~創新點:
1. 利用batch normalization中的縮放因子γ 作為重要性因子,即γ越小,所對應的channel不太重要,就可以裁剪(pruning)。 2. 為約束γ的大小,在目標方程中增加一個關於γ的正則項,這樣可以做到在訓練中自動剪枝,這是以往模型壓縮所不具備的。
來看目標函數: 第一項是模型預測所產生的損失,第二項就是用來約束γ的,λ是權衡兩項的超參,後面實驗會給出,一般設置為1e-4 或者 1e-5。g(*)採用的是g(s)=|s|, 就是L1范,可達到稀疏的作用。原理就講完了~
Network slimming
利用BN層中的縮放因子γ,在訓練過程當中來衡量channel的重要性,將不重要的channel進行刪減,達到壓縮模型大小,提升運算速度的效果。 看一下模型圖,左邊為訓練當中的模型,中間一列是scaling factors,也就是BN層當中的縮放因子γ,當γ較小時(如圖中0.001,0.003),所對應的channel就會被刪減,得到右邊所示的模型。 道理是不是非常簡單,而且巧妙的將γ增加到目標函數中去,達到了一邊訓練一邊剪枝的奇效
接下來看看,整體是如何運行的,如何剪枝再訓練,再剪枝。 整體流程框圖如下圖所示:
分為三部分,第一步,訓練;第二步,剪枝;第三步,微調剪枝後的模型,循環執行。
具體操作細節:
γ通常取 1e-4或者1e-5,具體情況具體分析,γ得出後,應該怎麼剪,γ多小才算小? 這裡採用與類似PCA里的能量佔比差不多,將當前層的γ全都加起來,然後按從大到小的順序排列,選取較大的那一部分,通常選取70%左右(具體情況具體分析)。
λ的選取對γ的影響如圖所示:
λ為0的時候,目標函數不會對γ進行懲罰,λ等於1e-5時,可以發現,γ=0.0+的有450多個,整體都向0靠近。當λ=1e-4時,對γ有了更大的稀疏約束了,可以看到有接近2000個γ是在0.0x附近。
剪枝百分比: 剪得越多,模型越小;剪得太多,精度損失。這是矛盾的,所以作者做了實驗對比,看看剪多少合適。實驗發現,當剪枝超過80%,精度會下降。
優點
Network
Slimming為一種神經網路訓練方法,其可以減小模型大小,運行內存,計算量,同時沒有精度損失,並最小化訓練過程.得到的模型不需要專門的庫或者軟體來運行.具體實現
在卷積層的每個通道引入一個尺度因子γγ,具體操作為將尺度因子γγ與該通道的輸出相乘. 在訓練的過程中,對這些尺度因子採用sparsity
regularization操作,以自動鑒定不重要的通道.這樣需要訓練的參數包括網路本身的參數,以及每個通道的尺度因子γγ,訓練目標函數為:式中,(x,y)表示訓練輸入,目標輸出.W為網路的各層的權重參數.l(f(x,W),y)l(f(x,W),y)表示網路本身的目標函數,λ∑γ∈Tg(γ)λ∑γ∈Tg(γ)表示尺度因子γγ參數的目標函數.
batch normalization
在CNN中,通常會引入batch normalization(BN),以加快模型收斂,優化模型生成效果.文獻提出,同時將通道中的尺度因子γγ重新應用於BN層.另zin,zoutzin,zout分別為BN層的輸入,輸出.B為當前的mini-batch,則BN層的計算公式為:
式中,μB,σBμB,σB為輸入激活函數對B的均值和方差.γ,βγ,β為需要訓練的仿射變換參數.
對於含有小的尺度因子的通道,如圖中橙色標記通道,將其剪去.剪枝後,我們獲得了緊湊的模型,如圖中有半部分所示.將剪枝後的模型進行fine-tuned,以達到與完整的網路模型相等甚至更高的精度.
完整的網路訓練過程圖如下:
推薦閱讀:
※很詳細很具體的指導英文論文寫作技巧!
※論文|通過模板匹配方式發現結構化變體
※一種繞過限制下載論文的思路
※女孩子就像別人的論文,___.
※北大中文經濟類核心期刊目錄
TAG:論文 |