华为诺亚提出VanillaNet:一种新视觉Backbone,极简且强大!

导读
简到极致、浅到极致!深度为6的网络即可取得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
简而浅的直桶状网络具有非常优秀的推理效率,但其训练难度较高,难以取得优异性能。自alexnet与vgg之后,鲜少有这种直桶状且性能优异的网络出现,其中的代表当属repvgg与parnet。
通过引入结构重参数机制,repvgg将直桶状网络重新焕发生机。但repvgg的深度仍然有20+的深度,感兴趣的同学可以查看让你的convnet一卷到底,清华&旷视提出cnn设计新思路repvgg 后来,princeton大学的邓嘉团队提出了深度为12的网络并在imagenet数据集上达到了80.7%,但引入的注意力导致了额外的跳过连接,仍为达到极限推理效率。对parnet一文感兴趣的同学可查阅12层也能媲美resnet?邓嘉团队提出最新力作parnet,imagenet top1精度直冲80.7% 就在这样的环境下,简到极致、浅到极致的网络vanillanet诞生了!!!深度为6的网络即可取得76.36%@imagenet的精度,深度为13的vanillanet甚至取得了83.1%的惊人性能。
网络架构 上图给出了本文所提vanillanet架构示意图,有没有觉得简到极致了。
对于stem部分,采用卷积进行特征变换; 对于body部分的每个stage,首先采用maxpool进行特征下采样,然后采用一个进行特征处理; 对于head部分,采用两个非线性层进行分类处理。 值得注意的是,(1) 每个stage只有一个卷积;(2)vanillanet没有跳过连接。
尽管vanillanet非常简单且足够浅,但其弱非线性能力会限制其性能。为此,作者从训练策略与激活函数两个维度来解决该问题。
训练策略 在训练阶段,通过引入更强的容量来提升模型性能是很常见的。由于更深的网络具有比浅层网络更强的非线性表达能力,作者提出在训练阶段采用深度训练技术为vanillanet带来更强的性能。
深度训练策略 对于激活函数,我们将其与identity进行组合,公式如下:
  其中,是用于平衡非线性能力的超参数。假设当前epoch与总训练epoch分别表示为,那么定义。因此,在训练初始阶段,该修正版激活函数等价于原始激活函数,即,此时网络具有较强的非线性表达能力;伴随训练收敛,修正版激活函数退化为identity,即,这就意味着两个卷积之间就不再有激活函数。
接下来,我们在说明一下如何合并两个卷积层(在dbb一文中已有了非常详细的公式介绍,而且对各种可折叠操作进行了非常详细的介绍)。
我们先来介绍bn与前接卷积之间的合并方式。假设表示卷积的参数,bn层的参数分别表示为,合并后的参数表示如下:
在完成卷积与bn合并后,我们介绍如何合并两个卷积。令分别表示输入与输出特征,卷积可表示如下:
基于上述卷积表示,我们可以将两个连续卷积表示如下:
因此,两个连续卷积可以进行合并且不会造成推理速度提升。
siaf(series informed activation function) 尽管已有诸多非线性激活函数,如relu、prelu、gelu、swish等,但这些它们主要聚焦于为深而复杂的网络带来性能提升。已有研究表明:简而浅网络的有限能力主要源于其弱非线性表达能力。
事实上,有两种方式可用于改善神经网络的非线性表达能力:堆叠非线性激活层、提升激活函数的非线性表达能力。现有方案往往采用了前者,前者往往会导致更高的推理延迟;而本文则聚焦于后者,即改善激活函数的非线性表达能力。
改善激活函数非线性能力能力的最直接的一种方式为stacking,序列堆叠也是深层网络的核心。不同与此,作者提出了共生(concurrently)堆叠方式,可表示如下:
  其中,n表示堆叠激活函数的数量,表示每个激活的scale与bias参数以避免简单的累加。通过该处理,激活函数的非线性表达能力得到了大幅提升。
为进一步丰富表达能力,参考bnet,作者为其引入了全局信息学习能力,此时激活函数表示如下:
可以看到,当时,。也就是说,所提激活函数是现有激活函数的一种广义扩展。因其推理高效性,作者采用relu作为基激活函数。
以卷积作为参考,作者进一步分析了所提激活函数的计算复杂度。卷积的计算复杂度可表示如下:
所提激活函数的计算复杂度表示为:
  进而可以得出两者之间的计算复杂度比例关系如下:
以vanillanet-b第4阶段为例,,该比例约为84,也就是说,所提激活函数的计算复杂度远小于卷积。
class activation(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)    def forward(self, x):        if self.deploy:            return torch.nn.functional.conv2d(                super(activation, self).forward(x),                 self.weight, self.bias, padding=(self.act_num*2 + 1)//2, groups=self.dim)        else:            return self.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)        return kernel * t, beta + (0 - running_mean) * gamma / std        def switch_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 本文实验 在过去几年里,研究人员往往假设计算资源非常有限,依托arm/cpu平台,聚焦于减少网络的flops与推理延迟。但是,伴随着ai芯片的研发进展,像自动驾驶等设备往往携带多个gpu以期获取实时反馈。因此,本文的延迟基于bs=1进行测试,而非常规的吞吐量。基于此配置,作者发现:模型的推理速度与flops、params的相关性极低。
以mobilenetv3-large为例,尽管其具有非常低的flops,但其gpu延迟为7.83,远高于vanillanet13。这种配置的推理速度与复杂度和层数强相关; 对比shufflenetv2x1.5与shufflenetv2x2,尽管其参数量与flops差别很大,但推理速度基本相同(7.23 vs 7.84); 对比resnet,vggnet与vanillanet可以看到:无额外分支与复杂模块的的vggnet、vanillanet具有更高的推理速度。 基于上述分析,作者提出了vanillanet这样简到极致,无任何额外分支,层数更少的架构。如上表所示,
vanillanet9取得了79.87%的精度,推理速度进而2.91ms,比resnet50、convnextv2-p快50%; 当扩展至vanillanet13-1.5x后,甚至取得了83.11%的指标。 这是不是意味着在imagenet分类任务上,我们并不需要深而复杂的网络呢???
上图给出了不同架构深度与推理速度之间的关系图,可以看到:
当bs=1时,推理速度与网络的深度强相关,而非参数量。这意味着:简而浅的网络具有巨大的实时处理潜力。 在所有网络中,vanillanet取得了最佳的速度-精度均衡。这进一步验证了:在计算资源充分时所提vanillanet的优异性。 按照国际惯例,最后附上coco检测任务上的对比,见上表。可以看到:所提vanillanet取得了与convnext、swin相当的性能。尽管vanillanet的flops与参数量更多,但其推理速度明显更快,进一步验证了vanillanet在下游任务的有效性。
最后附上不同大小模型的配置信息,参考如下。
全文到此结束,更多消融实验建议查看原文。


喜讯 | 西井科技荣获“国家知识产权优势企业”称号
智能手机2020年预测 折叠屏依旧是小众
三维视觉测量技术知识科普
无缝高清矩阵切换器的常见故障及解决方案有哪些?
连续激光器中激光二极管的挑战
华为诺亚提出VanillaNet:一种新视觉Backbone,极简且强大!
红外热释电传感器与红外传感器差异对比
英飞特公布2019年度报告 新兴应用领域为公司带来新的利润增长点
Testbench基本组成与示例
关于过氧化氢对铜抛光的影响研究报告
5G时代下的娱乐VR产品趋向丰富化
微波天线和基站天线的区别
3种机器学习算法解读
爱驰U5上市迎合消费升级 直面新能源汽车领域的挑战
贴片电解电容的外形规格代号
10W高精度离线式开关电源芯片CY2525D
关于高压真空断路器操纵大功率电器的原理
华为P10闪存门最新消息:普通群众怎么看华为P10闪存门事件,用数据说话
LED热量产生的基本原理解析
三星电子与LG电子2018年四季度业绩大幅下滑导致Earning Shock