SqueezeNet:论文笔记
目录
动机
- 更有效地分布式训练:通信开销一般与参数量成正比,训练更快往往需要更小的通信量。
- 将新模型导出到客户端时开销更小:自动驾驶汽车的无线更新。
- FPGA与嵌入式设备的部署更加灵活:更小的模型可以直接存储到芯片上。
model
设计策略
主要包含以下三个策略:
- 使用1*1的filter代替3*3,参数会少9x
- 减少输入到3x3滤波器的通道数目。考虑一个完全由3x3个滤波器组成的卷积层。该层参数总数为(输入通道数)*(滤波器数)*(3*3)。为了在一个CNN中保持较小的参数总数,不仅要减少3x3滤波器的数量(策略1),而且要减少3x3滤波器的输入通道的数量。
- 在网络中延迟下采样,使卷积层具有较大的**map。在卷积网络中,每个卷积层都会产生一个空间分辨率至少为1x1且往往远大于1x1的输出**map。这些**map的高度和宽度,由以下几方面控制:
- 输入数据的尺寸
- 下采样层的选择
策略1、2旨在降低参数,策略3在于提高精度。
基于策略1、2和3,文章提出Fire模块,SqueezeNet架构的构建模块
fire模块
组成:
- squeeze convolution层,只有1*1的filter
- expand层,具有1*1以及3*3的filter
在fire模块中自由使用1x1filter是策略1的应用。在fire模块中展示了三个可调维度(超参数):。在Fire模块中,
为squeeze convolution层的过滤器数量(全部为1x1),
为expand层的1x1过滤器数量,
为扩展层的3x3过滤器数量。在使用fire模块时,我们将
设置为小于(
+
),按照策略2,squeeze convolution层有助于限制3x3滤波器的输入通道数量。
网络结构
SqueezeNet从一个独立的卷积层(conv1)开始,接着是8个Fire模块(fire2-9),最后是一个conv层(conv10),逐步增加每个ire模块的filter数量。在conv1、fire4、fire8和conv10层后,SqueezeNet执行步长为2的最大池化;这些位置相对较后的池化是根据策略3进行的。表1中展示了完整的架构。
其他细节
- 为了使1x1和3x3滤波器的输出**具有相同的高度和宽度,我们在expand模块的3x3滤波器的输入数据中添加1像素的填充零的边界。
- ReLU用于挤压和膨胀层的**。
- Dropout 在fire9模块之后应用50%的比率。
- 注意在SqueezeNet中缺少全连接层;
- 在训练SqueezeNet时,我们从0.04的学习率开始,并在整个训练过程中线性降低学习率
- Caffe框架本身并不支持包含多个滤波器分辨率(例如1x1和3x3)的卷积层。为了解决这个问题,使用两个独立的卷积层来实现扩展层:一个有1x1滤波器的层,一个有3x3滤波器的层。然后,我们在通道维度中将这些层的输出连接在一起。这在数字上等同于实现一个包含1x1和3x3过滤器的层。
网络评估
在评估SqueezeNet时,使用AlexNet和相关模型的压缩结果作为比较的基础。
在下表中,基于SVD的方法能够将预训练的AlexNet模型压缩5倍,同时将top-1的准确率降低到56.0%。在ImageNet上,网络修剪在保持基线57.2% top-1和80.3% top-5精度的同时,模型大小减少了9倍。深度压缩在保持基线精度水平的情况下,模型大小减少了35倍。SqueezeNet实现相比于AlexNet缩小模型尺寸50倍,同时满足或超过的top-1和top-5的准确性。
使用33%稀疏和8位量化的深度压缩,产生了0.66 MB的模型(小于32位的AlexNet363×),与AlexNet等效的准确性。此外,在SqueezeNet上应用具有6位量化和33%稀疏度的深度压缩,得到了一个具有同等精度的0.47MB模型(小于32位AlexNet510倍)。证明小模型确实经得起压缩。
CNN微架构设计空间探索
SqueezeNet和其他的模型存在于CNN架构的一个广阔的和大部分未被探索的设计空间中。将架构探索分为两个主要主题:微架构探索
(每个模块层的维度和配置)和宏观架构探索(模块和其他层的高级端到端组织)。
这里的目标不是在每个实验中最大化精度,而是理解CNN架构的选择对模型大小和精度的影响。
元参数
在SqueezeNet中,每个fire模块都有超参数:。SqueezeNet有8个fire模块,共有24个超参数。如果对压缩式架构的设计空间进行广泛的扫描,定义以下更高级别的元参数集,这些元参数集控制CNN中所fire模块的尺寸。
我们将定义为CNN中的第一个fire模块中的expand过滤器的数量。在每freq个fire模块之后,增加了expand过滤器的数量
。换句话说,对于Fire模块i,expand过滤器的数量是
,
定义,
(在[0,1]范围,在所有fire模块共享)作为3x3expand过滤器的百分比。也就是说
最后,使用称为压缩比(SR)的元参数(同样,在[0,1]范围内,由所有Fire模块共享)定义Fire模块squeeze层中的过滤器数量:
SqueezeNet(表1)是生成的一个示例架构。其中,SqueezeNet的metaparameters有: = 128,
= 128,
= 0.5, freq = 2, SR = 0.125
压缩比SR
将压缩比(SR)定义为压缩层中的过滤器数量与扩展层中的过滤器数量之间的比率。
使用以下元参数:: = 128,
= 128,
= 0.5, freq = 2。对多个模型进行训练,每个模型在[0.125,1.0]范围内具有不同的压缩比。
下图展示了实验的结果,图上的每个点都是一个独立的模型,是从零开始训练的。在图中,SqueezeNet为SR=0.125点。从这个图中,了解到SR增加到0.125以上可以进一步增加ImageNet top5的精确度。从4.8MB模型的80.3%(即alexnet级别)提高到86.0%
19 mb的模型。当SR=0.75(一个19MB的模型)时,精度稳定在86.0%,设置SR=1.0会进一步增加模型的大小,但不会提高精度。
滤波器大小的权衡
在本实验中,使用以下元参数 = 128,
= 128,, freq = 2 SR = 0.500,将
从1%变化到99%。换句话说,每个Fire模块的扩展层都预定义了1x1和3x3之间划分的过滤器数量,这里我们将旋钮从“most 1x1”到“most 3x3”。
下图显示实验结果。可以看出,使用50%的3x3滤波器后,前5位的精度稳定在85.6%,进一步增加3x3滤波器的比例会导致更大的模型尺寸,但在ImageNet上并没有提高精度。
CNN宏架构设计空间探索
受ResNet的启发,探索了三种不同的架构:
- vanilla SqueezeNet
- 一些fire模块之间简单的旁路连接的SqueezeNet
简单的旁路架构围绕fire模块3,5,7,和9的增加了旁路连接,要求这些模块学习输入和输出之间的残差功能。为了像在ResNet中实现围绕Fire3的旁路连接,将输入设置为Fire4的输入等于(Fire2的输出+Fire3的输出),+操作符是按元素添加的。这改变了应用于这些fire模块参数的正则化,并且可以提高最终的精度和/或训练整个模型的能力。
一个限制是,在简单的例子中,输入通道的数量和输出通道的数量必须是相同的;因此,只有一半的Fire模块可以进行简单的旁路连接。当“相同数量的通道”要求不能满足时,使用复杂的旁路连接。一个简单的旁路“只是一根线”,一个复杂旁路,包括一个1x1卷积层,滤波器的数量设置等于所需的输出通道的数量。注意,复杂的旁路连接会向模型添加额外的参数,而简单的旁路连接不会。
- 剩余fire模块之间复杂的旁路连接的SqueezeNet
除了改变正则化之外,添加旁路连接有助于缓解压缩层带来的代表性瓶颈。
在SqueezeNet中,压缩比(SR)为0.125,这意味着每个压缩层的输出通道比后面的expand层少8倍。由于这种严重的维数降低,只有有限的信息可以通过压缩层。然而,通过在SqueezeNet中添加旁路连接,为信息在压缩层周围流动开辟了通道。
用下图中的三种宏架构训练了SqueezeNet,并在表中比较了精确度和模型大小。在整个宏架构探索中,固定微架构,以匹配在表1中描述的SqueezeNet。
复杂和简单的旁路连接都比普通的SqueezeNet结构提高了准确性。有趣的是,简单旁路比复杂旁路提高了更高的准确度。在不增加模型大小的情况下,简单的旁路连接使top 1的准确率提高了2.9个百分点,top 5的准确率提高了2.2个百分点。