1. 摘要
最近关于深度卷积神经网络的研究都集中在提高准确率上,对于准确率在同一个水平的网络,更小的网络结构至少有三个优点:1. 在分布式训练的时候需要更少的跨服务器通信;2. 从云端导出新模型到自动驾驶汽车上需要更小的带宽;3. 在 FPGA 等其它硬件内存有限的情况下更容易部署。
作者提出了一个称之为 SqueezeNet 的网络结构,可以达到和 Alex-Net 同等水平的准确率但参数量却减少了 50 多倍。再应用模型压缩技术,作者甚至可以将 SqueezeNet 压缩到小于 0.5 MB。
2. 相关工作
我们的目标是设计一个网络,参数量尽可能少,同时要保证模型的准确率。
一种方法就是对现有的网络以一种无损的方式进行压缩,已经提出的方法有:对预训练好的模型进行 SVD 分解,网络剪枝、量化和和霍夫曼编码等。
网络设计方面,随着网络的加深,我们没有办法手工选择每一层网络的卷积核大小,所以提出了 Inception 模块来结合不同大小的卷积核。而不同层之间的连接,残差网络 ResNet 和 Highway Networks 则给出了各自的方式,其中残差网络中针对特征图通道数是否相同设计了两种策略。
3. 网络结构
3.1. 设计策略
- 用 1×1 的卷积核来替换 3×3 大小的,这样可以减小 9 倍的参数
- 减少输入到 3×3 卷积核的特征通道数
- 在网络后期进行下采样以便卷积层有较大的激活特征,这样做的目的是提高分类准确率
3.2. Fire 模块
为了应用上面的三个策略,作者设计了一个 Fire 模块来作为网络结构的基本块,其细节如下图所示。
一个 Fire 模块包含:一个只有 1×1 卷积核的挤压卷积层(squeeze)和一个混合 1×1 和 3×3 卷积核的扩展卷积层(expand)。其中,挤压层 1×1 卷积核的数量为 \(s_{1x1}\),扩展层中 1×1 卷积核的数量为 \(e_{1x1}\),3×3 卷积核的数量为 \(e_{3x3}\)。它们三个都是可调的超参数,为了减少输入到 3×3 卷积核的输入特征通道数,我们要求 \(s_{1x1}<e_{1x1}+e_{3x3}\)。
这里的扩展卷积层,作者是通过分别进行一个 1×1 的卷积和 3×3 的卷积,然后将它们的输出特征拼接在一起来实现的。
3.3. SqueezeNet 网络结构
如上图中最左边所示,SqueezeNet 以一个标准的卷积层开始,然后是 8 个 Fire 模块,最后再以一个卷积层结束。步长为 2 的池化分别跟在第一个卷积层、 第 4 个 Fire 模块、第 8 个 Fire 模块和最后一个卷积层后面。
中间的网络结构在特征图通道数相同的 Fire 模块之间引入了残差网络中的跳跃连接,而最右边的网络结构在中间结构的基础上,针对特征图通道数不一样的情况,通过一个 1×1 的卷积来调整通道数一致后再相加。
3.4. 其它细节
- 扩展卷积层的 3×3 的卷积采通过补零来保证和 1×1 的卷积输出特征图大小一致
- 挤压卷积层和扩展卷积层都采用 ReLU 作为激活函数
- 最后一个 Fire 模块也即 fire9 后面有一个比率为 50% 的 Dropout 层
- 没有全连接层,最后一个卷积层后的特征图大小为 1×1×1000
- 学习率开始于 0.04 然后在训练过程中线性减小
每一层的详细参数如下表所示:
4. 进一步压缩
现在我们有一个问题,小的模型可以压缩吗?或者说小的模型是否需要所有的密集浮点计算来保证模型的表示能力?
可以看到,原始的 SqueezeNet 模型在参数量较小的情况下准确率已经追平甚至超越了 Alex-Net。经过进一步压缩后,模型的大小甚至比 Alex-Net 小了 510 多倍,但其准确率却依然没有降低。这说明我们的小模型也仍然有进一步压缩的潜力。
5. 超参数选择
针对 8 个 Fire 模块的 24 个超参数,作者设计了一个策略来同时控制它们。定义 \(base_e\) 为第一个 Fire 模块中扩展层中的卷积核数量,然后,每经过 \(freq\) 个 Fire 模块,我们对扩展层中的卷积核数量增加 \(incr_e\) 。换句话说,针对第 \(i\) 个 Fire 模块,扩展层中的卷积核数量为 \(e_i=base_e+incr_e*\lfloor\frac{i}{freq}\rfloor\)。
在每个 Fire 模块中,扩展层中有 1×1 和 3×3 大小的卷积核,定义 \(e_i = e_{i,1x1}+e_{i,3x3}\),\(pct_{3x3}\) 是其中 3×3 大小卷积核的比例。也就是说,\(e_{i,3x3} = e_i*pct_{3x3}\),\(e_{i,1x1} = e_i*(1-pct_{3x3})\)。
最后,通过定义挤压比(Squeeze Ratio)来确定挤压层中 1×1 大小卷积核的数量,\(s_{i,1x1} = SR*e_i\)。针对前面的 SqueezeNet,作者采取的参数为,\(base_e=128, incr_e=128, pct_{3x3}=0.5, freq=2, SR=0.125\)。
通过固定参数 \(base_e=128, incr_e=128, pct_{3x3}=0.5, freq=2\),作者针对挤压比训练了一系列模型,效果如上图左边所示,可以看到,提升 SR 还能将准确率进一步提升,\(SR=0.75\) 是一个最高点。
通过固定参数 \(base_e=128, incr_e=128, SR=0.5, freq=2\),作者针对 \(pct_{3x3}\) 训练了一系列模型,从设置扩展层几乎全是 1×1 的卷积核到几乎全是 3×3 的卷积核。效果如上图右边所示,可以看到,\(pct_{3x3}=0.5\) 是一个最高点,进一步提高 3×3 卷积核的比例只会增大模型大小而没有提升准确率。
6. 引入跳跃连接
图 2 中间的网络结构没有引入额外的参数,而右边的结构引入了 1×1 卷积的额外参数。引入跳跃连接后,模型的准确率都有所提升,而且中间简单的跳跃连接反而取得了最好的效果。