论文笔记-SqueezeNet: Alexnet-level accuracy whith 50x Fewer Parameters And < 0.5MB Model Size

来源:互联网 发布:欧阳娜娜的琴 知乎 编辑:程序博客网 时间:2024/05/22 08:01

关于Dense→Sparse→Dense (DSD) 训练法
不得不说一下原作的这个小发现,使用裁剪之后的模型为初始值,再次进行训练调优所有参数,正确率能够提升4.3%。 稀疏相当于一种正则化,有机会把解从局部极小中解放出来。这种方法称为DSD (Dense→Sparse→Dense)。
这个和我们人类学习知识的过程是多么相似!人类每隔一段时间重新温习一下学过的知识,会增加对所学知识的印象。我们可以把“隔一段时间”理解为“裁剪”,即忘却那些不怎么重要的参数,“再学习”理解为从新训练,即强化之前的参数,使其识别精度更高!

摘要:

我们提出了一个叫做SqueezeNet的小的CNN框架。SqueezeNet在ImageNet上取得了AlexNet级别的准确率,参数量减少了50倍。另外,通过模型压缩技术,我们能够把SqueezeNet压缩0.5M以内(比AlexNet小了510倍)。

1.简介和动机:

更小的CNN架构至少有三个优点: 

1.分布式训练更高效。服务器之间的通信是分布式CNN训练可扩展性的限制因素。对于分布式数据并行训练,通信开销与模型中的参数数量成正比(Iandola等,2016)。总之,小模型训练更快,因为需要较少的通信。 
2. 新模型导出到客户端开销小。对于自动驾驶,特斯拉等公司定期将新型号从其服务器复制到客户的汽车。 这种做法通常被称为空中更新。 消费者报告发现,特斯拉自动驾驶仪半自动驾驶功能的安全性随着最近的空中更新(消费者报告,2016)而逐渐改善。然而,当今典型的CNN/DNN模型的空中更新可能需要大量的数据传输。 使用AlexNet,这将需要240MB的从服务器到汽车的通信。较小的模型需要较少的通信,使频繁更新更可行。
3. 灵活的FPGA和嵌入式部署。 FPGA通常具有小于10MB的片上存储器并且没有片外存储器。对于推理,足够小的模型可以直接存储在FPGA上,而不是让存储带宽变成它的瓶颈(Qiu等人,2016),从而使得FPGA可以实时地处理视频流。此外,当在专用集成电路(ASIC)上部署CNN时,足够小的模型可以直接存储在芯片上,并且较小的模型可以使ASIC适合更小的管芯。

考虑到较小CNN架构的这几个优点,我们直接关注和大众所知模型有一样精度,但具有较少参数的CNN架构的问题。我们发现了一个这样的架构,我们称之为SqueezeNet。此外,我们提出了一个更严谨的方法来搜索设计空间中的新CNN架构。

2.相关工作:

2.1模型压缩

我们工作的首要目标是确定一个具有很少参数,同时保持精度的模型。为了解决这个问题,一种明智的方法是采用现有的CNN模型并以有损的方式压缩它。事实上,围绕模型压缩的主题出现了一个研究社区,并且已经报道了几种方法。Denton等人的一个相当直接的方法是对预训练的CNN模型应用奇异值分解(SVD)(Denton等人,2014)。Han等人开发了网络修剪,其从预训练模型开始,然后用零替换低于某个阈值的参数以形成稀疏矩阵,并且最后对稀疏CNN执行几次迭代训练(Han等人,2015b)。最近,Han等人通过将网络修剪与量化(至8位或更少)和huffman编码相结合,创建了一种称为深度压缩的方法(Han等人,2015a),并进一步设计了一种称为EIE的硬件加速器(Han等人,2016a ),直接对压缩模型操作,实现大幅加速和节能。

2.2CNN微观结构

随着设计非常深的CNN的趋势,手动选择每层的滤波器尺寸变得麻烦。为了解决这个问题,已经提出了由具有特定固定组织的多个卷积层组成的各种更高级别的构建块或模块。例如,GoogLeNet论文提出了Inception模块,其包括多个不同维度的滤波器,通常包括1x1和3x3,有时5x5(Szegedy等人,2014),有时1x3和3x1(Szegedy等人,2015)。然后,许多这样的模块可能与附加的自组织层组合以形成完整的网络。我们使用术语CNN微架构来指代各个模块的特定组织和尺寸。

