模型壓縮總覽

深度學習使得很多計算機視覺任務的性能達到了一個前所未有的高度。不過,複雜的模型固然具有更好的性能,但是高額的存儲空間、計算資源消耗是使其難以有效的應用在各硬件平臺上的重要原因。爲了解決這些問題,許多業界學者研究模型壓縮方法以最大限度的減小模型對於計算空間和時間的消耗。最近團隊里正在研究模型壓縮相關的內容,正好在這裏總結一下。(我的認識還很膚淺,本文也會不斷補充和修改,歡迎拍磚)

理論基礎

  • 必要性
    在許多網絡結構中,如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年所做的工作。在這方面有幾篇經典的論文。

論文

存在問題

應該說矩陣分解方法經過過去的發展已經非常成熟了,所以在2017、2018年的工作就只有Tensor Ring和Block Term分解在RNN的應用兩篇相關文章了。
那麼爲什麼Low-Rank在這兩年不再流行了呢?除了剛纔提及的分解方法顯而易見、比較容易實現之外,另外一個比較重要的原因是現在越來越多網絡中採用1×1的卷積,而這種小的卷積使用矩陣分解的方法很難實現網絡加速和壓縮。


2. 網絡剪枝(network pruning):

網絡剪枝的主要思想就是將權重矩陣中相對“不重要”的權值剔除,然後再重新fine tune 網絡進行微調。

  • 廣義上的修剪包括:
    1. 正則化regularization:修改目標函數/學習問題,所以優化後可能會得到一個參數較少的神經網絡,例如添加L1Norm在損失函數中
    2. 修剪pruning:面向大規模神經網絡,並刪除某些意義上冗餘的特徵或參數
    3. 增長growing:從小型網絡開始,按某種增長標準逐步增加新的單元
  • 剪枝的基本流程
    1. 衡量神經元的重要程度
    2. 移除一部分不重要的神經元
    3. 對網絡進行微調
    4. 返回第一步,進行下一輪剪枝
  • 這一部分的核心問題包括:
    • 剪枝的粒度變化——剪多深
    • 剪枝方法——怎麼剪
      1. 如何衡量權值的重要性。
      2. 如何選取去除權值的數量或比例。
    • 什麼時候剪
      1. 在去除不重要的權值之後,如何保持網絡性能。
      2. fine tune之後又會產生新的不重要權值,如何解決。
        我們從這幾個核心問題着手展開

論文

開山之作

剪枝的粒度變化——剪多深

  • 細粒度剪枝:對權重進行剪枝,fine-grained sparsity
    • 優點:保留模型精度
    • 缺點:非結構化剪枝,對局部進行調整,依賴於專門的運行庫和硬件設備,如LeCun的1989腦損傷論文。
  • 粗粒度剪枝(直接剪去filter或channel),coarse grained sparsity
  • 特例:直接剪網絡分支結構(粒度最大)2017-Driven Sparse Structure Selection for Deep Neural Networks
    • 總體:引入Gate控制分支,數據驅動,動態剪枝,端到端
    • 具體實現:爲CNN模型訓練和剪枝提出了一個統一的框架。通過在某些CNN結構上引入縮放因子和相應的稀疏正則化,將其定義爲聯合稀疏正則化優化問題。
    • 侷限性:應用於寬網絡結構,在某些網絡上不能用

剪枝的方法——怎麼剪

剪枝與訓練的結合——什麼時候剪

剪枝後綜合處理的及其他剪枝相關論文


3. 網絡量化(Network Quantization)

一般而言,神經網絡模型的參數都是用的32bit長度的浮點型數表示,實際上不需要保留那麼高的精度,可以通過量化,比如用0~255表示原來32個bit所表示的精度,通過犧牲精度來降低每一個權值所需要佔用的空間。此外,SGD(Stochastic Gradient Descent)所需要的精度僅爲6~8bit,因此合理的量化網絡也可保證精度的情況下減小模型的存儲體積。
根據量化方法不同,大致可以分爲二值量化,三值量化,多值量化
對網絡網絡進行量化要解決三個基本問題

  1. 如何對權重進行量化
  2. 如何計算二值權重的梯度
  3. 如何確保準確率

論文

二值量化( 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)

改進二值量化

多值量化

量化++

這部分介紹的是網絡量化+其他處理方法以達到模型壓縮的目的的論文

變bit/組合bit量化

這一部分文章考慮對於同一個模型採用不同種類的bit組合來進行模型量化

哈希

量化總結

最爲典型就是二值網絡、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來說包含更多信息,如類間距和類內方差等,所以這也可以作爲數據增廣的一種手段。

監督信息

着重於研究教學監督信息的豐富與改進

學生模型設計、方法集成

其他任務

模型加速

非壓縮目的的蒸餾

總結

  • 總體的來說,知識蒸餾是一種遷移學習,將大模型的知識最大程度的教授給小模型,以達到壓縮模型的目的。目前來看,無論是壓縮比還是蒸餾後的性能都還有待提高。
  • 存在的問題和研究的趨勢
    1. 尋“知識”的不同形式,去除softmax的限制,研究趨向於選用中間特徵層
    2. 如何選擇特徵層,如何設計損失函數
    3. 訓練學生模型數據集的選擇
    4. 學生模型的設計
    5. 如何和其他壓縮方法集成

緊湊網絡設計

  • 如果要把模型壓縮分爲兩部分的話,我想可以分爲壓縮已有的網絡和構建新的小網絡兩種。其中剪枝、量化和低秩分解可以歸到第一種,蒸餾歸入第二種,而更好的方法就是在模型構建的初始階段,就選擇小而緊湊的網絡,也就是緊湊網絡設計。
  • 目前我覺得應用緊湊模型設計最成功之一要數MobileNets系列
    了,當然也包括ShuffleNets系列,Inception系列(特別是V3和Xception)等。

論文

2017-MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

  • 提出採用深度可分離卷積(Depthwise separable convolution)來構建卷積,並且給出了不同程度的accuracy和latency的trade off。

參考:

  1. CNN 模型壓縮與加速算法綜述

  2. 【一文看懂】深度神經網絡加速和壓縮新進展年度報告

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章