深度学习模型网络学习之移动网络

1. SquezeeNet

标题 SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE
作者团队,发表时间 伯克利&斯坦福 ICLR-2017
文章解决的问题 如何设计网络使得模型变小精度不降低
解决的方案 依据三条设计准则设计fire模块,加入bypass,模型压缩
实验与结果 1.数据库: ImageNet
2. 训练参数: dropout为0.5,补零padding为1,初始学习率为0.04
3. 训练策略:
4.Result:模型比AlexNet小510倍,精度略有提升
总结

1.1 论文导读

小型网络模型的优点:

  • 有利于分布式训练,减少数据交换量
  • 模型变小,对客户端的更新更便捷
  • 更容易在FPGA上进行部署

相关工作:

模型压缩:SVD,Network Pruning,quantization,huffman encoding
CNN 微架构:LeCun(5x5),VGG(3x3),NIN(1X1),Inception module,ResNet Module
CNN宏观架构:Deeper(VGG),ResNet,bypass connections

三条设计准则

  • 将3x3的filters替换成1x1
  • 减少3x3滤波器的输入通道数
  • 延迟和减少下采样以获得更多**map,即网络前期尽量使stride为1

SquezeeNet

深度学习模型网络学习之移动网络
如上图所示,Fire module分为两个模块,squeeze模块由S1x1个1x1大小的滤波器组成,呼应设计准则1,expand层由e1x1个1x1大小的滤波器和e3x3个3x3大小的滤波器构成,同时保证S1x1 < e1x1+e3x3,呼应设计准则2

深度学习模型网络学习之移动网络
具体网络设计如上图(左边的模型),模型间很少采用pooling层,呼应设计准则3
在fire9之后有dropout为0.5,补零padding为1,初始学习率为0.04

SquezeeNet的压缩

使用韩松的Deep Compression 算法,采用6-bit的参数量化和33%的稀疏,最终模型大小为0.47MB (510×
smaller than 32-bit AlexNet),并且算法准确度并没有损失。

SquezeeNet宏观模型调优

如figure2所示,有三种模型,普通SquezeeNet,加入简单的bypass的SquezeeNet,加入复杂的bypass的SquezeeNet,简单的bypass是将值进行直接相加,并没有增加通道数,而复杂的bypass则通过加入若干个1x1的卷积核实现通道数的增加,增加了信息量,在一定程度上可以弥补S1x1模块造成的信息减少,但是结果证明,简单的bypass的SquezeeNet反而效果最好,这一点作者估计也是懵逼吧!

SquezeeNet微观模型调优

超参数SR(S1x1/(e1x1+e3x3)), pct (e3x3/(e1x1+e3x3) , base_e为第一个fire module的ei数值
深度学习模型网络学习之移动网络
最终实验选择:
basee = 128, incre = 128, pct = 0.5, freq = 2, and SR = 0.125

2. MobileNet

2.1 MobileNet V1

标题 MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
作者团队,发表时间 Google CVPR-2017
文章解决的问题 如何设计网络使得模型变小精度不降低
解决的方案 deepwise分离卷积层,所有层后都会做BN和Relu,减少卷积层数,减小输入图片大小,
实验与结果 1.数据库: ImageNet,COCO等
2. 训练参数: dropout为0.5,补零padding为1,初始学习率为0.04
3. 训练策略:RMSprop,模型小不做数据增强,不做或者较小的正则化
4.Result:模型比AlexNet小510倍,精度略有提升
总结 MobileNet应用广泛,包括Large Scale Geolocalizaton, Face Attributes,Object Detection,Face Embeddings

2.1.1 论文导读

deepwise分离卷积层

将传统的卷积层N个DxDxM分解为两个卷积:M个DxDx1,N个1x1xM,减少了参数量,并减少了八到九倍的计算量!
深度学习模型网络学习之移动网络

网络架构

每个deepwise分离卷积层间都有relu和BN计算
深度学习模型网络学习之移动网络
深度学习模型网络学习之移动网络
深度学习模型网络学习之移动网络

Width Multiplier : 更瘦的网络

定义一个超参数卷积宽度乘法因子a,参数取值为0.25,0.5,0.75,1,减少卷积的个数,这样做能减少a2的参数量与计算量:
深度学习模型网络学习之移动网络

Resolution Multiplier : 通过缩小图片减少特征

定义一个超参数分辨率乘法因子p,p取值为0~1,具体输入图像分辨率为128,160,192,224。
深度学习模型网络学习之移动网络

Fine Grained Recognition:

**训练技巧:
1. 用噪声较大的大数据库进行pretrain,然后用精确的小数据库进行finetune!
2. 利用较大规模精确度较高的模型网络的结果数据进行训练,这样的好处在于数据量可以无限大,且训练时不太需要考虑正则化!

2.2 MobileNet V2

标题 MobileNetV2: Inverted Residuals and Linear Bottlenecks
作者团队,发表时间 Google CVPR-2018
文章解决的问题 如何设计网络使得模型变小达到mobile设备的实时性
解决的方案 通过引入Inverted residuals block,将block改成梭形;在channel少的block最后层不做relu以提高准确率
实验与结果 1.数据库: ImageNet,COCO等
2. 训练参数: standard weight decay:0.00004 learning rate:0.045, learning rate decay rate of 0.98 per epoch
3. 训练策略:RMSprop, decay and momentum:0.9,standard weight decay:0.00004
4.Result: MobileNetV2可提高ImageNet中的分类精度,大幅提 高目标检测效率(SSD:20倍,YOLOV2:10倍)
总结

2.2.1 论文导读

Linear Bottlenecks

作者认为,对于神经网络某层的输入,我们可以将其中感兴趣的信息(manifold of interest)映射到低维子空间,并得出:
1. 经过relu后要是感兴趣的信息都非零,就意味着其仅仅是经过了一个线性变换;
2. 要想保持感兴趣的输入完整信息,就必须要让输入感兴趣的信息位于输入空间的低维子空间
作者发现,使用relu最完美的情况在输入的感兴趣信息全部包含在其**区域,因此可以完整保留下来。但现实可能并非那么理想,因此在通道较少的情形使用relu可能有害,通道较多的情形因为存在信息的重复,所以适宜使用relu。

Inverted residuals

作者认为低维度的卷积层足以表达感兴趣区域,而高维度的卷积层表达其中的细节,因此提出将传统的残差块交换一下卷积次序,设计成中间粗两边细的梭形,利用这种设计将感兴趣信息和细节区分开来(allows to separate the network expressiviness (encoded by expansion layers) from its capacity (encoded by bottleneck inputs)),从而达到提高准确率,降低参数数目的目的,如下图:
深度学习模型网络学习之移动网络

网络结构

Bottleneck residual block结构:
深度学习模型网络学习之移动网络
relu6指的是将结果限定在0-6区间上,这样float16可以更好的表示参数!
整体网络结构:
深度学习模型网络学习之移动网络

3. ShuffleNet

标题 ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
作者团队,发表时间 Face++ CVPR-2017
文章解决的问题 1x1卷积运算量太大
解决的方案 使用group convolution减少运算量,使用shuttle channel解决group convolution造成的边效应
实验与结果 1.数据库: ImageNet,COCO等
2. 训练参数: 学习率衰减1e-4,线性衰减,少量的尺度增强,batch size:1024,3x10^5次迭代训练
3. 训练策略:RMSprop,模型小不做数据增强,不做或者较小的正则化
4.Result:模型比AlexNet小510倍,精度略有提升
总结

3.1 论文导读

近期工作方向

  • 有效的模型设计
  • Group Convolution:group convolution(AlexNet) and depthwise separable convolution(MobileNet)
  • 模型加速:剪枝,量化,因式分解,利用FFT加速卷积运输
  • Channel Shuffle Operation:在group convolution后将通道打乱

方法

1. 在Group Convolutions后将交换通道顺序

作者发现使用 1x1卷积层(pointwise convolutions)运算量特别大,但是使用Group Convolution减少其运算量时group之间会出现边效应,所以引入channel shuttle的概念,将通道顺序重新排列,如下图所示:
深度学习模型网络学习之移动网络

2. ShuffleNet Unit

ShuffleNet Unit为下图的b,c子图,主要变化是将普通的1x1的卷积层进行分组计算,随后将重新排列通道顺序,stride=2的网络也略有不同!这样设计网络的好处可以大大减少运算量,但参数数量并没有发生变化,所以网络全部采用ShuffleNet Unit效果不一定理想,只在关键层使用!
深度学习模型网络学习之移动网络

3. Network Architecture

深度学习模型网络学习之移动网络

知识拓展:
CNN中千奇百怪的卷积方式大汇总

4. Xception

标题 Xception: Deep Learning with Depthwise Separable Convolutions
作者团队,发表时间 Google CVPR-2017
文章解决的问题 优化Inception模型
解决的方案 结合depthwise separable convolution,将1x1卷积结果的通道分块给3x3卷积
实验与结果 1.数据库: ImageNet,JFT等
2. 训练参数: 学习率衰减1e-5,
3. 训练策略:RMSprop
4.Result:模型大小比Inception V3相同,精度有明显提升
总结 Xception module可以进一步优化

4.1 论文导读

Inception的概念

Inception module的思想是将空间相关性和跨通道连接进行解耦,通过先进行1x1的卷积操作,然后进行3x3或者5x5的卷积操作,达到减少运算量和参数数量的目的!
深度学习模型网络学习之移动网络
进一步将Inception进行极致优化,变成先一次1x1的卷积,对结果进行分块,输入给3x3的卷积层!
深度学习模型网络学习之移动网络

depthwise separable convolution与Inception module的区别:

  • Inception module先进行1x1的卷积操作,depthwise separable convolution最后进行
  • Inception module每一层都会有**函数,这是至关重要的,猜想应该是能提升模型的非线性表达能力
  • depthwise separable convolution会将宽高进行解耦计算,举个栗子,将5x5的计算分解为5x1和1x5

The Xception architecture

深度学习模型网络学习之移动网络

Xception是基于这样的假设:在特征图中,空间相关性和通道相关性可以完全解耦!
Xception的结构实质上是depthwise separable convolution layers和残差连接的线性组合。depthwise separable convolution layers即figure4所示。

实验

训练参数:

On ImageNet:
– Optimizer: SGD
– Momentum: 0.9
– Initial learning rate: 0.045
– Learning rate decay: decay of rate 0.94 every 2 epochs
On JFT:
– Optimizer: RMSprop [22]
– Momentum: 0.9
– Initial learning rate: 0.001
– Learning rate decay: decay of rate 0.9 every 3,000,000 samples

dropout : 0.5
weight decay:L2 regularization) rate of 1e −5

结果:

深度学习模型网络学习之移动网络

实验证明:
1. 在逻辑回归层前加入全连接层能提高分类准确率
2. 残差连接的引如能加快网络收敛,提高分类准确率
3. 不使用**函数反而能加快网络收敛,提高分类准确率,这与Szegedy大神的结论相悖,作者认为Xception网络中3x3
的卷积输入通道变少(因分块,figure4所示),使用**函数反而会丢失信息!