论文:Network Slimming----阅读笔记

这篇文章利用通道稀疏化这样一个简单但很有效的方法,可以有效解决CNN网络在现实应用中部署时面临的三大挑战:

1.模型大

2.推理时占用内存开销大

3.计算量大

在这篇论文中,提出了网络瘦身,它解决了前面提到的所有挑战。方法是将L1正则化施加到BN层的缩放因子上,L1正则化推动BN层的缩放因子趋向于零,因为每一个缩放因子都和一个特定的CNN卷积通道(或者全连接层的一个神经元)相关联,这样就能够鉴别出不重要的通道或者神经元,利用这点可以进行后续的通道剪枝,另外正则化也很少损伤性能,甚至一些情况下它会导致更高的泛化准确率,剪掉不重要的通道有时候虽然会暂时降低性能,但是通过之后对剪枝网络的微调可以对精度补偿。在剪枝之后,更窄的网络会在模型大小、运行阶段的内存占用、计算量方面都会更显得紧凑。将上面的过程重复几次,就可以通过多阶段的网络瘦身获得更紧凑的模型。

related work:

1.低秩分解:“Exploiting linear structure within convolutional networks for efficient evaluation”这篇工作中使用像奇异值分解(SVD)这样的低秩近似技术,但是这种方法主要是在全连接层的表现比较好,可以将模型大小压缩3倍,但是没有明显的速度加速,因为CNN的计算量主要是来自卷积层。

2.权重量化:“Compressing neural networks with the hashing trick”这篇工作中的HashNet提出了量化网络权重,在训练之前,网络权重被分为不同的组,在每一个组内的权重共享权值。按照这种方法,只有共享的权重值和哈希索引需要被存储,因此可以节省大量的存储空间。在深度压缩中使用提高的量化技术在AlexNet和VGGNet上实现了 35x-49x 的压缩比。然而,这些技术既不能节省运行时的内存,又不能节省推理时间,因为在推理期间,共享的权重需要被恢复到原来的位置(相当于还多了个解码的过程)。

3.权重剪枝/稀疏化:韩松之前的“Learning both weights and connections for efficient neural network”这篇工作中,提出了在训练网络中剪枝掉不重要的连接关系,这样的话网络中的权重大多数变成了0,可以使用一种稀疏的模式存储模型。然而,这些方法需要专门的稀疏矩阵运算库或硬件来做加速,运行时的内存占用节省非常有限,因为产生的激活值仍然是密集的。韩松的这篇工作在训练期间没有给稀疏化任何指导,“Training sparse neural networks”这篇工作中通过给每个权重引入额外的门变量强加了稀疏约束,实现了更高的压缩比率。但是其仍然没有解决上面的缺点。

4.结构剪枝/稀疏化:目前,"Pruning filters for efficient convnets"提出了在训练CNNs时剪枝通道,然后通过微调来恢复精度;"The power of sparsity in convolutional neural networks"在训练之前,通过随机抛弃channel-wise的连接引入稀疏化,也得到了一个更小的网络;与这些网络相比,network slimming是在训练过程中将channel-wise稀疏化强加到优化目标函数中,导致了一种更平滑的通道剪枝过程和比较的小的精度损失。"Towards compact cnns"在训练期间引入神经元级别的稀疏化,因此一些神经元会被剪掉从而获得紧凑的网络。"Learning structured sparsity in deep neural networks"提出了一种SSL方法来对结构的不同层级稀疏化。这两种方法都在训练时使用了"组稀疏正则化"来获得结构稀疏化,与前面的方法不同,network slimming的方法将简单的L1稀疏化强加到channel-wise的缩放因子上,优化目标更加简单。由于这些方法都是对网络结构的(channels,neurons等)一部分做剪枝或稀疏化,而不是对个别权重,因此它们不太需要特别的库来实现推理加速和运行时的内存节省。network slimming就属于这个类别,完全不需要其他的特定库支撑。

5.神经结构学习:最先进的模型比如VGG、GoogleNet、ResNet等通常都是由专家设计的,也有一些在自动学习网络结构方面的探索,"Neural network architecture optimization through submodularity and supermodularity"在有限的资源预算下,为网络结构搜索引入了子模块/超模块;"Neural architecture search with reinforcement learning"和"Designing neural network architectures using reinforcement learning"这两篇工作提出了使用强化学习自动学习神经网络结构,这些方法的搜索空间非常大,因此常常需要从上百个模型中辨别好坏,网络瘦身可以看作是一种结构学习的方法,尽管对于每个层的宽度选择非常有限,然而,与前面的方法相比,network slimming仅通过单个训练过程就学习到网络结构,这是十分高效的。

channel-wise稀疏化的优势:正如之前讨论的,稀疏化可以在不同级别实现(weight-level,kernel-level,channel-level,layer-level)。细粒度的稀疏化(weight-level)由最高的灵活性和泛化性能,也能获得更高的压缩比率,但是它通常需要特殊的软硬件加速器才能在稀疏模型上快速推理。相反,粗粒度 layer-level稀疏化不需要特殊的包做推理加速,但是它灵活性上不如细粒度。事实上,只有深度足够深(超过50层),移除某些层才会很高效。相比之下,channel-wise稀疏化在灵活性和实现上做了一个平衡,它可以被应用到任何典型的CNN或者全连接层(将每个神经元看作一个通道),由此得到的网络本质上也是一个瘦的网络,可以在卷积CNN平台上快速推理。

challenge:实现通道稀疏化需要将和一个通道有关联的所有输入和输出的连接都剪掉。这使得在预训练的模型上修剪权重是不太有效的。比如对预训练好的ResNet做通道剪枝,在不损伤准确率的情况下,只能减少10%的参数量。"Learning structured sparsity in deep neural networks"这篇文章中通过将稀疏正则化强加到训练目标函数中,具体来讲,就是采用group Lasso来使得所有filters的同一个通道在训练时同时趋于0。然而,这个方法需要额外计算新引入的和所有filters有关的梯度项,这是一个问题。

缩放因子和稀疏性惩罚:network slimming是对每一个通道都引入一个缩放因子 [公式] ,然后与通道的输出相乘。接着联合训练网络权重和这些缩放因子,最后将小缩放因子的通道直接剪除,微调剪枝后的网络。特别地,将目标函数定义为:

preview

(x,y)是训练输入和目标,W是网络中可训练参数,第一项是CNN网络的训练损失函数,g(.)是在缩放因子上的惩罚项, λ 是两项的平衡因子。在我们的实验中,我们选择g(s)=|s|,即L1-正则化,被广泛地用于稀疏化。

剪掉一个通道的本质是要剪掉所有与这个通道相关的输入和输出连接关系,这样可以直接获得一个窄的网络,而不需要借用任何特殊的稀疏计算包。缩放因子扮演的是通道选择的角色,因为缩放因子的正则项和权重损失函数联合优化,网络自动鉴别不重要的通道,然后移除掉,几乎不影响网络的泛化性能。

利用BN层的缩放因子:BN层已经被大多数现代CNN网络采用,作为一种标准的方法来使得网络快速收敛并获得更好的性能。BN归一化激活值的方法给了我们设计一种简单高效的方法的灵感,即与channel-wise缩放因子的结合。尤其是,BN层使用mini-batch的统计特性对内部激活值归一化。 z_{in} 和 z_{out} 分别是BN层的输入和输出,B指代现在的minibatch,BN层执行下面的转换:

通常的做法是在卷积层之后插入一个BN层,引入channel-wise的缩放/平移参数。因此,我们直接将BN层的γ参数作为network slimming的缩放因子,这样做的一个优势在于没有给网络带来额外的花销。事实上,这也可能是能够学习到的最有意义的做通道剪枝的缩放因子:

       1.如果不使用BN层,而在卷积层之后加入一个缩放层,缩放因子的值对于评估一个通道的重要性没有任何意义,因为卷积层和缩放层就是一种线性变换而已。可以通过一方面降低缩放因子的值一方面方法卷积层的权重来使最终的结果保持不变;
        2.如果在BN层之前插入一个缩放层,缩放层的影响将完全被BN层所掩盖;
        3.如果在BN层之后插入一个缩放层,那么对于每个通道将会有两个连续的缩放因子;
通道剪枝和微调:引入缩放因子正则项之后,得到的模型中许多缩放因子都会趋于0。然后剪掉接近零的缩放因子对应的通道,这里说的再清楚一点,假设经过卷积之后的feature map 的维度为 h x w x c,h和w分别为特征图的高和宽,c为通道数,将其送入BN层会得到归一化之后的特征图,c个feature map中的每一个都对应一组γ和λ ,前面所说的剪掉小的γ 对应的通道实质上就是直接剪掉这个feature map对应的卷积核。至于什么样的 γ算小的呢?这个取决于为整个网络所有层设置的一个全局阈值,它被定义为所有缩放因子值的一个比例,比如剪掉整个网络中70%的通道,那么先对缩放因子的绝对值排个序,然后取从小到大排序的缩放因子中70%的位置的缩放因子为阈值,通过这样做,就可以得到一个较少参数、运行时占内存小、低计算量的紧凑网络。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值