導言:
繼MobileNet_v1和v2提出后,在2019年,MobileNet_v3在眾人的期盼下出來了,MobileNet_v3論文提出了兩個模型,MobileNet_v3-Large和MobileNet_v3-small,其主要區別在於層數不同(其余設計都一樣),此外還包括一個用於語義分割的MobileNet_v3-Large LRASPP模型。
MobileNet_v3成就
MobileNet_v3-Large在ImageNet分類中實現了比MobileNet_v2低百分之20的時延,同時高了3.2%精度。MobileNet_v3-small比MobileNet_v2在時延接近的情況下,高了6.6%的精度。
MobileNet_v3-Large在COCO數據集檢測上,在比v2快了25%,而精度卻幾乎一樣。
MobileNet_v3-Large LRASPP比MobileNet_v2 RASPP在Cityscapes分割數據集上快了34%。應該可以說是不負眾望了。
MobileNet_v3主要內容
MobileNet_v3着眼於賦予設備高效地實現高精度、低時延的能力,而不是發送數據到服務器,經過服務器推理后再發送回設備。為此,論文提出了以下內容:
1) 補充搜索技術
2) 適用於移動設備環境的非線性的新有效版本
3) 新的高效網絡設計
4) 新的高效分割解碼器(指的是語義分割)
01 NAS 和NetAdapt
當前,在人工智能界內有一句名言,所謂人工智能,是越人工越智能。現有的一些網絡所具備的高效的性能離不開人對這個網絡模型的精心設計與調參。最近幾年,如何讓計算機根據需求和現有硬件條件自動生成網絡已經進入重要研究方向。
NAS-神經網絡架構搜索。NAS通過設定一個空間,選擇一個搜索策略在這個空間內搜索,采用一個評估策略對搜索效果進行評估,最終選擇評估效果最好的結構。
在早期,NAS主要進行單元級搜索,使用一些預定義的操作集合,(如卷積、池化等)此外還包括,每一層的卷積核的大小,步長大小,卷積核數量等,這些集合構成了搜索空間,使用一個搜索策略來選擇操作集合,在訓練集訓練這些操作集合組成的網絡,並在驗證集上評估當達到某個閾值將會停止。
最近,開始進行Block級的搜索,例如Inception結構,就是一個Block,在搜索空間中使用了不同大小,不同數量的block。搜索策略直接搜索這些block組成網絡,進行測試。
MobileNet_v3使用了用於block搜索的平台感知NAS(PlatformAware NAS for Blockwise Search)構成全局網絡結構,使用NetAdapt對網絡結構進行layer-level的finetune。使用的搜索目標是 ACC(m) × [LAT(m) / TAR]^w, 這里ACC(m)是模型精度,LAT(m)是延時,TAR是目標延時,w是超參數。
之所以不怎么介紹NAS,是因為NAS需要數以百計甚至上千的GPU來訓練數月,例如 NASnet需要在 800 個 GPU 上訓練 28 天,對於普通人來說實在有些遙不可及,當然最近也出了一些只需要少量GPU就能訓練的算法,但至少現在還沒到那種能滿足普遍需求的時候。如有需要,公眾號中有NAS的一篇較為全面的綜述,可掃描文末二維碼關注公眾號。
網絡改進
在搜索得到的網絡的基礎上,提出了一些改進的方案。在網絡的開始和結束部分,重新設計了計算量大的層,此外還提出了一種新的非線性,即h-swish,h-swish是最近swish的改進版本,計算速度更快,也更易於量化。
02 Redesigning Expensive Layers
在MobileNet_v2的Inverted bottleneck結構中使用1x1卷積作為最后一層,用於擴大到一個更高維的特征空間,這一層對於提供豐富的特征用於預測極為重要,但也增加了延時。
為了降低延時,並保持高維空間特征,MobileNet_v3中把這一層移到了平均池化層的后面,在最后的特征集現在只需要計算1x1的分辨率,而不是原來的7x7。這種設計選擇的結果是,在計算和延遲方面,特性的計算變得幾乎是免費的。
一旦降低了該特性生成層的成本,就不再需要以前的瓶頸投影層來減少計算量。該觀察允許刪除前一個瓶頸層中的投影和過濾層,從而進一步降低計算復雜度。原始階段和優化后的階段如上圖所示。
另一個耗時的層是第一層卷積,當前的移動模型傾向於在一個完整的3x3卷積中使用32個濾波器來構建初始濾波器庫進行邊緣檢測。通常這些過濾器是彼此的鏡像。mobileNet_v3對這一層使h-swish非線性激活函數,其好處是使用了h-swish后濾波器的數量可以減少到16,而同時能夠保持與使用ReLU或swish的32個濾波器相同的精度。這節省了額外的3毫秒和1000萬 MAdds。
03 Nonlinearities
在一篇語義分割的論文中提出了使用swish的非線性函數來代替ReLU函數,它可以顯著提高神經網絡的精度,其定義為:swish x = x · σ(x),這里σ(x)是sigmoid函數。然而swish雖然提高了精度,但sigmoid函數計算是極為昂貴的,在嵌入式移動端不適合它的存在,因此,MobileNet_V3提出了計算更為簡便的h-swish函數,其定義如下:
如下圖所示,這里的h是hard的意思,簡單來說就是沒那么平滑。經過實踐檢驗,sigmoid和swish函數與其hard版本的函數在精度上並沒有什么明顯的差異。但是hard版本的計算卻簡便得多。
一般來說,在不同的設備上,對於sigmoid函數都是采用近似的方式實現,(例如,在高數中采用划分矩形求面積來近似實現積分,這里的近似是使用某些實現方式近似實現sigmoid函數),因此不同的實現方式會導致潛在的精度損失。而幾乎所有的軟件和硬件設備都可以直接實現ReLU6,因此這里的h-swish將不會出現sigmoid的情況,此外,h-swish可以通過分段函數實現(這是對h-swish的優化,下圖是與沒有優化的實驗效果對比),這樣會降低內存訪問次數,從而大大降低了等待時間成本。
論文中提到,在較深的層次中使用更能發揮swish的大多數好處,因此在MobileNet_v3結構中 中高層才使用h-swish。此外,h-swish即便使用了這些優化,但仍然引入了一些延遲成本,如下圖所示,使用分段函數作為h-swish的優化比沒有優化效果明顯要好,節約了6ms(大概百分之10), 而相比於ReLU, 優化后的h-swish僅引入了1ms的成本,但精度更高。
04 Large squeeze-and-excite
先簡要介紹一下這個模塊,論文中並沒有介紹。
這是一個注意力機制中的一個模塊SE,即插即用,用於現有的一些網絡。其分為兩個部分,一個是Squeeze部分,通過AdaptiveAvgPool2d將前一層的空間分辨率壓縮為1x1,第二個部分是Excitation部分,對壓縮后的部分進行線性變化(Linear),再ReLU,再Linear(通道數要與下一層通道數一致),再Sigmoid。將得到的一個1x1x下一層通道數 的層與原先網絡直接卷積得到的下一層逐像素相乘,這樣的好處是有些特征會被突出,有些特征會被抑制,從而實現模型的自注意力機制。
回到本文,MobileNet_v3中加入了這個模塊,但進行了一些調整。一個是將sigmoid換成了h-swish。第二個是將第二Linear的通道數變為下一層的1/4。但這樣就沒辦法逐像素相乘了,因為通道數不匹配,然后我去找了MobileNet_v3的代碼,發現它在通道數變為1/4后又使用expand_as將其擴展成了下一層的通道數。
MobileNet_v3結構:
實驗結論
在本文開頭已經介紹了MobileNet_v3的成就,記住那些即可,這里只給出圖,就不多介紹了,無非就是不同的超參數下其精度和延時有何變化,在某某數據集中與某某模型對比。稍微看看足以
本文來源於微信公眾號“ CV技術指南 ” 。更多內容與最新技術動態盡在公眾號發布。
歡迎掃描下方二維碼關注公眾號“CV技術指南”,主要進行計算機視覺方向的論文解讀,最新技術跟蹤,以及CV技術的總結。
原創文章第一時間在公眾號中更新,博客只在有空時間才更新少量公眾號文章