2.3 CNN宏结构

虽然CNN微体系结构涉及单个层和模块,但是我们将CNN宏体系结构定义为多个模块到端到端CNN体系结构的系统级组织。

也许在最近的文献中最广泛研究的CNN宏观架构主题是网络中深度(即层数)的影响。Simoyan和Zisserman提出了具有12到19层的的VGG(Simonyan&Zisserman,2014)族,并且说明了更深的网络在ImageNet-1k数据集上产生更高的精度(Deng等人,2009)。K.He等人提出了最多30层的更深的CNNs,提供更高的ImageNet精度(He等人,2015a)。

选择跨越多个层或模块的连接是CNN宏观结构研究的新兴领域。残差网络(ResNet)(He等人。,2015b)和Highway Networks(Srivastava等人,2015)分别提出了跨越多层的连接的使用,例如将来自层3的激活与来自层6的激活相加连接,我们将这些连接称为旁路连接。ResNet的作者提供了一个具有和不具有旁路连接的34层CNN的A/B比较; 添加旁路连接可在ImageNet Top-5的精度上提高2个百分点。

2.4 神经网络设计空间探索

神经网络(包括深度卷积神经网络)具有大的设计空间,具有用于微架构,宏架构,解算器和其它超参数的众多选项。社区似乎希望获得关于这些因素如何影响神经网络的准确性(例如设计空间的形状)。神经网络的设计空间探索(DSE)的许多工作集中在开发自动化方法以发现提供更高精度的神经网络架构。这些自动化DSE方法包括贝叶斯优化(Snoek等人,2012),模拟退火(Ludermir等人,2006),随机搜索(Bergstra&Bengio,2012)和遗传算法(Stanley和Miikkulainen,2002)。他们认为,这些论文中的每一篇提供了一种情况,其中所提出的DSE方法产生了与具有代表性的基线相比精度更高的神经网络架构。然而,这些论文没有试图提供关于神经网络设计空间的直观形状。在本文的后面,我们避开了自动化方法,相反,我们以这样一种方式重构CNN,以便我们可以进行原理性的A/B比较来研究CNN架构决策如何影响模型大小和准确性。

在以下部分,我们首先提出和评估使用和不使用模型压缩的SqueezeNet架构。然后,我们探讨微型架构和宏构架的设计选择对SqueezeNet类CNN架构的影响。

3.SqueezeNet:用较少的参数保留精度

在本节中,我们首先概述了几个参数的CNN架构的设计策略。然后,我们介绍Fire模块,我们新的构建块,用于构建CNN架构。最后,我们使用我们的设计策略构建SqueezeNet,它主要由Fire模块组成。

3.1 结构设计策略

策略1:使用1x1过滤器替换3x3滤波器给定一定数量的卷积滤波器的预算,我们将选择让这些滤波器中的大部分是1x1,因为1x1滤波器具有比3x3滤波器少9倍的参数。
策略2:将输入到3x3滤波器的通道数量减少。考虑一个完全由3x3滤波器组成的卷积层。该层中的参数的总量是(输入通道的数量)*(滤波器的数量)*3 * 3)。 因此,为了在CNN中保持小的参数总数,不仅要减少3×3滤波器的数量(见策略1),而且要减少3×3滤波器的输入通道的数量。我们使用挤压层将输入到3x3滤波器的通道数量减少,我们将在下一节中进行描述。
策略3:在网络后期降采样,以使卷积层具有大的激活图。在卷积网络中,每个卷积层产生的输出激活图的空间分辨率至少1x1并且经常比1x1大得多的。这些激活图的高度和宽度由以下控制:(1)输入数据的大小(例如256×256图像)和(2)在CNN架构中对其进行下采样的层的选择。最常见的是,通过在一些卷积或池化层中设置(stride> 1),将下采样设计到CNN架构中(例如(Szegedy等人,2014;Simonyan&Zisserman,2014;Krizhevsky等人,2012))。 如果网络中早期的层具有较大的步幅,则大多数层将具有小的激活图。相反,如果网络中的大多数层具有1的步幅,并且大于1的步幅集中朝向网络的尾部,则网络中的许多层将具有大的激活图。 我们的直觉是,在其他保持不变的情况下,大的激活图(由于延迟下采样)可以导致更高的分类精度。 实际上,K.He和H.Sun对4种不同的CNN结构应用了延迟下采样,并且在每种情况下延迟下采样导致更高的分类精度(He&Sun,2015)。


