1. 程式人生 > >工業界第一手實戰經驗:深度學習高效網路結構設計

工業界第一手實戰經驗:深度學習高效網路結構設計

SIGAI特約作者

mileistone

騰訊演算法工程師

研究方向:物體檢測

 

這一年來一直在做高效網路設計的工作,2018年即將結束,是時候寫一篇關於高效網路設計的總結。

 

首先看看當前業界幾個最負盛名的高效網路簡介:

以上網路的目標主要有三個:權重少、計算少、速度快。這三者之間不存在著嚴格的相關關係,它們是三個獨立的目標。即權重少不代表計算量少;計算量少不代表速度快。

 

高效網路高效的含義比較模糊,有的文章認為計算量小就是高效,有的文章認為速度快即高效。本篇總結主要從速度快入手。

 

速度快慢與計算量、結構是否利於並行、記憶體讀取、運算硬體平臺、具體軟體實現等等都有關係,所以沒有比較公允的衡量方式,一般比較好的衡量方式就是直接測速度。

 

從上述高效網路文章可以看出,高效網路的設計思路有如下幾條:

1、depthwise separable convolutions

 

2、low rank filter

 

3、pointwise group convolution

 

4、避免網路分支太多,或者group太多

 

5、減少element wise的操作

 

既然已經有這麼多高效網路,為什麼要我們還要重新設計網路?

 

因為網路與任務相關,例如分類還是檢測,分類是多少類,難度如何;檢測是多類別檢測還是單類別檢測,如果是單類別,這個類別的物體有什麼特性,例如人臉檢測和人體檢測的網路設計思路就大相徑庭。我們工作中面臨的任務大部分與論文裡提出網路針對的任務不同,如果我們直接將論文裡提出的模型拿過來用,而不加以改進,這個網路很可能不夠好,例如準確率還有優化空間、或者速度還有優化空間。

 

高效網路和複雜網路設計的區別較大。如:

 

1、殘差結構,僅僅是一個加的操作,這個操作在複雜網路裡所耗的時間可以忽略不計,但是在高效網路裡,它卻成為了不可忽視的因素[shufflenetv2];

 

2、bottleneck,在複雜網路裡,認為bottleneck可以減少計算量,但是在高效網路裡,bottleneck卻可能成為耗時的瓶頸

 

[shufflenet]We notice that state-of-the-art basic architectures such as Xception [3] and ResNeXt [40] become less efficient in extremely small networks because of the costly dense 1 × 1 convolutions. We propose using pointwise group convolutions to reduce computation complexity of 1 × 1 convolutions

 

[shufflenet]for each residual unit in ResNeXt the pointwise convolutions occupy

93.4% multiplication-adds (cardinality = 32 as suggested in

[40])

 

3、大kernel size filter。在複雜網路裡,我們越來越少用kernel size大的filter,例如5x5、7x7,我們認為用多層3x3就能達到大kernel size filter的感受野,例如兩層3x3可以達到一層5x5的感受野,3層3x3可以達到一層7x7的感受野,同時計算量更小,由於網路更深,非線性也更優。但是在高效網路裡,可能事情有些不同。

 

例如FaceBoxes提出的RDCL模組,用四層網路將feature map降為1/32。feature map大的部分非常耗時,不宜戀戰,為了加速,需要在網路前端儘快將feature map的大小降下來,這個時候大kernel size filter有了用武之地,RDCL裡面用到了7x7和5x5的大kernel。

 

4、任務相關性。複雜網路因為表達能力夠強,所以對任務不是很敏感;高效網路為了達到高效,需要充分利用任務的特點,針對該特點將與之無關的計算全部砍掉,這是高效網路的優點。然而世間沒有免費的午餐,這個優點會帶來缺點,因為高效網路與任務強耦合,換一個任務,網路的效果可能就不太好。例如將FaceBoxes這個網路backbone用來檢測人體,效果會打一定折扣,因為人體資料的分佈與人臉差異較大。

 

 

如何重新設計網路?

我將設計網路分為了5個層次:

 

0、入門,直接整體替換backbone

例如將VGG16換為mobilenet。

 

1、初級,減channel,砍block

即成比例地降低一個經典網路的channel,例如channel數降低為之前的1/2;或者stage的block重複數減小,例如將某個stage的block重複數從8減小為6。

 

2、中級,替換block

比如mobilenetv2出來了之後,整體將之前模型的block替換為mobilenetv2的block;或者shufflenetv2出來之後,整體將之前模型的block替換為shufflenetv2的結構。

 

3、高階,從頭開始設計,集眾家之所長

即理解業界各個經典模型背後的motivation以及解決思路,不再拘泥於生搬硬套。將各個經典模型背後的設計思路吃透,瞭然於胸,下筆如有神。

 

4、科學家,設計出新的模組,為業界添磚加瓦,例如depthwise separable convolutions,shuffle channel等等。

 

網路設計的未來

從nasnet和mnasnet的相繼推出,以及我自己設計網路的實踐經歷來看,我認為最終網路設計會完全被機器替代。

 

首先,我自己設計網路的過程,大概就是看各種網路結構的論文,然後把這些論文裡的設計思路用到網路設計中,思路驗證對了之後,再根據這個思路不斷改超參,搜尋得到一個該思考下的區域性最優模型。這個過程其實跟nas的過程一模一樣,即給定一些經典設計思路,和網路目標,最後組合這些網路設計思路得到最優模型。

比如nasnet所使用的網路模組有如下候選:

如果有公司能夠提供比演算法工程師更便宜的nas服務,我想大部分從事網路設計的演算法工程師就可以下崗了,就跟當年工業革命,紡紗機出現了之後,紡織工人最後要麼被裁,要麼自謀出路。硬體只會越來越便宜,而演算法工程師的待遇不可能一直降低,所以我想總有一天網路設計會被機器取代,就如同alphago大敗李世石和柯潔一樣。最後nas應該都不需要輸入網路設計思路,它自己就能找到最優的網路設計思路,如果alphazero都不需要學習人類棋譜,自我博弈就可成為圍棋大師。

 

nas服務是一群這個領域內最厲害科學家所設計的服務,nas所設計出來的模型以後必然會比大部分演算法工程師好,如果nas服務又好又便宜,那麼大部分公司應該都不需要僱傭演算法工程師。