中興算法大賽深度學習模型優化加速解決方案總結

前言:從小白入門,通過這次比賽學到很多東西。現在把文檔放到這裏,希望能夠幫助到需要的人。 特別感謝初賽排名第一的YaHei大佬。感謝他開源的代碼把我帶進了比賽的大門。附上大佬的項目鏈接:

https://github.com/hey-yahei/ZTE_Challenge2019_MOA

摘要: 本次模型壓縮幾乎無法重新訓練,因此無法採用許多常用的模型壓縮算法。針對主辦方提供的已經訓練完成的模型,主要使用了包括層融合、剪枝、奇異值分解等方法進行壓縮。

一、 層融合

​   在神經網絡訓練的過程中,BN層能夠加速網絡收斂,並且能夠控制過擬合。不過這樣也增加了一些運算和參數,因此在推理過程中,可以通過將BN層與卷積層的參數融合的方式,來減少運算,並略微地實現一些模型的壓縮。【1】

​   公式:

​   卷積層計算公式:
Y=WX+b Y = W*X + b

​   BN層計算公式:
Xbn=s(Xm)(σ+ϵ)+bbn X_{bn} = \frac{s(X - m)}{\sqrt(\sigma + \epsilon)} + b_{bn}
​   其中:m: 均值, $ \sigma$ : 方差, s: scale, $ b_{bn}$: 偏置, ϵ\epsilon : 滑動係數。

​   融合及將卷積層的輸出作爲BN層的輸入,帶入得到

​   融合公式:
Xbn=XsWσ+ϵ+s(bm)σ+ϵ+bbn X_{bn} = X * \frac{sW}{\sqrt{\sigma + \epsilon}} + \frac{s(b - m)}{\sqrt{\sigma + \epsilon}} + b_{bn}
​   得到融合之後的權值:
Wconv=Wsσ+ϵ W'_{conv} = W\frac{s}{\sqrt{\sigma + \epsilon}}

b_conv=(bconvm)sσ+ϵ+bbn b\_{conv} = (b_{conv} - m)\frac{s}{\sqrt{\sigma + \epsilon}} + b_{bn}

​   層融合對模型壓縮的效果並不明顯,對比賽所提供模型,層融合之後大小僅下降3KB。對於顯存大小及推理時間的提升未做詳細的量化分析。

二、 模型剪枝

​   對於一些權重極小的連接,將其去除幾乎不會影響模型的準確性,反而在重訓練過程中有助於避免過擬合現象的發生。本次針對該模型的剪枝以閾值修剪:去除絕對值低於$ 1*e^{-10}$的連接。關於閾值的設定,剛開始由於沒有經驗,不敢設很大。後來測試時發現,閾值設爲小於1e61*e^{-6}以內剪枝的數量幾乎一致。但是當閾值高到1e21*e^{-2}時就會對模型產生毀滅性的影響。本輪剪枝後模型大小下降也並不明顯,大約有340KB左右的下降。而且由於在修剪時需要同時對權值和prototxt文件進行修改,未能做到很好地利用代碼自動修剪,因此修剪體驗一般。

avatar

三、 刪除卷積層

   這個想法實在太過於簡單粗暴,幾乎不可能成爲一個通用的壓縮方法。幸運的是本次比賽的模型的conv5冗餘較大,直接刪除後邊四層的影響不大,而且賽後其他同學討論中提到甚至可以直接刪除後邊五層。必須承認這個方法來自QQ羣中一位同學的分享,並非自己發現。我自己在這一部分的工作主要就是修改代碼和prototxt文檔。這一方式雖然簡單粗暴,卻十分有效,直接將我從棄賽的邊緣拉到了前60名。該方法的主要提升在於對顯存佔用和推理計算量的降低。對於模型大小的壓縮效果並沒有很明顯,該步使模型大小減少了大約8.4MB。

四、 奇異值分解

​   奇異值分解(Singular Value Decomposition, SVD)是本次比賽所使用的最主要的壓縮手段,效果也是最明顯的。

avatar

avatar

