现阶段神经网络在GPU上运行速度已经可以达到实时性要求,但是移植到手机端或者在CPU上运行还存在运行速度的问题。网络优化加速主要包含:1.设计轻量级的网络;2.网络模型压缩剪枝;3.其他的一些量化加速。这里主要是记录轻量级的神经网络(与模型压缩有着本质性的区别):
1.SqueezeNet:
发表于ICLR-2017,它在ImageNet上实现了和AlexNet相同的正确率,但是只使用了1/50的参数。更进一步,使用模型压缩技术,可以将SqueezeNet压缩到0.5MB,这是AlexNet的1/510。
思想比较简单,主要包含squeeze层和expand层:squeeze层通过1×1的卷积核减少输入通道的数量;expand层中,把1×1 和3×3 得到的feature map进行concat,以得到不同尺寸的卷积特征,如图:
2.Xception:
Xception是Extreme Inception的意思,主要是对 inception的改进,提出了depthwise separable convolution来代替常规卷积操作。
(1)inception v3:
(2)depthwise separable convolution:
这里的depthwise separable convolution与Mobinenet中的深度分离卷积的区别就是:顺序不同,这里是先进行1*1卷积,再进行channel wise的分离卷积操作,最后进行concat。
3.Mobilenet V1:
最大的创新点是将常规卷积层换成了深度分离卷积,大大的减少了计算量,具体深度分离卷积如图:
常规卷积:H×W×M—>N个K×K×M—>H×W×N,计算量为H×W×K×K×M×N
深度分离卷积为:H×W×M—>M个K×K×1(相当于每个卷积核只负责一个通道,然后M个通道卷积后concat)—>H×W×M—>N个1×1×K—>H×W×N,计算量为H×W×M×K×K+H×W×K×N。
网络结构如图:
主要由DW3×3+1×1conv组合,用DW3×3/S=2代替max pooling下采样。
4.MobileNet v2:
文章作者称v1版本训练的时候会出现退化的情况,这点我不是很理解,主要创新点如下:
1.使用relu6代替relu:
ReLU6 定义为:f(x) = min(max(x, 0), 6),文章解释为动态控制输出范围,可以增加模型的稳定性
2.反瓶颈的结构:
resnet结构是先用1×1的卷积进行降维到原通道数的0.25,再接一个3×3的标准卷积,最后再用1×1的卷积升维到原通道数,形成两端粗,中间细的结构;
Mobilenet V2先用1×1的卷积进行升维到原通道数的6倍,再接一个3×3的深度分离卷积,最后再用1×1的卷积降维到原通道数,形成两端细,中间粗的结构
原因作者解释为在通道数较少的情况下,深度分离卷积效果较差。
3.linear替代relu:
作者在上面结构最后一个1×1卷积后采用的linear线性激活函数,原因是作者做实验分析在通道数较少的情况下,relu函数会破坏特征。linear函数作者并未给出,我查看了一下代码,显示是直接输出特征。
4.使用残差结构,特征复用
ResNet结构的特征复用,可以很大程度上缓解这种特征退化问题,在float16精度上效果更好
所以结构如图:
5.shufflenet V1:
作者首先分析了分组卷积的优缺点,其优点就是可以有效降低卷积层的计算量和参数量。缺点是分组卷积的各个分支之间是相对封闭的,存在互相之间通信不畅的问题。
ShuffleNet的核心是采用了两种操作:pointwise group convolution和channel shuffle,这在保持精度的同时大大降低了模型的计算量。具体残差结构如上图(b)所示:
1).先使用1 * 1分组卷积代替1 * 1常规卷积
2).channel shuffle对分组卷积分支之间进行通信
3).3 * 3 DWConv + 1 * 1分组卷积
4).残差相加
6.shuffleNetV2:
作者通过大量实验,分析出来四个构建轻量级网络的指导原则:
1).同等通道大小最小化内存访问
2).分组卷积数目过多会增加MAC
3).网络碎片化会降低并行度
4).不能忽略元素级操作
作者设计结构如c图所示,其中具体操作:
- 对输入进行channel split,保证了卷积输入输出通道数一致,这点对应了原则1);
- 1 * 1常规卷积替换V1中的1 * 1分组卷积,对应了原则2);
- 最后对分离的通道进行Concat操作,对应了原则4)
7.MixNet:
作者首先在MobileNet上做了卷积核大小的实验,发现了大尺寸的卷积核效果比3 * 3更好
因此本文设计了一个混合不同大小卷积操作,具体来说,对输入通道进行分组,分别使用不同组合的卷积进行特征提取,降低了参数量的同时,提升了性能。