天天看點

【論文閱讀】Aggregated Residual Transformations for Deep Neural Networks Saining(ResNext)

這篇文章是kaiming大神的組的工作,在resnet上繼續改進。一作謝賽甯,2013年從上海交大大學畢業後去UCSD讀博士,現在他引1400+了(不知道我畢業時能不能有這個的一半QAQ),導師是Zhuowen Tu。

Introduction

【論文閱讀】Aggregated Residual Transformations for Deep Neural Networks Saining(ResNext)

現代的網絡設計中通常會次堆疊類似結構,如VGG,Inception,Resnet等,進而減少網絡中超參數的數量,簡化網絡設計。

Inception使用了split-transform-merge政策,即先将輸入分成幾部分,然後分别做不同的運算,最後再合并到一起。這樣可以在保持模型表達能力的情況下降低運算代價。

但是Inception的結構還是過于複雜了。作者想,我直接暴力均分輸入,卷積層結構都是一樣的,然後再merge。這樣的話我隻需要告訴網絡分成幾組就可以了,不就不需要再設計那麼精巧的Inception了嗎?

【論文閱讀】Aggregated Residual Transformations for Deep Neural Networks Saining(ResNext)

圖3中的三種結構實際上是等價的。但是這種結構早在2012年AlexNet被發明出來的時候實際上已經被使用了。當初是因為一張顯示卡不夠用,必須要将卷積放到兩張顯示卡上算。是以現在幾乎所有的神經網絡架構的conv層都有group這個參數,但在作者之前就是沒人把這個group作為超參數調一下(這是個很有意思的問題,明明架構裡有,為啥大家不試試呢)。作者後來提到之前做網絡壓縮的人提出過group的方法,但是卻極少有人研究其精度,這篇文章是從模型表達和精度的方向上寫的。

這種結構可以在保持網絡的計算量和參數尺寸的情況下,提高分類精度。(論文裡沒有提到的是,雖然參數不變,但是顯存增加了)。如表一中顯示的,兩邊的網絡具有相同的參數和計算量,但是右側會有更好的精度。

【論文閱讀】Aggregated Residual Transformations for Deep Neural Networks Saining(ResNext)

就是這樣一個看似簡單的點子,卻有很驚人的效果。作者把他的網絡起名ResNeXt,意為ResNet的下一個版本。幾乎在各方面表現吊打了ResNet,Inception等一系列網絡。101層的ResNeXt吊打了計算量是他兩倍的ResNet-200。在ImageNet上取得了第二名。

方法

這篇論文的方法其實用一句話就能說清了——卷積裡加個group參數,或者是inception把不同的分支調到相同的結構。但是作者既然要發文章,就一定得強行解釋一波他這個結構和conv group以及inception的差別。

模闆

網絡設計時遵循了兩個原則:

  1. 如果相同尺寸的層共享相同的超參數。
  2. 如果圖像經過了降采樣層使尺寸除了2,那麼要在通道數上乘2,以保證每個塊的計算量大緻相同。

有了上面兩個限制,設計網絡的自由度就小了很多。隻需要定義出一個模闆單元,就可以依次決定後面的單元。表1就是個栗子。

回顧簡單神經元

簡單神經元的形式滿足

∑i=1Dwixi ∑ i = 1 D w i x i

是以可以看作是一個內建轉換的過程,即分割——轉換——內建的過程。對于普通神經元來講,分割就是把輸入分成一個個的 xi x i ,變換就是乘權重,內建就是相加。

內建轉換

其實在卷積内加分組的方法也可以看作是一個內建轉換的過程。可以寫成下面的形式:

F(x)=∑i=1CTi(x) F ( x ) = ∑ i = 1 C T i ( x )

這裡面, Ti T i 代表任意一種變換,而 x x 則代表要給group。結合圖3A圖食用更佳。

那麼問題來了,說這麼多你這種方法和inception的差別是啥?

inception設計網絡太複雜了,我們這個給個參數就行了呀XD

那你這種方法和直接對卷積層分組有什麼差別?

直接對卷積層分組的話每個 x x 對應的 Ti T i 都是一樣的,我們這個可以讓每個都不一樣哦

可是你這個不是一樣的嗎?

都說了是可以不一樣嘛。。我們取一樣的是因為這種形式最簡單。嗯。我們這個方法最牛逼。

模型能力

衆所周知的是模型的表達能力和參數基本上是成正比的。但是采用這種結構後,刻意調整通道數,以保證每層的參數數量和計算量和普通的ResNet相同,結果表達能力居然提高了。

實作細節

這部分沒什麼好說的,用了BN,ReLU,sgd,等等。用了圖3(c)的實作。

實驗

在imagenet1000上做了ablation實驗。把分組數量cardinility從1調到32,錯誤率持續走低。關鍵是在訓練集上的誤差也降低了。也就是說分組不是通過正則化的方法來提高精度的,而是的的确确增加了模型的表達能力。

在image-net5k上訓練出來的模型,在1k上的錯誤率可以和直接在1k上訓練出來的模型一戰。作者認為這是個了不起的成就,畢竟5k的任務要更複雜一些。

之後又在CIFAR-10,100和COCO上測試了,都取得了不錯的效果。

當然這些實驗基本上都是直接和同算力的ResNet對比的。

繼續閱讀