深度學習之模型壓縮


一、背景

     深度學習讓計算機視覺任務的性能到達了一個前所未有的高度。但,復雜模型的同時,帶來了高額的存儲空間、計算資源消耗,使其很難落實到各個硬件平台。

     為了解決這些問題,壓縮模型以最大限度地減小模型對於計算空間和時間的消耗。

二、理論基礎

    必要性:目前主流的網絡,如VGG16,參數量1億3千多萬,占用500多MB空間,需要進行300多億次浮點運算才能完成一次圖像識別任務。

    可行性:在深度卷積網絡中,存在着大量冗余地節點,僅僅只有少部分(5-10%)權值參與着主要的計算,也就是說,僅僅訓練小部分的權值參數就可以達到和原來網絡相近的性能。

三、目前方法

從數據,模型和硬件多維度的層面來分析,壓縮和加速模型的方法

1、壓縮已有的網絡,包含:張量分解,模型剪枝,模型量化;(針對既有模型)

1.1、張量分解

    定義:將網絡權值當滿秩矩陣,可以用多個低秩矩陣來逼近該矩陣。

 目的:降低時間復雜度。

   優點:適合模型壓縮

   缺點:實現並不容易,涉及計算成本高昂的分解操作,且需要大量的重新訓練來達到收斂。

    對於二維矩陣運算,SVD是個好方法。 

    SVD分解:

  • [2016,Zhang]Accelerating very deep convolutional networks for classification and detection:對參數矩陣進行張量SVD分解進行非線性問題的求解,同時不需要通過隨機梯度下降過程進行優化,並在非對稱重構中考慮前一網絡層的累計重構誤差,在不需要隨機梯度下降(SGD)的情況下,開發了一種有效的非線性優化問題求解方法
  • [2015,Jaderberg,BMVC]Speeding up convolutional neural networks with low rank expansions:使用秩為1(可以分解為行向量與列向量乘積)的卷積核作用在輸入圖上產生相互獨立的M個基本特征圖,卷積神經網絡大小為k×k 的卷積核分解為1×k 和k×1的卷積核, 然后通過學習到的字典權重利用線性組合重構出輸出特征圖。
  • [2017,Tai]Convolutional neural networks with low-rank regularization. (Princeton University, etc.):提出從零開始訓練低秩約束卷積神經網絡模型的方法,不僅速度得到提升,而且在一些情況下模型性能也有所提高.作者提出一種低階張量分解的新算法,用於消除卷積核中的冗余.該算法找 到 矩陣分解 的精神的全局優化器,比迭代方法更有效。

    對於多維矩陣運算,涉及到Tensor,主要是CP分解,Tucker分解,Tensor Train分解,Block Term分解。

    CP分解:

  • [2014,JADERBER]Speeding up convolutional neural networks using fine-tuned CP-decomposition:采用CP分解法將一層網絡分解為五層低復雜度的網絡層,但在基於隨機梯度下降法的模型權重微調過程中難以獲取張量分解的優化解.作者利用兩個卷積神經網絡模 型對該方法進行評估,結果表明該方法以較低的性能損失實現更高的計算速度
  • [2014,Denton,NIPS]Exploiting linear structure within convolutional netowrks for efficient evalution:探索多種張量分解方法,例如二維張量分解可采用奇異值分解法,三維張量可轉化為二維張量進行分解,以及單色卷積分解和聚類法低秩分解等.作者利用 卷 積 參 數 的冗余性獲得 近似計算過程,較大的減少所需的計算量,在保持原始模型浮動1%精度的條件下,基於 CPU和GPU的計算過程均取得近2倍的加速。

1.2、模型剪枝

    將權重矩陣中相對不重要的權值剔除,然后再重新精修(finetune)網絡進行微調。

1.2.1 廣義修剪

    1、正則化:修改目標函數,得到一個參數較少的網絡,如添加L1Norm在損失函數;

    2、修剪:刪除冗余的特征和參數

1.2.2 基本流程

     1、分析神經元重要程度

     2、移除不重要的神經元

     3、對網絡進行微調

     4、重新執行第一步,下一輪迭代

1.2.3 核心問題

1.2.3.1 剪什么?

    1、細粒度剪枝:保留模型精度,但依賴硬件設備

    2、粗粒度剪枝:模型速度和大小都有效提升,但精度會大幅下降。

