天天看點

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

文章目錄

  • ​​一、Abstract(摘要):​​
  • ​​二、Introduction(引言):​​
  • ​​三、Modernizing a ConvNet: a Roadmap(現代化路線)​​
  • ​​1.Macro Design子產品​​
  • ​​2.ResNeXt-ify子產品​​
  • ​​3.Inverted Bottleneck子產品:​​
  • ​​4.Large Kernel Sizes子產品:​​
  • ​​5.various layer-wise Micro Design子產品​​
  • ​​四、小總結​​

論文題目:

A ConvNet for the 2020s

論文下載下傳位址:​​https://arxiv.org/pdf/2201.03545.pdf​​

在這篇文章之前,CV領域被Transformer給刷榜了,什麼Vit啊 Swim啊各種的Transformer的模型,這個作者寫這篇文章 ,題目起的真的剛,20年代的卷積網絡,就是想告訴你們,如今這個被Transformer占領的時代,我們CNN要重回第一。

之前的Vit或者Swim什麼的都是要完全抛棄CNN,并且模型出來之後也證明了,抛棄CNN之後模型精準度等直接沖到第一了。我估計CNN陣營的大佬們看了之後坐不住了,直接發了一個這個模型,好家夥兩邊打起來了哈哈。

一、Abstract(摘要):

摘要的第一句 ​

​Roaring 20s​

​ 咆哮的20年代哈哈,其實就是指騰空出世的基于Transformer模型的Vit和Swim,他們已經可以說完全取代CNN作為CV領域任務的backbone,并且取得了SOTA的效果。

相較于Vit ,Swim在CV領域的下遊任務中均取得了很好的效果,作者在思考取得好效果的原因,發現并不是因為Swim應用了CNN中的歸納偏置,而是Transformer的特有優勢,随後作者開始參考Transformer,以ResNet為基礎最優化CNN模型,畢竟是兩邊打架,這篇論文的作者也強調,他們無論如何優化,都是CNN模型。

摘要最後一句話,作者提出的ConvNeXt效果比Transformer好。

二、Introduction(引言):

引言的前四段都可以直接略過,都是在介紹之前的工作,害,要不是大佬的文章,我都覺得是湊字數,也可能是這種論文的必要點,學會了,我寫論文的時候也這麼湊字數。

不過值得關注的是他這前幾段所介紹到的論文都可以讀一讀,雖然大部分已經讀過了,MobileNet [34]、EfficientNet [71]這兩個好像是輕量化網絡,還沒有看過,關注一下。

作者說 Vit性能的好歸功于Transformer的超強的縮放行為,因其加持了關鍵元件MSA(多頭自注意力機制)。

然後作者受到啟發,開始基于Resnet50改造。

作者引言裡給了張圖:

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

在imagenet-1K資料集上,可以看到ConvNeXt的性能已經超過了Swin了。

三、Modernizing a ConvNet: a Roadmap(現代化路線)

一般論文的慣例這一章節都是準備工作,本文這裡直接就開始介紹作者如何改造他的模型了。

作者直接給出了一個大圖,這個圖裡就是作者應用各種改造手段對比原先模型所提升的效果。

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

也就五個子產品:

  • Macro Design
  • ResNeXt-ify
  • Inverted Bottleneck
  • Large Kernel Sizes
  • various layer-wise Micro Design

論文中2.1節主要是介紹他們訓練的基礎,作者首先利用訓練vision Transformers的政策去訓練原始的ResNet50模型(例如 使用AdamW 優化器),發現比原始效果要好很多,并将此結果作為後續實驗的基準baseline。

下面來逐一看看各個子產品。

先放一張ResNet的圖,畢竟後面都是基于這個改造的。

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

1.Macro Design子產品

這個子產品裡主要有兩個政策,一個是stage ratio,另一個是 “patchify stem”。

  • stage ratio

作者參考了Swim的stage比例去調整Resnet50的stage比例。

ResNet50中stage1到stage4堆疊block的次數是(3, 4, 6, 3)比例大概是1:1:2:1,但在Swin Transformer中,比如Swin-T的比例是1:1:3:1,Swin-L的比例是1:1:9:1。在Swin Transformer中,stage3堆疊block的占比更高。是以作者就将ResNet50中的堆疊次數由(3, 4, 6, 3)調整成(3, 3, 9, 3)。

由此帶來的精度提升 78.8% -> 79.4%:

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)
  • patchify stem

這裡的stem就是指模型一開始的那個下采樣步驟:

Resnet裡就是下面這兩步:

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

原始的ResNet50:7 * 7 的卷積 加上 3* 3 的最大池化 = 下采樣四倍。

但在Transformer模型中一般都是通過一個卷積核非常大且相鄰視窗之間沒有重疊的(即stride等于kernel_size)卷積層進行下采樣。

比如在Swin Transformer中采用的是一個卷積核大小為4x4步長為4的卷積層構成patchify,同樣是下采樣4倍。

是以作者将ResNet中的stem也換成了和Swin Transformer一樣的patchify。替換後準确率從79.4% 提升到79.5%,并且FLOPs也降低了一點:

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

2.ResNeXt-ify子產品

先說一下分組卷積 grouped convolution:

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

将卷積的輸入feature map分成組,每個卷積核也相應地分成組,在對應的組内做卷積,如上圖所示,圖中分組數,即上面的一組feature map隻和上面的一組卷積核做卷積,下面的一組feature map隻和下面的一組卷積核做卷積。每組卷積都生成一個feature map,共生成2個feature map。

