from:https://blog.csdn.net/xuanwu_yan/article/details/53455260
背景
論文地址:Aggregated Residual Transformations for Deep Neural Networks
代碼地址:GitHub
這篇文章在 arxiv 上的時間差不多是今年 cvpr 截稿日,我們就先理解為是投的 cvpr 2017 吧,作者包括熟悉的 rbg 和何凱明,轉戰 Facebook 之后代碼都放在 Facebook 的主頁里面了,代碼也從 ResNet 時的 caffe 改成了 torch :)
貢獻
- 網絡結構簡明,模塊化
- 需要手動調節的超參少
- 與 ResNet 相比,相同的參數個數,結果更好:一個 101 層的 ResNeXt 網絡,和 200 層的 ResNet 准確度差不多,但是計算量只有后者的一半
方法
提出來 cardinality 的概念,在上圖左右有相同的參數個數,其中左邊是 ResNet 的一個區塊,右邊的 ResNeXt 中每個分支一模一樣,分支的個數就是 cardinality。此處借鑒了 GoogLeNet 的 split-transform-merge,和 VGG/ResNets 的 repeat layer。
所謂 split-transform-merge 是指通過在大卷積核層兩側加入 1x1 的網絡層,控制核個數,減少參數個數的方式。借鑒 fei-fei li 的 cs231n 課件1:
而 repeat layer 則是指重復相同的幾層,前提條件是這幾層的輸出輸出具有相同的維度,一般在不同的 repeat layers 之間使用 strip=2 降維,同時核函數的個數乘 2。
本文網絡參數
以上圖為例,中括號內就是 split-transform-merge,通過 cardinality(C) 的值控制 repeat layer。
output 在上下相鄰的格子不斷減半,中括號內的逗號后面卷積核的個數不斷翻倍。
等價模式
圖一右側的模型有兩個等價的模型,最右側是 AlexNet 中提出的分組卷積,相同層的 width 分組卷積,最終作者使用的是下圖最右邊的模型,更加簡潔並且訓練更快。
模型參數
調節 cardinality 時,如何保證和 ResNet 的參數個數一致呢?本文考慮的是調節 split-transform-merge 中間第二層卷積核的個數。
實驗
基本和 ResNet 差不多,augmentation、以及各個參數
結論
- ResNeXt 與 ResNet 在相同參數個數情況下,訓練時前者錯誤率更低,但下降速度差不多
- 相同參數情況下,增加 cardinality 比增加卷幾個數更加有效
- 101 層的 ResNeXt 比 200 層的 ResNet 更好
- 幾種 sota 的模型,ResNeXt 准確率最高
深度學習——分類之ResNeXt
論文:Aggregated Residual Transformations for Deep Neural Networks
作者:Saining Xie, Ross Girshick, Piotr Dollár, Zhuowen Tu, Kaiming He
ImageNet Top5錯誤率:3.03%
中心思想:Inception那邊把ResNet拿來搞了Inception-ResNet,這頭ResNet也把Inception拿來搞了一個ResNeXt,主要就是單路卷積變成多個支路的多路卷積,不過分組很多,結構一致,進行分組卷積。
卷積的范式
作者一上來先歸納了Inception的模式:split-transform-merge。
如下圖所示,先將輸入分配到多路,然后每一路進行轉換,最后再把所有支路的結果融合。

少不了要提一下Inception的缺點,太復雜了,人工設計的痕跡太重了。
然后,站得更高,分析了神經網絡的標准范式就符合這樣的split-transform-merge模式。以一個最簡單的普通神經元為例(比如FC中的每個神經元):

就是先對輸入的m個元素,分配到m個分支,進行權重加權,然后merge求和,最后經過一個激活。
由此歸納出神經網絡的一個通用的單元可以用如下公式表示:

結合ResNet的identity映射,帶residual的結構可以用如下公式表示:

上面的變換T可以是任意形式,一共有C個獨立的變換,作者將C稱之為基數,並且指出,基數C對於結果的影響比寬度和深度更加重要。
基本結構
如下圖,左邊是ResNet的基本結構,右邊是ResNeXt的基本結構:

回憶下上面的公式,可以看到,旁邊的residual connection就是公式中的x直接連過來,然后剩下的是32組獨立的同樣結構的變換,最后再進行融合,符合split-transform-merge的模式。
作者進一步指出,split-transform-merge是通用的神經網絡的標准范式,前面已經提到,基本的神經元符合這個范式,而如下圖所示:

a是ResNeXt基本單元,如果把輸出那里的1x1合並到一起,得到等價網絡b擁有和Inception-ResNet相似的結構,而進一步把輸入的1x1也合並到一起,得到等價網絡c則和通道分組卷積的網絡有相似的結構。
到這里,可以看到本文的野心很大,相當於在說,Inception-ResNet和通道分組卷積網絡,都只是ResNeXt這一范式的特殊形式而已,進一步說明了split-transform-merge的普遍性和有效性,以及抽象程度更高,更本質一點。
ResNeXt
然后是ResNeXt具體的網絡結構。
類似ResNet,作者選擇了很簡單的基本結構,每一組C個不同的分支都進行相同的簡單變換,下面是ResNeXt-50(32x4d)的配置清單,32指進入網絡的第一個ResNeXt基本結構的分組數量C(即基數)為32,4d表示depth即每一個分組的通道數為4(所以第一個基本結構輸入通道數為128):

可以看到ResNet-50和ResNeXt-50(32x4d)擁有相同的參數,但是精度卻更高。
具體實現上,因為1x1卷積可以合並,就合並了,代碼更簡單,並且效率更高。
參數量不變,但是效果太好,這個時候通常會有一個『但是』。。。但是,因為分組了,多個分支單獨進行處理,所以相交於原來整個一起卷積,硬件執行效率上會低一點,訓練ResNeXt-101(32x4d)每個mini-batch要0.95s,而ResNet-101只要0.70s,雖然本質上計算量是相同的,通過底層的優化因為能縮小這個差距。好消息是,看了下最近的cuDNN7的更新說明:
Grouped Convolutions for models such as ResNeXt and Xception and CTC (Connectionist Temporal Classification) loss layer for temporal classification
貌似已經針對分組卷積進行了優化,我還沒進行過測試,不過我猜效率應該提升了不少。
至於具體的效果,ResNeXt-101(32x4d)大小和Inception v4相當,效果略差,但Inception-v4慢啊= =,ResNeXt-101(64x4d)比Inception-Resnet v2要大一點,精度相當或略低。
上面的比較並不算很嚴謹,和訓練方式、實現方式等有很大的關系,實際使用中區別不大,還沒有找到一個很全的benchmark可以准確比較。不過這里的結果可以作為一個參考。
得益於精心設計的復雜的網絡結構,ResNet-Inception v2可能效果會更好一點,但是ResNeXt的網絡結構更簡單,可以防止對於特定數據集的過擬合。而且更簡單的網絡意味着在用於自己的任務的時候,自定義和修改起來更簡單。
最后,提一個八卦,ResNet作者的論文被Inception v4那篇argue說residual connection可以提升訓練收斂速度,但是對於精度沒有太大幫助,然后這篇ResNeXt馬上又懟回去了,說沒有要降好幾個點,對於網絡的優化是有幫助的。。。
總結下:split-transform-merge模式是作者歸納的一個很通用的抽象程度很高的標准范式,然后ResNeXt就這這一范式的一個簡單標准實現,簡潔高效啊。