华为诺亚实验室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的开创性研究为神经网络设计的新方向铺平了道路,挑战了基础模型的既定规范,并为精细化和有效的模型创建建立了新的轨迹。
2、A Vanilla Neural Architecture
在过去的几十年里,研究人员在神经网络的基本设计上已经达成了一些共识。大多数最先进的图像分类网络架构应该由三部分组成:一个干块,用于将输入图像从3通道转换为多通道并进行下采样,一个主体用于学习有用信息,一个完全连接层用于分类输出。主体通常有四个阶段,其中每个阶段都是通过堆叠相同的块派生出来的。每一阶段过后,特征的通道会扩大,而高度和宽度会减小。不同的网络利用和堆叠不同类型的块来构建深度模型。
尽管现有的深度网络取得了成功,但它们利用大量复杂的层来提取以下任务的高级特征。例如,众所周知的ResNet[18]需要34或50层的快捷键才能在ImageNet上达到70%以上的top-1精度。ViT的基础版本[13]由62层组成,因为自关注中的查询、键和值需要多层计算。
随着AI芯片的不断发展,神经网络推理速度的瓶颈将不再是flop或参数,因为现代gpu具有强大的计算能力,可以很容易地进行并行计算。相比之下,它们复杂的设计和大的深度阻碍了它们的速度。为此,我们提出香草网络,即VanillaNet,其架构如图1所示。我们遵循流行的神经网络设计,包括主干、主体和全连接层。与现有的深度网络不同,我们在每个阶段只使用一层,以建立一个尽可能少层的极其简单的网络。
这里我们以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),我们将其与恒等映射结合起来,可以表示为:
其中λ是一个超参数,用于平衡修改后的激活函数 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)} W∈RCout×(Cin×k×k), B ∈ R C o u t B∈R^{C_{out}} B∈RCout作为卷积核的权矩阵和偏置矩阵,其中输入通道为 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表示。合并的权重矩阵和偏置矩阵为
其中下标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 '} x∈RCin×H×W,y∈RCout×H′×W′为输入和输出特征,则卷积可表示为:
其中*表示卷积运算,·表示矩阵乘法, X ∈ R ( C i n × 1 × 1 ) × ( H ′ × W ′ ) X∈R^{(C_{in}×1×1)×(H ' ×W ')} X∈R(Cin×1×1)×(H′×W′)由im2col运算导出,将输入变换成与核形状对应的矩阵。幸运的是,对于1 × 1卷积,我们发现im2col操作变成了简单的重塑操作,因为不需要有重叠的滑动核。因此,将两个卷积层的权矩阵记为w1和w2,不带激活函数的两个卷积表示为:
因此,可以在不增加推理速度的情况下合并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)的并发叠加可表示为:
其中n为堆叠激活函数的个数,ai, bi为每个激活的尺度和偏差,避免简单累积。同时叠加可以大大增强激活函数的非线性。方程5在数学上可以看作是一个级数,它是多个量相加的运算。
为了进一步丰富序列的逼近能力,我们使基于序列的函数通过改变其邻居的输入来学习全局信息,这与BNET类似[49]。具体来说,给定一个输入特征 x ∈ R H × W × C x∈R^{H×W ×C} x∈RH×W×C,其中H、W、C分别为其宽度、高度和通道的个数,则激活函数表示为:
式中 h ∈ 1 , 2 , … , H , w ∈ 1 , 2 , … , W , c ∈ 1 , 2 , … C h∈{1,2,…, H}, w∈{1,2,…, W}, c∈{1,2,…C} h∈1,2,…,H,w∈1,2,…,W,c∈1,2,…C。不难看出,当n = 0时,基于级数的激活函数 A s ( x ) A_{s(x)} As(x)退化为普通激活函数A(x),这意味着所提出的方法可以看作是对现有激活函数的一般扩展。我们使用ReLU作为基本激活函数来构建我们的系列,因为它在gpu中的推理是有效的。
我们进一步分析了所提出的激活函数与其对应的卷积层的计算复杂度。对于核大小为K、输入通道为Cin、输出通道为Cout的卷积层,计算复杂度为:
而其串联激活层的计算代价为:
因此,我们有:
以VanillaNet-B中的第4阶段为例,其中Cout = 2048, k = 1, n = 7,比值约为84。综上所述,所提出的激活函数的计算成本仍然远远低于卷积层。更多的实验复杂性分析将在下一节中展示。
4、Experiments
4.1 Ablation Study
表1显示了公式6中使用不同n数时所提出的VanillaNet的性能。当n = 0时,激活函数退化为普通的ReLU激活函数。
4.2 Visualization of Attention
为了更好地理解所提出的VanillaNet,我们使用GradCam++[3]进一步可视化特征,它利用最后一个卷积层相对于特定类生成的特征映射的正偏导数的加权组合来生成一个很好的视觉解释。
图2显示了性能相似的VanillaNet-9和ResNets-50-TNR[45]的可视化结果。红色表示该区域高度激活,而蓝色表示预测类别的弱激活。我们可以发现这两个网络对于不同的样本有不同的注意图。可以很容易地发现,对于ResNet-50,活跃区域的面积较小。对于深度只有9的V网络,活跃区域要比深度网络大得多。我们认为,通过使用大量的参数和FLOPs, VanillaNet可以较强地提取输入图像中的所有相对激活,并彻底提取其信息。相比之下,由于非线性相对较低,vanillanet在分析部分有用区域时可能较弱。
4.3 Comparison with SOTA architectures
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要高得多,这证明了香草架构在对象检测和实例分割任务上的有效性。
5、 Conclusion
本文充分探讨了建立高性能但不需要捷径、高深度和注意层等复杂架构的神经网络的可行性,体现了设计向简单和优雅的范式转变。本文提出了一种深度训练策略和串联激活函数,以增强vanillanets在训练和测试过程中的非线性,提高其性能。在大规模图像分类数据集上的实验结果表明,VanillaNet的性能与知名的深度神经网络和视觉转换器相当,从而突出了极简主义在深度学习中的潜力。我们将进一步探索更好的参数分配,以实现高效的高性能网络架构。
总之,我们证明了使用非常简洁的架构可以实现与最先进的深度网络和视觉变压器相当的性能,这将在未来释放普通卷积网络的潜力。