图1:微观结构视图:在Fire模块中组织卷积滤波器。 在这个例子中,s1x1= 3,e1x1= 4,e3x3= 4。我们展示的是卷积滤波器不是激活器。

策略1和2在保持准确性的同时减少CNN中的参数的数量。策略3是关于在有限的参数预算上最大化精度。接下来我们描述Fire模块,这是我们的CNN架构的构建块,使我们能够成功地采用策略1,2和3。

3.2 Fire模块

我们定义Fire模块如下。Fire模块包括:挤压卷积层(仅有1x1滤波器),送到混合了1x1和3x3卷积滤波器的扩展层;我们在图1中说明了这一点。在fire模块中自由使用1x1过滤器是第3.1节中策略1的一个应用。我们在Fire模块中公开了三个可调整维度(超参):s1X1e1X1e3X3。在Fire模块中,s1X1挤压(都是1x1)中的滤波器数,e1X1是扩展层中1x1滤波器的数量,e3X3是扩展层中的3x3滤波器的数量。当我们使用Fire模块时,我们将s1X1设置为小于(e1X1 + e3X3),因此挤压层有助于将输入通道的数量限制为3x3过滤器,如第3.1节中的策略2所示。

3.3 SqueezeNet结构

我们现在描述SqueezeNet CNN架构。我们在图2中说明SqueezeNet开始于一个独立的卷积层(conv1),然后是8个fire模块(fire2-9),最后是一个最终的转换层(conv10)。 我们从网络的开始到结束逐渐增加每个fire模块的过滤器数量。 SqueezeNet在层conv1,fire4,fire8和conv10之后以步长为2来执行max-pooling; 这些相对较晚的polling安排是根据3.1节中的策略3。我们在表1中给出了完整的SqueezeNet架构。


图2:我们的SqueezeNet架构的宏观架构视图。 左:SqueezeNet(3.3节); 中间:SqueezeNet与简单的旁路(第6节); 右:具有复杂旁路的SqueezeNet(第6节)。

3.3.1 其他SequenceNet细节

为简洁起见,我们在表1和图2中省略了一些关于SqueezeNet的细节和设计选择。我们在下面提供这些设计选择。这些选择背后的直觉可以在下面引用的论文中找到。

  1. 为了使1x1和3x3滤波器的输出激活值具有相同的高度和宽度,我们在扩展模块的3x3滤波器的输入数据中添加零填充的1像素边界。
  2. ReLU(Nair&Hinton,2010)用于挤压和膨胀层的激活。
  3. 在fire9模块之后应用50%的dropout(Srivastava等人,2014)。
  4. 注意SqueezeNet中缺少全连接层; 这个设计选择是受到NiN(Lin et al。,2013)架构的启发。
  5. 在训练SqueezeNet时,我们从0.04的学习率开始,在训练过程中线性减少学习率,如(Mishkin et al。,2016)所述。 有关训练协议(例如批量大小,学习速率,参数初始化)的详细信息,请参阅我们的Caffe兼容配置文件,位于这里:https://github.com/DeepScale/SqueezeNet
  6. Caffe框架本身不支持包含多个滤波器分辨率的卷积层(例如1x1和3x3)(Jia等人,2014)。为了解决这个问题,我们使用两个独立的卷积层来实现我们的扩展层:一个带1x1滤波器的层和一个带有3x3滤波器的层。然后,我们在通道维中将这些层的输出连接在一起。这在数值上等同于实现包含1x1和3x3滤波器的一个层。

4 SqueezeNet评估

我们现在将注意力转向评估SqueezeNet。 在第2.1节中回顾的每一个CNN模型压缩论文中,目标是压缩AlexNet(Krizhevsky等人,2012)模型,该模型被训练使用ImageNet(Deng等人,2009)(ILSVRC 2012) 数据集。因此,在评估SqueezeNet时,我们使用AlexNet和相关的模型压缩结果作为比较的基础。
表1:SqueezeNet体系结构尺寸。(此表格的格式受到Inception2文章(Ioffe&Szegedy,2015)的启发。) 