1.2.3.2 怎么剪?

    1、權重衰減法:屬正則化方法

1.2.3.3 什么時候剪?

    迭代式剪枝:訓練權重----》剪枝-----》訓練權重

1.2.4 單個權重(Weight)剪枝——非結構化

    任意權重被看作是單個參數並進行隨機非結構化剪枝

    [2017,Molchanov,ICLR]Pruning Convolutional Neural Networks for Resource Efficient Transfer Learning Inference:從眾多的權重參數中選擇一個最優的組合(組合優化問題),使得被裁剪的模型的代價函數的損失最小。結合貪婪剪枝和基於反向傳播的微調來確保剪枝后的網絡的泛化性。提出了一種基於泰勒展開來近似計算去除部分參數后網絡的損失函數的變化。

     [2017,Wang,ICLR]Training Compressed Fully-Connected Networks with a Density-Diversity Penalty:Density指的是模型參數的冗余度,就是零和極小值的多少;Diversity指的是參數的多樣性,即如果參數能夠聚類成為少數幾個類別,那么就是多樣性低,反之就是多樣性豐富。實際上論文的目的不是通過加入懲罰項直接訓練一個很小的模型,而是通過這么一個懲罰,使得模型在訓練時能夠盡可能冗余,盡可能多樣性低,這樣在后續就可以更大程度低剪枝和量化編碼。

缺點:

導致網絡連接不規整,需要通過稀疏表達來減少內存占用,進而導致在前向傳播時,需要大量條件判斷和額外空間來標明0或非0參數位置,因此不適合並行計算。

非結構化的稀疏性需要使用專門的軟件計算庫或者硬件。

1.2.5 核內權重(Intra Kernel Weight)剪枝/核的稀疏化——結構化

對權重的更新加以正則項進行限制,使其更加稀疏,使大部分的權值都為0。

[2016,JIN]Training Skinny Deep Neural Networks with Iterative Hard Thresholding Methods:通過在目標函數中增加參數的L0范數約束,實現模型的稀疏化,但L0范數求解較困難,因此提出一種階段迭代算法,首先僅更新權值較大的參數,然后恢復所有網絡連接,迭代更新所有參數,在訓練中可實現模型裁剪

[2017,Anwar,JETC]Structured pruning of deep convolutional neural networks:

1、定義顯著性變量並進行貪婪剪枝。

核內定步長粒度,將細粒度剪枝轉化為粗粒度剪枝。

全連接或稠密連接:一般作用到同一輸入特征圖上的Kernel必須采用相同的步長和偏置

卷積層不是稠密連接:作用在不同特征圖上的kernel步長與偏置可以不同

2、使用進化粒子濾波器決定網絡連接重要性

1.2.6 卷積核(Kernel)/特征圖(Feature Map)/通道(Channel/ Filter)剪枝——結構化

定義:減去第i層的filter,進而減去第i層產生的部分特征圖和第i+1層的部分kernel。

kernel粒度的顯著性度量可以采用kernel的權重和來判斷,采用Filter的權重和來判斷

[2017,Hu,ICLR]Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures:激活值為0的神經元是冗余的,基於統計的方法刪除對大部分不同輸入都輸出零值的單元,並進行交替重新訓練。

1.2.7 中間隱層(Layer)剪枝

定義:刪除一些層,即改變網絡結構

[2017,Rueda,GCRP]Neron Pruning for Compressing Deep Networks using Maxout Architectures:提出一種最大化輸出單元將多個神經元合並為更復雜的凸函數表達,並根據各個神經元再訓練集上的響應的局部相關性進行選擇。

DeepRebirth: A General Approach for Accelerating Deep Neural Network Execution on Mobile Devices:將網絡層分為權重層(如卷積層和全連接層)和非權重層(如Pooling層、ReLU層等),非權重層的理論計算量較小,但由於內存數據訪問速度等原因,其計算耗時較多,提出將非權重層與權重層進行合並的方法,去除獨立的非權重層后,運行時間顯著減少 。

1.3、網絡量化

    一般,神經網絡模型的參數都是32bit長度的浮點數表示。很多時侯不需要這么高的精度,可以通過量化,用如用8bit來表示。通過犧牲精度來降低每個權值所需要的空間。SGD所需要的精度僅為6-8bit,合理的量化可保證精度的情況下減小模型的存儲體積。根據量化方法不同,可分為2值量化,3值量化,多值量化。

