導(dǎo)讀
簡(jiǎn)到極致、淺到極致!深度為6的網(wǎng)絡(luò)即可取得76.36%@ImageNet的精度,深度為13的VanillaNet甚至取得了83.1%的驚人性能。
VanillaNet: the Power of Minimalism in Deep Learning
論文地址:https://arxiv.org/abs/2305.12972
代碼地址:https://github.com/huawei-noah/VanillaNet
簡(jiǎn)而淺的直桶狀網(wǎng)絡(luò)具有非常優(yōu)秀的推理效率,但其訓(xùn)練難度較高,難以取得優(yōu)異性能。自AlexNet與VGG之后,鮮少有這種"直桶"狀且性能優(yōu)異的網(wǎng)絡(luò)出現(xiàn),其中的代表當(dāng)屬RepVGG與ParNet。
- 通過引入結(jié)構(gòu)重參數(shù)機(jī)制,RepVGG將"直桶狀"網(wǎng)絡(luò)重新煥發(fā)生機(jī)。但RepVGG的深度仍然有20+的深度,感興趣的同學(xué)可以查看讓你的ConvNet一卷到底,清華&曠視提出CNN設(shè)計(jì)新思路RepVGG
- 后來(lái),Princeton大學(xué)的鄧嘉團(tuán)隊(duì)提出了深度為12的網(wǎng)絡(luò)并在ImageNet數(shù)據(jù)集上達(dá)到了80.7%,但引入的注意力導(dǎo)致了額外的跳過連接,仍為達(dá)到極限推理效率。對(duì)ParNet一文感興趣的同學(xué)可查閱12層也能媲美ResNet?鄧嘉團(tuán)隊(duì)提出最新力作ParNet,ImageNet top1精度直沖80.7%
就在這樣的環(huán)境下,簡(jiǎn)到極致、淺到極致的網(wǎng)絡(luò)VanillaNet誕生了?。?!深度為6的網(wǎng)絡(luò)即可取得76.36%@ImageNet的精度,深度為13的VanillaNet甚至取得了83.1%的驚人性能。
網(wǎng)絡(luò)架構(gòu)
上圖給出了本文所提VanillaNet架構(gòu)示意圖,有沒有覺得簡(jiǎn)到極致了。
- 對(duì)于Stem部分,采用卷積進(jìn)行特征變換;
- 對(duì)于body部分的每個(gè)stage,首先采用MaxPool進(jìn)行特征下采樣,然后采用一個(gè)進(jìn)行特征處理;
- 對(duì)于head部分,采用兩個(gè)非線性層進(jìn)行分類處理。
值得注意的是,(1) 每個(gè)stage只有一個(gè)卷積;(2)VanillaNet沒有跳過連接。
盡管VanillaNet非常簡(jiǎn)單且足夠淺,但其弱非線性能力會(huì)限制其性能。為此,作者從訓(xùn)練策略與激活函數(shù)兩個(gè)維度來(lái)解決該問題。
訓(xùn)練策略
在訓(xùn)練階段,通過引入更強(qiáng)的容量來(lái)提升模型性能是很常見的。由于更深的網(wǎng)絡(luò)具有比淺層網(wǎng)絡(luò)更強(qiáng)的非線性表達(dá)能力,作者提出在訓(xùn)練階段采用深度訓(xùn)練技術(shù)為VanillaNet帶來(lái)更強(qiáng)的性能。
深度訓(xùn)練策略
對(duì)于激活函數(shù),我們將其與Identity
進(jìn)行組合,公式如下:
其中,是用于平衡非線性能力的超參數(shù)。假設(shè)當(dāng)前epoch與總訓(xùn)練Epoch分別表示為,那么定義。因此,在訓(xùn)練初始階段,該修正版激活函數(shù)等價(jià)于原始激活函數(shù),即,此時(shí)網(wǎng)絡(luò)具有較強(qiáng)的非線性表達(dá)能力;伴隨訓(xùn)練收斂,修正版激活函數(shù)退化為Identity
,即,這就意味著兩個(gè)卷積之間就不再有激活函數(shù)。
接下來(lái),我們?cè)谡f明一下如何合并兩個(gè)卷積層(在DBB一文中已有了非常詳細(xì)的公式介紹,而且對(duì)各種可折疊操作進(jìn)行了非常詳細(xì)的介紹)。
我們先來(lái)介紹BN與前接卷積之間的合并方式。假設(shè)表示卷積的參數(shù),BN層的參數(shù)分別表示為,合并后的參數(shù)表示如下:
在完成卷積與BN合并后,我們介紹如何合并兩個(gè)卷積。令分別表示輸入與輸出特征,卷積可表示如下:
基于上述卷積表示,我們可以將兩個(gè)連續(xù)卷積表示如下:
因此,兩個(gè)連續(xù)卷積可以進(jìn)行合并且不會(huì)造成推理速度提升。
SIAF(Series Informed Activation Function)
盡管已有諸多非線性激活函數(shù),如ReLU、PReLU、GeLU、Swish等,但這些它們主要聚焦于為深而復(fù)雜的網(wǎng)絡(luò)帶來(lái)性能提升。已有研究表明:簡(jiǎn)而淺網(wǎng)絡(luò)的有限能力主要源于其弱非線性表達(dá)能力。
事實(shí)上,有兩種方式可用于改善神經(jīng)網(wǎng)絡(luò)的非線性表達(dá)能力:堆疊非線性激活層、提升激活函數(shù)的非線性表達(dá)能力?,F(xiàn)有方案往往采用了前者,前者往往會(huì)導(dǎo)致更高的推理延遲;而本文則聚焦于后者,即改善激活函數(shù)的非線性表達(dá)能力。
改善激活函數(shù)非線性能力能力的最直接的一種方式為stacking
,序列堆疊也是深層網(wǎng)絡(luò)的核心。不同與此,作者提出了共生(concurrently
)堆疊方式,可表示如下:
其中,n表示堆疊激活函數(shù)的數(shù)量,表示每個(gè)激活的scale與bias參數(shù)以避免簡(jiǎn)單的累加。通過該處理,激活函數(shù)的非線性表達(dá)能力得到了大幅提升。
為進(jìn)一步豐富表達(dá)能力,參考BNET,作者為其引入了全局信息學(xué)習(xí)能力,此時(shí)激活函數(shù)表示如下:
可以看到,當(dāng)時(shí),。也就是說,所提激活函數(shù)是現(xiàn)有激活函數(shù)的一種廣義擴(kuò)展。因其推理高效性,作者采用ReLU作為基激活函數(shù)。
以卷積作為參考,作者進(jìn)一步分析了所提激活函數(shù)的計(jì)算復(fù)雜度。卷積的計(jì)算復(fù)雜度可表示如下:
所提激活函數(shù)的計(jì)算復(fù)雜度表示為:
進(jìn)而可以得出兩者之間的計(jì)算復(fù)雜度比例關(guān)系如下:
以VanillaNet-B第4階段為例,,該比例約為84,也就是說,所提激活函數(shù)的計(jì)算復(fù)雜度遠(yuǎn)小于卷積。
classactivation(nn.ReLU):
def__init__(self,dim,act_num=3,deploy=False):
super(activation,self).__init__()
self.deploy=deploy
self.weight=torch.nn.Parameter(torch.randn(dim,1,act_num*2+1,act_num*2+1))
self.bias=None
self.bn=nn.BatchNorm2d(dim,eps=1e-6)
self.dim=dim
self.act_num=act_num
weight_init.trunc_normal_(self.weight,std=.02)
defforward(self,x):
ifself.deploy:
returntorch.nn.functional.conv2d(
super(activation,self).forward(x),
self.weight,self.bias,padding=(self.act_num*2+1)//2,groups=self.dim)
else:
returnself.bn(torch.nn.functional.conv2d(
super(activation,self).forward(x),
self.weight,padding=(self.act_num*2+1)//2,groups=self.dim))
def_fuse_bn_tensor(self,weight,bn):
kernel=weight
running_mean=bn.running_mean
running_var=bn.running_var
gamma=bn.weight
beta=bn.bias
eps=bn.eps
std=(running_var+eps).sqrt()
t=(gamma/std).reshape(-1,1,1,1)
returnkernel*t,beta+(0-running_mean)*gamma/std
defswitch_to_deploy(self):
kernel,bias=self._fuse_bn_tensor(self.weight,self.bn)
self.weight.data=kernel
self.bias=torch.nn.Parameter(torch.zeros(self.dim))
self.bias.data=bias
self.__delattr__('bn')
self.deploy=True
本文實(shí)驗(yàn)
在過去幾年里,研究人員往往假設(shè)計(jì)算資源非常有限,依托ARM/CPU平臺(tái),聚焦于減少網(wǎng)絡(luò)的FLOPs與推理延遲。但是,伴隨著AI芯片的研發(fā)進(jìn)展,像自動(dòng)駕駛等設(shè)備往往攜帶多個(gè)GPU以期獲取實(shí)時(shí)反饋。因此,本文的延遲基于bs=1進(jìn)行測(cè)試,而非常規(guī)的吞吐量?;诖伺渲茫髡甙l(fā)現(xiàn):模型的推理速度與FLOPs、Params的相關(guān)性極低。
- 以MobileNetV3-Large為例,盡管其具有非常低的FLOPs,但其GPU延遲為7.83,遠(yuǎn)高于VanillaNet13。這種配置的推理速度與復(fù)雜度和層數(shù)強(qiáng)相關(guān);
- 對(duì)比ShuffleNetV2x1.5與ShuffleNetV2x2,盡管其參數(shù)量與FLOPs差別很大,但推理速度基本相同(7.23 vs 7.84);
- 對(duì)比ResNet,VGGNet與VanillaNet可以看到:無(wú)額外分支與復(fù)雜模塊的的VGGNet、VanillaNet具有更高的推理速度。
基于上述分析,作者提出了VanillaNet這樣簡(jiǎn)到極致,無(wú)任何額外分支,層數(shù)更少的架構(gòu)。如上表所示,
- VanillaNet9取得了79.87%的精度,推理速度進(jìn)而2.91ms,比ResNet50、ConvNeXtV2-P快50%;
- 當(dāng)擴(kuò)展至VanillaNet13-1.5x后,甚至取得了83.11%的指標(biāo)。
這是不是意味著在ImageNet分類任務(wù)上,我們并不需要深而復(fù)雜的網(wǎng)絡(luò)呢???
上圖給出了不同架構(gòu)深度與推理速度之間的關(guān)系圖,可以看到:
- 當(dāng)bs=1時(shí),推理速度與網(wǎng)絡(luò)的深度強(qiáng)相關(guān),而非參數(shù)量。這意味著:簡(jiǎn)而淺的網(wǎng)絡(luò)具有巨大的實(shí)時(shí)處理潛力。
- 在所有網(wǎng)絡(luò)中,VanillaNet取得了最佳的速度-精度均衡。這進(jìn)一步驗(yàn)證了:在計(jì)算資源充分時(shí)所提VanillaNet的優(yōu)異性。
按照國(guó)際慣例,最后附上COCO檢測(cè)任務(wù)上的對(duì)比,見上表??梢钥吹剑核酼anillaNet取得了與ConvNeXt、Swin相當(dāng)?shù)男阅?。盡管VanillaNet的FLOPs與參數(shù)量更多,但其推理速度明顯更快,進(jìn)一步驗(yàn)證了VanillaNet在下游任務(wù)的有效性。
最后附上不同大小模型的配置信息,參考如下。
全文到此結(jié)束,更多消融實(shí)驗(yàn)建議查看原文。
審核編輯 :李倩
-
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1208瀏覽量
24727 -
cnn
+關(guān)注
關(guān)注
3文章
352瀏覽量
22239
原文標(biāo)題:華為諾亞提出VanillaNet:一種新視覺Backbone,極簡(jiǎn)且強(qiáng)大!
文章出處:【微信號(hào):CVer,微信公眾號(hào):CVer】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論