1. 程式人生 > >模型壓縮相關工作

模型壓縮相關工作

image 理論 博客 article 數據 == 例如 iss 裁剪

總結的很好的一篇博客:https://blog.csdn.net/App_12062011/article/details/81665140

定點化:

    百度搜“模型壓縮定點化”

    https://blog.csdn.net/u011961856/article/details/76736103

    http://fjdu.github.io/machine/learning/2016/07/07/quantize-neural-networks-with-tensorflow.html

    https://petewarden.com/2015/05/23/why-are-eight-bits-enough-for-deep-neural-networks/

基於量化的模型壓縮

所謂量化,指的是減少數據在內存中的位數操作,例如,對於權重來說,如果大多數都在0附近,那麽32位的浮點表示,其實是有很大浪費的。這一方向的研究,主要是8位類型來表示32位浮點(定點化),甚至直接訓練低8位模型,二值模型。其作用不僅可以減少內存開銷,同時,可以節省帶寬,通過某些定點運算方式,甚至可以消除乘法操作,只剩加法操作,某些二值模型,直接使用位操作。當然,代價是位數越低,精度下降越明顯。

一般情況下,采用8位定點運算表示,理論上,可以節省4倍內存,帶寬,但是實際上,不是所有的模型參數,都可以定點化,這涉及到性能與加速的平衡。

但是 ,需要註意的是,如果你的模型本身夠快,那麽8位定點化操作, 可能沒有加速或者甚至變慢,因為,浮點轉定點,本身也是一筆開銷。大量浮點運算是比較慢,但是,模型參數不是很大的情況下,這種慢的差別在現代編譯器及硬件環境上幾乎體現不出來的,甚至可能量化開銷導致性能變慢。

剪枝:

Pruning Filters for Efficient Convnets
作者提出了基於量級的裁剪方式,用weight值的大小來評判其重要性,對於一個filter,其中所有weight的絕對值求和,來作為該filter的評價指標,將一層中值低的filter裁掉,可以有效的降低模型的復雜度並且不會給模型的性能帶來很大的損失,算法流程如下:

技術分享圖片

算每個channel的絕對值,按從小到大排序不同channel,把絕對值最小的m個channel刪除,並把相對應的下一層的channel也剪掉(這個相對應我還不知道怎麽回事),你可以逐層剪枝再finetune,也可以所有層剪完再finetune

文章還分析了不同層剪枝的敏感度,234層敏感度高,個人覺得這幾層是提基礎特征,所以更加敏感,自己剪枝也主要再後面層;還有個原因前面層參數更少,越少的越剪性能就越差

An Entropy-based Pruning Method for CNN Compression
作者認為通過weight值的大小很難判定filter的重要性,通過這個來裁剪的話有可能裁掉一些有用的filter。因此作者提出了一種基於熵值的裁剪方式,利用熵值來判定filter的重要性。 作者將每一層的輸出通過一個Global average Pooling將feature map轉換為一個長度為c(filter數量)的向量,對於n張圖像可以得到一個n*c的矩陣,對於每一個filter,將它分為m個bin,統計每個bin的概率,然後計算它的熵值 利用熵值來判定filter的重要性,再對不重要的filter進行裁剪。第j個feature map熵值的計算方式如下:
技術分享圖片

這篇論文的筆記:https://blog.csdn.net/u013082989/article/details/77943240

模型壓縮相關工作