最近需要將 Deep Learning model 部署至移動式設備上,所以稍微研究了一下 MobileNet 的模型架構,這邊筆記一下研究心得,為何 MobileNet 的參數量可以遠小於其他神經網路架構,而在不降低太多 Performance 的情況下提高運算速度?
MobileNetV1 : Depth-wise Separable Convolution
MobileNetV1 的核心方法是透過兩個 Hyper parameters : Width multiplier 和 Resolution multiplier 控制模型的整體架構和參數量,並採用 Depth-wise Separable Convolution 做 Feature extraction。
雖然 Depth-wise Separable Convolution 並不是 MobileNet 原創,但卻是 MobileNet 即其後繼者能夠大幅降低運算資源的大功臣 。相較於傳統的 Convolutional layer, Depth-wise Separable Convolution 可以大幅的減少參數量而不會降低太多 Performance,詳細的運算原理可以參考 Tommy Huang 在這篇文章的說明,裡面圖文並茂寫得非常清楚。
這邊使用 tensorflow keras 比較 Depth-wise separable convolution 和一般 Convolution 所使用的參數量。
Convolution 的 Kernel size 為 5 × 5
, 總共給 10
個 Kernel (filter),輸入的圖片尺寸為 28 × 28 × 3
一般的 Convolutional layer 總共會有 750
個參數。
# Convolution
5 × 5 × 10 × 3 = 750
而改用 Depth-wise separable convolutions,參數量可以大幅減少至 105
個。
# Depth-wise convolution
5 × 5 × 3 = 75
# Point-wise convolution
1 × 1 × 10 × 3 = 30
而參數減少的比例,論文中有給出公式可以計算 :
其中,N = num_filters = 10, Dk = filter_size = 5
,參數量降低至 14%,運算效能提升將近 7 倍。
1/10+1/(5×5) = 0.14 = 105/750
而兩個 Hyper-parameter 則是 trade-off,設定值可以根據使用者需求不同有所調整,論文中的實驗可以看到,在大幅降低計算量和參數量的狀況下, Performance還可以維持一定的水準(排頭參數為 Width Multiplier,224和128 則是 Resolution)。
MobileNetV2 : Inverted Residuals and Linear Bottlenecks
MobileNetV2 在 MobileNetV1 的 Depth-wise separable convolution 的基礎上,再增加了 Linear Bottlenecks 和 Inverted Residuals。
Inverted Residuals
一般 Residual block 是將 layers block 的 input 和 output 透過 Add
連結起來,而 block 內則通常是先降維再升維,如 Figure 1 (a), Inverted residuals 則是在 block (就是上面指的 linear bottleneck block) 內,將 input 升維再降維,如 Figure 1 (b)。
Linear Bottlenecks
Inverted Residuals Block 內的「先升維再降維」的操作,就是 Bottleneck 的概念。
由於 Depth-wise convolution 輸出的 dimension 必會等於輸入的 dimension ,若要取出 High dimension 的 Feature map,只能透過增加後面 Point-wise convolution 的 feature map 數量來達成。
舉例來說,一張 28×28×3
的圖片,做 3×3
的 Depth-wise convolution 後(假如 padding = 'same'
), output 的尺寸還是 28×28×3
,後續才會做 Point-wise convolution 提高 output 的 dimension。
而 Low dimension 的 Input 去做 Depth-wise convolution 又會有什麼問題呢? 論文中裡面提到了一個假設 :
It has been long assumed that manifolds of interest in neural networks could be embedded in low-dimensional sub-spaces.
個人翻譯 : 假設神經網路中對於輸出有用的資訊,可以被嵌入在低維度的子空間中。
畢竟有用的資訊量也不可能比原始 input 圖片還要多,都會小於等於原始 input 的資訊量。
如果今天 Depth-wise convolution 輸出的維度不夠高,那麼真正有用的資訊應該會被鑲嵌在比輸出的 dimension 又更低的 dimension 之下。因此有用的特徵資訊僅能存於這 3 層的 Feature map 之中(以28×28×3
的圖片為例)。若沒有充足的 dimension 容納有用的特徵資訊,那麼經過 relu activation function 後,可能會導致輸出的值大多數皆為 0 而導致資訊量流失。
因此在經過 Depth-wise convolution 前,最好提高 input 的 dimension,這樣最後經過 Relu 後,可以避免大量 neuron 沒有被 activate 的情況。
Linear Bottlenecks 就是為了解決 Depth-wise convolution 的 low dimension 問題,因此在進行 Depth-wise convolution 之前,會先接一層 1x1 的 convolutional layer (其實就是 point-wise convolution),這層 layer 的目的就是用在增加輸入層的 dimension,增加的比例可以透過 expansion factor t
來控制。這種先升維再降維的操作,就是 Bottleneck 的核心思想。
由於在 Point-wise convolution 後,dimension 的數量已經降回至原本 Input 的數量,所以在 Low dimension 的 layer , 論文中建議採用 Linear activation 而不是 Relu activation,以避免上面提到在低維度空間中,使用 Relu activation 可能會造成的資訊流失問題。而實驗結果也顯示,使用 Linear 的效果也比較好。
MobileNetV3 : Squeeze and Excitation with NAS
MobileNetV3 除了使用 AutoML 的技術做 Network Architecture Search (NAS),另外還加入了 SENet 的 Squeeze and Excitation 架構,透過 Global Average Pooling (GAP)計算每個 feature map 的權重,用來強化重要的 feature map 的影響力,並減弱不重要的 feature map 的影響力。
Figure 2 為原文中 Squeeze and Excitation block (SE block) 的範例,左邊數來第二個 layer 為 SE block 的 input layer 。
Squeeze : Global Information Embedding
Fsq
為 Squeeze function,這邊使用 Global Average Pooling 針對每層 ( C
層) Feature map 取全域平均 。 H × W × C
的 input shape 會得到 1 × 1 × C
的 output shape,C 即為每個 Feature map 的權重。
Excitation: Adaptive Recalibration
Fex
為 Excitation function,裡面分別為兩層 Fully Connected (FC) Layer,第一層 FC layer 搭配的是 Relu activate function,第二層 FC layer 搭配 Sigmoid activation function,output 的值即為每個 Feature map 的權重,最後再 Multiply 原本的 Input layer 。
在 SENet 的 paper 中,第二層的 FC Layer 是採用一般的 Sigmoid function當作 activation function,而在 MobileNetV3 中,則是改用 Hard sigmoid function,計算速度可以比 Sigmoid function 快,較適合部屬在移動設備,同時,原文中也提到,部分的 Relu activation function 改為使用 Hard-swish activation function,可在不增加太多運算量的情況下提升模型的 performance.
結語
雖然許多經典架構不是 MobileNet 原創,但仍是在 MobileNet 上的應用最廣為人知,了解一下 MobileNet 的進化史還是可以豐富一下自己的 DL 知識庫。
在 EfficientNet 出來後,MobileNet 已經不再是輕量化模型的霸主。但 EfficientNet 還是繼承了許多 MobileNet 的精神,且 EfficientNet 的架構並沒有太大的創新,反而是透過 NAS with AutoML,將有限的架構發揮到極致的 Performance ,看來EfficientNet 還是得叫 MobileNet 一聲爹。
以上內容皆為自己吸收整理,若有任何錯誤請不吝留言告知,如果對您有幫助也麻煩幫我拍拍手~👏
[References]
深度學習-MobileNet (Depthwise separable convolution)
Review: MobileNet and its variants
MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
MobileNetV2 : Inverted Residuals and Linear Bottlenecks
A Look at MobileNetV2: Inverted Residuals and Linear Bottlenecks