天天看點

隻用3x3卷積和ReLU 的SOTA算法RepVGG太長不看版模型定義為什麼要用VGG式模型結構重參數化讓VGG再次偉大實驗結果

作者:我愛計算機視覺
隻用3x3卷積和ReLU 的SOTA算法RepVGG太長不看版模型定義為什麼要用VGG式模型結構重參數化讓VGG再次偉大實驗結果

作者: 丁偉瀚

本文轉載自知悉,經作者授權轉載。

相關連結: https://zhuanlan.zhihu.com/p/344324470

2020年B站的年度彈劾幕是"敖青回來"。一定有很多時刻,讓你感覺到"先生的青春又回來了"。在一個卷積網絡是各種超吸附精确到小數後位的時代,你還記得五六年前的田園日子嗎,當時堆疊幾個卷積層會提出這一點?

我們最近的工作RepVGG實作了VGG風格的單向極簡主義架構,具有結構重新參數化,一直滾動到最後,在速度和性能方面達到SOTA水準,在ImageNet上的準确率超過80%。

沒有NAS,沒有關注,沒有新穎的激活功能,甚至沒有分支結構,隻有3x3卷積和ReLU,你能實作SOTA性能嗎?

隻用3x3卷積和ReLU 的SOTA算法RepVGG太長不看版模型定義為什麼要用VGG式模型結構重參數化讓VGG再次偉大實驗結果

開源預訓練模型和代碼(PyTorch版本)已經釋出了兩天,并且已經下載下傳了數百次,根據實際業務中的同行回報。

< h1級"pgc-h-center-line">太長而無法讀取</h1>版本

方法有多簡單?在5 p.m.閱讀完文章後,您可以在晚餐前完成編寫代碼并開始訓練,第二天您将看到結果。如果您沒有時間完成本文,隻需點選下面的代碼并閱讀前100行即可正确完成。

下面我們來仔細看看。

<h1類"pgc-h-center-line"的>模型定義。</h1>

我們所說的"VGG"的意思是:

1.沒有分支結構。這通常被稱為鉑金或前饋架構。

2. 僅使用 3x3 卷積。

3. 僅使用 ReLU 作為激活函數。

以下是對 RepVGG 模型基本架構的一句話介紹:将 20 層 3x3 卷積堆疊成 5 個階段,每個階段的第一層是 stride-2 的分步示例,每個卷積層以 ReLU 作為激活函數。

在一句話中,用一句話描述了RepVGG模型的詳細結構:RepVGG-A的五個階段是RepVGG-B的五個階段寬度的幾倍,RepVGG-B的五個階段是1,2,4,14,1,1和RepVGG-B的五個階段的寬度的幾倍。這裡的倍數是随機指定的"工作"數量,例如1.5,2.5,而無需微調。

對訓練設定還有一句話:ImageNet上的120個epoch,沒有技巧,甚至直接使用官方PyTorch示例的訓練代碼!

為什麼要設計這種極簡主義的模型,這麼簡單的手動設計模型如何在ImageNet上達到SOTA級别?

<為什麼VGG模型應該>h1類"pgc-h-center-line"中使用</h1>

除了我們相信簡單就是美之外,VGG極簡主義模型至少具有五個實際優勢(見論文)。

1.3x3卷積非常快。在 GPU 上,3x3 卷積的計算密度(理論計算除以所花費的時間)可能是 1x1 和 5x5 卷積的四倍。

2.由于并行度高,單向架構非常快。同樣數量的計算,"大而全"的計算效率遠遠超過"小而破"的操作。

3. 單向架構節省記憶體。例如,ResNet 的快捷方式将其記憶體占用量加倍,盡管它不考慮計算。

4.單向架構靈活性較好,易于改變每層寬度(如修剪)。

5. RepVGG 主體隻有一個運算符:3x3 卷積 ReLU。在設計專用晶片時,考慮到晶片的尺寸或成本,我們可以內建大量3x3卷積ReLU單元以實作高效率。不要忘記,單個架構的記憶體節省功能也可以幫助我們減少存儲單元。

<h1級"pgc-h-center-line"的>被大量參數化,以使VGG再次偉大</h1>

VGG模型近年來很少受到關注,主要是由于與各種多分支架構(如ResNet,Inception,DenseNet和各種NAS架構)相比,性能較差。

例如,對ResNet良好性能的一種解釋是,ResNet的分支結構(快捷方式)産生了一個具有大量子模型的隐式融合(因為每次遇到分支時總路徑都會加倍),這是單向架構顯然不具備的功能。

由于多分支架構有利于訓練,而我們要部署的模型是單向架構,是以提出一種解耦訓練與推理架構。我們通常以相同的方式使用模型:

1. 訓練模型

2. 部署此模型

但在這裡,我們提出了一種新的方法:

1. 訓練多分支模型

2. 将等效于單個模型的多分支模型轉換為

3. 部署單向模型

這使您可以利用多分支模型訓練(高性能)和單向模型推理(快速、節省記憶體)的優勢。這裡的關鍵顯然是建構的形式和多分支模型的轉換方式。

我們的實作是在訓練期間将并行 1x1 體積積分和常量映射分支添加到每個 3x3 卷積層,以形成 RepVGG 塊。此設計基于 ResNet 的方法,不同之處在于 ResNet 每兩層或三層添加一次,而我們每層添加一次。

隻用3x3卷積和ReLU 的SOTA算法RepVGG太長不看版模型定義為什麼要用VGG式模型結構重參數化讓VGG再次偉大實驗結果

訓練完成後,我們對模型進行等效的轉換以擷取部署模型。這種轉換也非常簡單,因為1x1卷積是3x3卷積的特殊(卷積核心中有許多0),而常數映射是1x1卷積的特殊(機關矩陣作為卷積核心)!根據卷積的線性度(特别是可加性),每個 RepVGG 塊的三個分支可以組合成一個 3x3 卷積。

下圖描述了轉換過程。在此示例中,輸入和輸出通道均為 2,是以 3x3 卷積的參數為 4 個 3x3 矩陣,而 1x1 卷積的參數為 2x2 矩陣。請注意,所有三個分支都有一個 BN(批量歸一化)層,其參數包括累積的均值和标準差以及學習的比例因子和偏差。

這并不妨礙轉換的可行性,因為推理時的卷積層和随後的BN層可以等價地轉換為具有偏差的卷積層(通常稱為"吸吮BN")。

隻用3x3卷積和ReLU 的SOTA算法RepVGG太長不看版模型定義為什麼要用VGG式模型結構重參數化讓VGG再次偉大實驗結果

在三個分支中的每一個"吸吮BN"之後(請注意,常量映射可以看作是一個參數為2x2機關矩陣的"卷積層"!),将獲得 1x1 卷積核心,其中 0 填充到 3x3 中。最後,三個分支獲得的卷積核心和偏差相加。

通過這種方式,每個 RepVGG 塊轉換前後的輸出完全相同,是以訓練的模型可以等效地轉換為隻有 3x3 卷積的單個模型。

隻用3x3卷積和ReLU 的SOTA算法RepVGG太長不看版模型定義為什麼要用VGG式模型結構重參數化讓VGG再次偉大實驗結果

從這個轉換過程中,我們看到了"結構再參數化"的本質:訓練的結構對應一組參數,我們在推理中想要的結構對應另一組參數,隻要前者參數可以等價于後者,前者的結構就可以轉換為後者。

實驗結果<>h1級"pgc-h-中心線"。</h1>

在1080Ti上進行測試,RepVGG型号的速度精度非常出色。通過公平的訓練設定,具有相同精度的 repVGG 速度為 ResNet-50 的 183%、ResNet-101 的 201%、EfficientNet 的 259% 和 RegNet 的 131%。

請注意,RepVGG 比 EvericientNet 和 RegNet 實作了更高的性能,而無需使用任何 NAS 或繁重的手動疊代設計。

隻用3x3卷積和ReLU 的SOTA算法RepVGG太長不看版模型定義為什麼要用VGG式模型結構重參數化讓VGG再次偉大實驗結果

這也表明,測量不同架構中 FLOP 的真實速度是不合适的。例如,RepVGG-B2的FLOP比EfficiftNet-B3快10倍,但1080Ti的速度是後者的兩倍,這表明前者的計算密度是後者的20倍以上。

在Cityscapes上的語義分割實驗表明,在更快的條件下,RepVGG模型比ResNet系列快約1%至1.7%,或者在mIoU高出0.37%時快62%。

隻用3x3卷積和ReLU 的SOTA算法RepVGG太長不看版模型定義為什麼要用VGG式模型結構重參數化讓VGG再次偉大實驗結果

另一系列燒蝕研究和對比實驗表明,結構再參數化是RepVGG模型優異性能的關鍵(見論文)。

最後,需要注意的是,RepVGG是專為GPU和專用硬體設計的高效模型,追求高速、省記憶體、少關注參數數量和理論計算。在低計算裝置上,它可能不如MobileNet和ShuffleNet系列合适。

論文位址:

https://arxiv.org/abs/2101.03697

開源預訓練模型和代碼(PyTorch 版本):

https://github.com/DingXiaoH/RepVGG

(MegEngine版本):

https://github.com/megvii-model/RepVGG

引用:

[1] 安德烈亞斯·法伊特、邁克爾·J·威爾伯和塞爾日·貝裡蒂。殘差網絡的行為類似于相對淺層網絡的集合。在神經資訊處理系統的進步中,第550-558頁,2016年。2, 4, 8