​   由於全連接層佔據了模型中最大一部分的參數,對全連接層作奇異值分解可以得到極大的壓縮收益。因此本次將SVD作爲了模型壓縮的重點。有幾天的工作都花在了測試不同的r值對模型準確率的影響上。並且希望能夠找到合適的r使得z恰好處於臨界點(0.950或0.900)。最終,本次最好成績對應的r值爲136, 對應的z值爲0.958。也許是由於服務器波動等因素,在r=130時,z取值爲0.951,卻並未得到更加理想的成績。而使z接近0.9的r值爲108,此時z值爲0.901,但權值的下降並沒能換來足夠的顯存使用及計算量的改善。這一部分對於運算速度和顯存佔用有着顯著的優化,同時對模型的大小有着更爲顯著的壓縮。在r=130時,模型大小下降了大約190MB, 比原來壓縮了大約63%。

五、 其他未成功應用方法

(1)無需數據的卷積網絡自動加速

​   無需數據的卷積網絡數據加速(Data-free Automatic Acceleration of Convolutional Networks, DAC)是由Xin Li 等人與2018年提出的一種無需重新訓練模型的壓縮方式【2】。將卷積核分解爲Depthwise 及 Pointwise兩種,分解運算的核心其實還是奇異值分解。最終可以實現對已訓練完成的模型的卷積核分解與替換,以及權值的遷移,而無需重新訓練。原文作者在CIFAR-VGG模型上測試,發現替換靠後的卷積層可以在減少較多參數的同時只造成很小的精度損失,而處理較爲靠前的卷積層則代價較大。
附上自己實現DAC的代碼

https://github.com/baizhenmao95/2019-ZTE-Algorithm-Competition/blob/master/DAC_AGAIN.py

avatar

​   由於論文中給出了該算法的詳細步驟,因此我嘗試用代碼復現了該算法,並對卷積層conv4_5_2進行了替換。雖然最終確實可以得到壓縮後的模型,將r取爲5時大約能夠減少該層一半的參數。但是也許是我的程序實現有誤,也許是該算法並不適用於該類模型的壓縮,甚至也許是所選的用於替換的卷積層並不合適,總之最終得到的模型與原模型相比,所提取的特徵圖的餘弦距離出現了負數。最後一天我壓寶壓在了這一算法上,卻最終沒能實現突破,也是一大遺憾。

(2) Octave Conv

​   OctaveConv是前幾天剛出現的一個新的方法。一出現就得到了許多深度學習相關的學者和媒體的大力推薦。而其簡單有效的思想也讓我印象深刻。因此十分希望能夠復現其中的結果,並在此次比賽中爲我所用。作爲一個新的方法,使用它的優勢在於我可能會是比賽中爲數不多的使用者,也就有可能得到幾乎獨一無二的改善。但是劣勢在於,過於新鮮的方法意味着對其的解讀與代碼的實現方面可能很有限。因此在將近一週的時間內我只能對照着論文原文【3】和某個MXnet版本的第三方復現代碼【4】學習。它即插即用、無需更改網絡結構的特性非常吸引人,而其通俗易懂的比喻也降低了對算法的原理及其效果的理解難度。可惜最終我還是意識到它似乎是一個需要重新訓練的算法,最終只能遺憾放棄。但是在之後的科研工作中也許能夠真正地用到。因此也算是一項不錯的收穫。

avatar

(3)DEEP COMPRESSION

​   這一壓縮操作來自於一篇很經典的模型壓縮論文【5】以及一個caffe版本的第三方復現代碼。主要做了基於Kmeans聚類的量化來壓縮卷積和全連接層的權重。經過壓縮後得到了一個大約只有8MB的numpy模型文件。這對於嵌入式設備的使用非常友好。但是也許由於參數選取不合適等原因造成了z值的大幅下降,最終只能棄用。但該算法的實用意義也許要大於比賽意義。

附參考資料:
【1】 https://blog.csdn.net/u013597931/article/details/85697008
【2】https://arxiv.org/pdf/1812.08374.pdf
【3】https://export.arxiv.org/pdf/1904.05049
【4】https://github.com/terrychenism/OctaveConv
【5】https://arxiv.org/pdf/1510.00149v5.pdf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章