新智元推薦
來源:AIWalker
編輯:SF
【新智元導讀】該文是清華大學&曠視科技等提出的一種新穎的CNN設計範式,它將ACNet的思想與VGG架構進行了巧妙的結合,首次將plain模型的精度在ImageNet上提升到了超過80%top1精度。相比ResNet、RegNet、EfficientNet等網絡,RepVGG具有更好的精度-速度均衡。
paper: httsp://arxiv.org/abs/2101.03697
code: https://github.com/DingXiaoH/RepVGG
Abstract
本文提出一種簡單而強有力的CNN架構RepVGG,在推理階段,它具有與VGG類似的架構,而在訓練階段,它則具有多分支架構體系,這種訓練-推理解耦的架構設計源自一種稱之為「重參數化(re-parameterization)」的技術。
在ImageNet數據集上,RepVGG取得了超過80%的top-1精度,這是plain模型首次達到如此高的精度。在NVIDIA 1080TiGPU上,RepVGG比ResNet50快83%,比ResNet101快101%,同時具有更高的精度;相比EfficientNet與RegNet,RepVGG表現出了更好的精度-速度均衡。
該文的主要貢獻包含以下三個方面:
提出了一種簡單有強有的CNN架構RepVGG,相比EfficientNet、RegNet等架構,RepVGG具有更佳的精度-速度均衡;
提出採用重參數化技術對plain架構進行訓練-推理解耦;
在圖像分類、語義分割等任務上驗證了RepVGG的有效性。
Method
Simple is Fast, Memory-economical, Flexible
簡單的ConvNet具有這樣三點優勢:
Fast:
相比VGG,現有的多分支架構理論上具有更低的Flops,但推理速度並未更快。比如VGG16的參數量為EfficientNetB3的8.4倍,但在1080Ti上推理速度反而快1.8倍。這就意味著前者的計算密度是後者的15倍。
Flops與推理速度的矛盾主要源自兩個關鍵因素:
(1) MAC(memory access cose),比如多分支結構的Add與Cat的計算很小,但MAC很高;
(2)並行度,已有研究表明:並行度高的模型要比並行度低的模型推理速度更快。
Memory-economical:
多分支結構是一種內存低效的架構,這是因為每個分支的結構都需要在Add/Concat之前保存,這會導致更大的峰值內存佔用;而plain模型則具有更好的內存高效特徵。
Flexible:
多分支結構會限制CNN的靈活性,比如ResBlock會約束兩個分支的tensor具有相同的形狀;與此同時,多分支結構對於模型剪枝不夠友好。
Training-time Multi-branch Architecture
Palin模型具有多種優勢但存在一個重要的弱勢:性能差。比如VGG16在ImageNet僅能達到72%的top-1指標。
本文所設計的RepVGG則是受ResNet啟發得到,ResNet的ResBlock顯示的構建了一個短連接模型信息流
,當
的維度不匹配時,上述信息流則轉變為
。
儘管多分支結構對於推理不友好,但對於訓練友好,作者將RepVGG設計為訓練時的多分支,推理時單分支結構。作者參考ResNet的identity與1x1分支,設計了如下形式模塊:
其中,
分別對應
卷積。在訓練階段,通過簡單的堆疊上述模塊構建CNN架構;而在推理階段,上述模塊可以輕易轉換為
形式,且
的參數可以通過線性組合方式從已訓練好的模型中轉換得到。
Re-param for Plain Inference-time Model
接下來,我們將介紹如何將已訓練模塊轉換成單一的
卷積用於推理。下圖給出了參數轉換示意圖。
我們採用
表示輸入
,輸出
,卷積核為3的卷積;
採用
表示輸入
,輸出
,卷積核為1的卷積;
採用
表示
卷積後的BatchNorm的參數;
採用
表示
卷積後的BatchNorm的參數;
採用
表示identity分支的BatchNorm的參數。
假設
分別表示輸入與輸出,當
時,
否則,簡單的採用無identity分支的模塊,也就是說只有前兩項。註:bn表示推理時的BN。
首先,我們可以將每個BN與其前接Conv層合併:
註:identity分支可以視作
卷積。通過上述變換,此時上述模塊僅僅具有一個
卷積核,兩個
卷積核以及三個bias參數。
此時,三個bias參數可以通過簡單的add方式合併為一個bias;而卷積核則可以將
卷積核參數加到
卷積核的中心點得到。
Architectural Specification
前面介紹了RepVGG的核心模塊設計方式,接下來就要介紹RepVGG的網絡結構如何設計了。
下表給出了RepVGG的配置信息,包含深度與寬度。
RepVGG是一種類VGG的架構,在推理階段它僅僅採用
卷積與ReLU,且未採用MaxPool。對於分類任務,採用GAP+全連接層作為輸出頭。
對於每個階段的層數按照如下三種簡單的規則進行設計:
第一個階段具有更大的解析度,故而更為耗時,為降低推理延遲僅僅採用了一個卷積層;
最後一個階段因為具有更多的通道,為節省參數量,故而僅設計一個卷積層;
在倒數第二個階段,類似ResNet,RepVGG放置了更多的層。
基於上述考量,RepVGG-A不同階段的層數分別為1-2-4-14-1;與此同時,作者還構建了一個更深的RepVGG-B,其層數配置為1-4-6-16-1。RepVGG-A用於與輕量型網絡和中等計算量網絡對標,而RepVGG-B用於與高性能網絡對標。
與此同時,作者採用因子
控制前四個階段的通道,因子
控制最後一個階段的通道,通常
(我們期望最後一層具有更豐富的特徵)。
為避免大尺寸特徵的高計算量,對於第一階段的輸出通道做了約束
。基於此得到的不同RepVGG見下表。
為進一步降低計算量與參數量,作者還設計了可選的
組卷積替換標準卷積。具體地說,在RepVGG-A的3-5-7-...-21卷積層採用了組卷積;此外,在RepVGG-B的23-25-27卷積層同樣採用了組卷積。
Experiments
接下來,我們將在不同任務上驗證所提方案的有效性,這裡主要在ImageNet圖像分類任務上進行了實驗分析。
上表給出了RepVGG與不同計算量的ResNe及其變種在精度、速度、參數量等方面的對比。
可以看到:RepVGG表現出了更好的精度-速度均衡,比如
RepVGG-A0比ResNet18精度高1.25%,推理速度快33%;
RepVGG-A1比Resnet34精度高0.29%,推理速度快64%;
RepVGG-A2比ResNet50精度高0.17%,推理速度快83%;
RepVGG-B1g4比ResNet101精度高0.37%,推理速度快101%;
RepVGG-B1g2比ResNet152精度相當,推理速度快2.66倍。
另外需要注意的是:RepVGG同樣是一種參數高效的方案。比如:相比VGG16,RepVGG-B2b168.com僅需58%參數量,推理快10%,精度高6.57%。
與此同時,還與EfficientNet、RegNet等進行了對比,對比如下:
RepVGG-A2比EfficientNet-B0精度高1.37%,推理速度快59%;
RepVGG-B1比RegNetX-3.2GF精度高0.39%,推理速度稍快;
此外需要注意:RepVGG僅需200epoch即可取得超過80%的top1精度,見上表對比。這應該是plain模型首次在精度上達到SOTA指標。
相比RegNetX-12GF,RepVGG-B3的推理速度快31%,同時具有相當的精度。
儘管RepVGG是一種簡單而強有力的ConvNet架構,它在GPU端具有更快的推理速度、更少的參數量和理論FLOPS;但是在低功耗的端側,MobileNet、ShuffleNet會更受關注。
全文到此結束,更多消融實驗分析建議各位同學查看論文原文。
題外話
話說在半個月多之前就聽說xiangyu等人把ACNet的思想與Inception相結合設計了一種性能更好的重參數化方案RepVGG,即可取得訓練時的性能提升,又可以保持推理高效,使得VGG類網絡可以達到ResNet的高性能。
在初次看到RepVGG架構後,筆者就曾嘗試將其用於VDSR圖像超分方案中,簡單一試,確實有了提升,而且不需要進行梯度裁剪等額外的一些操作,贊。
從某種程度上講,RepVGG應該是ACNet的的一種極致精簡,比如上圖給出了ACNet的結構示意圖,它採用了
三種卷積設計;而RepVGG則是僅僅採用了
三個分支設計。
ACNet與RepVGG的另外一點區別在於:ACNet是將上述模塊用於替換ResBlock或者Inception中的卷積,而RepVGG則是採用所設計的模塊用於替換VGG中的卷積。
Code
最後附上作者提供的RepVGG的核心模塊實現code,如下所示。