模型压缩大体上可以分为 5 种:
- 模型剪枝:即移除对结果作用较小的组件
- 模型量化:比如将 float32 降到int8
- 知识蒸馏:将 teacher 的能力蒸馏到 student上,一般 student 会比 teacher 小。我们可以把一个大而深的网络蒸馏到一个小的网络,也可以把集成的网络蒸馏到一个小的网络上。
- 参数共享:通过共享参数,达到减少网络参数的目的
- 参数矩阵近似:通过矩阵的低秩分解或其他方法达到降低矩阵参数的目的
许多实验证明,神经网络模型都是过参数化的(over-parameterized),许多参数都是冗余的,恰当的删除这些参数对模型最终的结果几乎没有影响。模型剪枝(model pruning)就是一个很好的例子。神经网络中存在很多数值为零或者数值接近零的权值,合理的去除这些“贡献”很小的权值,再经过对剩余权值的重训练微调,模型可以保持相同的准确率。对于很多神经网络来说,剪枝能够将模型大小压缩10倍以上,这就意味着可以减少10倍以上的模型计算量,结合定制硬件的计算力提升,最终可能达到更高的性能提升
模型剪枝带来的的稀疏性,从计算特征上来看非常的“不规则”,这对计算设备中的数据访问和大规模并行计算非常不友好。例如对GPU来说,我们使用cuSPARSE稀疏矩阵计算库来进行实验时,90%稀疏性(甚至更高)的矩阵的运算时间和一个完全稠密的矩阵运算时间相仿。也就是说,尽管我们知道绝大部分的计算是浪费的(90%稀疏性意味着性能提升的上限是10倍),却不得不忍受“不规则”带来的机器空转和消耗。
通过给神经网络剪枝添加一个“规则”的约束,使得剪枝后的模型更加适合硬件计算,但这种方法通常会牺牲模型的准确率和压缩比。
权值剪枝是一种非常有效的对深度神经网络引入稀疏性的方法。权值剪枝一般使用预先定义好的阈值来指导对权值的剪枝,绝对值小于这个阈值的权重将会被丢弃。完成剪枝后,模型的准确率会有所下降,通过重训练和微调剩余权重可以恢复模型的准确率。这种对每一个独立权值进行剪枝的方法称为细粒度剪枝(fine-grained pruning),这种方法可以在不损失模型准确率的情况下压缩网络模型大小。但是对于硬件计算来说,细粒度剪枝的一个缺点是将权值矩阵变成了不规则的稀疏矩阵,例如图1中最左侧的权值矩阵所示(这里我们以全连接层为例)。稀疏矩阵运算虽然需要更少的绝对计算量,但是不规则的内存访问和计算模式会增加存储访问延迟,破坏计算的并行性。后续的研究工作提出了粗粒度的剪枝方法(coarse-grained pruning),这种方法以block为剪枝对象,用block的平均值或最大值来代表整个block的重要性,例如图1示例中以2,3,4位block size。粗粒度剪枝方法使得权值矩阵更加规则,更加有利于硬件加速,但难以达到和细粒度剪枝相同的模型准确率或稀疏度(即相同稀疏度时,准确率低;相同准确率时,稀疏度低)。因此对于深度神经网络中权值的稀疏性来说,存在模型准确率和硬件加速比的权衡。“模型优化(压缩)”在实践中非常常见,已成为标准步骤
剪枝和量化混合使用能达到最佳效果
结论: large-sparse models to consistently outperform small-dense models and achieve up to 10x reduction in number of non-zero parameters with minimal loss in accuracy
参考文献:To prune, or not to prune: exploring the efficacy of pruning for model compression