group conv常用在輕量型高效網絡中,因為它用少量的參數量和運算量就能生成大量的feature map,大量的feature map意味着能夠編碼更多的資訊!

從分組卷積的角度來看,分組數g就像一個控制旋鈕,最小值是1,此時的g=1卷積就是普通卷積;最大值是輸入feature map的通道數C,此時g=C的卷積就是depthwise sepereable convolution,即深度分離卷積,又叫逐通道卷積。

論文中直接使用 ​​

​depthwise convolution​

​ 我看那個意思就是深度分離卷積。

深度分離卷積:

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

如上圖所示,深度分離卷積是分組卷積的一種特殊形式,其分組數,是feature map的通道數。即把每個feature map分為一組,分别在組内做卷積,組内一個卷積核生成一個feature map。這種卷積形式是最高效的卷積形式,相比普通卷積,用同等的參數量和運算量就能夠生成c個feature map,而普通卷積隻能生成一個feature map。

再上一張Xception裡的圖幫助了解深度可分離卷積:

  • Xception論文精度
  • 【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

作者在這裡就是用了Xception裡的那個深度可分離卷積。

原來的ResNet50的輸入次元是64,Swin-t的輸入次元是96,是以作者直接照搬将本文模型改成Swin的96輸入次元。

這一改動之後的精度提升:

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

3.Inverted Bottleneck子產品:

MobileNet v2中有一個結構就是Inverted residual block(倒殘差結構),在殘差結構中是1x1卷積降維->3x3卷積->1x1卷積升維,在倒殘差結構中正好相反,是1x1卷積升維->3x3DW卷積->1x1卷積降維。為什麼要這樣做,原文的解釋是高維資訊通過ReLU激活函數後丢失的資訊更少。

本文作者認為Transformer block中的MLP子產品非常像MobileNetV2中的Inverted Bottleneck子產品。

下圖a是ReNet中采用的Bottleneck子產品,b是MobileNetV2采用的Inverted Botleneck,c是ConvNeXt采用的是Inverted Bottleneck子產品。

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

于是作者采用Inverted Bottleneck子產品後,在較小的模型上準确率由80.5%提升到了80.6%,在較大的模型上準确率由81.9%提升到82.6%。

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

4.Large Kernel Sizes子產品:

  • Moving up depthwise conv layer

即将depthwise conv子產品上移,

  • 原來是1x1 conv -> depthwise conv -> 1x1 conv,
  • 現在變成了depthwise conv -> 1x1 conv -> 1x1 conv。

就是這個圖:

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

這麼做是因為在Transformer中,MSA子產品是放在MLP子產品之前的,是以這裡進行效仿,将depthwise conv上移。這樣改動後,準确率下降到了79.9%,同時FLOPs也減小了

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)
  • Increasing the kernel size

作者将depthwise conv的卷積核大小由3x3改成了7x7(和Swin Transformer一樣),當然作者也嘗試了其他尺寸,包括3, 5, 7, 9, 11發現取到7時準确率就達到了飽和。并且準确率從79.9% (3×3) 增長到 80.6% (7×7)。

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

5.various layer-wise Micro Design子產品

對應原文中2.6 Micro Design。

這一節都是細小的改動。

  • Replacing ReLU with GELU

在Transformer中激活函數基本用的都是GELU,而在卷積神經網絡中最常用的是ReLU,于是作者又将激活函數替換成了GELU,替換後發現準确率沒變化。

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)
【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)
  • Fewer activation functions

使用更少的激活函數。在卷積神經網絡中,一般會在每個卷積層或全連接配接後都接上一個激活函數。但在Transformer中并不是每個子產品後都跟有激活函數,比如MLP中隻有第一個全連接配接層後跟了GELU激活函數。接着作者在ConvNeXt Block中也減少激活函數的使用,減少後發現準确率從80.6%增長到81.3%。

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)
  • Fewer normalization layers

使用更少的Normalization。同樣在Transformer中,Normalization使用的也比較少,接着作者也減少了ConvNeXt Block中的Normalization層,隻保留了depthwise conv後的Normalization層。此時準确率已經達到了81.4%,已經超過了Swin-T。

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)
  • Substituting BN with LN

将BN替換成LN。Batch Normalization(BN)在卷積神經網絡中是非常常用的操作了,它可以加速網絡的收斂并減少過拟合。但在Transformer中基本都用的Layer Normalization(LN),因為最開始Transformer是應用在NLP領域的,BN又不适用于NLP相關任務。接着作者将BN全部替換成了LN,發現準确率還有小幅提升達到了81.5%。

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)
  • Separate downsampling layers

單獨的下采樣層。在ResNet網絡中stage2-stage4的下采樣都是通過将主分支上3x3的卷積層步距設定成2,捷徑分支上1x1的卷積層步距設定成2進行下采樣的。但在Swin Transformer中是通過一個單獨的Patch Merging實作的。接着作者就為ConvNext網絡單獨使用了一個下采樣層,就是通過一個Laryer Normalization加上一個卷積核大小為2步距為2的卷積層構成。更改後準确率就提升到了82.0%。

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

作者也像Swim那樣提出了很多的版本,C就是通道數,B就是block堆疊的stage的那個數量。

【論文精讀】……ConvNeXt……(CNN和Transformer打起來了,A ConvNet for the 2020s)

到這基本的ConvNeXt就完了,後面都是和各個模型對比的實驗,大概看一遍略過了。

四、小總結

繼續閱讀