在表2中,我们在近期模型压缩结果中检查SqueezeNet。 基于SVD的方法能够将预训练的AlexNet模型压缩5倍,同时将top-1精度降低到56.0%(Denton等人,2014)。网络修剪实现模型大小减少9倍,同时在ImageNet上保持了57.2%的top-1和80.3%的top-5准确率的基线(Han et al。,2015b)。深度压缩使模型大小减少35倍,同时仍然保持了基线精度水平(Han 等人,2015a)。现在,使用SqueezeNet,与AlexNet相比实现了模型大小减少50倍,同时满足或超过了AlexNet的top-1和前top-5的精度。 我们在表2中总结了所有上述结果。

这表明我们已经超过了模型压缩社区的最先进结果:即使使用未压缩的32位值来表示模型,SqueezeNet比模型压缩社区的最好结果的模型小1.4倍,同时保持或超过基线准确率。直到现在,一个悬而未决的问题是:是小模型适合被压缩,还是小模型“需要”由密集浮点值提供的强大的表达能力? 为了找出原因,我们使用33%稀疏度和8-bits量化对SqueezeNet应用深度压缩(Han等,2015a)。 这产生了和AlexNet相同精度的0.66MB的模型(比32位AlexNet小363倍)。此外,在SqueezeNet上应用6-bits量化和33%稀疏性的深度压缩,我们产生具有相同精度的0.47MB的模型(比32位AlexNet小510倍)。我们的小模型的确适合压缩。

表2:比较SqueezeNet和模型压缩方法。模型大小指的是在训练好的模型中存储所有参数所需的字节数。 


此外,这些结果表明,深压缩(Han等人,2015a)不仅在具有许多参数(例如AlexNet和VGG)的CNN架构上工作良好,而且还能够压缩已经紧凑,完全卷积的SqueezeNet架构。深度压缩将SqueezeNet压缩10倍,同时保持基线精度。 总之:通过将CNN架构创新(SqueezeNet)与最先进的压缩技术(深度压缩)相结合,我们实现了模型尺寸减少510×,与基准相比精度没有降低。

5.CNN微结构设计空间探索

到目前为止,我们已经为小型模型提出了结构设计策略,遵循这些原则来创建SqueezeNet,发现SqueezeNet比AlexNet小50倍,具有同等的精度。 然而,SqueezeNet和其他模型仍然是一个广泛并且大部分设计空间未被开发的CNN架构。 现在,在第5和第6节,我们探讨了设计空间的几个方面。 我们将这个架构探索分为两个主要主题:微架构探索(每个模块层的维度和配置)和宏架构探索(模块和其他层的高级的端到端组织)。

在本节中,我们设计和执行实验,目的是提供关于微结构设计空间的形状相对于我们在第3.1节中提出的设计策略的直观表现。 请注意,我们的目标不是最大化每个实验的准确性,而是理解CNN架构选择对模型大小和精度的影响。


5.1 CNN微架构元参数

在SqueezeNet中,每个fire模块都有三维超参数,我们在3.2节定义:s1X1e1X1e3X3。 SqueezeNet有8个fire模块,总共24维超参数。为了对SqueezeNet这样架构的设计空间进行广泛扫描,我们定义了以下一组更高级别的元参数,用于控制CNN中所有fire模块的尺寸。我们将basee定义为CNN中第一个fire模块中的扩展过滤器数。在每个freq fire模块之后,我们通过增加扩展过滤器的数量incre 。换句话说,对于fire模块i,扩展滤波器的数量是ei=basee+(increjfreq)。在fire模块的展开层中,一些过滤器为1X1,一些为3x3;我们定义ei=ei,1X1+ei3X3pct3X3(范围[0; 1],在所有fire模块中共享)作为3X3的扩展过滤器的百分比。换句话说,ei,3X3=eipct3X3ei,1X1=ei(1pct3X3)。最后,我们使用称为挤压比(SR)(同样,范围是[0; 1],在所有Fire模块共享)的元参数定义fire模块挤压层中的过滤器数量:si,1X1=SRei(或等价地si,1X1=SR(ei,1X1+ei3X3))。 SqueezeNet(表1)是我们使用上述的元参数集合生成的示例体系结构。具体来说,SqueezeNet具有以下元参数:basee=128,incre=128,pct3X3=0.5,freq=2,SR=0.125

6.CNN宏观结构设计空间探索

到目前为止,我们已经探索了在微架构级别的设计空间,即CNN的单个模块的内容。 现在,我们在宏观架构层面探讨关于Fire模块间高级连接的设计决策。 受ResNet的启发(He等人,2015b),我们探索了三种不同的架构:
  • Vanilla SqueezeNet(按照前面的章节)。
  • SqueezeNet一些Fire模块之间的简单旁路连接。 (受(Srivastava等人,2015; He等人,2015b)的启发。)
  • SqueezeNet其余的Fire模块之间的复杂旁路连接。

我们在图2中说明了SqueezeNet的三个变体。

我们简单的旁路架构是在3、5、7、9 Fire 模块周五增加旁路连接,让这些模块学习输入和输出之间的残差函数。 在ResNet中,为了在Fire3周围实现旁路连接,我们设置Fire4的输入和(Fire2的输出+Fire3的输出)相等,+操作是按元素加。这改变了应用于这些Fire模块参数的正则化,和ResNet一样,可以提高训练完整模型的准确率和能力。 

一个限制是,在简单的情况下,输入通道的数量和输出通道的数量必须相同; 因此,只有一半的Fire模块可以具有简单的旁路连接,如图2的中间图所示。当不能满足“相同数量的通道”要求时,我们使用复杂的旁路连接,如图所示在图2的右侧。虽然简单的旁路“仅仅是线“,但是我们定义复杂旁路为包含滤波器的数量等于所需的输出通道的数量的1*1卷积层。请注意,复杂的旁路连接会为模型添加额外的参数,而简单的旁路连接则不会。

除了改变正则化之外,对我们来说直观的是,添加旁路连接将有助于减轻挤压层引入的表达瓶颈。 在SqueezeNet中,挤压比(SR)为0.125,意味着每个挤压层比相应的膨胀层有8倍少的输出通道。 由于这种严重的维度减小,可以通过挤压层的信息有限。 然而,通过添加旁路连接到SqueezeNet,我们打开了信息围绕挤压层流动的途径。 

我们使用图2中的三个宏结构训练SqueezeNet,并在表3中比较精度和模型大小。如表1所述,在整个宏结构探索中,我们固定了微结构以匹配SqueezeNet。 复杂和简单的旁路连接都比vanilla SqueezeNet架构提高了精度。有趣的是,简单的旁路实现了比复杂旁路更高的精度。 添加简单的旁路连接使得在不增加模型尺寸的情况下在top-1准确率增加2.9个百分点,top-5准确率增加2.2个百分点。


7.结论

在本文中,我们提出了一个更严格的方法来探索卷积神经网络的设计空间。 实现这个目标的过程中,我们提出了SqueezeNet,这是一种CNN架构,比AlexNet少50倍的参数,并在ImageNet上维持了AlexNet级别的精度。我们还将SqueezeNet压缩到小于0.5MB,或者说比没有压缩的AlexNet小510倍。 自从我们在2016年发布本文作为技术报告以来,Song Han和他的合作者进一步实验了SqueezeNet和模型压缩。使用一种称为密集稀疏密集(DSD)的新方法(Han等人,2016b),Han等人在训练期间使用模型压缩作为正则化器,以进一步提高精度,产生SqueezeNet参数的压缩集,在ImageNet-1k上更准确1.2百分点,并且还生成SqueezeNet参数的未压缩集,更准确4.3个百分点(与我们在表2中的结果相比)。

我们在本文开头提到,小型模型更适合FPGA上的片上实现。 自从我们发布了SqueezeNet模型,Gschwend开发了一个SqueezeNet的变种并在FPGA上实现(Gschwend,2016)。 正如我们的预期,Gschwend能够将一个类似SqueezeNet的模型的参数完全存储在FPGA中,并且无需对负载模型参数进行片外存储访问。

SqueezeNet是我们在广泛探索CNN架构设计空间时发现的几个新的CNN之一。 我们希望SqueezeNet将激励读者考虑和探索在CNN架构的设计空间的广泛的可能性,并以更系统的方式进行探索。
阅读全文
0 0