Slimmable neural networks

文章目标:训练一个网络,可以使用不同的深度进行推理(网络可以调整它的宽度,依据硬件条件)

1

1.1

  1. 轻量化网络 lightweight networks
  2. NAS

这些无法部署到不同的手机上去。因为手机的性能千差万别。
在这里插入图片描述

1.2

一些模型虽然提出了一些宽度乘法子,使得模型可以在acc与速度之间进行一些取舍。
缺点:不同宽度的模型需要独立测试与部署

所以引入动态神经网络的介绍

动态神经网络与数据驱动的模型是否一致呢?

比如

  1. Optimizing accuracy-efficiency trade-offs by selective execution
  2. Multi-scale dense networks for resource efficient image classification
  3. Skipnet: Learning dynamic routing in convolutional networks 与 Block Drop 这些网络可以减小深度,但是,减小深度并不能减少内存的占用,我们需要减少宽度。所以本文提出的是一个可以以不同宽度进行运算的网络

1.3

优点:

  1. 单一模型
  2. 不同设备调整

相关工作

自适应计算图

Anytime neural networks via joint optimization of auxiliary losses. arXiv preprint arXiv:1708.06832, 2017.

Stochastic downsampling for cost-adjustable inference and improved regularization in convolu- tional networks.

Convolutional networks with adaptive computation graphs.

Multi-scale dense networks for resource efficient image classification

条件正则化

Feature-wise transformations

slimmable neural network

文章说直接训练不行(训练流程和本文保持一致)
在这里插入图片描述
这是因为对于某个通道而言,它的输入通道数量是不同,导致了均值和方差的差别。

当然,他也只是想当然这么说。

不过后来,这个人做了一个有趣的实验。它使用渐进训练的方法来先训练一个A, 再在A的基础上训练B

当然,我也不知道他是怎么加上B的,是间隔插入还是拼接呢

switch BN

本文提出了一个 S-BN ,它对于不同的子网络,可以有不同的均值 方差。
文章说,BN可以将条件信息编码进入特征表示中。
Film: Visual reasoning with a general conditioning layer.
Revisiting batch normaliza- tion for practical domain adaptation.
有点:

  1. 超参数少

看到一个博文https://zhuanlan.zhihu.com/p/105064255这样写:

宽度乘子的方法非常粗糙。第一,宽度乘子的方法是一个全局参数,会把模型每一层的通道做成统一比例裁剪。然而实际上不同通道的裁剪比例是不一样的。这个观点在很多模型剪枝的工作里面都能得到印证。第二点,对于不同的宽度乘子的模型,都需要独立训练。即,model x1.0 和 model x0.75需要分别从头开始训练。这种训练方式不仅会需要更多的计算资源,各个模型的性能也还有比较大的提升空间。

细心一点可以发现,这里使用共享参数的时候,索引越靠前的参数被共享的次数越多。所有的卷积核的地位并不平等

新概念

  • switchable BN

代码实验

switchable BN

虽然说了这么多,但是也就是提出了一个 switchable BN 层而已。然后我去看了源代码 https://github.com/JiahuiYu/slimmable_networks ,结果令我更失望。所谓的 S-BN 其实就是一系列 BN 层组成一个container,然后依据特定的缩放因子选择特定的BN层。
在这里插入图片描述
可以看到,当缩放因子不同的时候,即网络宽度不同的时候,用的BN层不一样。所以也没有什么创新。

switch Conv

当我觉得s-BN层没什么创新的时候,发现还有个 switch Conv 层,这个也是一个具有宽度因子的卷积层(即可以根据宽度因子改变输出大小,改变模型宽度)。
在这里插入图片描述
它用的是这个方法,比如现将一个卷积层分依据通道为两部分:1,2。然后对于宽度因子为1(即无缩放),使用全部通道,即图中的1+2。对于宽度因子为0.5 的模型,switch Conv 层只使用1部分进行计算。这样做乍一看还是可以的,稍微是有点创新。但其实有一些问题没有解决,见下一节。

训练过程

模型是这样训练的:

  1. 先训练一个完整的resnet(下称为模型1),
  2. 然后呢,训练一个宽度因子为0.5的模型(模型0.5)。但有些问题:
    (1). 由于训练模型1 的时候使用了conv中的1和2(对应上图),但在训练模型0.5的时候,conv1改变了,而conv2没有改变。这就导致虽然你模型0.5的精度提高了,但是训练好的模型1精度反而下降了。等第二个batch时候,训练模型1时改变了conv1的值,这就导致了模型0.5的精度的下降。
    如此一来,可能出现模型1与模型0.5相互干扰的情况。
    在试验中也验证了这一现象:如果我们只训练模型1,(即宽度因子 = [1])的时候,精度高;如果我们的宽度因子为:[0.5,1],那么两个模型就会相互干扰,导致二者精度都下降。如果我们的宽度因子[0.25 0.5 1],那么干扰的情况就更加严重了,精度进一步下降。

所以这种共享参数的模型压缩方法的前提是:
1 确保不会相互干扰。
2 共享部分的训练所用的数据、策略、输入必须保持一致。(本文中输入没有保持一致)

猜你喜欢

转载自blog.csdn.net/qq_43110298/article/details/110928375