深度學習,尤其是深度卷積網絡的迅猛發展,使得其在存儲和算力奢侈的GPU(多GPU)上的部屬趨於成熟。然而,將基於深度CNN的方法有效移植到存儲和算力有限的移動設備端(手機、Pad、嵌入式設備等)面臨諸多挑戰。
核心挑戰就是如何降低CNN對memory(存儲)和FLOPS(算力)的要求,但又保持CNN的性能(相比於其在GPU端的原貌)沒有顯著衰減。爲解決這一核心挑戰,我們就需要研究網絡輕量化,具體說就是通過設計新的網絡結構(archeticture)以及網絡中不淑的卷積操作(Conv Ops),以實現 1. 減少網絡參數量;2. 降低網絡運算過程中的FLOPs。
關於輕量化網絡的設計,八仙過海。這裏希望和大家分享我對Google開發的MobileNet(V1-V3)系列網絡的宏觀感受。個人水平有限,也沒有深入實現過MobileNet的各個版本,因此此處僅站在廣義CNN設計的角度彙報一下。
MobileNet的殺手鐗,是深度可分離卷積(Depthwise Separable Convolution)
For breviety,此博客把Depthwise Separable Conv簡稱爲DSC。
要理解DSC,我們先回溯普通卷積。
------------------------------------------------------------------------Here We Go--------------------------------------------------------------------------------
I. 普通卷積是如何操作的?普通卷積所產生的參數量和FLOPs如何計算?
爲粗糙的畫功向大家致歉。。。趕論文比較急,沒時間作圖了。、
Convolution的本質是feature localization,即,在input feature map上將某些local、局部的feature通過滑窗計算cross-correlation相似度的方式(注:cross-correlation和卷積實質上是把filter旋轉180度的關係),進行定位。該定位響應圖,就是某個feature的卷積輸出通道圖。
普通卷積,概述就是一個filter一次性完整地卷input feature map的所有通道,所以filter本身是由channel dimension的。而每一個filter在卷完之後的輸出是單通道的,所以該卷積層最後的輸出有多少通道,就需要在該卷積層設置多少個不同的filter(但沒一個fitler同樣尺寸和channel)。
1. 一個Conv操作所涉及的參數量是:
(Dk * Dk * M) * N-------每個卷積核參數 * N個核
Dk是卷積核尺寸(3、5、7等),M是輸入特徵通道數,N是輸出特徵通道數。
可見,一個CNN網絡architecture在設計時,如果有效控各個conv layer的制特徵圖channel數,以及卷積和空間大小,則有可能控制該CNN的整體參數量。卷積核尺寸越小、channel越淺,參數越少。
2. 一個Conv操作所涉及的計算量(所需算力)是:
(Dk * Dk * M * N)* Dw * DH
括號中是一個Conv的參數量。Conv在執行的時候是elementwise multiplciaiton then summation。所以一個Conv filter進行一次操作(即對input滑窗一遍)的計算量就是:
每個滑窗位置產生的計算量 * 滑窗位置的個數
由於是elementwise multiplicaiton + summation,所以每個滑窗位置產生的計算量 = 每個卷積核的參數量
所以一個卷積層操作的計算量等於其所有卷積核的參數量 * 輸入圖尺寸(假設SAME padding)。
如果選用SAME pading保持卷積輸入輸出空間尺寸不變,那麼滑窗位置的個數就等於輸入空間尺寸(可以理解爲,輸出圖上每個pixel的數值是conv filter在對應位置上進行cross-correlation計算所得的scalar數值)。
由此可見,卷積的計算量不僅與卷積核本身的尺寸、網絡中特徵圖channel數相關,還與網絡中特徵圖的空間尺寸相關。
所以,若輸入圖片大小固定,那麼CNN中conv層設計使得網絡中特徵圖尺寸越小(早、多pooling進行降採)+ 保持特徵圖通道數較小,則整個CNN的memeory和FLOPs較小。
但是,這明顯是約束該網絡的空間精細度(spatail fidelity)和語義深度(semantic depth)。好大的treade-off!
II. Spatialwise Separable Conv和DSC都可以對普通Conv實現輕量化。
Spatialwise Separable Conv就是將一個 空間大小3 * 3的filter拆解成先卷一個3 * 1 再卷一個1 * 3.
3 * 3 = 9, 3 * 1 + 1 * 3 = 6, 9 > 6
III. DSC
DSC是將一個普通卷積拆解爲先depthwise convolution(逐個通道單獨做輸入輸出均爲1 channel的卷積),再做pointwise convolution(通道數目調控)。
1. Depthwise conv的意義是將輸入feature map拆解爲各個單個通道,並在各個通道上做輸入輸出均爲1通道的卷積,所以一個DSC的depthwsie conv階段涉及到的參數爲:
(Dk * Dk) * M
括號中是每個單個通道上的filter的參數,M是M個通道。
2. pointwise conv是用1 * 1 conv filter將M輸入通道擴張到N輸出通道(Channel Manipulation)。
(1 * 1 * M) * N
括號中是用1 * 1 大小filter一齊卷M個channel的depthwise conv輸出,N是有N個這樣的1 * 1 * M個filters。
3. 一個DSC卷積層和一個普通Conv層總參數比較:Dk=3, M = 16, N = 32
DSC:Dk * Dk * M + 1 * 1 * M * N = 656
普通Conv:Dk * Dk * M * N = 4608