华为诺亚实验室VanillaNet学习笔记

news2024/11/25 1:49:28

华为诺亚实验室VanillaNet学习笔记

VanillaNet: the Power of Minimalism in Deep Learning

Abstract

基础模型的核心理念是“多而不同”,计算机视觉和自然语言处理领域的惊人成功就是例证。然而,优化的挑战和变压器模型固有的复杂性要求范式向简单性转变。在这项研究中,我们介绍了VanillaNet,一个包含优雅设计的神经网络架构。通过避免高深度、快捷方式和复杂的操作(如自我关注),vanillanet令人耳目一新的简洁却非常强大。每一层都被精心制作得紧凑而直接,非线性激活函数在训练后被修剪以恢复原始结构。VanillaNet克服了固有复杂性的挑战,使其成为资源受限环境的理想选择。其易于理解和高度简化的架构为高效部署提供了新的可能性。大量的实验表明,VanillaNet提供的性能与著名的深度神经网络和视觉转换器相当,展示了极简主义在深度学习中的力量。VanillaNet的这一富有远见的旅程具有重新定义景观和挑战基础模型现状的巨大潜力,为优雅有效的模型设计开辟了一条新的道路。预训练的模型和代码可在https://github.com/huawei-noah/VanillaNet和https://gitee.com/mindspore/models/tree/master/research/cv/vanillanet上获得

1、Introduction

在过去的几十年里,人工神经网络已经取得了显著的进步,这是由增加网络复杂性导致性能提高的想法驱动的。这些网络由具有大量神经元或变形块的多层组成[43,31],能够执行各种类似人类的任务,如人脸识别[25]、语音识别[8]、对象检测[38]、自然语言处理[43]和内容生成[2]。现代硬件令人印象深刻的计算能力使神经网络能够以高精度和高效率完成这些任务。因此,人工智能嵌入式设备在我们的生活中变得越来越普遍,包括智能手机、人工智能摄像头、语音助手和自动驾驶汽车。

诚然,该领域的一个显著突破是AlexNet的开发[24],它由12层组成,在大规模图像识别基准上达到了最先进的性能[7]。在此成功的基础上,ResNet[18]通过快捷连接引入身份映射,使深度神经网络能够在广泛的计算机视觉应用中训练出高性能,如图像分类[40]、目标检测[38]和语义分割[33]。在这些模型中加入人为设计的模块,以及不断增加的网络复杂性,无疑增强了表征性深度神经网络的能力,导致如何训练具有更复杂架构的网络以获得更高性能的研究激增[23,19,47]。

除了卷积架构,Dosovitskiy等人[13]还将transformer架构引入到图像识别任务中,展示了其利用大规模训练数据的潜力。Zhai等人[53]研究了视觉变压器架构的缩放规律,在ImageNet数据集上达到了令人印象深刻的90.45%的top-1精度,这表明更深层次的变压器架构,如卷积网络,往往表现出更好的性能。Wang等人[44]进一步提出将变压器的深度缩放到1000层,以获得更高的精度。Liu等人[32]重新审视了神经网络的设计空间,并引入了ConvNext,实现了与最先进的变压器架构相似的性能。

尽管经过优化的深度和复杂神经网络取得了令人满意的性能,但其日益增加的复杂性给部署带来了挑战。例如,ResNets中的快捷操作在合并来自不同层的特征时消耗了大量的片外内存流量[27]。此外,AS-MLP中的轴向移位[28]和Swin Transformer中的移位窗口自关注[31]等复杂操作需要复杂的工程实现,包括重写CUDA代码。

这些挑战要求神经网络设计的范式向简单性转变。然而,ResNet的发展似乎导致了纯卷积层的神经架构的放弃(没有额外的模块,如快捷键)。这主要是由于通过添加卷积层实现的性能增强没有达到预期。如[18]所述,没有捷径的普通网络会出现梯度消失,导致34层的普通网络比18层的网络性能更差。此外,AlexNet[24]和VGGNet[40]等简单网络的性能在很大程度上已经被ResNets[18]和ViT[7]等深度和复杂网络所超越。因此,对于结构简单的神经网络的设计与优化,人们关注较少。解决这个问题并开发具有高性能的简洁模型将具有很大的价值

为此,我们提出了VanillaNet,这是一种新颖的神经网络架构,强调设计的优雅和简单,同时在计算机视觉任务中保持卓越的性能。VanillaNet通过避免过度的深度、捷径和复杂的操作(如自我关注)来实现这一点,从而产生了一系列简化的网络,这些网络解决了固有的复杂性问题,非常适合资源有限的环境。为了训练我们提出的VanillaNet,我们对其简化架构相关的挑战进行了全面分析,并设计了一个“深度训练”策略。这种方法从包含非线性激活函数的几个层开始。随着训练的进行,我们逐步消除这些非线性层,在保持推理速度的同时允许轻松合并。为了增强网络的非线性**,我们提出了一个有效的、基于序列的激活函数,该函数包含多个可学习的仿射变换**应用这些技术已被证明可以显著提高不太复杂的神经网络的性能。如图3所示,VanillaNet在效率和准确性方面都超越了现代网络,突出了极简方法在深度学习中的潜力。VanillaNet的开创性研究为神经网络设计的新方向铺平了道路,挑战了基础模型的既定规范,并为精细化和有效的模型创建建立了新的轨迹

image-20230527213923051

2、A Vanilla Neural Architecture

在过去的几十年里,研究人员在神经网络的基本设计上已经达成了一些共识。大多数最先进的图像分类网络架构应该由三部分组成:一个干块,用于将输入图像从3通道转换为多通道并进行下采样,一个主体用于学习有用信息,一个完全连接层用于分类输出。主体通常有四个阶段,其中每个阶段都是通过堆叠相同的块派生出来的。每一阶段过后,特征的通道会扩大,而高度和宽度会减小。不同的网络利用和堆叠不同类型的块来构建深度模型

尽管现有的深度网络取得了成功,但它们利用大量复杂的层来提取以下任务的高级特征。例如,众所周知的ResNet[18]需要34或50层的快捷键才能在ImageNet上达到70%以上的top-1精度。ViT的基础版本[13]由62层组成,因为自关注中的查询、键和值需要多层计算。

随着AI芯片的不断发展,神经网络推理速度的瓶颈将不再是flop或参数,因为现代gpu具有强大的计算能力,可以很容易地进行并行计算。相比之下,它们复杂的设计和大的深度阻碍了它们的速度。为此,我们提出香草网络,即VanillaNet,其架构如图1所示。我们遵循流行的神经网络设计,包括主干、主体和全连接层。与现有的深度网络不同,我们在每个阶段只使用一层,以建立一个尽可能少层的极其简单的网络

image-20230527214316129

这里我们以6层为例,详细展示了网络的架构。对于茎,我们使用步长为4的4 × 4 × 3 × C卷积层,遵循[18,31,32]中的流行设置,将具有3通道的图像映射到具有C通道的特征。在第1、2和3阶段,使用步幅为2的maxpooling层来减小大小和特征映射,通道数增加2。在阶段4,我们不增加通道的数量,因为它遵循平均池化层。最后一层是输出分类结果的全连通层每个卷积层的核大小为1 × 1,因为我们的目标是在保留特征映射信息的同时,使用最小的每层计算代价。激活函数在每个1 × 1卷积层之后应用。为了简化网络的训练过程,在每一层之后还加入了批归一化。对于不同层数的VanillaNet,我们在每个阶段都添加了block,在补充资料中会详细说明。值得注意的是,vanillanet没有快捷方式,因为我们的经验发现,添加快捷方式对性能的改善很小。这也提供了另一个好处,即所提出的架构非常容易实现,因为没有分支和额外的块,如挤压和激励块[22]。

虽然vanillanet的架构简单且较浅,但其较弱的非线性对性能造成了限制,因此,我们提出了一系列技术来解决这个问题。

3、Training of Vanilla Networks

在深度学习中,通过在训练阶段引入更强的能力来增强模型的性能是很常见的[4,50]。为此,我们建议利用深度训练技术来提高所提出的vanillanet在训练过程中的能力,因为深度网络比浅网络具有更强的非线性。

3.1 Deep Training Strategy

深度训练策略的主要思想是在训练过程的开始阶段用一个激活函数来训练两个卷积层,而不是单个卷积层。随着训练次数的增加,激活函数逐渐简化为恒等映射。在训练结束时,可以很容易地将两个卷积合并为一个卷积,从而减少推理时间。这种思路在cnn中也被广泛使用[10,12,9,11]。然后,我们将详细描述如何执行此技术。

对于激活函数 A ( x ) A(x) A(x)(可以是通常的函数,如ReLU和Tanh),我们将其与恒等映射结合起来,可以表示为:

image-20230527215246390

其中λ是一个超参数,用于平衡修改后的激活函数 A ′ ( x ) A' (x) A(x)的非线性。将当前epoch和深度训练epoch的个数分别表示为e和E。设 λ = e / E λ = e/E λ=e/E。因此,在训练开始时(e = 0), A ′ ( x ) = A ( x ) A ' (x) = A(x) A(x)=A(x),说明网络具有较强的非线性。当训练收敛时,我们得到 A ′ ( x ) = x A ' (x) = x A(x)=x,这意味着两个卷积层中间没有激活函数。我们进一步演示了如何合并这两个卷积层。

我们首先将每个批处理归一化层及其前一个卷积转换为单个卷积。我们将 W ∈ R C o u t × ( C i n × k × k ) W∈R^{C_{out} × (C_{in}×k×k)} WRCout×(Cin×k×k) B ∈ R C o u t B∈R^{C_{out}} BRCout作为卷积核的权矩阵和偏置矩阵,其中输入通道为 C i n C_{in} Cin,输出通道为 C o u t C_{out} Cout,核的大小为k。批归一化中的scale, shift, mean和variance分别用 γ , β ,µ, σ ∈ R C o u t γ, β,µ,σ∈R^{C_{out}} γβµσRCout表示。合并的权重矩阵和偏置矩阵为

image-20230527220248094

其中下标I∈{1,2,…, Cout}表示第i个输出通道中的值。

在将卷积与批处理归一化合并之后,我们开始合并两个1×1卷积。设 x ∈ R C i n × H × W , y ∈ R C o u t × H ′ × W ′ x∈R^{C_{in}×H×W}, y∈R^{C_{out}×H' ×W '} xRCin×H×W,yRCout×H×W为输入和输出特征,则卷积可表示为:

image-20230527220352116

其中*表示卷积运算,·表示矩阵乘法, X ∈ R ( C i n × 1 × 1 ) × ( H ′ × W ′ ) X∈R^{(C_{in}×1×1)×(H ' ×W ')} XR(Cin×1×1)×(H×W)由im2col运算导出,将输入变换成与核形状对应的矩阵。幸运的是,对于1 × 1卷积,我们发现im2col操作变成了简单的重塑操作,因为不需要有重叠的滑动核。因此,将两个卷积层的权矩阵记为w1和w2,不带激活函数的两个卷积表示为:

image-20230527220739877

因此,可以在不增加推理速度的情况下合并1 × 1卷积

3.2 Series Informed Activation Function

已经提出了几种不同的深度神经网络激活函数,包括最流行的整流线性单元(ReLU)及其变体(PReLU [17], GeLU[20]和Swish[37])。他们着重于利用不同的激活函数来提高深层复杂网络的性能。然而,已有的理论证明[35,14,42],简单浅层网络的有限功率主要是由于其较差的非线性造成的,这与深层复杂网络不同,尚未得到充分的研究。

实际上,改善神经网络非线性的方法有两种:将非线性激活层叠加或增加每个激活层的非线性,而现有网络的趋势是选择前者,这会导致在并行计算能力过剩时产生较高的延迟。

改善激活层非线性的一个直接方法是叠加。激活函数的连续叠加是深度网络的核心思想。相反,我们转而并发地堆叠激活函数。表示神经网络中输入x的单个激活函数为A(x),它可以是常用的函数,如ReLU和Tanh。A(x)的并发叠加可表示为:

image-20230528123218244

其中n为堆叠激活函数的个数,ai, bi为每个激活的尺度和偏差,避免简单累积。同时叠加可以大大增强激活函数的非线性。方程5在数学上可以看作是一个级数,它是多个量相加的运算。

为了进一步丰富序列的逼近能力,我们使基于序列的函数通过改变其邻居的输入来学习全局信息,这与BNET类似[49]。具体来说,给定一个输入特征 x ∈ R H × W × C x∈R^{H×W ×C} xRH×W×C,其中H、W、C分别为其宽度、高度和通道的个数,则激活函数表示为:

image-20230528124012297

式中 h ∈ 1 , 2 , … , H , w ∈ 1 , 2 , … , W , c ∈ 1 , 2 , … C h∈{1,2,…, H}, w∈{1,2,…, W}, c∈{1,2,…C} h1,2Hw1,2Wc1,2C。不难看出,当n = 0时,基于级数的激活函数 A s ( x ) A_{s(x)} As(x)退化为普通激活函数A(x),这意味着所提出的方法可以看作是对现有激活函数的一般扩展。我们使用ReLU作为基本激活函数来构建我们的系列,因为它在gpu中的推理是有效的

我们进一步分析了所提出的激活函数与其对应的卷积层的计算复杂度。对于核大小为K、输入通道为Cin、输出通道为Cout的卷积层,计算复杂度为:

image-20230528124056433

而其串联激活层的计算代价为:

image-20230528124120339

因此,我们有:

image-20230528124147840

以VanillaNet-B中的第4阶段为例,其中Cout = 2048, k = 1, n = 7,比值约为84。综上所述,所提出的激活函数的计算成本仍然远远低于卷积层。更多的实验复杂性分析将在下一节中展示。

4、Experiments

4.1 Ablation Study

image-20230528124347890

表1显示了公式6中使用不同n数时所提出的VanillaNet的性能。当n = 0时,激活函数退化为普通的ReLU激活函数。

image-20230528124551146

image-20230528124613331

4.2 Visualization of Attention

为了更好地理解所提出的VanillaNet,我们使用GradCam++[3]进一步可视化特征,它利用最后一个卷积层相对于特定类生成的特征映射的正偏导数的加权组合来生成一个很好的视觉解释。

图2显示了性能相似的VanillaNet-9和ResNets-50-TNR[45]的可视化结果。红色表示该区域高度激活,而蓝色表示预测类别的弱激活。我们可以发现这两个网络对于不同的样本有不同的注意图。可以很容易地发现,对于ResNet-50,活跃区域的面积较小。对于深度只有9的V网络,活跃区域要比深度网络大得多。我们认为,通过使用大量的参数和FLOPs, VanillaNet可以较强地提取输入图像中的所有相对激活,并彻底提取其信息。相比之下,由于非线性相对较低,vanillanet在分析部分有用区域时可能较弱

image-20230528124626120

4.3 Comparison with SOTA architectures

image-20230528124915903

4.4 Experiments on COCO

为了进一步证明所提出的V anillaNet在下游任务上的有效性,我们在COCO数据集中进行了评估[30]。我们使用RetinaNet[29]和Mask-RCNN[16]作为框架来评估所提出的方法。FPS是在Nvidia A100 GPU上测量的。

表5显示了所提出的vanillanet在COCO检测和分割方面的性能。所提出的vanillanet可以成功地达到与ConvNext和Swin骨干网络相似的性能。虽然V anillaNet的FLOPs和Parameters远高于Swin和ConvNext,但它的FPS要高得多,这证明了香草架构在对象检测和实例分割任务上的有效性。

image-20230528124940693

5、 Conclusion

本文充分探讨了建立高性能但不需要捷径、高深度和注意层等复杂架构的神经网络的可行性,体现了设计向简单和优雅的范式转变。本文提出了一种深度训练策略和串联激活函数,以增强vanillanets在训练和测试过程中的非线性,提高其性能。在大规模图像分类数据集上的实验结果表明,VanillaNet的性能与知名的深度神经网络和视觉转换器相当,从而突出了极简主义在深度学习中的潜力。我们将进一步探索更好的参数分配,以实现高效的高性能网络架构。

总之,我们证明了使用非常简洁的架构可以实现与最先进的深度网络和视觉变压器相当的性能,这将在未来释放普通卷积网络的潜力。

Network Architectures

image-20230528125243609

Training Details

image-20230528125310642

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/579135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:finalshell虚拟机与真实机的上传和下载;rz、sz

使用命令rz上传的速度会比拖拽上传的速度慢

Day3:Windows网络编程-UDP

对比TCP与UDP的通信区别 UDP Server没有listen()和accept() TCP Server #include <iostream> #include <WinSock2.h> // 包含网络库 #pragma comment(lib,"ws2_32.lib") using namespace std;int main() {// 1. 初始化套接字 初始化套接字库cout <&l…

Qt编写视频监控系统76-Onvif跨网段组播搜索和单播搜索的实现

一、前言 在视频监控行业一般会用国际onvif工具来测试设备是否支持onvif协议&#xff0c;工具的名字叫ONVIF Device Manager&#xff08;还有个工具叫ONVIF Device Test Tool&#xff0c;专用于程序员测试各种数据交互&#xff09;&#xff0c;可以自行搜索下载&#xff0c;此…

linux网桥简单理解和持久化配置

文章目录 前言一、Linux 网桥是什么&#xff1f;二、网桥主要作用三、网桥配置命令及安装(CentOS系统)1 网桥配置命令2.持久化网桥配置 前言 linux bridge是网络虚拟化中非常重要的一种设备&#xff0c;今天就来学习下linux bridge的相关知识 一、Linux 网桥是什么&#xff1…

Allegro操作规范

光绘输出操作规范 1.1添加钻孔表 添加钻孔表的具体步骤为: 1.通过屏幕右边的Visibility选项的Views列表,将Drill层打开 2.将Visibility选项中的PIN和Via选项都选中,见下图所示: 1.2添加钻孔文件 参数设好之后关闭NC Drill/Parameters窗口,输出数控机床钻孔文件的命…

企业域名与企业邮箱:提升企业形象的必备选择

在商业中&#xff0c;你最不想做的就是把注意力从业务上移开&#xff0c;去担心一些小事——比如电子邮件。大多数免费的企业电子邮件账户偷工减料&#xff0c;因此无法交付货物。在Zoho我们围绕您的需求设计了我们的平台&#xff0c;以创建优于其他工作电子邮件地址的电子邮件…

jQuery-从左到右、从右到左

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>从左到右、从右到左</title> <style type"text/css"> select { …

采购申请审批测试

采购申请审批的配置并不难&#xff0c;但是总会有原因导致业务无审批策略&#xff0c;而且这个配置也比较脆弱&#xff0c;有时同步也会出现问题&#xff0c;小编利用这篇操作记录下测试结果。 1、项目类别的审批策略分类 下图是审批策略分类-项目类别不给值&#xff0c;测试…

LAMP架构中的安装论坛

前言&#xff1a;本次操作依赖于LAMP的环境已经配置完全&#xff0c;网站也是依赖于开发人员现有的网站包框架&#xff0c;实施在LAMP已搭建好的环境进行安装部署 目录 一、对mysql进行操作 创建数据库&#xff0c;并进行授权 二、解压论坛压缩包 三、初步访问安装 解决…

少年,你可听说过MVCC?

&#xff1a;切&#xff01;这谁没听过&#xff0c;不就是多版本并发控制么~ 早在亘古时期&#xff0c;修真界就流传着一门mysql功法&#xff0c;将其修至小乘境界&#xff0c;足以纵横一方。。。不乏也有走火入魔者&#xff0c;为祸一方~ Serializable篇 强制事务排序&#…

【MCS-51】中断系统原理及应用

中断是单片机中一个十分重要的功能&#xff0c;它的出现能够让我们的单片机在顺序执行命令时&#xff0c;具备应对特殊情况的能力。 目录 &#x1f319;通信方式 &#x1f343;无条件传送 &#x1f343;有条件传送 &#x1f343;DMA通信 &#x1f343;中断传送 &#x1…

python计算程序开始、结束以及运行的时间

python 计算程序运行的耗时&#xff0c;主要有三种方法&#xff1a; time.time() 、 time.perf_counter() 和 datetime.datetime.now()方法 使用方法如下&#xff1a; 1. time.time() import time start time.time() # 程序开始时间,单位为秒 print("start_time:&…

C++ [STL之list的使用]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT 前言 vector是一片连续的空间&#xff0c;在数据访问上性能较好&#xff0c;但是任意位置插入删除性能较低&#xff0c;头插头删性能亦是如此&#xff1b;此时在这种需要频繁插入的场景下&…

PCL计算法向量结果不对的问题

一、点云&#xff08;高程渲染。CC计算的法向量&#xff0c;Z分量渲染&#xff09; 高程渲染 法向量Z分量的绝对值渲染 二、PCL计算法向量 下面是PCL计算法向量的代码&#xff08;点类型自己设置的&#xff09; 计算出的法向量有正有负 void pclNormalEstimation(pcl::Point…

【C++】构造函数初始化列表的特性以及注意事项

文章目录 一、1.1构造函数体赋值&#xff1a;二、 初始化列表2.1初始化基本形式&#xff0c;注意&#xff1a;3. 尽量使用初始化列表初始化&#xff0c;因为不管你是否使用初始化列表&#xff0c;对于自定义类型成员变量&#xff0c;一定会先使用初始化列表初始化。4. 成员变量…

JavaScript教程(二)

BOM浏览器对象模型 什么是BOM BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是 window&#xff1b;BOM由一系列相关的对象构成&#xff0c;并且每个对象都提供了很多方…

deepfloyd/IF

Stable Diffusion团队放大招&#xff01;新绘画模型直出AI海报&#xff0c;实现像素级图像生成AI画文字终于能画对了https://mp.weixin.qq.com/s/_pwBD4-wLA9zNHBpD6WdNgDeepFloyd IF — DeepFloydhttps://deepfloyd.ai/deepfloyd-ifhttps://colab.research.google.com/#scroll…

微服务开发系列 第八篇:Elasticsearch

总概 A、技术栈 开发语言&#xff1a;Java 1.8数据库&#xff1a;MySQL、Redis、MongoDB、Elasticsearch微服务框架&#xff1a;Spring Cloud Alibaba微服务网关&#xff1a;Spring Cloud Gateway服务注册和配置中心&#xff1a;Nacos分布式事务&#xff1a;Seata链路追踪框架…

gradle快速入门

1.Gradle 入门 1.1 Gradle 简介 Gradle 是一款Google 推出的基于JVM、通用灵活的项目构建工具&#xff0c;支持Maven&#xff0c;JCenter 多种第三方仓库;支持传递性依赖管理、废弃了繁杂的xml 文件&#xff0c;转而使用简洁的、支持多种语言(例如&#xff1a;java、groovy 等…

如何成功申请计算机软件著作权【申请流程完整记录】

致谢 &#xff1a;此博文的编写包括软著的申请&#xff0c;均借鉴了大佬【万里守约】的博客&#xff0c;很幸运一次性通过 — 提示&#xff1a;此博文仅适合个人申请&#xff0c;因为我是自己一个人的项目&#xff0c;自己一个人申请软著 文章目录 前言&#xff1a;一、网站注册…