RepVGG:极简架构,SOTA性能,论文解读
**
RepVGG:極簡架構(gòu),SOTA性能,論文解讀
**
更新:RepVGG的更深版本達到了83.55%正確率!PyTorch代碼和模型已經(jīng)在GitHub上放出。DingXiaoH/RepVGG
2020年B站年度彈幕是“爺青回”。一定有很多瞬間,讓你感覺“爺?shù)那啻夯貋砹恕薄T谶@個卷積網(wǎng)絡(luò)各種超參精確到小數(shù)點后三位的時代,你是否還記得五六年前的田園時代,堆幾個卷積層就能漲點的快樂? ResNet和Inception等模型提出后,大家的研究重點逐漸轉(zhuǎn)向各種多分支卷積網(wǎng)絡(luò)架構(gòu),VGG這樣的“直筒型”簡單架構(gòu)鮮有問津。
而我們相信科學(xué)技術(shù)總是螺旋式地上升。我們撿起七年前的老架構(gòu),注入了一個新想法。讓七年前的模型再次跟上SOTA,是多么有趣的一件事!
我們最近的工作RepVGG,用結(jié)構(gòu)重參數(shù)化(structural re-parameterization)“復(fù)興”VGG式單路極簡架構(gòu),一路3x3卷到底,在速度和性能上達到SOTA水平,在ImageNet上超過80%正確率。已經(jīng)被CVPR-2021接收。
不用NAS,不用attention,不用各種新穎的激活函數(shù),甚至不用分支結(jié)構(gòu),只用3x3卷積和ReLU,也能達到SOTA性能?
論文地址:下載地址
開源預(yù)訓(xùn)練模型和代碼(PyTorch版):https://github.com/DingXiaoH/RepVGG。已有1200+ star。除了構(gòu)建模型、訓(xùn)練、轉(zhuǎn)換的代碼以外,也包括一些對常見問題的回答。
(MegEngine版):下載地址
太長不看版
方法有多簡單呢?下午5點看完文章,晚飯前就能寫完代碼開始訓(xùn)練,第二天就能看到結(jié)果。如果沒時間看完這篇文章,只要點開下面的代碼,看完前100行就可以完全搞明白。https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py
下面是詳細介紹。
模型定義
我們所說的“VGG式”指的是:
-
沒有任何分支結(jié)構(gòu)。即通常所說的plain或feed-forward架構(gòu)。
-
僅使用3x3卷積。
-
僅使用ReLU作為激活函數(shù)。
下面用一句話介紹RepVGG模型的基本架構(gòu):將20多層3x3卷積堆起來,分成5個stage,每個stage的第一層是stride=2的降采樣,每個卷積層用ReLU作為激活函數(shù)。
再用一句話介紹RepVGG模型的詳細結(jié)構(gòu):RepVGG-A的5個stage分別有[1, 2, 4, 14, 1]層,RepVGG-B的5個stage分別有[1, 4, 6, 16, 1]層,寬度是[64, 128, 256, 512]的若干倍。這里的倍數(shù)是隨意指定的諸如1.5,2.5這樣的“工整”的數(shù)字,沒有經(jīng)過細調(diào)。
再用一句話介紹訓(xùn)練設(shè)定:ImageNet上120 epochs,不用trick,甚至直接用PyTorch官方示例的訓(xùn)練代碼就能訓(xùn)出來!
為什么要設(shè)計這種極簡模型,這么簡單的純手工設(shè)計模型又是如何在ImageNet上達到SOTA水平的呢?
為什么要用VGG式模型
除了我們相信簡單就是美以外,VGG式極簡模型至少還有五大現(xiàn)實的優(yōu)勢(詳見論文)。
-
3x3卷積非常快。在GPU上,3x3卷積的計算密度(理論運算量除以所用時間)可達1x1和5x5卷積的四倍。
-
單路架構(gòu)非常快,因為并行度高。同樣的計算量,“大而整”的運算效率遠超“小而碎”的運算。
-
單路架構(gòu)省內(nèi)存。例如,ResNet的shortcut雖然不占計算量,卻增加了一倍的顯存占用。
-
單路架構(gòu)靈活性更好,容易改變各層的寬度(如剪枝)。
-
RepVGG主體部分只有一種算子:3x3卷積接ReLU。在設(shè)計專用芯片時,給定芯片尺寸或造價,我們可以集成海量的3x3卷積-ReLU計算單元來達到很高的效率。別忘了,單路架構(gòu)省內(nèi)存的特性也可以幫我們少做存儲單元。
結(jié)構(gòu)重參數(shù)化讓VGG再次偉大
相比于各種多分支架構(gòu)(如ResNet,Inception,DenseNet,各種NAS架構(gòu)),近年來VGG式模型鮮有關(guān)注,主要自然是因為性能差。例如,有研究[1]認為,ResNet性能好的一種解釋是ResNet的分支結(jié)構(gòu)(shortcut)產(chǎn)生了一個大量子模型的隱式ensemble(因為每遇到一次分支,總的路徑就變成兩倍),單路架構(gòu)顯然不具備這種特點。
既然多分支架構(gòu)是對訓(xùn)練有益的,而我們想要部署的模型是單路架構(gòu),我們提出解耦訓(xùn)練時和推理時架構(gòu)。我們通常使用模型的方式是:
-
訓(xùn)練一個模型
-
部署這個模型
但在這里,我們提出一個新的做法:
-
訓(xùn)練一個多分支模型
-
將多分支模型等價轉(zhuǎn)換為單路模型
-
部署單路模型
這樣就可以同時利用多分支模型訓(xùn)練時的優(yōu)勢(性能高)和單路模型推理時的好處(速度快、省內(nèi)存)。這里的關(guān)鍵顯然在于這種多分支模型的構(gòu)造形式和轉(zhuǎn)換的方式。
我們的實現(xiàn)方式是在訓(xùn)練時,為每一個3x3卷積層添加平行的1x1卷積分支和恒等映射分支,構(gòu)成一個RepVGG Block。這種設(shè)計是借鑒ResNet的做法,區(qū)別在于ResNet是每隔兩層或三層加一分支,而我們是每層都加。
訓(xùn)練完成后,我們對模型做等價轉(zhuǎn)換,得到部署模型。根據(jù)卷積的線性(具體來說是可加性),設(shè)三個3x3卷積核分別是W1,W2,W3,有 conv(x, W1) + conv(x, W2) + conv(x, W3) = conv(x, W1+W2+W3))。怎樣利用這一原理將一個RepVGG Block轉(zhuǎn)換為一個卷積呢?
其實非常簡單,因為RepVGG Block中的1x1卷積是相當于一個特殊(卷積核中有很多0)的3x3卷積,而恒等映射是一個特殊(以單位矩陣為卷積核)的1x1卷積,因此也是一個特殊的3x3卷積!我們只需要:1. 把identity轉(zhuǎn)換為1x1卷積,只要構(gòu)造出一個以單位矩陣為卷積核的1x1卷積即可;2. 把1x1卷積等價轉(zhuǎn)換為3x3卷積,只要用0填充即可。
下圖描述了這一轉(zhuǎn)換過程。在這一示例中,輸入和輸出通道都是2,故3x3卷積的參數(shù)是4個3x3矩陣,1x1卷積的參數(shù)是一個2x2矩陣。注意三個分支都有BN(batch normalization)層,其參數(shù)包括累積得到的均值及標準差和學(xué)得的縮放因子及bias。這并不會妨礙轉(zhuǎn)換的可行性,因為推理時的卷積層和其后的BN層可以等價轉(zhuǎn)換為一個帶bias的卷積層(也就是通常所謂的“吸BN”)。
對三分支分別“吸BN”之后(注意恒等映射可以看成一個“卷積層”,其參數(shù)是一個2x2單位矩陣!),將得到的1x1卷積核用0給pad成3x3。最后,三分支得到的卷積核和bias分別相加即可。這樣,每個RepVGG Block轉(zhuǎn)換前后的輸出完全相同,因而訓(xùn)練好的模型可以等價轉(zhuǎn)換為只有3x3卷積的單路模型。
從這一轉(zhuǎn)換過程中,我們看到了“結(jié)構(gòu)重參數(shù)化”的實質(zhì):訓(xùn)練時的結(jié)構(gòu)對應(yīng)一組參數(shù),推理時我們想要的結(jié)構(gòu)對應(yīng)另一組參數(shù);只要能把前者的參數(shù)等價轉(zhuǎn)換為后者,就可以將前者的結(jié)構(gòu)等價轉(zhuǎn)換為后者。
實驗結(jié)果
在1080Ti上測試,RepVGG模型的速度-精度相當出色。在公平的訓(xùn)練設(shè)定下,同精度的RepVGG速度是ResNet-50的183%,ResNet-101的201%,EfficientNet的259%,RegNet的131%。注意,RepVGG取得超過EfficientNet和RegNet的性能并沒有使用任何的NAS或繁重的人工迭代設(shè)計。
這也說明,在不同的架構(gòu)之間用FLOPs來衡量其真實速度是欠妥的。例如,RepVGG-B2的FLOPs是EfficientNet-B3的10倍,但1080Ti上的速度是后者的2倍,這說明前者的計算密度是后者的20余倍。
在Cityscapes上的語義分割實驗表明,在速度更快的情況下,RepVGG模型比ResNet系列高約1%到1.7%的mIoU,或在mIoU高0.37%的情況下速度快62%。
另外一系列ablation studies和對比實驗表明,結(jié)構(gòu)重參數(shù)化是RepVGG模型性能出色的關(guān)鍵(詳見論文)。
最后需要注明的是,RepVGG是為GPU和專用硬件設(shè)計的高效模型,追求高速度、省內(nèi)存,較少關(guān)注參數(shù)量和理論計算量。在低算力設(shè)備上,可能不如MobileNet和ShuffleNet系列適用。
參考文獻
[1] Andreas Veit, Michael J Wilber, and Serge Belongie. Residual networks behave like ensembles of relatively shallow networks. In Advances in neural information processing systems, pages 550–558, 2016. 2, 4, 8
總結(jié)
以上是生活随笔為你收集整理的RepVGG:极简架构,SOTA性能,论文解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 朱永新:教师的幸福感到底从何而来?
- 下一篇: ~~~端午安康~~~