1. 程式人生 > >深度學習模型壓縮方法綜述(一)

深度學習模型壓縮方法綜述(一)

前言

目前在深度學習領域分類兩個派別,一派為學院派,研究強大、複雜的模型網路和實驗方法,為了追求更高的效能;另一派為工程派,旨在將演算法更穩定、高效的落地在硬體平臺上,效率是其追求的目標。複雜的模型固然具有更好的效能,但是高額的儲存空間、計算資源消耗是使其難以有效的應用在各硬體平臺上的重要原因。

最近正好在關注有關深度學習模型壓縮的方法,發現目前已有越來越多關於模型壓縮方法的研究,從理論研究到平臺實現,取得了非常大的進展。

2015年,Han發表的Deep Compression是一篇對於模型壓縮方法的綜述型文章,將裁剪、權值共享和量化、編碼等方式運用在模型壓縮上,取得了非常好的效果,作為ICLR2016的best paper,也引起了模型壓縮方法研究的熱潮。其實模型壓縮最早可以追溯到1989年,Lecun老爺子的那篇

Optimal Brain Damage(OBD)就提出來,可以將網路中不重要的引數剔除,達到壓縮尺寸的作用,想想就可怕,那時候連個深度網路都訓練不出來,更沒有現在這麼發達的技術,Lecun就已經想好怎麼做裁剪了,真是有先見之明,目前很多裁剪方案,都是基於老爺子的OBD方法。

目前深度學習模型壓縮方法的研究主要可以分為以下幾個方向: 更精細模型的設計,目前的很多網路都具有模組化的設計,在深度和寬度上都很大,這也造成了引數的冗餘很多,因此有很多關於模型設計的研究,如SqueezeNet、MobileNet等,使用更加細緻、高效的模型設計,能夠很大程度的減少模型尺寸,並且也具有不錯的效能。 模型裁剪

,結構複雜的網路具有非常好的效能,其引數也存在冗餘,因此對於已訓練好的模型網路,可以尋找一種有效的評判手段,將不重要的connection或者filter進行裁剪來減少模型的冗餘。 核的稀疏化,在訓練過程中,對權重的更新進行誘導,使其更加稀疏,對於稀疏矩陣,可以使用更加緊緻的儲存方式,如CSC,但是使用稀疏矩陣操作在硬體平臺上運算效率不高,容易受到頻寬的影響,因此加速並不明顯。 除此之外,量化Low-rank分解遷移學習等方法也有很多研究,並在模型壓縮中起到了非常好的效果。

基於核的稀疏化方法

核的稀疏化,是在訓練過程中,對權重的更新加以正則項進行誘導,使其更加稀疏,使大部分的權值都為0。核的稀疏化方法分為regular和irregular,regular的稀疏化後,裁剪起來更加容易,尤其是對im2col的矩陣操作,效率更高;而irregular的稀疏化後,引數需要特定的儲存方式,或者需要平臺上稀疏矩陣操作庫的支援,可以參考的論文有:

  • Learning Structured Sparsity in Deep Neural Networks 論文地址 本文作者提出了一種Structured Sparsity Learning的學習方式,能夠學習一個稀疏的結構來降低計算消耗,所學到的結構性稀疏化能夠有效的在硬體上進行加速。 傳統非結構化的隨機稀疏化會帶來不規則的記憶體訪問,因此在GPU等硬體平臺上無法有效的進行加速。 作者在網路的目標函式上增加了group lasso的限制項,可以實現filter級與channel級以及shape級稀疏化。所有稀疏化的操作都是基於下面的loss func進行的,其中Rg為group lasso: 這裡寫圖片描述 則filter-channel wise: 這裡寫圖片描述 而shape wise: 這裡寫圖片描述 由於在GEMM中將weight tensor拉成matrix的結構,因此可以通過將filter級與shape級的稀疏化進行結合來將2D矩陣的行和列稀疏化,再分別在矩陣的行和列上裁剪掉剔除全為0的值可以來降低矩陣的維度從而提升模型的運算效率。該方法是regular的方法,壓縮粒度較粗,可以適用於各種現成的演算法庫,但是訓練的收斂性和優化難度不確定。作者的原始碼為:https://github.com/wenwei202/caffe/tree/scnn

  • Dynamic Network Surgery for Efficient DNNs 論文地址 作者提出了一種動態的模型裁剪方法,包括以下兩個過程:pruning和splicing,其中pruning就是將認為不中要的weight裁掉,但是往往無法直觀的判斷哪些weight是否重要,因此在這裡增加了一個splicing的過程,將哪些重要的被裁掉的weight再恢復回來,類似於一種外科手術的過程,將重要的結構修補回來,它的演算法如下: 這裡寫圖片描述 作者通過在W上增加一個T來實現,T為一個2值矩陣,起到的相當於一個mask的功能,當某個位置為1時,將該位置的weight保留,為0時,裁剪。在訓練過程中通過一個可學習mask將weight中真正不重要的值剔除,從而使得weight變稀疏。由於在刪除一些網路的連線,會導致網路其他連線的重要性發生改變,所以通過優化最小損失函式來訓練刪除後的網路比較合適。 優化問題表達如下: 這裡寫圖片描述 引數迭代如下: 這裡寫圖片描述 其中用於表示網路連線的重要性 h 函式定義如下: 這裡寫圖片描述 該演算法採取了剪枝與嫁接相結合、訓練與壓縮相同步的策略完成網路壓縮任務。通過網路嫁接操作的引入,避免了錯誤剪枝所造成的效能損失,從而在實際操作中更好地逼近網路壓縮的理論極限。屬於irregular的方式,但是ak和bk的值在不同的模型以及不同的層中無法確定,並且容易受到稀疏矩陣演算法庫以及頻寬的限制。論文原始碼:https://github.com/yiwenguo/Dynamic-Network-Surgery

  • Training Skinny Deep Neural Networks with Iterative Hard Thresholding Methods 論文地址 作者想通過訓練一個稀疏度高的網路來降低模型的運算量,通過在網路的損失函式中增加一個關於W的L0正規化可以降低W的稀疏度,但是L0正規化就導致這是一個N-P難題,是一個難優化求解問題,因此作者從另一個思路來訓練這個稀疏化的網路。演算法的流程如下: 這裡寫圖片描述 先正常訓練網路s1輪,然後Ok(W)表示選出W中數值最大的k個數,而將剩下的值置為0,supp(W,k)表示W中最大的k個值的序號,繼續訓練s2輪,僅更新非0的W,然後再將之前置為0的W放開進行更新,繼續訓練s1輪,這樣反覆直至訓練完畢。 同樣也是對引數進行誘導的方式,邊訓練邊裁剪,先將認為不重要的值裁掉,再通過一個restore的過程將重要卻被誤裁的引數恢復回來。也是屬於irregular的方式,邊訓邊裁,效能不錯,壓縮的力度難以保證。

總結

以上三篇文章都是基於核稀疏化的方法,都是在訓練過程中,對引數的更新進行限制,使其趨向於稀疏,或者在訓練的過程中將不重要的連線截斷掉,其中第一篇文章提供了結構化的稀疏化,可以利用GEMM的矩陣操作來實現加速。第二篇文章同樣是在權重更新的時候增加限制,雖然通過對權重的更新進行限制可以很好的達到稀疏化的目的,但是給訓練的優化增加了難度,降低了模型的收斂性。此外第二篇和第三篇文章都是非結構化的稀疏化,容易受到稀疏矩陣演算法庫以及頻寬的限制,這兩篇文章在截斷連線後還使用了一個surgery的過程,能夠降低重要引數被裁剪的風險。之後還會對其他的模型壓縮方法進行介紹。(未完待續)