深度學習使得很多計算機視覺任務的性能達到了一個前所未有的高度。不過,復雜的模型固然具有更好的性能,但是高額的存儲空間、計算資源消耗是使其難以有效的應用在各硬件平台上的重要原因。為了解決這些問題,許多業界學者研究模型壓縮方法以最大限度的減小模型對於計算空間和時間的消耗。最近團隊里正在研究模型壓縮相關的內容,正好在這里總結一下。(我的認識還很膚淺,本文也會不斷補充和修改,歡迎拍磚)
理論基礎
- 必要性
在許多網絡結構中,如VGG-16網絡,參數數量1億3千多萬,占用500MB空間,需要進行309億次浮點運算才能完成一次圖像識別任務。 - 可行性
論文<Predicting parameters in deep learning>提出,其實在很多深度的神經網絡中存在着顯著的冗余。僅僅使用很少一部分(5%)權值就足以預測剩余的權值。該論文還提出這些剩下的權值甚至可以直接不用被學習。也就是說,僅僅訓練一小部分原來的權值參數就有可能達到和原來網絡相近甚至超過原來網絡的性能(可以看作一種正則化)。 - 最終目的
最大程度的減小模型復雜度,減少模型存儲需要的空間,也致力於加速模型的訓練和推測
目前的方案
-
綜述文章
-
要解決這些問題往往需要從多個角度切入,包括機器學習算法,優化算法,計算機架構,數據壓縮,索引編制及硬件設計等。對於模型壓縮這一塊的方法大致可以分為:低秩近似(low-rank Approximation),網絡剪枝(network pruning),網絡量化(network quantization),知識蒸餾(knowledge distillation)和緊湊網絡設計(compact Network design)。
image.png -
對於矩陣運算(特別是卷積運算)來說,如果權重矩陣稠密而且巨大,那么計算和存儲都需要極大的開銷。前三種方法都是致力於將權重矩陣變得更稀疏,以此來減小計算和存儲的開銷。后兩種方法往往是需要對網絡結構有較大的改動,也需要對神經網絡的更深層原理有一定的認識才能進行更好的壓縮。
-
也能把模型壓縮分為前端壓縮和后端壓縮:
image.png -
對於模型壓縮這方面的總覽和發展歷程,中科院的這篇已經介紹的非常好了。在這里我們主要分析一些論文並給出部分網上有的python實現代碼。
1. 低秩近似/分解(low-rank Approximation/factorization):
這一部分的思路比較簡單,如果把原先網絡的權值矩陣當作滿秩矩陣來看,那么是不是可以用多個低秩的矩陣來逼近原來的矩陣,以達到簡化的目的?答案是肯定的。原先稠密的滿秩矩陣可以表示為若干個低秩矩陣的組合,低秩矩陣又可以分解為小規模矩陣的乘積。對於二維矩陣運算來說SVD是非常好的簡化方法,所以在早期的時候,微軟研究院就做過相關的工作來對網絡實現加速。后面對於高維矩陣的運算往往會涉及到Tensor分解方法來做加速和壓縮,主要是CP分解、Tucker分解、Tensor Train分解和Block Term分解這些在2015年和2016年所做的工作。在這方面有幾篇經典的論文。
論文
-
2014-Speeding up Convolutional Neural Networks with Low Rank Expansions
這篇文章提出用fx1+1xf的卷積核來替代f*f的卷積核的線性組合卷積核基底的方法來進行低秩近似,下圖可以很直觀的表達作者思想:線性卷積核組合近似
該方法在場景文字識別中實驗在無精度損失的情況下達到原來的2.5倍速,而達到4.5倍速的同時僅損失1%的accuracy。 -
2014-NPIS-Exploiting Linear StructureWithin Convolutional Networks for Efficient Evaluation
上面這個是屬於rank-1的重構,這篇文章則是提出rank-k的重構,他對卷積使用一個中間層來進行降秩,通過單譜段處理(monochromatic convolution approximation)(暫時還不太懂這個,只知道是通過固定某一個維度,合並其他三個維度進行SVD)和雙聚類處理(bicluster)加上SVD對矩陣進行降k維估計。該方法對於每個卷積層能提速一倍,損失1%的精度。A visualization of monochromatic and biclustering approximation structures. -
2015-NPIS-Structured transforms for small footprint deep learning
- 用結構化矩陣
-
2015-Accelerating Very Deep Convolutional Networks for Classification and Detection
-
2014-Speeding-up Convolutional Neural Networks Using Fine-tuned CP-Decomposition||pytorch代碼||借鑒博客
-
2015-Compression of Deep Convolutional Neural Networks for Fast and Low Power Mobile Applications||pytorch代碼
-
2017-High performance ultra-low-precision convolutions on mobile devices
存在問題
應該說矩陣分解方法經過過去的發展已經非常成熟了,所以在2017、2018年的工作就只有Tensor Ring和Block Term分解在RNN的應用兩篇相關文章了。
那么為什么Low-Rank在這兩年不再流行了呢?除了剛才提及的分解方法顯而易見、比較容易實現之外,另外一個比較重要的原因是現在越來越多網絡中采用1×1的卷積,而這種小的卷積使用矩陣分解的方法很難實現網絡加速和壓縮。
- 超參數的數量隨着網絡層數的增加呈線性變化趨勢,例如中間層的特征通道數等等。參考2016年的NIPSConvolutional neural networks with low-rank regularization
- 隨着模型復雜度的提升,搜索空間急劇增大——Learning structured sparsity in deep neural networks
2. 網絡剪枝(network pruning):
網絡剪枝的主要思想就是將權重矩陣中相對“不重要”的權值剔除,然后再重新fine tune 網絡進行微調。
- 廣義上的修剪包括:
- 正則化regularization:修改目標函數/學習問題,所以優化后可能會得到一個參數較少的神經網絡,例如添加L1Norm在損失函數中
- 修剪pruning:面向大規模神經網絡,並刪除某些意義上冗余的特征或參數
- 增長growing:從小型網絡開始,按某種增長標准逐步增加新的單元
- 剪枝的基本流程
- 衡量神經元的重要程度
- 移除一部分不重要的神經元
- 對網絡進行微調
- 返回第一步,進行下一輪剪枝
- 這一部分的核心問題包括:
- 剪枝的粒度變化——剪多深
- 剪枝方法——怎么剪
- 如何衡量權值的重要性。
- 如何選取去除權值的數量或比例。
- 什么時候剪
- 在去除不重要的權值之后,如何保持網絡性能。
- fine tune之后又會產生新的不重要權值,如何解決。
我們從這幾個核心問題着手展開
論文
開山之作
- 1989-楊麗坤-Optimal brain damage
- 1993-NIPS-Second Order Derivatives for Network Pruning: Optimal Brain Surgeon
- 利用二階泰勒展開選擇參數進行剪枝,將剪枝看做正則項來改善訓練和泛化能力。
剪枝的粒度變化——剪多深
- 細粒度剪枝:對權重進行剪枝,fine-grained sparsity
- 優點:保留模型精度
- 缺點:非結構化剪枝,對局部進行調整,依賴於專門的運行庫和硬件設備,如LeCun的1989腦損傷論文。
- 粗粒度剪枝(直接剪去filter或channel),coarse grained sparsity
- 優點:模型速度和大小有效提升,保證了通用性
- 缺點:容易造成精度大幅下降,同時模型殘留冗余
- 2017CVPRW_stanford&Nvidia_Exploring the Regularity of Sparse Structure in Convolutional Neural Networks
- 探索完整的修剪粒度范圍,並評估模型的regularity and accuracy之間的權衡。
- 證明粗粒修剪能夠達到與細粒修剪相似甚至更好的壓縮率,即使它獲得的稀疏性較小。
- 展示粗粒度稀疏能夠以結構化的方式跳過計算並減少內存引用,這導致更高效的硬件加速器實現
- 2017-Pruning filters for efficient convnets
濾波器級別剪枝,基於濾波器權重本身的統計量
- 特例:直接剪網絡分支結構(粒度最大)2017-Driven Sparse Structure Selection for Deep Neural Networks
- 總體:引入Gate控制分支,數據驅動,動態剪枝,端到端
- 具體實現:為CNN模型訓練和剪枝提出了一個統一的框架。通過在某些CNN結構上引入縮放因子和相應的稀疏正則化,將其定義為聯合稀疏正則化優化問題。
- 局限性:應用於寬網絡結構,在某些網絡上不能用
剪枝的方法——怎么剪
-
權重衰減法
屬於前面提到的正則化的方法,通過在網絡目標函數中引入表示結構復雜性的正則化項來使訓練的網絡權重趨向稀疏化。缺點是正則化參數/權重剪枝閾值對剪枝結果影響很大- 2015-NIPS-Learning both weights and connections for efficient neural network
- 該文章設定了取舍權值的閾值,非結構化,屬於細粒度剪枝
- 設定了絕對值正則項,優點是簡單直接,缺點是基於小權值對網絡貢獻小,與網絡輸出沒有直接關系的假設,可能會嚴重破壞網絡。
- 2017-Automated Pruning for Deep Neural Network Compression
- 解決問題:(1)傳統方法需要在多個待測試閾值上重復迭代(2)權重閾值在所有層共享,難以尋找合適的閾值
- 具體實現:權重與閾值聯合優化,layer-specific thresholds,省略多次迭代過程
- 2017-ICCV-Learning Efficient Convolutional Networks through Network Slimming||pytorch實現
- channel-level ,新的重要程度衡量方法,稀疏約束實現動態剪枝
- 具體實現:1. 利用batch normalization中的縮放因子γ 作為重要性因子,即γ越小,所對應的channel越不重要,就可以裁剪 2.在目標方程中增加一個關於γ的L1正則項
- 2017-Learning Sparse Neural Networks through L0 Regularization
- 在常用損失項上加上L0范數(向量中的非零項)應用數學技巧解決這個復雜的組合優化問題
- 2015-NIPS-Learning both weights and connections for efficient neural network
-
靈敏度計算方法——數據驅動
- 利用Loss對權重的二階導數(Hession 矩陣)計算權重重要性(LeCun1989腦損傷的做法)
- 由於Hession矩陣的計算復雜,很長一段時間沒有人用
- 2017-Learning to Prune Deep Neural Networks via Layer-wise Optimal Brain Surgeon||pytorch實現這篇文章對該方法進行了改善
- 本文將二階導數的計算限制在單層網絡中,以減小計算量
- 並證明了剪枝后預測性能下降是每層重構誤差的線性組合
- 損失近似
該方法通過觀察損失函數的變化來判斷對應枝的重要性-
2017-Pruning convolutional neural networks for resource efficient inference||Pytorch實現
- intuition:在遷移學習中,如果原先學習的特征如在VGG16中包含車,人馬的識別但是在新的任務中我只需要識別貓和狗,那么有多少特征對新的分類器是有貢獻的呢?
- 濾波器級別剪枝,計算每個濾波器對於損失函數的影響程度
- -基於交替貪婪准則並且需要fine tune
-
2017ICLR-Pruning convolutional neural networks for resource efficient transfer learning
- 本文是filter級別的剪枝
- 剪枝准則:選擇一個filter集合中的子集,將子集計算對應的Loss與原集合對應的Loss的差異作為衡量filter重要性的准則。
- 迭代刪除重要度最低的filter,並進行fine tune
-
- 根據相關性剪枝
類似於特征工程中的PCA
- 2017-ICCV-Channel Pruning for Accelerating Very Deep Neural Networks||caffe代碼
- 考慮到裁剪對下一層的影響,選取最有代表性的channel
- 具體實現:(1)LASSO regression based channel selection (2)least quuare reconstruction——利用剩下的channnel重構這一層原本的輸出
- 2017-Combined Group and Exclusive Sparsity for Deep Neural Networks
- 探究了特征之間的正負相關關系,在神經元節點上剪枝
- 具體實現:(1)exclusive sparsity regularization ——使上層特征盡可能地由不同底層特征構成
(2)group sparsity regularization——允許某些重要的底層特征在上層共享
- 其他
-
2016-A data-driven neuron pruning approach towards efficient deep architectures
數據驅動的濾波器級別剪枝 -
2017-CVPR-Designing Energy-Efficient Convolutional Neural Networks Using Energy-Aware Pruning
- 根據能量消耗剪枝(理論依據不足)
- 具體實現:(1)能量估計方法:通過實際的電池消耗(來自於計算與存儲),建立數據稀疏與帶寬減小與電池消耗的模型(2)節能意識指導剪枝:從能量消耗最多的層開始剪枝,基於最小化輸出誤差來剪枝(3)CNNs的能量消耗分析
- 利用Loss對權重的二階導數(Hession 矩陣)計算權重重要性(LeCun1989腦損傷的做法)
剪枝與訓練的結合——什么時候剪
- 迭代式剪枝 :訓練權重——剪枝——訓練權重
大多數的剪枝方法都屬於這個模式。這里給一個典型的論文——2015NIPS-Learning both weights and connections for efficient neural network - 動態剪枝:剪枝與訓練同時進行,一般指稀疏約束的方法
具體做法是在網絡的優化目標中加入權重的稀疏正則項,使得訓練時網絡的部分權重趨向於0,而這些0值正是剪枝對象。 - 特殊:不在訓練時剪枝,對單個樣本的inference剪枝
- 2017-Adaptive Neural Networks for Efficient Inference
- 不改變網絡結構,只針對單個樣本的inference過程精簡網絡
- 具體實現:(1)early-exit stratage to bypass some layers (2)network selection such as AlexNet,GoogLeNet,etc.
- 2017-Adaptive Neural Networks for Efficient Inference
剪枝后綜合處理的及其他剪枝相關論文
-
2015-Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding
該論文針對以上問題都提出了相應的解決方案。其整體流程如下圖所示:image.png
其模型壓縮率非常高:在ImageNet數據集上,該方法對AlexNet的內存占用減少35倍(從240MB到6.9MB)同時不損失准確率,對於VGG-16減少49倍的內存占用(從552MB到11.3MB)同樣不損失准確率。可以說是非常牛了。當然,圖中也說明了該壓縮是剪枝、量化和哈夫曼編碼共同作用的結果。不過光剪枝也就達到了十倍的壓縮率了,已經相當可觀了。 -
2015-Structured Pruning of Deep Convolutional Neural Networks
-
2017-PackNet: Adding Multiple Tasks to a Single Network by Iterative Pruning||【pytorch】
-
2017ICCV-ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression||【caffe】
-
2017-Exploring the Regularity of Sparse Structure in Convolutional Neural Networks
-
2017-Soft Weight-Sharing for Neural Network Compression||【keras】
-
2017-Data-Driven Sparse Structure Selection for Deep Neural Networks||【MXNET】
-
2017NIPS-Net-Trim: Convex Pruning of Deep Neural Networks with Performance Guarantee||【tensorflow】
-
2017NIPS-Structured Bayesian Pruning via Log-Normal Multiplicative Noise||【tf】
3. 網絡量化(Network Quantization)
一般而言,神經網絡模型的參數都是用的32bit長度的浮點型數表示,實際上不需要保留那么高的精度,可以通過量化,比如用0~255表示原來32個bit所表示的精度,通過犧牲精度來降低每一個權值所需要占用的空間。此外,SGD(Stochastic Gradient Descent)所需要的精度僅為6~8bit,因此合理的量化網絡也可保證精度的情況下減小模型的存儲體積。
根據量化方法不同,大致可以分為二值量化,三值量化,多值量化
對網絡網絡進行量化要解決三個基本問題
- 如何對權重進行量化
- 如何計算二值權重的梯度
- 如何確保准確率
論文
二值量化( binary quantization)
思想是將權值矩陣中的單精度浮點數用兩個值來表示,一般考慮使用符號函數或者加入線性化的符號函數來近似。
- 2017-Towards Accurate Binary Convolutional Neural Network
致力於不損失模型精度,使用multiple binary weight/multiple binary activations - 2016-Binarized Neural Networks on the ImageNet Classification Task
分析了權值變化 - 2016-XNOR-NET
- 提出了一個BWN(Binary-Weight-Network)和XNOR-Network,前者只對網絡參數做二值化,帶來約32x的存儲壓縮和2x的速度提升,而后者對網絡輸入和參數都做了二值化,在實現32x存儲壓縮的同時帶了58x的速度提升;
- 提出了一個新型二值化權值的算法;
- 第一個在大規模數據集如ImageNet上提交二值化網絡結果的工作;
- 無需預訓練,可實現training from scratch。
三值量化(ternary quantization)
改進二值量化
- 2015-Neural Networks with Few Multiplications
- 在二值網絡符號函數(+1,-1)的基礎上,認為需要顯式地增加0這個量化值
- 使用ternary connect
- 反傳的時候也加入了量化,認為3-4bits足夠替代原網絡精度
- 2016-Trained Ternary Quantization
在常規的ternary網絡基礎上,使用FP32精度的數據做計算——保持計算精度 - 2016-Accelerating Deep Convolutional Networks using low-precision and sparsity
多值量化
- 2015-Deep Learning with Limited Numerical Precision
- 使用16-bit fixed-point number
- 對原來的模型取rounding model,round的方法有round-to-nearest和stochastic rounding
- 2017-Towards the Limit of Network Quantization
- 解決給定壓縮比時,模型精度丟失loss問題
- 2017-Mixed Precision Training
- 使用FP32計算,使用FP16保存;沒有超參數的變化——保持計算精度
量化++
這部分介紹的是網絡量化+其他處理方法以達到模型壓縮的目的的論文
- 2016-Deep neural networks are robust to weight binarization and other non-linear distortions
- 不是單純量化,而是使用投影函數將權值映射到某個范圍
- 2018-BinaryRelax: A Relaxation Approach For Training Deep Neural Networks With Quantized Weights
- 使用松弛量化的方法,可以在非凸假設下達到收斂的目的
- 使用continuous regularizer
- 2017-Training Quantized Nets: A Deeper Understanding
- 理論分析隨機近似SR和離散近似BC表現差異的原因
- BinaryConnection有退火屬性,SR沒有,這一點是關鍵,SR會提前停止。
- 2017-Training Quantized Nets: A Deeper Understanding
- 這是一種直接對訓練好的模型進行量化的方法,不需要再fine tune
- 2015-Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding
還是這篇論文,其中在剪枝之后采用了量化處理。- 采用k-means聚類來確定每一層共享的權值
- centroid initialization:3種共享權值的初始化方法
- 獲取權值分布,利用huffman編碼壓縮數據量
變bit/組合bit量化
這一部分文章考慮對於同一個模型采用不同種類的bit組合來進行模型量化
- 2017-Adaptive Quantization for Deep Neural Network
- 為每一層找到優化的量化位數
- 度量每一層參數量化誤差的方法
- 2017-Fixed-point optimization of deep neural networks with adaptive step size retraining
- 逐步調整量化步長,取得優化的長度
哈希
- 2015-Compressing neural networks with hashing trick
該文提出將映射到同一個哈希桶中的權值進行共享,共享同一個權值
量化總結
最為典型就是二值網絡、XNOR網絡等。其主要原理就是采用1bit對網絡的輸入、權重、響應進行編碼。減少模型大小的同時,原始網絡的卷積操作可以被bit-wise運算代替,極大提升了模型的速度。但是,如果原始網絡結果不夠復雜(模型描述能力),由於二值網絡會較大程度降低模型的表達能力。因此現階段有相關的論文開始研究n-bit編碼方式成為n值網絡或者多值網絡或者變bit、組合bit量化來克服二值網絡表達能力不足的缺點。
知識蒸餾(knowledge distillation)
蒸餾模型采用的是遷移學習,通過采用預先訓練好的復雜模型(Teacher model)的輸出作為監督信號去訓練另外一個簡單的網絡。這個簡單的網絡稱之為student model。
論文
開山之作
- 2006-Model Compression
嘗試用一個神經網絡近似多個集成的分類器 - 2014-Do deep nets really need to be deep?
- Our success in training shallow neural nets to mimic deeper models suggests that there probably exist better algorithms for training shallow feed-forward nets than those currently available.
- 該文章訓練了和深度網絡幾乎擁有同樣參數數量的淺層網絡(也就是更肥更短的網絡),在TIMIT phoneme recognition task上能夠達到與深度網絡相近的性能,以此說明了深度網絡並不是一定優於淺層網絡。
- 2015-Distilling the knowledge in a neural network,參考閱讀
- 作者Hinton認為是有辦法將深度網絡中所學到的知識轉移到另一個相對簡單的網絡中去的。
- 提出用改造的原始模型的softmax輸出(加入一個溫度常數T控制預測概率的平滑程度)作為一個軟目標(soft target),加權結合真實標簽(hard target)來計算小網絡訓練時的損失函數,權重經驗值推薦為9:1。
- 這種方法對於沒有標簽的數據集也可以拿來訓練,而且實驗效果還不錯。在mnist數據集上對於遷移訓練集數據中包含無標簽數據或者某些類別數據缺失,依然能夠有很好的表現。另外大模型的輸出相較於GTlabel來說包含更多信息,如類間距和類內方差等,所以這也可以作為數據增廣的一種手段。
監督信息
着重於研究教學監督信息的豐富與改進
- 2015-ICLR-FitNets: Hints for thin deep nets (Bengio)||keras代碼||tensorflow
- 對hinton15的改進,小模型設計的又窄又深,這樣壓縮的效果更明顯,同時又更好的performance,監督信息加入了中間特征層(原意是分成兩部分訓練)
- 缺點是難收斂
- 2017-ICLR-Paying More Attention to Attention: Improving the Performance of Convolutional Neural Networks via Attention Transfer
- 對fitNets的改進,提出使用attention特征作為監督信息,並給出兩種有效的attention map
- 2016-AAAI-Face model compression by distilling knowledge from neurons (商湯)||caffe代碼
- 針對人臉識別數據集類別緯度高的特點,用Softmax前一層網絡的輸出作為監督信息,設計了一個算法對神經元進行選擇,保證維度的緊湊和高效。
- 2016-Deep Model Compression: Distilling Knowledge from Noisy Teachers
- 也是對hinton15的改進,基本思想是學生向多個老師學習,並通過向老師模型的logits添加擾動,實現基於噪聲的正則。
- 2017-Like What You Like: Knowledge Distill via Neuron Selectivity Transfer (圖森)||MXNet代碼
- 看作一個分布匹配問題,使用了新的loss函數,用於中間層特征;該方法可以和其他壓縮方法結合,也可以用到檢測等任務中
- 2017-CVPR-A gift from knowledge distillation: Fast optimization, network minimization and transfer learning
- 和之前的方法不同,利用Gram矩陣擬合層與層之間的關系,學生模仿老師解題的過程
- 2017-Knowledge Projection for Effective Design of Thinner and Faster Deep Neural Networks
- 本文提出一種新的設定,開始和以前一樣,使用一個預訓練的大網絡來指導一個更窄更快的小網絡訓練,但是用來訓練的數據是新的並且標簽信息有限,所以這個場景包括了不同數據域的自適應和模型壓縮
- 加入了一個知識投影矩陣,是學習得到的,選擇大模型的某處中間層,經過投影,加入到小模型的某處,這個過程也是學習的
- 2017-Training Shallow and Thin Networks for Acceleration via Knowledge Distillation with Conditional Adversarial Networks
- 以前的方法是通過最小化確定的損失函數來擬合學生和老師,本文通過cGANs來學習適合的loss,更好的進行知識的遷移
- 2017-AAAI18-DarkRank: Accelerating Deep Metric Learning via Cross Sample Similarities Transfer (圖森)||MXNet實現
- 引入了新的監督信息,考慮不同樣本之間的相似性,Learning to rank思想
學生模型設計、方法集成
- 2016-ECCV-Accelerating convolutional neural networks with dominant convolutional kernel and knowledge pre-regression
- 設計了學生模型的網絡結構,壓縮並加速,使用distillation提高模型的精度
- 2017-Knowledge Distillation for Small-footprint Highway Networks
- 使用了Hinton15的方法,應用在了語音識別任務,改進了學生模型,更少的參數同樣的准確率
- 2017-Apprentice: Using Knowledge Distillation Techniques To Improve Low-Precision Network Accuracy
- 這里用蒸餾來彌補因為量化導致的性能下降
- 2017-Do Deep Convolutional Nets Really Need to be Deep and Convolutional?
- Yes,they do;對於稍微復雜的任務,小模型需要有卷積層,並且要深,當然不用像大模型那么深
- 2017-Moonshine: Distilling with Cheap Convolutions
- 通過更換老師模型中的卷積塊,得到學生模型
- 2018-Model compression via distillation and quantization||pytorch實現
- 學生模型為淺網絡,在蒸餾的同時進行量化,同時使用SGD優化量化點的位置
其他任務
- 2015-Cross Modal Distillation for Supervision Transfer
- 跨模態的知識遷移,將有標簽模態模型學到的知識遷移到沒有標簽模態模型中,用mid-level的特征作為監督信息
- 2016-Training Constrained Deconvolutional Networks for Road Scene Semantic Segmentation
- 用於語義分割
- 2016-Sequence-Level Knowledge Distillation
- 使用蒸餾對機器翻譯模型進行壓縮和加速,針對Seq2Seq,提出Sequence級別的度量方法
- 2017-CVPR-Mimicking very efficient network for object detection (商湯)
- 用在檢測任務中,hinton15的效果很差
- 對Hinton15的改進,中間層(Proposal)相同位置的特征作為監督信息,使用L_2損失衡量,,最終損失包含兩部分
- 小網絡的特征需要進行轉換,為了和大網絡的維度相同
- ★2017-NIPS-Learning Efficient Object Detection Models with Knowledge Distillation
- 面向檢測問題的一個基於知識遷移的端到端框架;針對檢測中標簽少,不均衡,回歸損失等問題,結合FItNets15和新的loss進行解決
- 2017-Model Distillation with Knowledge Transfer from Face Classification to Alignment and Verification
模型加速
- 2018-ICLR-Large scale distributed neural network training through online distillation
- 分布式SGD存在瓶頸,提出在線蒸餾方法提高大規模計算集群上的模型表現和計算效率
非壓縮目的的蒸餾
- 2015-Net2Net: Accelerating Learning via Knowledge Transfer
- 實際工作中,需要從頭訓練不同的模型,很費時;基於保函數變換理論,將原網絡加寬或者加深;該方法更多的用在網絡結構的探索和遷移學習上
- 2017-Data-Free Knowledge Distillation for Deep Neural Networks||paper解析及tensorflow實現
image.png- 目前的蒸餾方法都需要訓練集,這有很多限制,本文提出一種方法只需要一小部分元數據,不需要原來的訓練數據,需要記錄每層的激活信息,利用大網絡和元數據重建數據
- 2017-Data Distillation: Towards Omni-Supervised Learning
- 非壓縮類,針對半監督問題,利用標注數據訓練模型A,將未標注的數據經過不同的幾何變換后輸入A,得到若干的輸出,將輸出進行集成,利用集成的標簽訓練一個學生模型
- 2017-Knowledge Adaptation: Teaching to Adapt
- 2018-Transparent Model Distillation
總結
- 總體的來說,知識蒸餾是一種遷移學習,將大模型的知識最大程度的教授給小模型,以達到壓縮模型的目的。目前來看,無論是壓縮比還是蒸餾后的性能都還有待提高。
- 存在的問題和研究的趨勢
- 尋“知識”的不同形式,去除softmax的限制,研究趨向於選用中間特征層
- 如何選擇特征層,如何設計損失函數
- 訓練學生模型數據集的選擇
- 學生模型的設計
- 如何和其他壓縮方法集成
緊湊網絡設計
- 如果要把模型壓縮分為兩部分的話,我想可以分為壓縮已有的網絡和構建新的小網絡兩種。其中剪枝、量化和低秩分解可以歸到第一種,蒸餾歸入第二種,而更好的方法就是在模型構建的初始階段,就選擇小而緊湊的網絡,也就是緊湊網絡設計。
- 目前我覺得應用緊湊模型設計最成功之一要數MobileNets系列
了,當然也包括ShuffleNets系列,Inception系列(特別是V3和Xception)等。
論文
2017-MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
- 提出采用深度可分離卷積(Depthwise separable convolution)來構建卷積,並且給出了不同程度的accuracy和latency的trade off。
原文此處鏈接:https://www.jianshu.com/p/e73851f32c9f
參考: