模型压缩与加速:Octave Convolution
??自AlexNet刷新了ImageNet比賽的最佳記錄以來,神經網絡的又一次高潮猛烈的到來了.一些列各種各樣的網絡層出不窮,圖像/音頻/文本等各種任務下都開始了神經網絡一統天下的聲音.然而神經網絡雖然很火,近些年在落地端卻鮮有比較成功的案例,其中一個很重要的原因是這些網絡需要很強的計算資源,基本都要跑在PC或者服務器上.因此個人認為深度學習如果想在工業上獲得比較大的推廣和應用,解決模型大小與推理速度是一個很重要的問題.
??模型壓縮與加速自然成為了一個很重要的技術點.這個系列會寫一些相關的論文和工作,記錄一下一些比較實用的points,也是自我學習的總結.個人認為神經網絡之所以能夠被壓縮和加速的同時維持足夠的精度,甚至提高部分精度,其中很重要的一個原因在于模型的冗余.在實踐中我們經常會感覺模型在數據集上的訓練/測試精度達到存在上限,訓練到達某個點metric就再也上不去了,會想當然的覺得模型的容量不夠了,或者認為當前這么多參數構成的model最多就這么多表達能力了,其實不然.模型此時往往還有冗余的部分,理論上如果能對每一個權值進行精細化的調教,精度還能繼續上升,或者說達到當前的精度并不需要當前這么多的參數.不是模型的表達能力不夠了,僅僅是我們目前的訓練方法和trick訓練不出來了而已.此時模型往往還是有冗余的空間的,否則模型壓縮與加速也就無從談起了.
??第一篇寫的是Octave Convolution.來自Facebook和新加坡國立大學聯手的文章:《Drop an Octave: Reducing Spatial Redundancy in Convolutional Neural Networks with Octave Convolution》.從名字就可以看出來,這是一篇針對卷及神經網絡的壓縮和加速文章.
??這篇文章的基本想法看起來很簡單但是很有意思,作者認為一張圖片可以分為低頻部分(粗略的結構)和高頻部分(邊緣紋理等細節),比如一張企鵝的照片可以按照頻率如下分開:
企鵝身上的大塊的毛發/大片的背景等屬于低頻部分,企鵝身體的邊緣/企鵝與背景的交界等部分屬于高頻部分,這部分包含的信息變化比較多.低頻的信息重復性較強,適當壓縮一下不會造成很大的信息損失,而高頻部分信息多樣性比較強,壓縮會造成信息損失.將這種想法推廣到CNN網絡的特征圖中,特征圖中的低頻部分可以適當壓縮,高頻部分原樣保留.則在不損失精度的前提下降低了模型的復雜度和計算量.這就是這篇文章的basic insight.
??文章中的一張圖足以用來說明上述思想.原本的特征圖是c×h×wc\times{h}\times{w}c×h×w,經過低頻壓縮后變為c1×h×wc_1\times{h}\times{w}c1?×h×w的高頻部分和c2×h′×w′c_2\times{h'}\times{w'}c2?×h′×w′的低頻部分,其中c1+c2=cc_1+c_2=cc1?+c2?=c且h′<h,w′<wh'<h, w'<wh′<h,w′<w,h′=0.5h,w′=0.5wh'=0.5h, w'=0.5wh′=0.5h,w′=0.5w文中.在進行網絡的前向傳播時,高低頻數據除了各自傳播以外還可以互相影響,保證信息的多樣性.
具體做法如下:
將每個卷積核分成兩個分量:W=[WH,WL]W=[W^H, W^L]W=[WH,WL],每一層的輸入輸出也分別分為兩個tensor,分別代表高頻特征YHY_HYH?和低頻特征YLY_LYL?,前向傳播時高低頻信息可以相互影響,YH=YH→H+YL→HY_H=Y_{H\rightarrow{H}}+Y_{L\rightarrow{H}}YH?=YH→H?+YL→H?,YL=YL→L+YH→LY_L=Y_{L\rightarrow{L}}+Y_{H\rightarrow{L}}YL?=YL→L?+YH→L?.通過一個介于0~1之間的系數α\alphaα來調節高低頻通道之間的相對大小,即c2=α×c,c1=(1?α)×c)c_2=\alpha\times{c}, c_1=(1-\alpha)\times{c})c2?=α×c,c1?=(1?α)×c),α=0\alpha=0α=0時就是我們熟悉的普通卷積了.此時卷積核也要對應的分解開.需要注意的是,下圖的卷積核分解和我們一般看到的卷積核示意圖不同,這個長方體的厚度方向表示的卷積核的寬和高(k×kk\times{k}k×k),寬和高方向分別代表卷積核輸入和輸出通道按照高頻和低頻的分配方式.
此時前向傳播時特征圖的計算方法如下圖:
該層的輸入為(1?αin)cin×h×w(1-\alpha_{in})c_{in}\times{h}\times{w}(1?αin?)cin?×h×w的高頻特征和αincin×0.5h×0.5w\alpha_{in}c_{in}\times{0.5h}\times{0.5w}αin?cin?×0.5h×0.5w的低頻特征,維度為h×wh\times wh×w的高頻特征經過WH→HW^{H\rightarrow{H}}WH→H的卷積核運算得到YH→HY^{H\rightarrow H}YH→H;維度為0.5h×0.5w0.5h\times 0.5w0.5h×0.5w的低頻特征經過上采樣得到維度為h×wh\times wh×w的特征,再經過WL→HW^{L\rightarrow{H}}WL→H的卷積核運算得到YL→HY^{L\rightarrow H}YL→H,最后YH→HY^{H\rightarrow H}YH→H+YL→HY^{L\rightarrow H}YL→H得到維度為h×wh\times wh×w的高頻輸出YHY^{H}YH.低頻特征的計算方法類似,只是第二部分使用高頻輸入池化降維后再通過卷積核運算.
在Octave Convolution的網絡中,α\alphaα是一個可以調節的超參數,在作者的設定中,第一層的αin=0,αout=α\alpha_{in}=0, \alpha_{out}=\alphaαin?=0,αout?=α,最后一層中的αin=α,αout=0\alpha_{in}=\alpha, \alpha_{out}=0αin?=α,αout?=0.其余層的αin=αout=α\alpha_{in}=\alpha_{out}=\alphaαin?=αout?=α.
??最后作者在很多網絡上都做了實驗,去驗證了這種高低頻分離的想法的有效性,在降低計算量的同時維持甚至提高了網絡的精度,是非常實用的點.下圖中黑色的點是原有網絡的表現,可以看到,所有的網絡在引入了α\alphaα后基本都能維持精度前提下的簡化,甚至簡化后的model精度不降反升.
??說兩句題外話,有很多人diss神經網絡,認為其理論基礎并不完善.反正就是扔進去一堆數據一頓訓練,完全是個黑箱子.我覺得這種diss也是有道理的.可以看到很多所謂的針對網絡的改進,都是先給出一堆定性的描述說怎么怎么好,可是這些描述本來就很難全面的去衡量.很多東西真是怎么說都有道理,也怎么說都有缺點,反正論文就只說正面的東西,忽略不利的東西.最關鍵的是做實驗,要拿出一些比較general的model去跑一跑,只要效果變好了那就大功告成,可以發paper了,有點成王敗寇的感覺哈哈.那么這種新型的卷積到底是不是比較general的改進,是否對分類/分割/檢測等各種任務都有較好的改善呢?這個就只能實際去試過才知道了吧.
論文地址:https://export.arxiv.org/abs/1904.05049
參考鏈接:https://mp.weixin.qq.com/s?__biz=MzIzNjc1NzUzMw==&mid=2247518961&idx=1&sn=dbecefc1a33a4271e82f67ec4d9784e0&chksm=e8d03d83dfa7b49561dfc30acbbcc326c17b02b1c84388db02e333cdf6874caf49a6cd82818f&mpshare=1&scene=1&srcid=&pass_ticket=yi%2FcpjT%2FLNaKCb0fsxUwWTuGb%2FAYHMlSjnG9ENCxVoXxSLVpOFR8YVhqEipuWIC7#rd
總結
以上是生活随笔為你收集整理的模型压缩与加速:Octave Convolution的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摇杆控制LED灯的亮度
- 下一篇: 人的“肥胖”基因FTO可促进水稻和土豆增