Slimmable Neural Networks
简述
这篇文章主要解决的问题是:给定资源限制,如何即时、可调整地对神经网络的准确率和开销进行平衡?
为了解决这个问题,在这篇文章中作者提出了可瘦身网络(名字和之前的slim neural networks很相似,但是采用了不同的方法)。在该方法中,依据需要的准确率和容量的不同,从一簇具有不同宽度的网络中进行选择。如下图所示:
在不同的具有不同宽度的四个模型之间进行切换,四个模型之间进行参数共享,不同层中的激活通道的数目可以进行调整。将slimmale network中的一个模型变体称为一个switch
,switch
中的激活通道的数目称为width
。$0.25$表示所有层的通道数都是完整模型的$0.25$倍。
但是,如何训练这些具有不同宽度的模型呢?经验上,直接训练带有多个分支的网络会导致准确率下降0.1%左右,导致这一问题的主要原因是不同的通道数会得到不同的特征均值和方差。不同分支之间均值和方差的差异会导致共享的BN层的统计值不准确。为了解决这个问题,作者提出了一种简单但有效的方式,可切换批量归一化层(switchable batch normalization),该方法针对不同的switch
设置不同的BN参数。
实现细节
简单训练与增量训练
所谓简单训练指的是对于一个共享网络直接在不同的初始化状态下进行训练。这一方法的训练比较稳定,但是在测试集上的准确率比较低。其错误曲线如下图所示:
左侧为训练集上的损失曲线,右侧为在测试集上的错误率曲线,可以看出,简单训练的训练过程很稳定,但是在测试集上的性能就很差劲。
作者认为导致这一问题的原因在于,对于一层中的一个通道,随着上一层的特征图的通道的不同,在当前通道中的聚合特征图的均值和方差将会不同,不同的聚合特征图将被平均为一个共享的批量归一化层。当采取一层接一层的传播方式时,将会导致不准确的BN统计值。BN层的滑动平均均值和标准差只在测试时使用,训练时使用各自的BN统计值,因此训练比较稳定而测试误差较大。
作者同时调研了另一种名为增量式训练的方法,所谓增量式训练方法指的是:增量式训练方法:首先训练模型A,再在A的基础上添加参数得到A+B,在训练过程中只对B额外增加的B的参数进行微调。准确率只提升了一点,比单独训练A+B中的所有参数的准确率低。原因在于没有同时调整A和B的参数。
可切换BN(Switchable Batch Normalization,S-BN)
为了解决不同switch之间的BN层统计特性不同的问题,作者提出了可切换BN层的概念。即:针对不同的分支维持不同的BN参数。
BN层的提出是为了解决神经网络的层间协方差偏移问题,如下所示:
在训练时使用当前mini-batch的通道均值和标准差,在测试时使用所有训练数据集的均值和标准差的滑动平均值。
为了训练可瘦身网络,S-BN方法针对网络中的每一个分支都维持单独的BN层参数。在测试时,不同的分支使用各自的BN参数,结局了分支切换时的特征聚合不连续性问题。与增量式训练相比,使用S-BN方法,我们可以同时训练具有不同宽度的分支,可以对所有权重进行同时更新。
训练可瘦身神经网络
网络的训练目标是所有分支的准确率的平均值,因而使用所有分支的损失的非加权和作为损失函数。训练流程如下: