本文主要是介绍剪枝方向文献粗读笔记_1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文献粗读:
- Channel Gating Neural Networks
- Neuron-Level Structured Pruning using Polarization Regularizer
- SCOP: Scientific Control for Reliable Neural Network Pruning
- Provable Filter Pruning for Efficient Neural Networks
- Directional Pruning of Deep Neural Networks
- Neuron Merging: Compensating for Pruned Neurons
- Storage Efficient and Dynamic Flexible Runtime Channel Pruning via Deep Reinforcement Learning
Channel Gating Neural Networks
文章1地址
提出了一个动态、细粒度、基于训练的降低计算量的剪枝方法——Channel gating。利用输入特征的“空间结构”, 通过判断输入特征中对分类结果贡献较小的区域,对该区域“关门”,跳过该区域的计算。重要性判断标准是“feature map 的导数”,导数值较小的区域被认为是不重要的。(partial sum应该是导数之和的意思吧…)
但因为这个算法是一个“即时生效”型的,就是在infer阶段进行“开关门”的,这会导致额外计算量的增加和精度下降。因此训练-找到一个合适的policy环节格外重要。
实验结果:在CIFAR10上的各种sota模型,减少 2.7-8 倍的FLOPs,减少 2-4.4 倍的off-chip memory access。和知识蒸馏方法结合,在ImageNet上,ResNet-18减少2.6倍计算量没有精度损失。并且在FPGA和ASIC上都获得了较好的加速效果。
Neuron-Level Structured Pruning using Polarization Regularizer
以往的剪枝大多基于 L 1 n o r m L1\;norm L1norm进行,但是这种方法缺少对不同神经元的“差异性”,它让所有值都趋向于0。 本文提出了 p o l i a r i z a t i o n r e g u l a r i z e r poliarization\;\;regularizer poliarizationregularizer, 能够让重要的神经元保持不变,无效的神经元趋向于0。 并且此方法无需占用普通GPU和CPU上额外的硬件资源。如下图所示,利用L1范数训练后的结果和Pola进行训练得结果差别很大。一是权重较小区域:L1没有明确的分界线,难以寻找一个较好的threshold;二十权重较大区域,pola方法对该区域保护较好。
实验表明对结构化剪枝,本文的新正则化方法效果更好,且在CIFAR和ImageNet数据集上取得了sota的效果。
SCOP: Scientific Control for Reliable Neural Network Pruning
文章3地址
已有的很多方法都有各种缺陷:通道之间的相关性可能让一些filters和features有很大的norm,但是包含的信息缺很少,这让基于范式的方法失效;输入数据的微小扰动可能造成巨大的“卷积核重要性排名变化”,这使得输入数据驱动型(上面那个channel gate,还有之前看过的manifold都是这种类型)方法失效。
本文提出的方法增加knockoff feature作为一个科学控制组,减少除了filter以外所有可能对output的影响。knockoff features的分布(图像)和real features相似,但是真实的label独立。作为对照组,发掘filter的冗余。另外,这篇文章理论上证明了knockoff data生成的intermediat feature同样也是real data的对照组。在训练过程中,将对照组和真实组一起喂给网络,两组features混合在一起,用一个可学习的比例因子进行训练。在对照组中拥有较大比例因子的filters应该倍剪去(?最后一句凭自己感觉总结的)。
实验效果(仅仅截取CIFAR-10部分):
这篇文章属实没怎么看懂。主要是不理解对照组存在的背后原理。直观上理解为:因为对照组的存在,剪枝的条件更加“苛刻”了一点,因为不仅要管自己,还要管对照组。但感觉这个方法还是有点太理想了,(属于更照顾accuracy而非pruning rate的方法?),感觉很难剪啊,不知道为啥会有这么高的剪枝率。另外这篇文章的数学推导实在太多了,很多地方连符号是啥意思都不知道…过几天可以精读一下。
Provable Filter Pruning for Efficient Neural Networks
文章4地址
提出了一种可证明的、基于采样的、输入数据驱动的去除冗余filters的方法。仅仅依靠一小部分的输入数据,就可以对filters进行显著性评分,并且构建”重要性采样分布“,越重要的filters被采样的概率越高。
提到,现在的剪枝方法大多是基于启发式的(这个”大多“有点过分了吧,很多动态的方法确实是基于启发式的,但是静态的好像也没啥启发式算法啊…),缺少对”大小“和”性能“的保证,需要繁琐重复的训练、或手动微调超参数,或极大依赖于”绝对值大小“比较法。本文提出了一个全新的卷积核重要性定义:卷积核灵敏度(filter sensitivity) ,它是由输入数据一个小batch计算得到的。本文还显示,如果采样卷积核的频率和它的灵敏度成正比,可以得到方差较小的采样方案。
最核心的应该是fiter sensitivity的提出,利用它作为“标准”,做启发式搜索,找到一个接近于全局最优的解。文章很数学,不知道有生之年能不能看懂。
Directional Pruning of Deep Neural Networks
提出了一个新的优化算法。因为SGD再训练时经常会找到一个“平缓的极小山谷”(flat minimum valley),本文提出一种全新的能在“平缓区域”找到稀疏极小值的剪枝方法。为了减少在平缓地区的计算量,本文调整了 l 1 l_1 l1近端梯度算法,能够在小学习率、经过充分训练后进行“有方向的剪枝”。
Neuron Merging: Compensating for Pruned Neurons
提出了一个新的神经元合并概念(Neuron merging),既适用于卷积层,也适用于全连接层,能够补偿因为剪枝而引起的精度下降。
首先是将原始权重分解成两个矩阵,其中一个是当前层的新权重矩阵,另一个被命名为放缩矩阵。如果激活函数为ReLU,放缩矩阵在一定条件下能被吸收进下一层。本文的神经元合并方法是一种无数据(data-free)的方法。对新权重矩阵,采用 l 1 l_1 l1范数进行压缩,放缩矩阵是通过神经元间的余弦相似性和 l 2 l_2 l2范数的比例进行构建的。
实验结果:对VGG-16和WideResNet-404,在CIFAR10数据集上分别能够以 64 % 64\% 64%和 40 % 40\% 40%的剪枝率下保持 93.16 % 93.16\% 93.16%和 93.3 % 93.3\% 93.3%的精度,并且是没有微调。
不知道怎么具体实现的,但是看着想法先定义为“扯淡”的行列。有空去看看。感觉这个channel的叠加太过于理想化了。。。
Storage Efficient and Dynamic Flexible Runtime Channel Pruning via Deep Reinforcement Learning
基于深度强化学习的剪枝策略寻找,可以找到每一层需要剪多少,应该剪哪些。另外,这篇文章还加入了“静态”的组件,就是彻底删去一些非常不重要的通道来减少参数的存储量。
提到了目前强化学习进行模型剪枝的痛点:action space太大了。对每一层,它的搜索(离散)空间都是每一层的channel数,而且不同layers的情况还各不相同。为了解决这个问题,本文设计了一个新的可以用来评估通道重要性的预测装置,再通过一个基于深度强化学习的装置来学习每个layer的压缩率。
为了实现动态灵活性和静态存储效率之间的平衡,文本提出了两种重要性方法——runtime importance 和 static importance,前者用来考察不同输入对每个通道的重要性,后者考察每个通道对所有输入数据的重要性。
实验效果(截取部分,另外为什么这里top1的准确率比top5要小啊,我晕了。。。。):
这篇关于剪枝方向文献粗读笔记_1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!