過參數化主要是指在訓練階段,在數學上需要進行大量的微分求解,去捕抓數據中的微小變化信息,壹旦完成叠代式的訓練之後,網絡模型推理的時候就不需要這麽多參數。而剪枝算法正是基於過參數化的理論基礎而提出的。
剪枝算法核心思想就是減少網絡模型中參數量和計算量,同時盡量保證模型的性能不受影響。
那在AI框架中,實際上剪枝主要作用在右下角的端側模型推理應用場景中,為的就是讓端側模型更小,無論是平板、手機、手表、耳機等小型IOT設備都可以輕松使用AI模型。而實際在訓練過程更多體現在剪枝算法和框架提供的剪枝API上面。
實際上大部分剛接觸剪枝算法的時候,都會從從宏觀層面去劃分剪枝技術,主要是分為Drop Out和Drop Connect兩種經典的剪枝算法,如下圖所示。
1)Drop Out:隨機的將壹些神經元的輸出置零,稱之為神經元剪枝。
2)Drop Connect:隨機將部分神經元間的連接Connect置零,使得權重連接矩陣變得稀疏。
下面會把剪枝的更多種方式呈現出來,可能會稍微復雜哈。從剪枝的粒度來劃分,可以分為結構化剪枝和非結構化剪枝,2個剪枝結構方法。下面來看看具體的剪枝方法有4種:
細粒度剪枝、向量剪枝、核剪枝在參數量與模型性能之間取得了壹定的平衡,但是網絡模型單層的神經元之間的組合結構發生了變化,需要專門的算法或者硬件結構來支持稀疏的運算,這種叫做 結構化剪枝(Unstructured Pruning) 。
其中,非結構化剪枝能夠實現更高的壓縮率,同時保持較高的模型性能,然而會帶來網絡模型稀疏化,其稀疏結構對於硬件加速計算並不友好,除非底層硬件和計算加速庫對稀疏計算有比較好的支持,否則剪枝後很難獲得實質的性能提升。
濾波器剪枝(Filter-level)主要改變網絡中的濾波器組和特征通道數目,所獲得的模型不需要專門的算法和硬件就能夠運行,被稱為 結構化剪枝(Structured Pruning) 。結構化剪枝又可進壹步細分:可以是channel-wise,也可以是filter-wise,還可以是在shape-wise。
結構化剪枝與非結構化剪枝恰恰相反,可以方便改變網絡模型的結構特征,從而達到壓縮模型的效果,例如知識蒸餾中的student網絡模型、NAS搜索或者如VGG19和VGG16這種裁剪模型,也可以看做變相的結構化剪枝行為。
雖然剪枝算法的分類看上去很多,但是核心思想還是對神經網絡模型進行剪枝,目前剪枝算法的總體流程大同小異,可以歸結為三種:標準剪枝、基於子模型采樣的剪枝、以及基於搜索的剪枝,如下圖所示。
標準剪枝是目前最流行的剪枝流程,在Tensorflow、Pytroch都有標準的接口。主要包含三個部分:訓練、剪枝、以及微調。
1) 訓練 :首先是對網絡模型進行訓練。在剪枝流程中,訓練部分主要指預訓練,訓練的目的是為剪枝算法獲得在特定基礎SOTA任務上訓練好的原始模型。
3) 微調 :微調是恢復被剪枝操作影響的模型表達能力的必要步驟。結構化模型剪枝會對原始模型結構進行調整,因此剪枝後的模型參數雖然保留了原始的模型參數,但是由於模型結構的改變,剪枝後模型的表達能力會受到壹定程度的影響。實現上,微調網絡模型,參數在計算的時候先乘以該Mask,Mask為1的參數值將繼續訓練通過BP調整梯度,而Mask為0的部分因為輸出始終為0則不對後續部分產生影響。
4) 再剪枝 :再剪枝過程將微調之後的網絡模型再送到剪枝模塊中,再次進行模型結構評估和執行剪枝算法。目的是使得每次剪枝都在性能更優的模型上面進行,不斷叠代式地進行優化剪枝模型,直到模型能夠滿足剪枝目標需求。
最後輸出模型參數儲存的時候,因為有大量的稀疏,所以可以重新定義儲存的數據結構, 僅儲存非零值以及其矩陣位置。重新讀取模型參數的時候,就可以還原矩陣。
除標準剪枝之外,基於子模型采樣的剪枝《EagleEye: Fast sub-net evaluation for efficient neural network pruning》最近也表現出比較好的剪枝效果。得到訓練好的模型之後,進行子模型采樣過程。壹次子模型采樣過程為:
1)對訓練好的原模型中可修剪的網絡結構,按照剪枝目標進行采樣,采樣過程可以是隨機的,也可以按照網絡結構的重要性或者通過KL散度計算進行概率采樣。
2)對采樣後的網絡結構進行剪枝,得到采樣子模型。子模型采樣過程通常進行 次,得到 個子模型( ≥1), 之後對每壹個子模型進行性能評估。子模型評估結束之後,選取最優的子模型進行微調以得倒最後的剪枝模型。
基於搜索的剪枝主要依靠強化學習等壹系列無監督學習或者半監督學習算法,也可以是神經網絡結構搜索相關理論。
給定剪枝目標之後,基於搜索的剪枝在網絡結構中搜索較優的子結構,這個搜索過程往往伴隨著網絡參數的學習過程,因此壹些基於搜索的剪枝算法在剪枝結束後不需要再進行微調。
這幾年神經網絡剪枝pruning作為模型壓縮技術的四小龍之壹,正在受到越來越多的關註。當然,各種更好的pruning參數選取方法壹定還會層出不窮。另外,從趨勢來看,以下幾個方向值得關註:
打破固定假設 :挑戰已有的固有的假設,例如ICLR2019會議的best paper彩票假說《The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks 》的出現。還有壹開始提到的對於over-parameterization,與重用已有參數是否有有益的反思非常有意思。這樣的工作會給剪枝算法非常大的啟發,從而根本改變解決問題的思路。
自動化剪枝 :隨著AutoML的大潮,越來越多的算法開始走向自動化。模型壓縮能拉下嗎?當然不能。經過前面的介紹我們知道,像ADC,RNP,N2N Learning這些工作都是試圖將剪枝中部分工作自動化。如量化中的《HAQ: Hardware-Aware Automated Quantization》考慮網絡中不同層信息的冗余程度不壹樣,所以自動化使用混合量化比特進行壓縮。
與NAS融合 :如前面模型剪枝流程中提到,剪枝算法與神經網絡搜索NAS的界限已經模糊了。NAS有針對結構化剪枝進行搜索方法,如One-Shot Architecture Search是先有壹個大網絡,然後做減法。NAS與模型壓縮兩個壹開始看似關系不是那麽大的分支,在近幾年的發展過程中因為下遊任務和部署場景的需求,最後似乎會走到壹塊去。這兩個分支今天有了更多的交集,也必將擦出更多的火花。
與GAN融合 :這幾年機器學習最火熱的分支之壹GAN,正在不斷滲透到已有領域,在pruning中也開始有它的身影。如2019年《Towards Optimal Structured CNN Pruning via Generative Adversarial Learning》讓generator生成裁剪後網絡,discrimintor來判別是否屬於原網絡還是裁剪後網絡,從而進行更有效的網絡結構化裁剪。
硬件稀疏性支持 :剪枝會給神經網絡模型帶來稀疏性特征,參數稀疏性在計算中會有大量的索引,所以並不能加速。現在雖然有像cuSPARSE這樣的計算庫,但底層硬件AI芯片本身設計並不是專門為稀疏數據處理打造的。如果能將稀疏計算和處理能力做進芯片那必將極大提高計算效率。僅2021年中國就推出了10+款基於ASIC的AI加速芯片,相信針對稀疏性場景的支持在未來會有所突破。
模型壓縮算法中針對已有的模型,有:張量分解,模型剪枝,模型量化。針對新構建的網絡,有:知識蒸餾,緊湊網絡設計等方法。
剪枝只是模型壓縮方法中的壹種,它與其它模型壓縮方法並不沖突,因此會與量化、蒸餾、NAS、強化學習等方法慢慢融合,這些都是很值得研究的方向。另外在上面的發展來看,打破固有的假設定義,與NAS、GAN、AutoML、RL等技術進行相互的融合,可能到最後會模糊purning方式,出現新的範式或者壓縮模式也是很吸引的。