深度学习网络模型从卷积层到全连接层存在着大量冗余的参数,大量神经元激活值趋近于0,仅仅只有少部分(5-10%)权值参与着主要的计算. 将这些神经元去除后可以表现出同样的模型表达能力,这种情况被称为过参数化,而对应的技术则被称为模型剪枝。
下面看一下谷歌的论文《To prune, or not to prune: exploring the efficacy of pruning for model compression》给出的两个经典网络稀疏化前后的效果对比.
上面两个图分别展示了经典的MobileNet和InceptionV3在参数稀疏化后依然可以保持不错的性能, 所以模型剪枝是非常必要的. 它能帮助我们获得一个更简单,更高效的模型. 从而减小模型对于计算空间和时间的消耗。
根据粒度的不同,至少可以粗分为4个粒度。
细粒度剪枝(fine-grained),向量剪枝(vector-level),核剪枝(kernel-level) 方法在参数量与模型性能之间取得了一定的平衡,但是网络的拓扑结构本身发生了变化,需要专门的算法设计来支持这种稀疏的运算,被称之为 非结构化剪枝。
而滤波器剪枝(Filter-level) 只改变了网络中的滤波器组和特征通道数目,所获得的模型不需要专门的算法设计就能够运行,被称为结构化剪枝。除此之外还有对整个网络层的剪枝,它可以被看作是滤波器剪枝(Filter-level)的变种,即所有的滤波器都丢弃。
模型剪枝的步骤如下:
第一步:训练一个基准模型。
第二步:去掉一些不重要的连接,得到剪枝后的网络。
第三步:对剪枝后网络进行微调以恢复损失的性能,然后继续进行第二步,依次交替,直到满足终止条件,比如精度下降在一定范围内。
一般连接重要性可以使用这个连接的权重大小来判断, 这种方式比较简单, 而且比较主观.
更好的方式是基于优化目标,根据剪枝对优化目标的影响来对其重要性进行判断, 以最优脑损伤(Optimal Brain Damage, OBD)方法为代表,Optimal Brain Damage首先建立了一个误差函数的局部模型来预测扰动参数向量对优化目标造成的影响。通过这个局部模型找到一个参数集合,使得删除掉这个参数集合之后损失函数E的增加最小.
第二个问题是剪枝性能的恢复, 一般使用重训练的方式恢复.
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。