CNN的反擊!InceptionNeXt: 當 Inception 遇上 ConvNeXt

極市平臺 發佈 2024-02-26T13:59:47.727996+00:00

舉例來說,ConvNeXt-T 和 ResNet-50 的 FLOPs 相似,但是在 A100 GPU 上進行全精度訓練時,只能達到 60% 的吞吐量。首先對大核進行分解,分成幾組曉得卷積核。

作者丨科技猛獸

編輯丨極市平台

本文目錄

1 InceptionNeXt: 當 Inception 遇上 ConvNeXt
(來自 NUS, Sea AI Lab)
1 InceptionNeXt 論文解讀
1.1 背景和動機
1.2 MetaNeXt 架構
1.3 Inception Depthwise Convolution
1.4 InceptionNeXt 模型
1.5 實驗結果

太長不看版

受 Vision Transformer 長距離依賴關係建模能力的啟發,最近一些視覺模型開始上大 Kernel 的 Depth-Wise 卷積,比如一篇出色的工作 ConvNeXt。雖然這種 Depth-Wise 的算子只消耗少量的 FLOPs,但由於高昂的內存訪問成本 (memory access cost),在高性能的計算設備上會損害模型的效率。舉例來說,ConvNeXt-T 和 ResNet-50 的 FLOPs 相似,但是在 A100 GPU 上進行全精度訓練時,只能達到 60% 的吞吐量。

針對這個問題,一種提高速度的方法是減小 Kernel 的大小,但是會導致顯著的性能下降。目前還不清楚如何在保持基於大 Kernel 的 CNN 模型性能的同時加速。

為了解決這個問題,受 Inception 的啟發,本文作者提出將大 Kernel 的 Depth-Wise 卷積沿 channel 維度分解為四個並行分支,即小的矩形卷積核:兩個正交的帶狀卷積核和一個恆等映射。通過這種新的 Inception Depth-Wise 卷積,作者構建了一系列網絡,稱為 IncepitonNeXt,這些網絡不僅具有高吞吐量,而且還保持了具有競爭力的性能。例如,InceptionNeXt-T 的訓練吞吐量比 ConvNeXt-T 高1.6倍,在 ImageNet-1K 上的 top-1 精度提高了 0.2%。

本文的目標不是擴大卷積核。相反,本文以效率為目標,在保持相當的性能的前提下,以簡單和速度友好的方式分解大卷積核。

1 InceptionNeXt: 當 Inception 遇上 ConvNeXt

論文名稱:InceptionNeXt: When Inception Meets ConvNeXt

論文地址:

https://arxiv.org/pdf/2303.16900.pdf

1.1 背景和動機

回顧深度學習的歷史,卷積神經網絡 (CNN) 無疑是計算機視覺中最受歡迎的模型。2012年,AlexNet 在 ImageNet 競賽中獲勝,開啟了 CNN 在深度學習特別是計算機視覺領域的新時代。從那時起,眾多的 CNN 已經成為潮流的引領者,如 Network In Network,VGG,Inception Nets,ResNe(X)t,DenseNet 等。

受 Transformer 在 NLP 中成就的影響,研究人員嘗試將其模塊或塊集成到視覺 CNN 模型裡面,比如 Non-local Neural Networks 和 DETR。此外,Image GPT (iGPT)[1]受語言生成預訓練的啟發,將像素視為 token,並採用純Transformer 進行視覺自監督學習。然而,由於將像素視為 token 導致的計算成本太高,iGPT 處理高解析度圖像的能力也受限。

ViT 開創性地解決了這個問題,通過將圖片 Patch 視為 token,並提出了一個簡單的 patch embedding 模塊來生成 input 的 Embedding。ViT 利用一個純 Transformer 模型作為圖像分類的 Backbone,在經過了大規模監督圖像預訓練後得到了驚人的表現。而且,ViT 進一步點燃了 Transformer 在計算機視覺中的應用熱情。許多 ViT 變體,如 DeiT 和 Swin,在多種視覺任務中取得了顯著的性能。類 ViT 模型優於傳統 CNN 的性能 (Swin-T 81.2% ImageNet-1K v.s.ResNet-50 76.1% ImageNet-1K) 使得許多研究者相信 Transformer 最終將取代 CNN 並統治計算機視覺領域。

CNN 是時候反擊了!通過引入 DeiT 和 Swin 中先進的訓練技術,ResNet strikes back 這個工作表明,ResNet-50 的性能可以提高 2.3%,達到 78.4%。此外,ConvNeXt 表明,使用像 GELU 激活函數這樣的現代模塊和類似於注意力窗口大小的大 kernel,CNN 模型在各種設置和任務中可以穩定地優於 Swin Transformer。ConvNeXt 為代表的現代 CNN 模型中,共同的關鍵特徵是接受野較大,且使用了 Depthwise Convolution 獲得。

