# MobileNetV4
[paper link](https://arxiv.org/abs/2404.10518)
[timm code](https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/mobilenetv3.py#L654)
## Intro
- V3 之後過了5年,V4 終於橫空出世,一樣由 Google 的團隊發表,試圖 make MobileNet great again
- 這篇的主要目的是**在任何 CPU, DSP, GPU上都能獲得最佳的表現**,包含 Apple Neural Engine 以及 Google 自己的 Pixel EdgeTPU,這篇論文的成果最後是應用在 Pixel 8 上面
- 主要的組件有 1. UIB (Universal Inverted Bottleneck) 2. MobileMQA 3. 老招 NAS

- 注意MNv4在iPhone上的latency明顯比較高,這也是近年的一個趨勢,只要是 Apple 出的模型 (如 MobileOne) 就只能在 iOS 裝置上屠榜,而 Google 或是其他公司出的也都只能在 iOS 以外的裝置上有好的表現
- 但是其實我們從這些研究上都看不出來這些模型們到底偷用了什麼優化的技巧,究竟有什麼是只有Apple工程師自己知道的技巧能讓自己的模型在 iOS 上表現最好?
## Model
- 這裡假設大家都已經看過 [MobileV1~V3](https://hackmd.io/deIE8K-OSPyoYUn-rU-L2w?view),都已經知道 DW, PW, IB 等基本組件,還沒看過記得先去看
### Hardware-Independent Pareto Efficiency
- 為了**評估模型是否在任何設備上都能以高效率運行**,Goole 提出了 The Roofline model
- 它不只是能用來衡量模型時間,也可以用來預測一個模型是受限於記憶體 (memory-bottleneck) 還是受限於計算能力 (compute-bottleneck)
- 從算式(1)可以看到他們就是分別算出 Memory MAC 跟 Compute MAC 然後比較兩個哪個比較大來判斷這個模型的效能瓶頸所在

### UIB

- 基於Inverted bottleneck的架構,對於其前面和中間是否要加入 depthwise 做排列組合,然後用 NAS 去搜
- 都加: Extra DW
- 只加中間: Inverted Bottleneck
- 只加在前面: ConvNext
- 都不加: FFN
### Mobile MQA
讓每個head都共用相同的K跟V,僅有不同的 query,以參數共享的方式來降低運算量
- 從過去的實驗可以得知這個用法並不會降低模型性能,而且在 batch size 小的時候可以顯著降低計算量 (輕量視覺模型常常有很大的特徵空間+batch size=1)
除此之外,他們觀察到混合架構模型中有許多在空間上相鄰的token之間具有相關性,這是由於 early layer 中的 conv filter 已經對空間進行混合所造成的。也就是說,其實下游的 key 跟 value 的空間已經不是那麼重要。
對此,他們額外引入了 Spatial Reduction Attention (SRA) 來去對 key 跟 value 的空間進行縮減,但還是保留 query 的尺寸
- 具體來說,他們把 Avgpooling 換成 stride =2 的 3x3 depth-conv 作為所謂的 SR 來縮減圖像空間


### 架構
MNv4-Conv-S 如下

## 實驗結果
- 多路徑效率問題: Group Conv 和類似的多路徑設計由於記憶體存取方式很複雜,會造成運算效率低
- 硬體是否支援很重要: 如 SE、GELU、LayerNorm 在移動裝置上沒有很好的支援
- 簡單的力量: 簡單的模組如ReLU、Conv2D、DW-Conv 和 BatchNorm 在移動裝置上有很好的支援,效率較高
# Result
- 這裡他們有使用現代的 recipe 來去重新訓練 MBV1, V2, V3 來去一起做比較

# 題外話: timm mobilentV4
雖然當時 Google 發了 MBV4 這篇論文,但只做了 tensorflow 的實作。因此 timm 的作者 rwightman 就自己用更現代且不同的資料增強方式來 train 了一堆 比論文中的模型 (v1 ~ v4都有) 還表現更好的模型,有興趣的人可以參考這篇文章 https://huggingface.co/blog/rwightman/mobilenet-baselines