3個問題:如何量化?如何計算梯度?如何保證准確率?

1.3.1、二值量化

    將權值矩陣中的單精度浮點數用兩個值來表示。一般使用符號函數或加入線性化的符號函數來近似。

    [2017,Zhou,ICLR]Incremental network quantization:Towards lossless cnns with low-precision weights:給定任意結構的全精度浮點神經網絡模型,能將其轉換成無損的低比特二進制模型。增量式網絡量化方法,三種獨立操作:權重划分、分組量化、再訓練。

1.3.2、 三值量化

   改進的二值量化,在二值網絡函數(-1,+1)的基礎上,顯式地增加0這個量化值。

      2016,Fengfu,CVPR]Ternary weight networks:三值化

1.3.3、 多值量化

   使用8big或16bit定點數來表示。

   [2016,DETTMERS]8-bit approximations for parallelism in deep learning:開發並測試8bit近似算法,將32bit的梯度和激活值壓縮到8bit,通過 GPU集群測試模型和數據的並行化性能,在保證模型預測精度的條件下,提出的方法取得兩倍的數據傳輸加速。

注:在TensorRT的量化處理:

 

 其中scaling_factor為FP32的比例系數

2、構建新的小型網絡,包含:知識蒸餾,緊湊網絡設計;(針對新模型)

2.1、遷移學習/知識蒸餾

  • 遷移學習:將一個模型的性能遷移到另一個模型上
  • 網絡精餾:在同一個域上遷移學習的一種特例

     采用預訓練好的復雜模型的輸出作為監督信號去訓練另外一個簡單的網絡。

  2017,Romero,ICLR]Hints for the deep nets:設計了更深的更窄的學生模型,同時保證兩者的網絡參數相同,采用Hints方式。

2.2、緊湊網絡設計

    1、MobileNet系列:采用深度可分離卷積來構建卷積。

       Efficient Convolutional Neural Networks for Mobile Vision Applications:借鑒factorized convolution的思想,將普通卷積操作分成兩部分

  • Depthwise Convolution:每個卷積核濾波器只針對特定的輸入通道進行卷積操作
  • Pointwise Convolution:采用1x1大小的卷積核將depthwise convolution層的多通道輸出進行結合

    2、ShuffleNet:

        ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices:基於MobileNet的group思想,將卷積操作限制到特定的輸入通道。而與之不同的是,ShuffleNet將輸入的group進行打散,從而保證每個卷積核的感受野能夠分散到不同group的輸入中,增加了模型的學習能力。

    3、SqueezeNet:

      [2016,Iandola,]SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size

  • 將3x3卷積核替換為1x1卷積核(1個1x1卷積核的參數是3x3卷積核參數的1/9,這一改動理論上可以將模型尺寸壓縮9倍)
  • 減小輸入到3x3卷積核的輸入通道數
  • 盡可能的將降采樣放在網絡后面的層中
  • 借鑒ResNet思想,對原始網絡結構做了修改,增加了旁路分支,將分類精度提升了約3%。
  • 作者提出了一個類似inception的網絡單元結構,取名為fire module。一個fire module 包含一個squeeze 卷積層(只包含1x1卷積核)和一個expand卷積層(包含1x1和3x3卷積核)。其中,squeeze層借鑒了inception的思想,利用1x1卷積核來降低輸入到expand層中3x3卷積核的輸入通道數。

3、計算加速(針對硬件)

 Faster CNNs with direct sparse convolutions and guided pruning:提出一種基於向量形式的乘法,實現密集矩陣與稀疏矩陣之間的高效乘法運算。

   [2017,ICML]MEC: Memory-efficient Convolution for Deep Neural Network:內存利用率高且速度較快的卷積計算方法

4、對數據進行變換(針對數據源)

    WAE-Learning a Wavelet-like Auto-Encoder to Accelerate Deep Neural Networks:WAE借助小波分解得思想,將原圖分解成兩個低分辨率圖像,以達到網絡加速的目。

 

 

參考鏈接:

1、https://blog.csdn.net/wspba/article/details/75671573

2、https://blog.csdn.net/qiu931110/article/details/80189905

3、https://blog.csdn.net/shentanyue/article/details/83508497


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM