ResNext與Xception——對模型的新思考

飛翔的塵埃 7年前發布 | 36K 次閱讀 R語言 機器學習

很早以前我曾寫過一篇關于CNN網絡結構的文章——CNN--結構上的思考,后來在書中也提到基于ResNet思想的網絡結構演變,今天就來看一看在此之后的又一股有關網絡結構的思潮。如果說前面的幾次網絡結構的演變都是在外部進行探索,那么這一次的微創新則是聚焦于模型內部了。今天兩個主角就是曾經的兩大經典模型——ResNet和Inception(GoogLeNet)的后代——ResNext和Xception。

模型發展的回顧

前面介紹的模型主要站在更為宏觀的角度,然后不斷地進入圍觀的世界。我們面對的數據是一個三維的張量(Tensor),它有三個維度:通道(Channel),長(Height),寬(Width)。這三個維度統一起來形成了我們要分析處理的數據。

在卷積操作爆發之前,神經網絡的主要運算方式是全連接,也就是說,每一次運算過程中,輸出的每一個元素都要受三個維度共同的影響(當然,一般來說全連接是沒有三個維度的,這個只是做一個比方)。后來前輩們發現了卷積操作的妙用,于是大家開始廣泛采用卷積操作。在卷積操作中,每一個輸出的元素中,三個維度的影響力如下:

1 所有的通道

2 局部的高度

3 局部的寬度

這就是我們最初見到的卷積操作。如果用圖來表示兩種操作的差異,我們可以下面這張圖來表示:

 

卷積一戰成名。此后,前輩開始發明各種各樣的網絡,這些網絡都以卷積操作作為基本操作體。于是一系列的模型結構誕生了。模型在自身規模方面有了很大的發展,終于追上了處理器(GPU)的處理速度。經過這些年的發展,架構和招式修煉到了一定境界,那么是不是該回過頭來看看這個基本操作體了?

通道的局部性

前面看到,我們發現了數據的局部相關性,所以卷積操作出現,代替了全連接的大部分工作,使得模型在能夠抽取大量有用特征的同時,還能保證模型參數的精簡。于是在高和寬兩個維度,局部性得到了有效的驗證。那么一個自然而然的問題就來了——通道信息是否也具有局部性?換句話說,在處理通道時,我們是不是也可以像處理長寬一樣,不把所有的信息考慮在內,像下面這張圖這樣?

 

 

今天要介紹的這兩個新生代模型告訴我們,這個想法是有道理的。

在ResNext模型中,作者提出了Cardinality這個概念,它表示了通道分成的組。假如說我們本來有這樣一段模型結構:

 

 

此時中間的計算是經典的卷積操作,所有的通道信息合并處理,也相當于把通道分成了1組,如果想要將通道分成兩組,那么運算過程中,在中間的層次,我們會得到兩個結果,這兩個結果分別計算,最后合并起來(concatenate)或者加和起來(sum):

 

 

對于Xception模型中,作者提出了“depth-wise separable convolution”的結構,也就是說,在做卷積計算的時候,每一個通道內的數據做單獨計算,也就是說,如果有N維通道輸出,那么Cardinality就等于N。

兩個模型的其他方面各有異同,但思路上卻十分一致,都是要對通道下手,把convolution進化成為group convolution。

Group Conv的優點

前面提到了卷積之于全連接的優點,那么成組的卷積之于卷積的優點是不是類似呢?看上去是的。和全連接把所有的信息考慮在內類似,卷積操作把所有的通道信息考慮在內,也可能是一種信息浪費。我們曾經了解過,不同的卷積參數會產生不同的卷積效果,因而在不同的通道中,最終的輸出結果也有所不同。但是卷積參數比較有限,產生的輸出結構難免會有一定的相關性,因此將這些相關的特征放在一起考慮,有時并不一定會產生更好的效果,反而可能會造成一定程度的過擬合。因此,在通道維度做局部化的考量也是一個不錯的思路。

但是隨之而來的一個問題是——通道畢竟不同于長和寬,后兩者有明確物理意義上的局部性,而通道的局部性卻是人為想象出來的,因此這種做法難免會有些缺乏說服力,到底怎么處理通道這一維呢?

ShuffleNet的解決方案

有關group conv的解決方案也在不斷探索中,其中ShuffleNet做出了一定的嘗試。下圖是直接從它的論文中截取的,可以從圖(b)中看出,在完成一次group conv之后,通道的順序會發生一定的變化。作者并不是讓相近的幾個通道一直做信息的匯集,而是不斷地交換相鄰的通道,從某種意義上,這樣得到的通道融合會更加地均勻。

 

 

對通道的展望

看了這些論文的展示,下面我們就要認真地思考一個問題,如何更好地處理通道這個維度?顯然,完全孤立各個通道和把所有通道考慮在內是走了兩個極端,那么中間的狀態是什么?ImageNet 2017的冠軍模型SENet也對通道做了處理,它們的做法比較有趣,采用了“Squeeze-Excitation”的方法:

Squeeze操作將通道信息壓縮成一個數(average pooling,相當于1階矩),然后對這個通道匯總信息做全連接操作,得到各個通道的權重;

Excitation操作把這些權重賦給每一個通道,這種給通道加權的方式也是一種操縱通道的方式。

相信這種方法為他們最終的成功提供了幫助,但也可以看出,這種方法通過輕量級的通道與通道之間的交互來定義通道的重要程度。它所使用的信息只有一個一階矩,如果想要做的更好是不是可以再增加一些信息呢?是不是還有別的方法呢?這些都是值得我們思考的。

私貨時間

我的書 《深度學習輕松學:核心算法與視覺實踐》 ,感謝支持!

 

來自:https://zhuanlan.zhihu.com/p/28839889

 

 本文由用戶 飛翔的塵埃 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!