剪枝方向文献粗读笔记_1

2023-10-12 19:59

本文主要是介绍剪枝方向文献粗读笔记_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的效果。
文章2实验结果

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应该倍剪去(?最后一句凭自己感觉总结的)。

文章3实验原理
实验效果(仅仅截取CIFAR-10部分):
文章3实验结果
  这篇文章属实没怎么看懂。主要是不理解对照组存在的背后原理。直观上理解为:因为对照组的存在,剪枝的条件更加“苛刻”了一点,因为不仅要管自己,还要管对照组。但感觉这个方法还是有点太理想了,(属于更照顾accuracy而非pruning rate的方法?),感觉很难剪啊,不知道为啥会有这么高的剪枝率。另外这篇文章的数学推导实在太多了,很多地方连符号是啥意思都不知道…过几天可以精读一下。

Provable Filter Pruning for Efficient Neural Networks

文章4地址

  提出了一种可证明的、基于采样的、输入数据驱动的去除冗余filters的方法。仅仅依靠一小部分的输入数据,就可以对filters进行显著性评分,并且构建”重要性采样分布“,越重要的filters被采样的概率越高。
  提到,现在的剪枝方法大多是基于启发式的(这个”大多“有点过分了吧,很多动态的方法确实是基于启发式的,但是静态的好像也没啥启发式算法啊…),缺少对”大小“和”性能“的保证,需要繁琐重复的训练、或手动微调超参数,或极大依赖于”绝对值大小“比较法。本文提出了一个全新的卷积核重要性定义:卷积核灵敏度(filter sensitivity) ,它是由输入数据一个小batch计算得到的。本文还显示,如果采样卷积核的频率和它的灵敏度成正比,可以得到方差较小的采样方案。
  最核心的应该是fiter sensitivity的提出,利用它作为“标准”,做启发式搜索,找到一个接近于全局最优的解。文章很数学,不知道有生之年能不能看懂。
文章4原理

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范数的比例进行构建的。
文章5方法

  实验结果:对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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/198123

相关文章

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

hdu1010 奇偶剪枝

恰好t时间到达 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.Arrays;import

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi