一、典型的剪枝算法分为三个步骤
1、训练(大型模型)
2、剪枝(prune)
3、微调(finetune)
二、我想提倡的观点
自动剪枝算法的价值可能在于识别高效结构、执行隐性架构搜索,而不是选择「重要的」权重
论文地址:https://openreview.net/forum?id=rJlnB3C5Ym
因为按照传统的剪枝模型
-- 首先训练一个过参数化的模型
-- 然后继承这个模型的参数,进行权重剪枝(按权重绝对值筛选)
-- finetune这个模型
但该论文作者经过实验发现:
-- 测试了 6 个当前最优剪枝算法,微调剪枝模型的性能只相当于用随机初始化权重训练剪枝模型
-- 有时甚至还不如后者" "所以作者提出一个新思路:
-- 不用典型三步流程,直接从头开始训练目标网络。
-- 我们在多个网络架构、数据集和任务上对大量剪枝算法的观察结果是一致的。结果表明:
-- 1)训练过参数化的大型模型不一定会得到高效的最终模型;
-- 2)学习大型模型的「重要」权重对于较小的剪枝模型未必有用;
-- 3)最终模型的高效率不是由一组继承的「重要」权重决定的,而是剪枝架构本身带来的,这表明一些剪枝算法的作用可以被视为执行网络架构搜索。
所以作者思路上的转变带来步骤上的转变:
-- 即是剪枝第一二步完成之后,直接重新训练这个模型
-- 而不是finetune
-- 即是prune + 重新训练 >= prune + finetune
三、目前的剪枝算法总结
文章地址:https://blog.youkuaiyun.com/librahfacebook/article/details/97285482
1、Regularization(正则化):选择正确的正则化会影响剪枝和重训练的性能。
2、Dropout Ratio Adjustment(Dropout比例调整):Dropout被广泛用于防止过拟合,也应用于重训练。
3、Local Pruning and Parameter Co-adaptation(局部剪枝和参数自适应):在重训练阶段,保留经过剪枝后的连接的初始训练阶段的权值要比重新初始化剪枝层后的要好。
4、Iterative Pruning(迭代剪枝):学得正确的连接是一个迭代的过程。每次迭代都是一个贪心搜索,我们从中找到最好的连接。
5、Pruning Neurons(修剪神经元):在剪去连接后,那些零输入或零输出连接的神经元可能被安全地修剪掉。
四、剪枝算法知识补充:决策树剪枝算法
文章地址:https://blog.youkuaiyun.com/yujianmin1990/article/details/49864813
剪枝策略
剪枝之后,对该节点的类别判别是用“大多数原则“,选择当前数据集下的最多的类标签为该节点的类别。
1)Reduced Error Pruning:误差降低剪枝
最简单粗暴的一种后剪枝方法,其目的减少误差样本数量。
剪枝的条件:f(T)⩽f(T′)f(T)⩽f(T′),即e(tK′)⩽e(tK)e(tK′)⩽e(tK)
剪枝之后使得误差降低。
2)Pessimistic Error Pruning:悲观错误剪枝
该方法基于训练数据的误差评估,因此不用单独找剪枝数据集。但训练数据也带来错分误差偏向于训练集,因此需要加入修正1/2。是自上而下的修剪。
3)Minimum Error Pruning:最小误差剪枝[1]
该方法由Niblett&Bratko1987年发明。与悲观错误剪枝方法相近,但是对类的计数处理是不同的。自底向上剪枝。
4)Error-Based Pruning:基于错误的剪枝[6]
该方法由Quinlan在1992年的C4.5算法中首次提出并使用。使用测试集来剪枝。
对每个节点,计算剪枝前和剪枝后的误判个数,若是剪枝有利于减少误判(包括相等的情况),则减掉该节点所在分支。
5)Critical Value Pruning:
该方法由Mingers1987年发明。
树的生成过程中,会得到选择属性及分裂值的评估值,设定一个阈值,所有小于此阈值的节点都剪掉。