【AI不惑境】移动端高效网络,卷积拆分和分组的精髓
大家好,這是專欄《AI不惑境》的第六篇文章,講述卷積拆分和分組卷積的精髓。
進入到不惑境界,就是向高手邁進的開始了,在這個境界需要自己獨立思考。如果說學(xué)習(xí)是一個從模仿,到追隨,到創(chuàng)造的過程,那么到這個階段,應(yīng)該躍過了模仿和追隨的階段,進入了創(chuàng)造的階段。從這個境界開始,講述的問題可能不再有答案,更多的是激發(fā)大家一起來思考。
作者&編輯 | 言有三
在移動端高效的模型設(shè)計中,卷積拆分和分組幾乎是不可缺少的思想,那么它們究竟是如何高效,本身又有哪些發(fā)展呢。
?
1 什么是卷積拆分
一個多通道的普通2D卷積包含了三個維度,分別是通道,長,寬,如下圖(a)。
?
然后將這個卷積的步驟分解為3個獨立的方向[1],即通道方向,X方向和Y方向,如上圖(b),則具有更低的計算量和參數(shù)量。
假如X是卷積核寬度,Y是卷積核高度,C是輸入通道數(shù),如果是正常的卷積,那么輸出一個通道,需要的參數(shù)量是XYC,經(jīng)過上圖的分解后,參數(shù)量變?yōu)閄+Y+C,一般來說C>>X和Y,所以分解后的參數(shù)對比之前的參數(shù)約為1/(XY)。
對于3×3的卷積,相當(dāng)于參數(shù)量降低一個數(shù)量級,計算量也是相當(dāng),可見這是很高效的操作。
當(dāng)然,還可以只分解其中的某些維度,比如在Inception V3的網(wǎng)絡(luò)結(jié)構(gòu)中,就將7×7的卷積拆分為1×7和7×1兩個方向。從另一個角度來看,這還提升了網(wǎng)絡(luò)的深度。
?
2 什么是通道分組
2.1 分組卷積的來源
標(biāo)準(zhǔn)的卷積是使用多個卷積核在輸入的所有通道上分別卷積提取特征,而分組卷積,就是將通道進行分組,組與組之間相關(guān)不影響,各自得到輸出。
通道分組的思想來自于Laurent Sifre在Google實習(xí)的時候提出的separable convolution,相關(guān)的內(nèi)部報告可以參考YouTube視頻https://www.youtube.com/watch?v=VhLe-u0M1a8,具體的實現(xiàn)在它的博士論文[2]中,如下示意圖。
?
對于平移,旋轉(zhuǎn)等剛體運動來說,它們可以被拆分成不同的維度,因此使用上面的separable convolution,實現(xiàn)起來也很簡單,就是先進行通道的分組,這在AlexNet網(wǎng)絡(luò)中還被當(dāng)作一個訓(xùn)練技巧。
2.2 從Xception到MobileNet
隨著Google的Inception網(wǎng)絡(luò)提出,這一個相對于VGG更加高效的網(wǎng)絡(luò)也開始進化。到了Inception V2的時候,已經(jīng)用上了上面的思想。
?
上面就是一個與Inception Module類似的模塊,只是每一個通道完全一樣,這就可以等價于通道分組了。
假如分組的個數(shù)與輸入通道數(shù)相等,Inception便成為了極致的inception(extreme inception,簡稱Xception[3])。
首先經(jīng)過1×1卷積,然后通道分組進行卷積,這樣的一個結(jié)構(gòu)隨Tensorflow的流行而流行,名為Depthwise Separable Convolution。
隨后Google的研究人員提出了MobileNets[4]結(jié)構(gòu),使用了Depthwise Separable Convolution模塊進行堆疊,與Xception中的不同是1×1卷積放置在分組卷積之后。因為有許多這樣的模塊進行堆疊,所以兩者其實是等價的。
畫成二維圖,示意圖如下:
?
畫成三維圖,示意圖如下:
使用Netscope可視化MobileNet的網(wǎng)絡(luò)如下,當(dāng)我們看到這個28層的網(wǎng)絡(luò),又經(jīng)歷了殘差網(wǎng)絡(luò)的洗禮后,頓時有種返璞歸真的感覺。
2.3 分組卷積性能如何
令輸入blob大小為M×Dk×Dk,輸出為N×Dj×Dj,則標(biāo)準(zhǔn)卷積計算量為M×Dk×Dk×N×Dj×Dj,而轉(zhuǎn)換為Depthwise卷積加Pointwise卷積,Depthwise卷積計算量為M×Dk×Dk×Dj×Dj,Pointwise卷積計算量為M×N×Dj×Dj,計算量對比為:(M×Dk×Dk×Dj×Dj+M×N×Dj×Dj)/M×Dk×Dk×N×Dj×Dj= 1/N+1/(Dk×Dk),由于網(wǎng)絡(luò)中大量地使用3×3的卷積核,當(dāng)N比較大時,上面卷積計算量約為普通卷積的1/9,從而降低了一個數(shù)量級的計算量。
性能上也沒有讓我們失望,在只有VGG16不到1/32的參數(shù)量和1/27的計算量的同時還能取得與之相當(dāng)?shù)男阅堋?/p>
?
關(guān)于更多細節(jié)的解讀和實驗對比,此處就不再做介紹了,可以閱讀以前的一篇文章。
【模型解讀】說說移動端基準(zhǔn)模型MobileNets
2.4 分組卷積性能的進一步提升
對于MobileNet這樣的網(wǎng)絡(luò)結(jié)構(gòu),還可以從兩個方向進行提升,第一個是增加分組的信息交流,第二個是更加智能的分組。
簡單的分組使得不同通道之間沒有交流,可能會導(dǎo)致信息的丟失,Shufflenet[5]重新增加了通道的信息交換。具體來說,對于上一層輸出的通道,先做一個Shuffle操作,再分成幾個組進入到下一層,示意圖如下:
另一方面,MobileNet的分組是固定,ShuffleNet中的通道的打亂也是一個確定的映射,那是不是可以基于數(shù)據(jù)來學(xué)習(xí)到更加合適的分組呢?Condensenets[6]給出了確定的回答。
更多的解讀,我們已經(jīng)放在了知識星球中,感興趣的可以關(guān)注。
?
3 分組卷積結(jié)構(gòu)的發(fā)展
ResNet雖然不是殘差連接的發(fā)明者,但使得這一思想為眾人癡狂。MobileNet也不是分組卷積的發(fā)明者,但同樣是它使分組的思想深入人心,原來這樣的網(wǎng)絡(luò)結(jié)構(gòu)不僅不降低準(zhǔn)確率,還能大幅度提升計算效率,尤其適合硬件并行。
自此,分組的思想被不斷拓展研究,下面我們主要考慮分組的各個通道存在較大差異的研究。
3.1 多分辨率卷積核通道分組網(wǎng)絡(luò)
這一類網(wǎng)絡(luò)以SqueezeNet[7]為代表,它以卷積層conv1開始,接著是8個Fire modules,最后以卷積層conv10結(jié)束。
一個fire module的子結(jié)構(gòu)下圖,包含一個squeeze模塊加上一個expand模塊。Squeeze模塊使用1×1卷積進行通道降維,expand模塊使用1×1卷積和3×3卷積用于通道升維。
Squeezenet的壓縮比率是驚人的,只有AlexNet 1/50的參數(shù)量,能達到相當(dāng)?shù)男阅堋?/p>
3.2 多尺度通道分組網(wǎng)絡(luò)
這一類結(jié)構(gòu)采用不同的尺度對信息進行處理,對于分辨率大的分支,使用更少的卷積通道,對于分辨率小的分支,使用更多的卷積通道,以Big-Little Net[8]為代表,K個分支,尺度分別為1/2^(K-1),如下圖結(jié)構(gòu)。
當(dāng)然,如果兩個通道在中間的計算過程中還存在信息的交流,則可以獲得更高的性能,比如Octave Convolution[9]。
?
卷積核通過因子被分為了高分辨率和低分辨率兩部分,低分辨率具有較多的通道,被稱為低頻分量。高分辨率具有較少的通道,被稱為高頻分量,兩者各自學(xué)習(xí),并且進行信息的融合。高分辨率通道通過池化與低分辨率通道融合,低分辨率通過上采樣與高分辨率通道融合。最終在22.2GFLOPS的計算量下,ImageNet Top-1的精度達到了82.9%。
3.3 多精度通道分組網(wǎng)絡(luò)
除了還分辨率和卷積核上做文章,還可以在計算精度上做文章,這一類結(jié)構(gòu)以DSConv[10]為代表,它將卷積核分為兩部分,一部分是整數(shù)分量VQK,一部分是分?jǐn)?shù)分量KDS,如下圖:
VQK(Variable Quantizes Kernel)只有整數(shù)值,不可訓(xùn)練,它的權(quán)重值從預(yù)訓(xùn)練模型中計算而來。KDS(kernel distribution shifter)是浮點數(shù),包含一個kernel級別的偏移量,一個channel級別的偏移量。
這一個模型在ResNet50和ResNet34,AlexNet,MobileNet等基準(zhǔn)模型上取得了14x參數(shù)量的壓縮,10x速度的提升。
除了上面這些思路外,還有很多可以做的空間,大家可以去多實驗寫論文填坑,有三就幫到這里了。
參考文獻
[1] Jin J, Dundar A, Culurciello E. Flattened convolutional neural networks for feedforward acceleration[J]. arXiv preprint arXiv:1412.5474, 2014.
[2] Sifre L , Mallat, Stéphane. Rigid-Motion Scattering for Texture Classification[J]. Computer Science, 2014.
[3] Chollet F. Xception: Deep Learning with Depthwise Separable Convolutions[J]. computer vision and pattern recognition, 2017: 1800-1807.
[4] Howard A G, Zhu M, Chen B, et al. Mobilenets: Efficient convolutional neural networks for mobile vision applications[J]. arXiv preprint arXiv:1704.04861, 2017.
[5] Zhang X, Zhou X, Lin M, et al. Shufflenet: An extremely efficient convolutional neural network for mobile devices[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 6848-6856.
[6] Huang G, Liu S, Van der Maaten L, et al. Condensenet: An efficient densenet using learned group convolutions[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 2752-2761.
[7] Iandola F N, Han S, Moskewicz M W, et al. SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 0.5 MB model size[J]. arXiv preprint arXiv:1602.07360, 2016.
[8] Chen C F, Fan Q, Mallinar N, et al. Big-little net: An efficient multi-scale feature representation for visual and speech recognition[J]. arXiv preprint arXiv:1807.03848, 2018.
[9] Chen Y, Fang H, Xu B, et al. Drop an octave: Reducing spatial redundancy in convolutional neural networks with octave convolution[J]. arXiv preprint arXiv:1904.05049, 2019.
[10] Gennari M, Fawcett R, Prisacariu V A. DSConv: Efficient Convolution Operator[J]. arXiv preprint arXiv:1901.01928, 2019.
總結(jié)
分組卷積之所有有效,一個是因為網(wǎng)絡(luò)中的空間和通道的冗余計算使得其性能可以保持,而簡單的分組并行計算又非常適合于GPU等處理器,因此在移動端高效率模型中廣泛使用,是必須掌握的思想。
下期預(yù)告:深度學(xué)習(xí)中的尺度。
AI白身境系列完整閱讀:
第一期:【AI白身境】深度學(xué)習(xí)從棄用windows開始
第二期:【AI白身境】Linux干活三板斧,shell、vim和git
第三期:【AI白身境】學(xué)AI必備的python基礎(chǔ)
第四期:【AI白身境】深度學(xué)習(xí)必備圖像基礎(chǔ)
第五期:【AI白身境】搞計算機視覺必備的OpenCV入門基礎(chǔ)
第六期:【AI白身境】只會用Python?g++,CMake和Makefile了解一下
第七期:【AI白身境】學(xué)深度學(xué)習(xí)你不得不知的爬蟲基礎(chǔ)
第八期:?【AI白身境】深度學(xué)習(xí)中的數(shù)據(jù)可視化
第九期:【AI白身境】入行AI需要什么數(shù)學(xué)基礎(chǔ):左手矩陣論,右手微積分
第十期:【AI白身境】一文覽盡計算機視覺研究方向
第十一期:【AI白身境】AI+,都加在哪些應(yīng)用領(lǐng)域了
第十二期:【AI白身境】究竟誰是paper之王,全球前10的計算機科學(xué)家
AI初識境系列完整閱讀
第一期:【AI初識境】從3次人工智能潮起潮落說起
第二期:【AI初識境】從頭理解神經(jīng)網(wǎng)絡(luò)-內(nèi)行與外行的分水嶺
第三期:【AI初識境】近20年深度學(xué)習(xí)在圖像領(lǐng)域的重要進展節(jié)點
第四期:【AI初識境】激活函數(shù):從人工設(shè)計到自動搜索
第五期:【AI初識境】什么是深度學(xué)習(xí)成功的開始?參數(shù)初始化
第六期:【AI初識境】深度學(xué)習(xí)模型中的Normalization,你懂了多少?
第七期:【AI初識境】為了圍剿SGD大家這些年想過的那十幾招
第八期:【AI初識境】被Hinton,DeepMind和斯坦福嫌棄的池化,到底是什么?
第九期:【AI初識境】如何增加深度學(xué)習(xí)模型的泛化能力
第十期:【AI初識境】深度學(xué)習(xí)模型評估,從圖像分類到生成模型
第十一期:【AI初識境】深度學(xué)習(xí)中常用的損失函數(shù)有哪些?
第十二期:【AI初識境】給深度學(xué)習(xí)新手開始項目時的10條建議
AI不惑境系列完整閱讀:
第一期:【AI不惑境】數(shù)據(jù)壓榨有多狠,人工智能就有多成功
第二期:【AI不惑境】網(wǎng)絡(luò)深度對深度學(xué)習(xí)模型性能有什么影響?
第三期:【AI不惑境】網(wǎng)絡(luò)的寬度如何影響深度學(xué)習(xí)模型的性能?
第四期:【AI不惑境】學(xué)習(xí)率和batchsize如何影響模型的性能?
第五期:【AI不惑境】殘差網(wǎng)絡(luò)的前世今生與原理
第六期:【AI不惑境】移動端高效網(wǎng)絡(luò),卷積拆分和分組的精髓
感謝各位看官的耐心閱讀,不足之處希望多多指教。后續(xù)內(nèi)容將會不定期奉上,歡迎大家關(guān)注有三公眾號 有三AI!
總結(jié)
以上是生活随笔為你收集整理的【AI不惑境】移动端高效网络,卷积拆分和分组的精髓的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【完结】12篇文章带你逛遍主流分割网络
- 下一篇: 【NLP】用于语音识别、分词的隐马尔科夫