参考链接:https://zhuanlan.zhihu.com/p/635454943
https
文章目录
1. 前言
1.1 为什么要进行模型剪枝
CNN在实际应用中的部署主要受以下几个方面制约。
1)模型大小的限制
CNN强大的表示能力来自其数百万可训练参数。这些参数以及网络结构信息需要存储在磁盘上,并在推理期间加载到内存中。例如,在ImageNet上存储一个典型的CNN会消耗超过300MB的空间,这对嵌入式设备来说是一个巨大的资源负担。
2) 运行时内存
在推理期间,CNN的中间激活/响应甚至可能比存储模型参数占用更多内存空间,即使批量大小为1。这对于高端GPU来说不是问题,但对于许多计算能力较低的应用程序来说,这是负担不起的。
3) 计算操作数
卷积操作在高分辨率图像上计算量很大。大型CNN在移动设备上处理一张图像可能需要几分钟的时间,这使得在实际应用中采用它是不现实的。
因此有必要对模型进行压缩,而满足边缘设备的AI应用。
而剪枝就是模型压缩技术的一种。(模型压缩技术:剪枝、蒸馏、量化、低秩分解等)
1.2 为什么可以进行模型剪枝
生物学启发:
生物研究发现人脑是高度稀疏的。
比如 2016年早期经典的剪枝论文就曾提到,生理学上发现对于哺乳动物,婴儿期产生许多的突触连接,在后续的成长过程中,不怎么用的那些突触就会退化消失。突触修剪从出生时就开始了,一直持续到
20 多岁。
结合深度神经网络是模仿人类大脑结构,和该生理学现象,我们可以认为深度神经网络是存在稀疏性的。
过参数化:
深度学习网络模型从卷积层到全连接层存在着大量冗余的参数,大量神经元激活值趋近于0,将这些神经元去除后可以表现出同样的模型表达能力,这种情况被称为过参数化,而对应的技术则被称为模型剪枝。
尽管大型神经网络已经无数次证明了它们的学习能力,但事实证明,在训练过程结束后,并非它们的所有部分都仍然有用。
2. 剪枝方式的几种分类
2.1 结构化剪枝 和 非结构化剪枝
- 非结构化剪枝:
将每个单独的权重置为0
。 - 结构化剪枝:
移除一组规则的权重,如layer剪枝、filter剪枝、通道剪枝
。
一般我们会用结构化,或者说粒度不是那么细致的剪枝比如砍通道,这个是已经很成熟了,可以直接拿过来用,可以直接加速并部署起来的,和你做一个小模型差不多;
非结构化是直接修改权重,这样的效果实际上部署起来会比较的麻烦,而且现有的工具链加速其实不是那么明显.
2.1.1 结构化剪枝
结构化剪枝的重点,并不是在“剪枝”,而在于“结构”。
它更像是寻找一种优秀网络结构的方法,去让自己网络适配自己的数据集,而非“剪枝”方法。
结构化修剪方法在通道或层的层次上进行修剪,不需要专用的硬件/库来实现
。
结构化剪枝则是指按照一定的结构进行剪枝
。
这种方式会改变神经网络的结构,剪枝后的网络会比原来的网络更小,更简单。
1)layer-l