vacation1314
传统结构化剪枝往往分为三步走, 训练-剪枝-finetune 。
剪枝方面默认的常识是:
本文揭示了几个违背过往剪枝常识的观察:
注意,作者上述的观察都是基于结构化剪枝的。对于非结构化剪枝,只有在小数据集合上,从头开始训练可以达到和剪枝-finetune相同的精度,在大数据集合上则会失败。
为什么之前的论文实验中,从头开始训练的实验效果都没有使用剪枝之后的参数的效果好?因为想当然的思想,使得之前的在“ 从头开始训练的”实验中没有仔细选择超参数、数据扩充策略,并且也没有给从头开始训练足够的计算时间和轮次(因为作者提到从头开始训练需要更多的轮次才能得到和利用剪枝参数进行finetune类似的精度)
当然,如果已经具备了一个训练好的大模型,那么剪枝和finetune可以加快获得高效网络的时间。
常见的减小网络参数量的方法有低秩化、量化、剪枝。剪枝因为其高效卓越的表现得到了广泛的关注。
剪枝可以分为非结构化剪枝和结构化剪枝。非结构化剪枝作用在单个权重上;导致卷积核的权重参数稀疏化。结构化剪枝作用在channel层以及layer层。
这篇文章受到了一些研究剪枝特征的论文的启发。
文本则是论文2的更进一步发现, 不需要特定的初始化参数,直接从头开始训练就可以得到类似精度乃至更加优秀的高效模型。节点的连接,也就是剪枝之后的网络结构才是给高效模型带来提升的重要因素。
数据 :CIFAR-10, CIFAR-100 , 和ImageNet datasets。 ** 实验模型 :VGG、ResNet、DenseNet是剪枝论文常用的三个网络,具有较好的代表性。 ** 对比其他论文的方法 :对比了两个自动剪枝方法、4个预定义结构的剪枝方法 训练的开销 :对于从头开始训练的剪枝模型,怎么分配训练轮次合适?之前的方法都是和大模型采用相同的轮次,用Scratch-E表示;如果按照训练过程中的浮点数计算,那么一个被剪枝50%的模型,应该训练的轮次为原始模型的2倍,这种训练方式用Scratch-B表示。 在直觉上,小的模型只需要更少轮次就可以实现收敛,但是在本文的实验中,发现部分情况下,Scratch-B的训练方式是有必要的,可以提升精度.
实验的分析章节就是对简述中提到的结论的验证,这边就不展开赘述了。
对于《 Learning efficient convolutional networks through network slimming》这篇文章,采用全局剪枝的方式,根据不同的剪枝比率可以得到不同的剪枝模型。对不同的剪枝模型从头开始训练可以得到图中的蓝色曲线;采用相同的剪枝比率,但是逐层等比例剪枝(比如剪枝比率为,在上面的论文中,是网络所有层参数排序之后,减掉排序末尾的20%;而后面这种等比例剪枝,则是每层减掉20%),从头开始训练可以得到图中红色曲线。可见即使不采用剪枝之后的权重,剪枝保留的结构也是很有用的。
作者针对《 Learning efficient convolutional networks through network slimming》这篇文章进行了5次随机从头训练,发现如果指定比率剪枝,那么5次剪枝之后,每层的保留层数总是神奇的相似,这说明这个方法确实可以得到一个比较高效稳定的结构。
更进一步的实验发现, 在VGG网络上,net-slimming剪枝策略优于每层等比例剪枝,而在ResNet,DenseNet上,net-slimming剪枝策略可能不如每层等比例剪枝。 作者分析了这些网络剪枝之后的结构,发现这种结构趋向于每层等比例剪枝,这可能就是这个策略剪枝之后的效果约等于每层等比例剪枝的原因。而VGG网络每层的冗余并不是均衡的,因此剪枝策略有效。
根据net slimming算法在VGG网络上的成功结果,是否可以挖掘到一个设计网络结构的基本原则? 对于VGG网络,剪枝之后的相邻层有相似的channel数量,将相似channel数量的层分为一个stage,网络分为三个stage。将同一个stage中的平均层数作为新模型的该stage中的层数,这样得到的新网络称为 “Guided Pruning” 。 在VGG16上剪枝的模型迁移到VGG19上,这样得到的新网络称为 迁移“Guided Pruning方法 。 下图展示了剪枝算法、“Guided Pruning”、迁移“Guided Pruning方法以及每层均匀剪枝策略在不同剪枝比率(x轴是参数量,餐数量少的剪枝比率高)时的准确率。可以看到前三者的准确率大差不差。 因此不需要从头开始训练一个大的网络,可以采用迁移学习的方式从小网络直接得到一个性能还不错的更深层网络
small891227
论文: CondenseNet V2: Sparse Feature Reactivation for Deep Networks
[图片上传失败...(image-e22c5a-28)]
目前大多数SOTA卷积网络都只能应用于算力充足的场景,而低算力场景往往是多数算法落地的实际场景,所以轻量级网络的研究是十分重要的。近期有研究认为DenseNet的长距离连接是低效的,较深的层往往将早期特征认定为过时并在生成新特征时将其忽略,造成了额外的内存和计算消耗。 为了缓解这一低效的设计,CondenseNet在训练过程中根据权重动态逐步裁剪不重要的层间连接,而ShuffleNetV2则通过分支和shuffle的设计使得层间连接随着层间距离增大而减少。对于这两个网络的具体介绍,可以看看公众号之前发的两篇解读: 《CondenseNet:可学习分组卷积,原作对DenseNet的轻量化改进 | CVPR 2018》 和 《ShuffleNetV1/V2简述 | 轻量级网络》 。
[图片上传失败...(image-cf316f-28)]
尽管上面的两个改进网络都有其提升,但论文认为直接淘汰浅层特征做法过于激进,浅层特征还是可能包含对生成深层特征有用的信息。在仔细研究后,论文提出了特征重激活(feature reactivation)的概念。整体思路如图1c所示,更新浅层特征从而可以更高效地被深层特征复用。 但需要注意的是,如果直接更新全部特征会带来过度的计算量,影响整体的效率。实际上,从DenseNet的成功可以看出,大部分的特征是不需要每次都更新的。为此,论文提出可学习的SFR(sparse feature reactivation)模块,通过学习的方式选择浅层特征进行重新激活,仅引入少量计算量就可以保持特征的"新鲜"。在应用时,SFR模块可转换分组卷积,复用当前的加速技术保证实践性能。 论文基于SFR模块和CondeseNet提出了CondenseNetV2,在性能和特征复用程度上都有很不错的表现,能媲美当前SOTA轻量级网络。实际上,SFR模块可简单地嵌入到任意卷积网络中,论文也将SFR模块嵌入ShuffleNetV2进行了相关实验,效果也是杠杠的。
先定义DenseNet中的特征复用机制。假设block共 层,每层的特征输出为 , 为block输入。由于当前层会以稠密连接的形式复用前面所有层的输出, 层的复合函数会接受所有的前层特征作为输入:
[图片上传失败...(image-67b18e-28)]
在CondenseNet中, 为可学习分组卷积(LGC),用于自动学习输入的分组以及去掉不重要的连接。而在ShuffleNet中, 的输入会根据与当前层的距离进行丢弃。上面的两种网络设计倾向于丢弃冗余的长距离连接,取得了很不错的性能提升,然而这样的设计可能会阻碍高效的特征复用机制的探索。实际上,导致深层不再使用浅层特征的主要原因是特征 一旦产生就不再改变。为此,论文提出计算消耗少的SFR模块,使得过时的特征可以被廉价地复用。
对第 层引入重激活模块 ,该模块将层输入 转换为 ,用于激活前面的层输出特征。定义激活操作 为与 相加,稠密层的输入重激活可公式化为:
[图片上传失败...(image-bd7bc4-28)]
为重激活的输出特征, 层的可学习分组卷积操作 输出新特征 。此外,旧特征 会被重新激活以提高其作用。
[图片上传失败...(image-ca15be-28)]
显然,重激活所有的特征是不必要的,DenseNet的成功说明大部分特征是不需要重新激活的,而且过多的重激活也会带来过多的额外计算。为此,论文希望能自动找到需要重激活的特征,只对这部分特征进行重激活。于是,论文提出了SFR(sparse feature reactivation)模块,如图2所示,基于剪枝的方法逐步达到这个目标。
[图片上传失败...(image-89be7d-28)]
重激活模块 包含卷积层、BN层和ReLU层,卷积核的权值矩阵 的大小表示为 , 和 分别表示输出维度和输入维度。将 模块的输入 分成 组,权值矩阵 也随之分为 组 ,每个的大小变为 。注意这里的分组不是将卷积变为分组卷积,只是为了方便稀疏化而进行的简单分组,计算量和参数量没改变。为了将重激活连接稀疏化,定义稀疏因子 (也可以每组不同),使得每组在训练后只能选择 个维度进行重激活。 在训练期间,每个 中的连接方式由 个二值掩码 控制,通过将对应的值置零来筛选出 中不必要的连接。换句话说,第 组的权值变为 , 为element-wise相乘。 SFR模块参考了CondenseNet的训练方法进行端到端训练,将整体训练过程分为 个稀疏阶段和最终的优化阶段。假设总训练周期为 ,则每个稀疏阶段的周期数为 ,优化阶段的周期数为 。在训练时,SFR模块先重激活所有特征,即将 初始为全1矩阵,随后在稀疏阶段逐步去掉多余的连接。在每个稀疏阶段中, 组内重激活 输出的重要程度通过计算对应权值的L1-norm 得到,将每个组中重要程度最低的 个输出(除掉组内已裁剪过的)裁剪掉,即将 输出对应的 组权值 设为零。如果 输出在每个组中都被裁剪了,则代表该特征不需要重激活。在训练之后,每组输入只更新 比例的输出, 的值越大,稀疏程度越高。
[图片上传失败...(image-2a01c2-28)]
在测试阶段,SFR模块可转换为标准分组卷积和index层的实现,这样的实现在实际使用中可以更高效地计算。如图3所示,转换后的分组卷积包含 组,输出和输入维度为 。在分组卷积产生中间特征后,index层用于重排输出的顺序,从而获得 。在排序时,需要将相同序号的中间特征相加再进行排序。
[图片上传失败...(image-c66174-28)]
基于提出的SFR模块,论文在CondenseNet的基础上改造出CondeseNetV2的新稠密层,结构如图4右所示。LGC层先选择重要的连接,基于选择的特征产生新特征 。随后SFR模块将 作为输入,学习重激活过时的特征。跟CondenseNet一样,为了增加组间交流,每次分组卷积后面都接一个shuffle操作。从图4的结构对比可以看出,CondenseNet和CondenseNetV2之间的差异在于旧特征的重激活,CondenseNetV2的特征复用机制效率更高。
[图片上传失败...(image-ea02d2-28)]
CondenseNetV2沿用了CondenseNet指数增长以及全稠密连接的设计范式,加入了SFR-DenseLayer。结构图表1所示,SE模块和hard-swish非线性激活依旧使用。表1展示的是参考用的基础设计,调整的超参数或网络搜索可以进一步提升性能。
[图片上传失败...(image-fc72d1-28)]
SFR模块可嵌入到任意CNN中,除了CondenseNet,论文还尝试了ShuffleNet的改造。改造后的结构如图5所示,论文称之为SFR-ShuffleNetV2,仅应用于非下采样层。
[图片上传失败...(image-9aa6cb-28)]
对不同层的卷积核权值进行可视化,纵坐标可认为是来自不同层的特征。可以看到,CondenseNet更关注相邻层的特征,而CondenseNetV2则也会考虑较早层的特征。
[图片上传失败...(image-e4be2f-28)]
通过卷积核权值之和直接展示了层间的关联层度,进一步展示了CondenseNet对较早层的复用程度较高。
[图片上传失败...(image-bce011-28)]
不同参数下的准确率对比,其中图b的 即CondenseNet。
[图片上传失败...(image-c06fc-28)]
论文提出了三种不同大小的CondenseNetV2,参数如表2所示,而ImageNet上的性能对比如表3所示。
[图片上传失败...(image-35bc99-28)]
在ImageNet上对比各模块的实际提升效果。
[图片上传失败...(image-65fc74-28)]
与SOTA模块在ImageNet上进行对比。
[图片上传失败...(image-745308-28)]
在端侧设备上进行推理速度对比。
[图片上传失败...(image-cc685b-28)]
CIFAR数据集上的网络对比。
[图片上传失败...(image-6adad1-28)]
作为检测主干网络的性能对比。
论文提出SFR模块,直接重新激活一组浅层特征来提升其在后续层的复用效率,而且整个重激活模式可端到端学习。由于重激活的稀疏性,额外引入的计算量非常小。从实验结果来看,基于SFR模块提出的CondeseNetV2性能还是很不错的,值得学习。
狗在形态上的多样性,似乎说明它们不可能拥有同一个祖先,就连伟大的生物学家达尔文也是这样认为。他曾经对狗的来历作过研究,并有如下的叙述:“……关于全世界的狗类,我
去年,“四川大学华西临床医学院 2019 届毕业生发表 46 篇 SCI 文章”引起热议,在过去近一年之后,近日,这个话题再度被提起。 我发现,当事人 邓
现在很多人不办ETC是因为觉得ETC的便利性有限,不知道ETC除了高速收费还有其他便利性。觉得ETC的用处不大,不愿意去做。高速跑得少,没必要办。 许多人不办,
梦想,一个很美丽的词语,为梦想付出了那么多,很多人会说不值得。但是,等到成功的那一刻,什么付出都值得了!以下是我为大家整理有关梦想的议论文,欢迎参阅! 梦想的议
来源:zhidao.baidu.com/question/495899995864459564.转帖来的文章,虽然很长,但我还是希望来看的人能认真仔细的看完。也