A Main/Subsidiary Network Framework for Simplifying Binary Neural Networks_CVPR19

URL: http://openaccess.thecvf.com/content_CVPR_2019/html/Xu_A_MainSubsidiary_Network_Framework_for_Simplifying_Binary_Neural_Networks_CVPR_2019_paper.html

TL;DR

这篇论文提出了一种对二值化网络进行修剪的剪枝方法,将量化和剪枝这两个模型压缩方法结合了起来。由于是首次尝试,作者在文中进行了很多必要的定义。

Algorithm

作者实验发现,尽管量化已经大大地减少了每个权重/神经元表达能力的冗余,二值化网络在网络拓扑方面也存在着较大的冗余。
作者的设计思路如下图所示。

A Main/Subsidiary Network Framework for Simplifying Binary Neural Networks_CVPR19_第1张图片

从图中可以看出,作者的设计主要包括两部分:主网络和辅助组件。主网络是待修剪网络,辅助模块是为了得到各个卷积核的mask。

核心算法主要包含两个部分:

第一部分:主网络的特征学习

对于第i层,辅助模块的权重Mi通过随机分布进行初始化。为了实现filter修剪的目的,M这个四维tensor中,第一维索引相同的所有元素共享相同的权值(即同一个卷积核的mask共享同一个权重)

卷积核的mask 是辅助模块的输出tensor。

接下来,

1)利用对象转换函数Iden()来得到Oi,然后利用filter mask Oi来对主网络的权重Wi做掩膜,即进行对应像素点相乘。接下来将掩膜后的权重tensor与输入特征图做卷积操作。

2)固定辅助模块的权重tensor,将主网络的权重设置成可学习的。因为辅助模块是固定的且被初始化为接近零的数,因此它不会在特征学习阶段产生作用(此结论如何得出的没想太明白~~全部和0做点乘,不是把权重都变成零了嘛)。整个的二值网络将会从头开始训练。

第二部分:辅助组件的特征选择(即filter筛选)
在单独一个层中训练辅助组件:从头开始训练完主网络以后,我们利用一个二值操作来逐层筛选二值网络的特征(同时也是筛选filter)。与训练主网络不同,此时主网络的权重以及辅助组件除该层以外的其它层保持固定,辅助单元的当前层权重设置为可训练。产生卷积核mask的转换函数由Iden()变为Bin()。

通过这样一个函数,我们将浮点数Mi投影到0到1的二值化数。Oi中的元素值为0表明相应的filter被移除,为1则表明保留该filter。
由于Bin()函数是不可微的,本文在反向传播的过程中应用下面的f(x)函数来代替符号函数sign()。

除了上述转换之外,我们同时需要我们需要添加约束来防止Oi全部退化到1。于是在辅助组件中i层的训练loss函数定义为:

其中L_corss_entropy是data的loss,L_distill是公式7定义的蒸馏损失。

最后,我们固定辅助组件的j层权重和主网络第i层之前的所有层权重,重新训练第i层以后的其他主网络层(感觉这种训练方式过去复杂,不适合较深的网络。)

自下而上的逐层训练机制:

为了解决梯度不匹配以及在特征选择过程中的非整数解,接下来我们针对辅助模块提出一种以层为单位、自底向上的训练方法:越靠近输入的先训练。当第i层正在训练时,所有前面已经训练过的层参数保持固定,辅助组件被初始化为几乎为零的数(使之不影响网络训练)。这样做有以下三个优点:

1)正如公示1,本文利用STE来估计符号函数的梯度。根据链式法则,对于在i层的每一个激活节点,我们想要计算Loss函数关于该节点参数的偏导数来衡量该节点对最终误差的贡献度大小。二值化网络的误差贡献度计算如下:

其中,(3)和(5)是基于链式法则得到,(4)(6)是基于STE估计得到的,这些估计将会在反向传播过程中带来梯度误差,且越靠近输入的层,梯度误差越大。作者的这种训练机制使得具有最严重梯度不匹配问题的层是传播次数最少的,一定程度上减少了误差的传播。

2)帮助主网络更好地适应由前面的层修剪导致的特征偏移。
本文所提出的修剪方法和基于规则的修剪方法的主要不同在于,可以通过聚焦网络的最后输出来学习更加可学习的参数来适应数据。
3)逐层修剪可以获得更高的修剪率

总的来说,这篇文章的pipline如下:
1)用服从随机分布的接近于0的数来初始化辅助组件的权重;
2)设置辅助组件中的权重固定,从头训练整个网络
3)从第一层开始逐层训练。对每一层重复以下步骤进行训练。i)将辅助单元所训练的mask Mi的激活函数由Iden() 改为Bin()。除了Mi之外的其他参数保持固定。根据公式2中的loss训练辅助组件;ii)然后固定辅助组件网络的参数权重以及主网络i层之前的网络层权重,重新训练主网络第i层。

蒸馏loss
作者认为,尽管剪枝不是一个明确的迁移学习任务,但是它的目标也是引导修剪后的网络学习与原始网络具有相似分布的输出,这也有点类似于蒸馏。因此为了更好地训练辅助组件,作者在loss中加入了蒸馏loss。

最后作者还讨论了所提出方法和基于L1-norm和LASSO回归的修剪方法的关系,证明了上述两种方法在二值化网络修剪方面是不起作用的。

Experiments

由于这篇文章是第一个对二值化网络进行剪枝的,没有文章对比,所以作者自己设计了基于规则修剪的方法作为baseline,然后与所提出的方法进行对比。
作者分别在cifar10和imagenet上对VGGNet和ResNet进行了压缩实验。实验结果如下:

A Main/Subsidiary Network Framework for Simplifying Binary Neural Networks_CVPR19_第2张图片

Thoughts

这篇文章作为第一个将量化和修剪结合起来的文章,有一定的借鉴意义。不过本文所提出的算法schedule过于繁琐且耗时,不适合压缩较深的网络模型,在这方面还有可优化的空间。

你可能感兴趣的:(深度模型压缩,Paper,Reading)