儘管 Depthwise Convolution 的 FLOPs 很小,但是它實際上是一個「昂貴的」運算符,因為它帶來了很高的內存訪問成本 (memory access cost),這個問題使它成為了計算密集型設備的瓶頸。如下圖1所示,儘管 FLOPs 相似,但是 Kernel Size 為 7×7 大小的 ConvNeXt-T 比 3×3 的 ConvNeXt-T 慢1.4倍,比 ResNet-50 慢1.8倍。如果強行把 Kernel Size 減掉,會導致性能下降。比如與 ConvNeXt-T/k7 相比,ConvNeXt-T/k3 在 ImageNet-1K 數據集上的 top-1 精度下降了 0.6%。

圖1:模型精度和訓練吞吐量之間的 Trade-off

目前還不清楚如何在保持大 Kernel CNN 性能的同時加速它們。本文最初的發現表明,並不是所有的輸入通道都需要經歷計算成本高昂的 Depth-wise Convolution 運算。因此,作者提出保留部分信道不變,只對部分信道進行深度卷積運算。首先對大核進行分解,分成幾組小的卷積核。1/3 的通道以 3×3 為核,1/3 的通道以 1×k 為核,剩下的 1/3 的通道以 k×1 為核。這個新的簡單,廉價的運算符稱為 Inception Depthwise Convolution,基於它構建的模型 InceptionNeXt 在精度和速度之間實現了更好的平衡。比如 InceptionNeXt-T 獲得了比 ConvNeXt-T 更高的精度,同時享受了類似於 ResNet-50 的1.6倍訓練吞吐量提升。

圖2:MetaFormer, MetaNext, ConvNeXt 和 InceptionNeXt

1.2 MetaNeXt 架構

MetaNeXt 是一種對於 ConvNeXt 的抽象架構。在一個 MetaNeXt Block 中,輸入 首先這樣操作:

式中,,分別代表 Batch size,通道數,高和寬。然後以上的輸出進行歸一化操作:

經過歸一化後,將得到的特徵輸入到由兩個全連接層組成的 MLP 模塊中,兩層之間夾有 GELU 激活函數,與 Transformer 中的 FFN 相同。兩個全連接層也可以通過 1×1 卷積實現。同時採用 Short-cut 連接:

和 MetaFormer 對比

如上圖2所示,可以發現 MetaNeXt 塊與 MetaFormer 塊共享類似的模塊,例如 token mixer 和 MLP。然而,這兩種模型之間的關鍵區別在於 Shortcut 的數量。MetaNeXt 是一種單殘差的架構,而 MetaFormer 是一種雙殘差的架構。從這個角度來看,MetaNeXt 塊可以看作是把 MetaFormer 的兩個 Sub-Block 進行合併,以簡化整體架構。因此,與 MetaFormer 相比,MetaNeXt 體系結構的速度更快。但是,這種更簡單的設計有一個限制,即:MetaNeXt 中的 token mixer 不能太複雜,比如把 ConvNeXt 中的 Depthwise Convolution 換成 Attention 以後,作者發現精度掉到了 3.9%。

1.3 Inception Depthwise Convolution

針對傳統的大 Kernel Depthwise Convolution 阻礙模型速度的問題, 本文提出了 Inception Depthwise Convolution。Inception 這個模型利用了小 Kernel (如 3×3) 和大 Kernel (如 5×5) 的幾 個分支。同樣地, Inception Depthwise Convolution 採用了 3×3 作為基本分支之一, 但避免了大 的矩形 Kernel, 因為它們的實際速度較慢。大的 矩形 Kernel 被分解為 和 。

對於輸入 , 首先沿著 channel 的維度分為 4 個 group:

然後,這4個特徵分別通過4個不同的算子:

其中, 表示默認設置為3的小矩形 Kernel 大小, 表示默認設置為11的大 Kernel 大小。最後, 每個分支的輸出被拼接起來:

以上過程的 PyTorch 偽代碼如下:

import torch.nn as nn

class InceptionDWConv2d(nn.Module):
    def __init__(self, in_channels, square_kernel_size=3, band_kernel_size=11, branch_ratio=1/8):
        super().__init__()
        
        gc = int(in_channels * branch_ratio) # channel number of a convolution branch
        
        self.dwconv_hw = nn.Conv2d(gc, gc, square_kernel_size, padding=square_kernel_size//2, groups=gc)
        
        self.dwconv_w = nn.Conv2d(gc, gc, kernel_size=(1, band_kernel_size), padding=(0, band_kernel_size//2), groups=gc)
        
        self.dwconv_h = nn.Conv2d(gc, gc, kernel_size=(band_kernel_size, 1), padding=(band_kernel_size//2, 0), groups=gc)
        
        self.split_indexes = (gc, gc, gc, in_channels - 3 * gc)
        
    def forward(self, x):
        # B, C, H, W = x.shape
        x_hw, x_w, x_h, x_id = torch.split(x, self.split_indexes, dim=1)
        
        return torch.cat(
            (self.dwconv_hw(x_hw), 
            self.dwconv_w(x_w), 
            self.dwconv_h(x_h), 
            x_id), 
            dim=1)

Inception Depthwise Convolution 和其他幾種算子的計算複雜度比較如下圖3所示。可以看出,比普通卷積的效率要高得多。

不同類型算子的特性

1.4 InceptionNeXt 模型

基於 InceptionNeXt Block,作者構建了一系列 InceptionNeXt 模型。與 ResNet 和 ConvNeXt 類似,InceptionNeXt 也採用了4 Stage 的模型框架。InceptionNeXt 採用 Batch Normalization,因為強調推理速度。與 ConvNeXt 的另一個不同之處在於,InceptionNeXt 在 Stage 4 的 MLP 模塊中使用的 Expansion Ratio 為3,並將保存的參數移動到分類器中,這可以幫助減少一些計算量。不同大小的 InceptionNeXt 模型的參數配置如下圖4所示。

圖4:不同大小的 InceptionNeXt 模型的參數配置

1.5 實驗結果

ImageNet-1K 圖像分類

評價視覺基礎模型的重要指標之一是 ImageNet-1K 直接訓練的圖像分類結果。InceptionNeXt 使用的超參數如下圖5所示,實驗結果如圖6所示。數據增強的方式依然包括:random resized crop, horizontal flip, RandAugment, Mixup, CutMix, Random Erasing 和 color jitter。正則化的方式依然包括:label smoothing, stochastic depth, 和 weight decay。

圖5:ImageNet-1K 實驗的訓練超參數

圖6:ImageNet-1K 圖像分類實驗結果

作者將 InceptionNeXt 與各種最先進的模型進行比較,包括基於注意力的模型和基於卷積的模型。從圖6中可以看出,InceptionNeXt 不僅具有較高的競爭性能,而且具有較高的速度。例如,InceptionNeXt-T 不僅比 ConvNeXtT 高出 0.2%,而且訓練/推理吞吐量也比 ConvNeXts 高 1.6×/1.2×,與 ResNet-50 相似。也就是說,InceptionNeXt-T 既享有 ResNet-50 的速度,又享有 ConvNeXt-T 的精度。

同樣作者也遵循 ConvNeXt 的做法做了一些直筒架構的模型,實驗結果如下圖7所示。實驗結果如下圖7所示。可以看到,在直筒形狀的架構下,InceptionNeXt 也可以表現得很好,證明了 InceptionNeXt 在不同的框架之間表現出良好的泛化性能。值得注意的是,把 ConvNeXt 中的 Depthwise Convolution 換成 Attention 以後,得到的 MetaNeXt-Attn 無法訓練收斂,僅達到 3.9% 的精度。這個結果表明,與 MetaFormer 中的 token mixer 不同,MetaNeXt 中的令牌混合器不能太複雜。

圖7:直筒架構模型實驗結果

ADK20K 語義分割

作者使用 ImageNet-1K 預訓練的權重,使用 UperNet 作為分割頭,使用 AdamW 優化器訓練模型,學習率為 6e-5,Batch Size 大小為16,疊代次數為 160K。使用 Semantic FPN 作為分割頭,Batch Size 大小為32,疊代次數為 40K。實驗結果如圖8和圖9所示。

圖8:以 UperNet 為分割頭的 ADE20K 語義分割實驗結果

圖9:以 Semantic FPN 為分割頭的 ADE20K 語義分割實驗結果

對於以 UperNet 為分割頭的實驗結果,可以看出,在不同的模型尺寸下,InceptionNeXt 的性能始終優於 Swin 和ConvNeXt。對於以 Semantic FPN 為分割頭的實驗結果,可以看出,在不同的模型尺寸下,InceptionNeXt 的性能始終優於 PVT 和 PoolFormer。這些結果表明,InceptionNeXt 對於密集預測任務也有很高的潛力。

總結

本文認為在一個卷積視覺模型中,並不是所有的輸入通道都需要經歷計算成本高昂的 Depth-wise Convolution 運算。因此,作者提出保留部分信道不變,只對部分信道進行深度卷積運算。首先對大核進行分解,分成幾組曉得卷積核。1/3 的通道以 3×3 為核,1/3 的通道以 1×k 為核,剩下的 1/3 的通道以 k×1 為核。這個新的方式稱為 Inception Depthwise Convolution,基於它構建的模型 InceptionNeXt 在精度和速度之間實現了更好的平衡。比如 InceptionNeXt-T 獲得了比 ConvNeXt-T 更高的精度,同時享受了類似於 ResNet-50 的1.6倍訓練吞吐量提升。

參考

  1. ^Generative Pretraining From Pixels
關鍵字: