Residual Leaning:認識ResNet與他的冠名後繼者ResNeXt、ResNeSt

Residual Leaning: 認識ResNet與他的冠名後繼者ResNeXt、ResNeSt

打從ResNet出現後,以residual block / residual learning為主架構的網路接連地在各個論文中出現,也正式撬開了深層數網路的時代。事實上,目前在computer vision上大部分主流的網路幾乎都使用了ResNet的觀念,也衍生出了許多的後繼者。

本篇論文主要會介紹ResNet,包含ResNet改變了什麼以及ResNet原版的幾個架構:ResNet50、ResNet101、ResNet152等等。以及介紹兩個名子跟他有夠像、超容易誤認的ResNeXt以及ResNeSt。前者為ResNet接近官方的後繼者,也是許多當代state-of-the-art (SOTA)的backbone網路,後者為今年現身,數據漂亮的新網路架構。

ResNet與一般網路架構差 (Figure from this paper )

Tip

文章難度:★★☆☆☆

閱讀建議:本篇文章大部著重介紹 ResNet的觀念,只要有 convolution neural network基本概念,即使沒看過 ResNet也可以理解。後面一小段則是介紹稍微小改動的 ResNeXt,難度也不高。最後介紹今年新的 ResNeSt,則比較進階一點,關於 ResNeSt的小爭議也放在了文章的末段。

推薦背景知識: convolution neural network、image classification。

ResNet

ResNet論文 [1]出來前,當時的網路相較於現在,都是非常淺的設計。這個原因在於當時較深的網路比較容易訓練不起來,使得更深的網路有時反而帶來更差的效果。而ResNet提出的residual learning簡單地使得深層網路更容易訓練,也開啟了各種超深網路的時代。

ResNet的網路設計其實很naive,就是簡單地增加一條路線做單純的加法 (如下圖左),而這樣組合起來的convolution layer,論文稱為一個 (building) block,方法簡單卻使的深層網路訓練變得容易許多。而在疊更深的網路時,ResNet設計了bottleneck (building) block,降低3x3 convolution的寬度,大幅減少了所需的運算量。

Basic residual block and bottleneck block (Figure from this paper )

聽到深層網路訓練不起來,很容易直接想到gradient vanishing。不過ResNet論文卻不這麼認為,作者認為gradient vanishing應該已經在使用batch normalization [2]後得到了一定non-zero variances的保證。

論文在實驗時,在一般堆疊 (plain)網路加上了batch normalization,作者透過觀察gradient確定batch normalization足夠保證forward時的non-zero variances、以及back propagation時良好的梯度。而實驗結果也證明了一般堆疊的網路也能收斂在一個不差的地方。

直接疊深的網路疊深部見得效果更好 (Figure from this paper )

至於在討論到 ResNet為什麼比 plain來的強時,作者 argue說這是因為學習一個 transform比學習一個殘差的 transform來得更加困難。雖然並不是很有說服力的說法,不過結果確實就是 residual learning又好訓練效果又好。

不管是哪種ResNet,整體架構都可以分為三大部分:

  1. Input stem: 使用一般的convolution,並且用大的stride降低解析度。
  2. Stage block: ResNet共有4個Stage block,每個stage block都是由數個building block堆疊而成。不論是用stride或是pooling,每個stage一般都會先降低解析度並加大寬度 (channel),再做一連串的residual learning。
  3. Output stem:依照任務,設計不同的輸出。一般來說這邊會隨著任務轉變,所以通常不算在ResNet的backbone裡。
ResNet50 架構圖 (figure from myself)

由於每個 stage第一個 building block的輸入與 residual path連接的地方解析度與網路寬度都不同,所以第一個 block會多一個 convolution,做解析度與寬度的調整。

而不同深度的ResNet的差別有兩個:

  1. ResNet18、ResNet34使用一般的residual block,而ResNet50、ResNet101、ResNet152使用了expansion為4的bottleneck block。
  2. 剩下的差異就在於每個stage堆疊的building block層數不同,詳細差異可以參考下面的表格。
一張圖看懂不從層數的ResNet (Figure from this paper )

這邊可以看到 ResNet34與 ResNet50的運算量其實是差不多的,明明 ResNet50的寬度與深度都都比較大。這就是 bottleneck block的作用,而調整 bottleneck的寬度比例 (第三個 convolution除以第一、二個 convolution的寬度)則稱謂 expansion。

ResNeXt

ResNeXt [3]來自有ResNet一作Kaiming He列名的論文,的確很有資格使用這麼相似的名子。ResNeXt也確實相當地爭氣,至今 (2020年) 依然是一個相當常見的架構。

ResNeXt的改動其實很簡單,用一言以蓋之:多個cardinal比單純的寬度 (channel) 來的更有效率。實際上的作法則是把ResNet用於實現transform堆疊的convolution改成多個平行較瘦的網路,最後在residual path前再加起來。而平行的數量在論文稱為cardinality。

ResNeXt與ResNet的building block比較 (Figure from this paper )

而在實驗數據上,則是明顯地超越了ResNet。

ResNet與ResNeXt在ImageNet上的表現 (Figure from this paper )

實際上ResNeXt論文的最大貢獻是研究了split-transform-merge的方法,並且提供了一個簡單而有效的方法-equivalent cardinal。之前Split-transform-merge做的最有名的應用之一是Google的Inception網路 [4]。不過Inception在split-transform-merge的設計較複雜,也衍生出更多超參數,而ResNeXt增加的超參數基本上只有一個cardinality。

Reduction module in Inception-v4 (Figure from this paper )

簡單概括ResNeXt的優點,主要有兩個:

  1. 相比ResNet,在相同的參數與運算量下,有更好的表現。
  2. 相比Inception相關方法,超參數調整容易。

事實上這篇論文花在討論 split-transform-merge,並且深入淺出地從簡單的 fully-connected layer開始舉例,到討論多種等價的設計,蠻值得好好閱讀。不過為了避免模糊焦點,這篇文章就不在多做延伸討論了!

ResNeSt

ResNeSt [5]是今年 (2020年) 出現的新網路架構,實際上的改動也跟ResNeXt一樣地簡單。簡單地說他的building block集合了三個元素:

  1. ResNet的residual path。
  2. ResNeXt的multi-path equivalent cardinal。
  3. SK-Net [6]中使用的feature-map split attention。
ResNeSt架構圖 (figure from this paper )

在feature-map split attention裡attention在這邊的意思並不是Transformer [7]那種attention,只是單純的對每個split計算一個weight,而這些weight總和為一。因為被split的是在網路的寬度 (channel、filter、或解釋為feature map),因此稱為feature-map split attention。

Split attention in ResNeSt (figure from this paper )

最後在數據上,除了ImageNet外,在object detection、instance segmentation、semantic segmentation都給出了接近SOTA或以上的成績。

ResNeSt在ImageNet上的成績與他的FLOPs數 (figure from this paper )

其實我個人覺得 ResNeSt並不最適合這個名子,因為在網路架構上乍看與ResNeXt相似,不過有一半其實更像是SK-Net,是我可能會取SK-NeXt吧,

但無庸置疑地,ResNeSt是一個強大的架構,實驗數據優異,並且有開源而且架構良好的官方程式碼。不過,他的 novelty來自兩篇論文方法的接合,可能就比較不被 top conference贊同,也是可能就是這篇論文投稿一直撞牆的原因。至於 ResNeSt會不會成為未來流行的架構,就要交給時間證明了。

小結論

了解了ResNet一家名子最相似的幾個網路,現在可以來看一下使用這些網路的知名應用。以下是今年 (2020年) 一篇object detection論文CentripetalNet [8]中的數據:

Object detection的幾個歷史SOTA比較 (figure from this paper )

或是看看semantic segmentation的數據,同樣是今年 (2020年)的論文 [9]的數據:

Semantic segmentation的幾個歷史SOTA比較 (figure from this paper )

即使過了好幾年,ResNet家族還是霸佔了大部分的網路backbone。事實上,許多非直接使用與ResNet相似命名的backbone大多都還是在堆疊網路上使用residual block,這招確實已經成為顯學,也是當代最佳、最主流的網路設計概念之一。

其他網路輔助架構如DCN、MG、ASPP等等,之後有機會再考慮寫另一篇補充!

老話一句:Deep Learning領域每年都會有大量高質量的論文產出,說真的要跟緊不是一件容易的事。所以我的觀點可能也會存在瑕疵,若有發現什麼錯誤或值得討論的地方,歡迎回覆文章或來信一起討論 :)

關於更多網路架構相關文章,可以參考:

Appendix

這邊單純地補充一下關於ResNeSt論文中的一些數據討論。

ResNeSt論文開頭給出了這個數據:比當代最快的EfficientNet [10]快,又刷新了其他題目的SOTA。看起來似乎很神,不過這個速度的計算上其實有些小秘密。

ResNeSt開頭最大張的圖,也是作者最想展現的數據亮點 (figure from this paper )

首先,回頭看一下EfficientNet論文中,ResNet與EfficientNet的FLOPs數:

Performance, #Params and #FLOPs comparison (figure from this paper )

對比ResNeSt論文中ResNeSt與ResNet的FLOPs數:

Performance, #Params and #FLOPs comparison (figure from this paper )

可以看到兩篇論文在ResNet-50的GFLOPs都約為4.14,而ResNeSt-50的GFLOPs為5.39,對比EffiecentNet-B2的1.0,然而在ResNeSt論文裡的latency卻是ResNeSt壓著EffiecentNet打?這點雖然矛盾,卻不是錯誤的。

關於這個速度的計算,論文作者是這樣說的:In this benchmark, all inference speeds are measured using a mini-batch of 16 using the implementation from the original author on a single NVIDIA V100 GPU。

實際上這個問題與YOLOv4 [11]數據壓著EffiecentNet打有點類似,因為在GPU上低的FLOPs數不等價於低的latency。這點ResNeSt與YOLOv4論文的目標有點相似,都是追求在GPU上最好的表現。不過,實際上在CPU上大概依然是EffiecentNet的天下。

References

  1. Deep Residual Learning for Image Recognition[CVPR 2016]
  2. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift[ICML 2015]
  3. Aggregated Residual Transformations for Deep Neural Networks[CVPR 2017]
  4. Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning[ICLR Workshop 2016]
  5. ResNeSt: Split-Attention Networks[arXiv 2020]
  6. Selective Kernel Networks[CVPR 2019]
  7. Attention Is All You Need[NIPS 2017]
  8. CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection [CVPR 2020]
  9. Object-Contextual Representations for Semantic Segmentation[arXiv 2020]
  10. EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks[ICML 2019]
  11. YOLOv4: Optimal Speed and Accuracy of Object Detection[arXiv 2020]
comments powered by Disqus