【论文笔记】Channel Pruning for Accelerating Very Deep Neural Networks

论文:https://arxiv.org/abs/1707.06168
源码:https://github.com/yihui-he/channel-pruning

本篇论文来自ICCV2017年的论文,是旷世的工作。因为之复现AMC的论文发现源码中使用了权重重构 (weight reconstruction)的方法,于是乎查了出处发现来源于这篇论文。本文的思想算是channel prune早期的idea,作者试图从channels中找到最具代表性的weight,然后使用 Lasso 回归来选择保留权重,然后重构剩下的权重使其能尽可能的还原原始的输出。

简介

CNN模型加速的方法目前可以分为三种方式
1、optimized implementation:FFT 计算层面优化,针对GPU进行一些矩阵计算的优化
2、quantization:模型量化,将float类型使用整型integer表示,例如哈夫曼编码、二值化网络…
3、structured simplification:结构简化,本文就是基于这种方式,(张量分解,稀疏连接,裁剪通道的粗粒度剪枝)
裁剪通道的方式存在一种问题,当我们对当前层裁剪之后改变了通道数量,因为要保证通道对齐,所以就会导致下一层的通道被强制裁剪,因此作者考虑使用reconstruction的方式重构权重。
在这里插入图片描述

相关工作

该章节再次介绍了这三类的CNN加速的一些代表性算法:optimized implementation,quantization ,structured simplification 在此处不进行赘述。

方法

剪枝方法分两步走
one step :使用Lasso 回归裁剪多余的通道
具体做法,当裁剪一个 c 个通道的权重时,待裁剪权重W的shape为 n ∗ c ∗ k h ∗ k w n * c * k _h* k_w nckhkw,从feature map中采样 N ∗ c ∗ k h ∗ k w N * c* k _h* k_w Nckhkw 尺寸的 X, N ∗ n N * n Nn 的 Y。其中 c’ ( 0 < = c ′ < = c 0<=c'<=c 0<=c<=c),定义列向量 β \beta β 为mask层(决定保留哪些channel)。因此为了最小化裁剪前后的误差,可将问题建模如下
a r g m i n w , β 1 2 N ∣ ∣ Y − ∑ i = 1 c β i X i W i T ∣ ∣ F 2 argmin_{w,\beta} \frac{1}{2N}|| Y-\sum_{i=1}^c \beta_iX_iW_i^{\mathrm T}||^2_F argminw,β2N1Yi=1cβiXiWiTF2
s u b j e c t   t o ∣ ∣ β ∣ ∣ 0 < = c ′ subject \ to ||\beta||_0 <= c' subject toβ0<=c
事实上这个问题属于NP-hard问题,为了便于求解论文中给等式加入了l1正则项
a r g m i n w , β 1 2 N ∣ ∣ Y − ∑ i = 1 c β i X i W i T ∣ ∣ F 2 + λ ∣ ∣ β ∣ ∣ 1 argmin_{w,\beta} \frac{1}{2N}|| Y-\sum_{i=1}^c \beta_iX_iW_i^{\mathrm T}||^2_F + \lambda|| \beta||_1 argminw,β2N1Yi=1cβiXiWiTF2+λβ1
s u b j e c t   t o ∣ ∣ β ∣ ∣ 0 < = c ′ , ∀ ∣ ∣ W i ∣ ∣ F = 1 subject \ to ||\beta||_0 <= c', \forall||W_i||_F=1 subject toβ0<=c,WiF=1

并且提出了两步走求解的方法
首先固定 W W W再求解 β \beta β,固定了W之后这个问题可以用Lasso回归解决
β L a s s o ( λ ) = a r g m i n β 1 2 N ∣ ∣ Y − ∑ i = 1 c β i Z i ∣ ∣ F 2 + λ ∣ ∣ β ∣ ∣ 1 \beta^{Lasso}(\lambda) = argmin_{\beta} \frac{1}{2N}|| Y-\sum_{i=1}^c \beta_iZ_i||^2_F+ \lambda|| \beta||_1 βLasso(λ)=argminβ2N1Yi=1cβiZiF2+λβ1
s u b j e c t   t o ∣ ∣ β ∣ ∣ 0 < = c ′ subject \ to ||\beta||_0 <= c' subject toβ0<=c
其中 Z i = X i W i T Z_i =X_iW_i^{\mathrm T} Zi=XiWiT

经过上一步求解 β \beta β后,此时可以固定 β \beta β求解W,此时问题就变成了简单地最小二乘法可以解决的了
a r g m i n w ′ ∣ ∣ Y − X ′ ( W ′ ) T ∣ ∣ F 2 argmin_{w'} || Y-X'(W')^{\mathrm T}||^2_F argminwYX(W)TF2

实验结果

作者对VGG Resnet Xception 分别在 ImageNet ,Cifar10 , 和 VOC2007数据集上进行了实验
分别于 first k 和 max response 对比有着更优秀的效果
first k 就是 ranking 截取前k个
max response 就是所谓的绝对值求和比大小排序
在这里插入图片描述
论文中使用这种裁剪方式在不同的模型和不同的任务上进行了大量的对比试验,详情可以看论文。

结论

综上所述,论文提出了一种用于减少深度学习网络的推理时间通道修剪方法。提升网络处理效率,同时保持准确性。在ImageNet、CIFAR-10和PASCAL VOC上,VGG网和类resnet网都具有令人信服的速度和准确性。
这种权重重构的方法的优势在于使用了数学工具进行了建模优化,相较于其他直接裁剪而影响下层通道的方法具备优势,重构后的权重让输出更接近原始featuremap。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码修剪卷积神经网络用于资源高效推理,是一种优化模型的方法,旨在减小模型的尺寸和计算量,从而实现在资源受限的设备上进行高效推理。 修剪是指通过删除模型中的一些参数或神经元来减小模型的复杂性。在卷积神经网络中,修剪通常包括删除一些卷积核或通道,以及减少连接权重的数量。这可以通过一些算法和技术来实现,例如剪枝算法、稀疏矩阵和低秩近似等。 修剪卷积神经网络可以带来多个好处。首先,它可以大大减小模型的尺寸,从而降低了存储模型所需的内存空间。其次,修剪可以减少模型的计算量,使得模型可以更快地进行推理。这对移动设备和嵌入式系统等资源受限的设备非常重要。此外,修剪还可以提高模型的泛化能力,减少过拟合的风险。 对于修剪卷积神经网络的代码实现,一般分为两个步骤。首先,需要训练一个初始的卷积神经网络模型。然后,通过一些修剪算法选择要修剪的参数或神经元,并将其从模型中移除。修剪的目标可以是按照权重大小或梯度大小进行选择。 在实际编程中,代码可以使用一些深度学习框架(如PyTorch或TensorFlow)来实现。这些框架通常提供了一些修剪工具和函数,以便进行参数和神经元的修剪。开发者需要根据具体的应用场景和需求来选择合适的修剪策略,并根据框架的API来实现修剪过程。 总之,代码修剪卷积神经网络是一种资源高效推理的方法,通过减小模型的尺寸和计算量,提高模型的效率和性能。这对于在资源受限的设备上进行深度学习推理任务非常有意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值