由于我们的深度学习模型都部署在移动端,所以本篇就来总结一下深度学习模型压缩的方法。
相对于服务器,移动端的存储空间、计算资源都非常有限,但是深度学习本身的特点,参数量大,模型复杂,导致深度学习在移动端的部署非常非常困难。因此深度学习模型的压缩和加速是深度学习研究领域一个重要的分支。
深度学习模型压缩和加速主要有以下几个方向:更小更快的网络结构设计、模型裁剪以及核稀疏化、量化、Low-rank分解、知识蒸馏。
- 更小更快的网络结构设计
很多时候我们用vgg、resnet等大型网络跑完模型,如果要部署在计算能力不足的客户端,我们往往会把这些网络换成更小更快、但特征提取的效果也不会下降太多的网络,比如mobileNet(v1、v2、v3)、shuffleNet(v1、v2)、squeezeNet等。 - 模型裁剪以及核稀疏化
结构复制的模型有比较好的性能,但是参数也存在冗余,因此对于训练好的模型,可以对模型中不重要的连接和神经元进行裁剪。那么问题就变为什么样的连接和神经元是不重要的呢?其实我们思考一下,网络结构是由一层一层的神经元通过有权重的边连接的,如果有些权重比较小,对于下一层的神经元的影响就比较小,我们可以认为这样的边是不重要的。而核稀疏化,是在训练过程中,对权重的更新加以正则项进行诱导,使其更加稀疏,使大部分的权值都为0。 - 量化
我们可以通过各种模型压缩的方法对模型进行压缩优化,但是很多时候,对于移动端的算力来说还是会有点吃力,因此对于移动端的推理运算,我们往往还要做量化操作,最普遍的就是float32量化成int8的操作。当然还有二值化等量化方法,但没有int8量化常用。 - Low-rank分解
Low-rank分解有很多种,如cp分解、svd分解、tucker分解、张量列分解。它们的主要思想都是通过参数矩阵的分解达到减少计算量的目的。 - 知识蒸馏
知识蒸馏的主要思想是把一个大模型的性能迁移到一个小模型上。通过已经训练好的大模型的指导,来指导小模型的训练,使小模型的训练可以达到跟大模型接近的性能。
接下来的文章会按照以上综述分别介绍各个方向具体的方法。