作者&编辑 | 言有三
1 精简模型设计
精简模型的设计是模型压缩中的第一步,而且是能够保证模型精度不下降的最有效的一种策略,最近我们分享了对特征图的冗余计算进行约减的GhostNet框架。
GhostNet
GhostNet是一个模型压缩框架,它基于卷积特征图中的冗余性,实现了从一个基准特征经过多次线性变换生成多个特征图从而降低计算量的操作。
作者/编辑 言有三
卷积神经网络特征图(feature map)往往具有冗余性,如下图所示:
其中同样颜色框的内容比较相似,如果我们可以找到某种办法从一个特征图产生出多个特征图,就可以大大降低计算量,因为卷积中一层的计算量与输入输出的特征通道数量成正比。
如上是一个标准的卷积过程,而下图则是我们期望的卷积过程:
与标准卷积相比,它不直接使用卷积操作得到最终的特征图输出,而是首先得到一个通道数较少的输出,这个输出被称做intrinsic feature map,它的通道数少于需要的最终特征通道数。我们假设最终输出通道数为n,而intrinsic feature map的通道数为m,则m<n。
为了得到最终的n个通道的feature map,我们需要对intrinsic feature map进行一系列线性运算,每一个输入通道都要生成s个输出通道,因此m=n/s,这s个通道之中有一个是恒等映射。线性操作通过卷积方式实现,这样的模块被称做Ghost Module(伪影模块,很形象的比喻)。
接下来我们来对比一下计算量,假设输出特征图高为h',宽为w',卷积核大小为k,输入特征通道数为c,线性操作卷积核大小为d,则正常卷积和上述的设计的理论计算量对比如下:
分母中前一项为正常卷积计算量,后一项为线性操作计算量,上式理论计算量比值约为s,这个s就是通道的压缩倍数,越大的s意味着越大的压缩。
当将其用于设计bottleneck结构时,示意图如下:
上图展示了步长分别为1和2的结构,都包含两个Ghost module,第一个用于对通道升维,第二个用于对通道降维。
下表展示了将其用于ResNet模型压缩并且与一些方法的对比,可以看出s=4时GhostNet模型性能没有降低。
在COCO数据集上与MobileNet V3的对比结果也验证了Ghost结构的泛化能力。
官方对算法进行了开源,基于Pytorch,地址为https://github.com/iamhankai/ghostnet.,感兴趣读者可以尝试。
参考文献
[1] Han K, Wang Y, Tian Q, et al. GhostNet: More Features from Cheap Operations.[J]. arXiv: Computer Vision and Pattern Recognition, 2019.
2 模型剪枝
模型剪枝是非常直观的减少参数的方法,最近我们分享了通道敏感的方案和基于几何中位数的框架。
Discrimination-aware Channel Pruning
Discrimination-aware Channel Pruning(DCP)是一个基于鉴别力感知的通道剪枝框架,它在fine-tune与剪枝阶段加入了鉴别力感知损失,使剪枝后的模型能够更好保留特征的鉴别能力。
作者/编辑 言有三
框架如上图所示,首先有一个预训练模型,然后在模型的各个阶段添加分支损失。
损失有两种,第一种是分类损失L(p,s)。第二种是特征重建损失LM,它就是剪枝后模型输出特征与基准特征之间的L2距离。
具体优化时首先将网络层均匀分为p段,每一次的剪枝都在当前段中的层进行。优化过程分为两步,假如当前是经过了剪枝后的第p-1个阶段,接下来就是第p阶段,它使用Lp层的损失L(p,s)与剪枝网络最终的分类损失Lf一起对模型进行finetune,更新第p-1阶段剪枝得到的模型,恢复模型的精度与特征鉴别力。
然后就是第p阶段的剪枝,它把特征重建误差LM和辅助损失L(p,s)一起作为优化目标,采用贪心策略完成通道的选择。选择通道的准则就是基于当前的损失权重对通道权重的梯度值,逐步增加通道直到满足停止条件,即达到预设的剪枝率或者重建误差变化在一定范围内。
下表展示了不同的剪枝率时在ImageNet上的错误率,在30%的剪枝率时性能下降不明显。
下图展示了被剪枝的通道和被保留的通道。
可以看出被保留的通道特征更加的丰富,作者们对算法进行了开源,基于Pytorch,地址为 https://github.com/SCUT-AILab/DCP,感兴趣读者可以尝试。
参考文献
[1] Zhuang Z, Tan M, Zhuang B, et al. Discrimination-aware Channel Pruning for Deep Neural Networks[C]. neural information processing systems, 2018: 883-894.
FPGM
FPGM是一个模型剪枝框架,它通过几何中位数来进行通道的剪枝。
作者/编辑 言有三
当前有很多的框架基于卷积核的范数来进行剪枝,即认为范数小的卷积核对应的特征有效信息少,不过它也有一定的局限性,如下图所示:
其一是当范数的标准差太小的时候,卷积核之间的差异其实不大,此时很难进行选择,如左图。
其二是如果最小范数值仍然很大,那么此时的卷积核被认为都是重要的,也不好去除。
本文借鉴了一个中位数概念,作者们将滤波器看作是欧氏空间中的点,并且计算出这些滤波器的“中心”,称之为几何中位数,这通过最小化所有点到它的距离和来进行计算。
得到了中位数后就按照滤波器和该中位数的距离来判断它的有效性。如果距离越近,作者们认为这些滤波器的信息跟其他滤波器的重合度更高,因此更应该被去除。
下表展示了ImageNet的实验结果:
与基准模型的对比验证了在保证准确率的前提下,FLOPS的降低细节。
参考文献
[1] He Y , Liu P , Wang Z , et al. Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration[J]. 2018.
3 硬件计算
设计硬件计算友好的算法是非常有效的模型加速算法,最近我们分享了基于移位操作的模型ShiftNet和基于纯加法计算的模型AdderNet。
ShiftNet
ShiftNet是一个模型压缩框架,它使用移位操作来代替卷积操作,大大降低了计算量。
作者/编辑 言有三
上图是它的整个框架示意图,可知道包含两个步骤,第一个是shift操作,第二个是1*1卷积。移位操作用于对通道内的特征进行提取,而1*1卷积用于融合通道之间的特征。
那么这个移位操作如何实现呢?首先我们来看标准卷积,分组卷积以及移位操作的比较。
从上图可以看出,移位操作与分组卷积有类似之处。它们都是单独对每一个通道单独做计算,对于一个输入大小为M*Df*Df的特征,其中M是通道,Df*Df是空间分辨率,它的输出大小也是M*Df*Df。假设卷积核大小为Dk*Dk,移位操作的定义如下:
其中K的计算如下:
可以看出它实际上是DepthWise卷积的特例,首先每一个通道是单独进行操作的,然后对于每一个通道,每一次移位操作中,K只有一个元素为非零,其中K ̃:,:,m的大小就是Dk*Dk,每一个通道实际上就是有Dk*Dk种移位操作。
每一个通道完全独立,一个输入通道为M的移位操作,将有(Dk*Dk)^M种操作,搜索空间太大,所以接下来我们对其进行限制。将M个通道分为(Dk*Dk)个组,组内共享移位操作,称之为一个shift group。
基于这些操作,一个标准的模块就可以建立了:
下表展示了与标准ResNet的一个对比:
与基准模型的对比验证了在保证准确率的前提下,shift操作对于参数量降低的能力。
参考文献
[1] Wu B, Wan A, Yue X, et al. Shift: A Zero FLOP, Zero Parameter Alternative to Spatial Convolutions[C]. computer vision and pattern recognition, 2018: 9127-9135.
AdderNet
AdderNet是一个去除了卷积操作中的乘法,只使用加法的模型设计思想,在分类任务上取得了逼近对应的卷积神经网络基准模型性能的效果,并降低了计算代价。
作者/编辑 言有三
卷积神经网络使用卷积核和输入特征通道进行卷积来不断地提取特征,并最终获得有鉴别力的特征来完成不同的任务。对于分类任务来说,最后完成任务依赖的就是特征之间的相似度,一个基于softmax损失的特征往往处在不同的角度区间,如上图中的右图,因此很多的改进方法都试图让这些特征在角度上拥有更好的区分度。
既然我们需要的是具有鉴别力的特征,那是不是可以使用其他的操作来代替乘法?所谓AddNet,就是将网络中的卷积乘操作全部替换成了加法(减法),而特征之间的相似度的表达就变成来下式,即直接计算L1距离即可。
它带来的效果就是,如果特征想要具有较好的鉴别力,在空间的分布就会如上图中左图,不是依赖于角度,而是在距离上分布为不同的聚集区域,这就是AddNet的思想。
它的主要问题是如何去训练和优化这样的模型,特征对滤波器F的梯度如下。
sgn代表符号函数,这样的梯度只能取若干离散的值,明显不利于模型的优化,所以它们用L2距离的导数来进行替换。
如上,这种形式的梯度直接表示为输入特征和滤波器之间的距离大小。
对输入X求导也是类似的,不过作者们对结果进行来截断如下:
作者们发现如果不对X进行截断,多层的反向传播会使得改进梯度的量级和真实梯度的量级有着很大的累计误差,导致梯度爆炸。
在一般的CNN中,如果想要网络优化过程中结果稳定,我们就希望保证每一层的输出分布相似,即激活值和状态梯度的方差在传播过程中保持不变,Xavier等优化方法都是力图保证这一点。对于AdderNet来说,它的计算如下:
由于输出方差与输入方差以及权重方差分别线性相关,所以仅通过控制权重分布无法保证每一层分布相似,因此必须借助于BN等技术。不过因为AdderNet的方差很大,而且每一层差异也较大,作者们使用每一层的梯度和神经元个数对学习率进行了归一化,即配置每一层的学习率不同,计算式子如下:
其中k就是每一层特征元素数,△L就是第l层的梯度。在ImageNet分类任务上的一个实验结果如下:
上表与二值神经网络BNN进行了对比,可知性能上有较大优势,不过作者们没有贴出实际计算效率的对比结果。
官方对算法进行了开源,基于Pytorch,地址为https://github.com/huawei-noah/AdderNet,感兴趣读者可以尝试。
参考文献
[1] Chen H, Wang Y, Xu C, et al. AdderNet: Do We Really Need Multiplications in Deep Learning?[J]. arXiv: Computer Vision and Pattern Recognition, 2019.