MobileNetV2論文筆記

原文鏈接:https://blog.csdn.net/Dlyldxwl/article/details/79101293
論文:Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation
 

Introduction
本文是谷歌公司的又一新作,目標主要是在提升現有算法的精度的同時也提升速度,以便加速深度網絡在移動端的應用。網絡的名字是Mobilenet V2,很明顯可以看出是對Mobilenet的改進。那麼Mobilenet存在一些什麼問題呢?相信大多數朋友和我一樣,第一次看到Mobilenet的時候就覺得爲什麼這個網絡的“形態”設計的和VGG差不多,都是直筒狀。後續大量的實驗表明,基於resnet,densenet 等對feature複用的結構是很奏效的。所以Mobilenet V2採用了Shortcut connection的思想,因此個人覺得本文也是對現有的Residual block的一個改進,差不多也就是改進Resnet+mobilenet網絡。 
直觀感受一下在detection領域mobilenet v2+ssdlite對比其他算法的效果。

Approach
先看一下Mobilenet V2的conv block。如下圖所示,以s=1爲例說明,矩形框的寬度表示該layer的“寬度”,即channels。和傳統的residuals block對比主要有以下兩個創新點:一是block裏的第二個conv1×1後面並沒有接relu,而是用的linear,作者稱之爲Line Bottlenecks;二是傳統的residuals block屬於沙漏形狀,即input和output很寬,中間接了一個降維的bottleneck layer,但是mobilnet V2更像是一個梭子形狀,即input和output較窄,中間是一個升維的layer,因此作者稱之爲Inverted residuals。下面就這兩個創新點展開介紹。

Line Bottlenecks 
個人覺得本部分是全文最難懂的一部分,看起來比較玄乎,由於本人水平有限,以下描述均爲個人理解,各位看官發現不正確的請告知我。 
首先稱經過激活層後的張量爲感興趣流形,維度爲H×W×D,D爲channel,文中稱之爲寬度。作者說長期以來一直認爲神經網絡中感興趣的流形可以嵌入到低維子空間中,什麼意思呢?也就是說實際中的感興趣流形並不是D channel的所有信息,只是一個它的一個低維子空間。這似乎意味着降低空間維度就可以解決問題了。其實在mobilenet裏面已經有了這方面的應用(mobilenet有一個寬度乘數和一個分辨率乘數,對mobilenet不清楚的同學可以移步這裏)。寬度乘數通過降低激活空間的維度最終希望讓感興趣流形充滿整個空間,但是每個深度網絡都會有非線性激活函數(例如Relu,負值置0,正值保留),很容易想到,對於感興趣流形佔比大的低維子空間,通過relu層有較高的概率使得較多輸出置0,這顯然是丟失了一些有用的信息考慮到如果經過relu後參數非0,那麼輸出和輸入必定是經過了一個線性變換,也就是說此時relu僅僅是一個線性分類器。另一方面,作者在附錄中說明了一個道理,如果輸入流形可以嵌入到激活空間的一個子空間裏(這個子空間可以通過Relu的非零部分),Relu可以保留信息並引入一定的複雜性。 
總結起來,就是說明兩個事實:一是經過relu後要是感興趣流形都非零,就意味着其僅僅是經過了一個線性變換;二是要想保持輸入流形的完整信息,就必須要讓輸入流形位於輸入空間的低維子空間。 
通俗的來說就是,要想提升效果,維度是要降的,但channel數較低時通過relu層會有相對高的概率使較多的輸出爲0,要想不爲0,就要使用relu的線性部分,相當於接了個線性分類器。正如下圖第三行所示,channel從tk降爲k‘並使用了linear,消除了低維空間中relu對特徵的破壞。

話外篇:其實在xception中,已經提到了dw conv layer後面不接relu是比接relu效果好的,並做了對比實驗。如下圖所示。

Inverted residuals

顧名思義,倒置的residual,就是bottlenecks layer放在首尾,中間是channel高的layer。如下圖所示。其實這兩個連接在去掉skip connection後本質上是一樣的,只不過觀察的起點不一樣罷了。但是前面的理論介紹過了,感興趣流形是在低維的空間裏,所以mobilenet V2的連接形式就變成了Inverted residual梭子形。

現在兩個創新點都已經說明了,總領起來看一下:對於mobilenet V2的每個bottleneck residual block,先進行升維,在接dw layer+relu,最後在降維+linear,並且還做了shortcut connection。升維、降維的作用是什麼呢?通俗的解釋一下:比如dw conv layer的輸入是128個channel,mobilenet就直接用128個filter去卷積,這必然會導致信息流通不好(畢竟這是channel和spatial的完全解耦),但是V2卻先把128維升爲128×6,然後再進行dw layer,這分明就是冗餘的思想嘛!一對一可能效果不好,但是我6對1 ,總有好的吧!接下來,再用1×1的 layer 去降維,這個layer的作用和一般的residual block可不一樣了!在傳統的residual block中,1×1的作用是用來降低計算量的,此處的作用確是讓網絡自己去找到起主要作用的channel!這比模型訓練完剪枝等操作有用多了! 
文中還有一些有關內存優化的細節,抽空再過來寫。 
突然有種知道但是說不好的感覺。。原理太難說清楚了。。大概也是我理解的不夠深刻。。

Experiments
先看一下mobilenet V2的結構。個人覺得圖片是有一定問題的,第五行28*28*32經過s=2後size並沒有降低,而且文中說明了使用19個bottleneck block,圖中卻展示了17個bottleneck block,此處還是等源碼公開再商榷吧。

è¿éåå¾çæè¿°

作者在classification,detection,segmentation三個領域均做了實驗,並和其他網絡進行對比,此處以detection爲例說明,就不貼那麼多實驗圖了。 
因爲mobilenet v2是追求在移動端的應用,所以文中沒有和速度較慢的two-stage進行比較。文中提到的SSDLite是改進過的SSD算法,其實就是把SSD的prediction layer也換成了dw+pw結構,參數從14.8M降低到了2.1M。v2和V1與SSDLite的連接大致是相仿的,結果如下圖所示。 效果是顯而易見的。

Conclusion
大致看完了文章後反過來回想一下,作者是怎麼設計出這樣的網絡的?以下是本人的“意淫”過程,可以選擇性忽略。。本人比較喜歡還原作者的思路。。 
首先dw conv對參數量的縮減作用是明顯,這也導致了其表達能力不強(channel和spital的完全解耦),因爲1個feature map和1個filter連接。如果可以把channel shuffle一下,那麼效果肯定會提升的,因此shufflenet提出了;1個人處理不好一個問題,我讓多個人去幹,這樣做好的可能性就大大提升了啊。雖然這個比喻不太恰當,但我覺得夠說明問題,因此先把channel升到6倍,再進行dw,然後再降維選出“做得好”的那些channell,因此Inverted residuals結構出來了(當然還有skip connection在複用特徵和解決梯度問題上起到了重要作用),然後訓練過程發現低維空間中relu對特徵破壞嚴重,linear纔是王道(其實這個在shufflenet和xceeption裏面也提到了),又誕生了“Line Bottlenecks”,因此V2也就出來了。哈哈哈

等有空,畫個圖直觀對比V1,V2, Resnet等網絡結構。

本人水平有限,博客中說的不準確的還望指出,共同進步~

關於mobilenet 系列,本人寫了一些關於網絡設計的見解,移步這裏

2018.05.3 補充

試想一下爲什麼mobilenet 在檢測任務上比VGG 差那麼多,谷歌出過一篇不同算法和不同backbone在coco數據集上的detect 結果對比。paper中說movilenet ssd略差於vgg ssd。我不是很相信,因爲本人自己在caffe下多次訓練mobilenet ssd,即使是自己進行過部分feature fuse,在voc07 test上map也不過74。 
這是爲什麼呢?結合自己的工作今天好好想了一下,主要是因爲mobilenet 讓網絡變得稀疏。因爲dw結構,一個filter僅和一張feature map卷積,後續接個relu,很容易產生稀疏,造成某個神經元全0. 如果再加上一個寬度乘數,壓縮感興趣流形會造成更多的信息損失,所以效果差。關於稀疏的問題可以參考我做博客的這一篇實驗圖 
那麼xception,shufflenet發現了這個問題之後,在DW後面不接relu了,這樣就不會丟失信息了,如下圖:

但是在v2中,並不是在DW層後去除relu,而在pw層中去除relu,這又是怎麼回事呢? 
復看論文發現這是因爲v2中dw層是“及其冗餘”的,pw“很瘦”,目的就是篩選出低維的感興趣流形,這意味着只要感興趣流形信息不丟失就可以了,冗餘的dw層接relu就接唄,影響不大,當然個人覺得dw不接也是可以的,不過非線性要弱一些。

此外,mobilenet v2採用1*1conv來進行降維,或說pruning吧,能不能用一種廉價的手段來剪枝呢?比如說在厚的dw層結束後對channel維度進行pooling的操作?這樣便大大的加速了網絡時間。筆者在此拋磚引玉,能否找到可以替代1*1的廉價升/降維方式呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章