深度学习模型压缩方法(3)-----模型剪枝(Pruning)
生活随笔
收集整理的這篇文章主要介紹了
深度学习模型压缩方法(3)-----模型剪枝(Pruning)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
link
前言
上一章,將基于核的稀疏化方法的模型壓縮方法進行了介紹,提出了幾篇值得大家去學習的論文,本章,將繼續(xù)對深度學習模型壓縮方法進行介紹,主要介紹的方向為基于模型裁剪的方法,由于本人主要研究的為這個方向,故本次推薦的論文數(shù)量較多,但都是非常值得一讀的。
基于模型裁剪的方法
- 對以訓練好的模型進行裁剪的方法,是目前模型壓縮中使用最多的方法,通常是尋找一種有效的評判手段,來判斷參數(shù)的重要性,將不重要的connection或者filter進行裁剪來減少模型的冗余。同樣也分為regular和irregular的方式。 這類方法最多,下面列舉幾篇典型的方案。
- 作者在裁剪的時候同樣會考慮每一層對裁剪的敏感程度,作者會單獨裁剪每一層來看裁剪后的準確率。對于裁剪較敏感的層,作者使用更小的裁剪力度,或者跳過這些層不進行裁剪。目前這種方法是實現(xiàn)起來較為簡單的,并且也是非常有效的,它的思路非常簡單,就是認為參數(shù)越小則越不重要。
- Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures 論文地址
作者認為,在大型的深度學習網(wǎng)絡(luò)中,大部分的神經(jīng)元的激活都是趨向于零的,而這些激活為0的神經(jīng)元是冗余的,將它們剔除可以大大降低模型的大小和運算量,而不會對模型的性能造成影響,于是作者定義了一個量APoZ(Average Percentage of Zeros)來衡量每一個filter中激活為0的值的數(shù)量,來作為評價一個filter是否重要的標準。APoZ定義如下: - 作者認為通過weight值的大小很難判定filter的重要性,通過這個來裁剪的話有可能裁掉一些有用的filter。因此作者提出了一種基于熵值的裁剪方式,利用熵值來判定filter的重要性。 作者將每一層的輸出通過一個Global average Pooling將feature map轉(zhuǎn)換為一個長度為c(filter數(shù)量)的向量,對于n張圖像可以得到一個n*c的矩陣,對于每一個filter,將它分為m個bin,統(tǒng)計每個bin的概率,然后計算它的熵值 利用熵值來判定filter的重要性,再對不重要的filter進行裁剪。第j個feature map熵值的計算方式如下:
- Designing Energy-Efficient Convolutional Neural Networks using Energy-Aware Pruning 論文地址
這篇文章也是今天的CVPR,作者認為以往的裁剪方法,都沒有考慮到模型的帶寬以及能量的消耗,因此無法從能量利用率上最大限度的裁剪模型,因此提出了一種基于能量效率的裁剪方式。 作者指出一個模型中的能量消耗包含兩個部分,一部分是計算的能耗,一部分是數(shù)據(jù)轉(zhuǎn)移的能耗,在作者之前的一片論文中(與NVIDIA合作,Eyeriss),提出了一種估計硬件能耗的工具,能夠?qū)δP偷拿恳粚佑嬎闼鼈兊哪芰肯摹H缓髮⒚恳粚拥哪芰肯膹拇蟮叫∨判?#xff0c;對能耗大的層優(yōu)先進行裁剪,這樣能夠最大限度的降低模型的能耗,對于需要裁剪的層,根據(jù)weight的大小來選擇不重要的進行裁剪,同樣的作者也考慮到不正確的裁剪,因此將裁剪后模型損失最大的weight保留下來。 - 此文的方法比較有意思,作者認為,既然我無法直觀上的判定filter的重要性,那么就采取一種隨機裁剪的方式,然后對于每一種隨機方式統(tǒng)計模型的性能,來確定局部最優(yōu)的裁剪方式。 這種隨機裁剪方式類似于一個隨機mask,假設(shè)有M個潛在的可裁剪weight,那么一共就有2^M個隨機mask。假設(shè)裁剪比例為a,那么每層就會隨機選取ML*a個filter,一共隨機選取N組組合,然后對于這N組組合,統(tǒng)計裁剪掉它們之后模型的性能,然后選取性能最高的那組作為局部最優(yōu)的裁剪方式。 算法流程如下:
- 作者發(fā)現(xiàn),在最后一個卷積層中,經(jīng)過LDA分析發(fā)現(xiàn)對于每一個類別,有很多filter之間的激活是高度不相關(guān)的,因此可以利用這點來剔除大量的只具有少量信息的filter而不影響模型的性能。 作者在VGG-16上進行實驗,VGG-16的conv5_3具有512個filter,將每一個filter的輸出值中的最大值定義為該filter的fire score,因此對應(yīng)于每一張圖片就具有一個512維的fire向量,當輸入一堆圖片時,就可以得到一個N*512的fire矩陣,作者用intra-class correlation來衡量filter的重要性:
- 本文為2016年的CVPR,應(yīng)用場景為人臉識別的模型:DeepID。作者認為,如果一層中的某個神經(jīng)元的激活與上一層的某個神經(jīng)元的激活有很強的相關(guān)性,那么這個神經(jīng)元對于后面層的激活具有很強的判別性。也就是說,如果前后兩層中的某對神經(jīng)元的激活具有較高的相關(guān)性,那么它們之間的連接weight就是非常重要的,而弱的相關(guān)性則代表低的重要性。如果某個神經(jīng)元可以視為某個特定視覺模式的探測器,那么與它正相關(guān)的神經(jīng)元也提供了這個視覺模式的信息,而與它負相關(guān)的神經(jīng)元則幫助減少誤報。作者還認為,那些相關(guān)性很低的神經(jīng)元對,它們之間的連接不一定是一點用也沒有,它們可能是對于高相關(guān)性神經(jīng)元對的補充。在全連接層中,計算方式如下:
- 可以看出來,基于模型裁剪的方法很多,其思路源頭都是來自于Oracle pruning 的方法,即挑選出模型中不重要的參數(shù),將其剔除而不會對模型的效果造成太大的影響,而如何找到一個有效的對參數(shù)重要性的評價手段,在這個方法中就尤為重要,我們也可以看到,這種評價標準花樣百出,各有不同,也很難判定那種方法更好。在剔除不重要的參數(shù)之后,通過一個retrain的過程來恢復(fù)模型的性能,這樣就可以在保證模型性能的情況下,最大程度的壓縮模型參數(shù)及運算量。目前,基于模型裁剪的方法是最為簡單有效的模型壓縮方式。(未完待續(xù))
總結(jié)
以上是生活随笔為你收集整理的深度学习模型压缩方法(3)-----模型剪枝(Pruning)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Transformer用到3D点云分割
- 下一篇: cuda 代码与文章