今天扯扯如何减少模型所占的空间。
我认为压缩这块可以简单分为两部分分别是Pruning和Quantization,Pruning的思想是将卷积层和全连接层中的权重较小的值去掉,然后finetune恢复精度,Quantization是指将32位的浮点数量化成低比特的整数从而达到压缩和加速的目的,下面分别来说这两部分:
Pruning这块我主要试了两大类,分别是non-structured sparsity和structured sparsity两种,我在实现的时候都是加入一个mask,其大小和卷积层参数的大小相同,如果该位置的权重保留则为1,否则为0。
non-structured sparsity是指卷积层为剪枝后的权重的位置是随机的,不规律的,这部分我主要尝试了Deep Compression[1]和其改进版本Dynamic network surgery[2],Deep Compression中的Pruning很简单,计算每个卷积层中所有权重的L1 norn,然后排序,根据预先设置的稀疏度将L1 norm 较小的值去掉,然后finetune回复精度,作者论文中说可以做到无精度损失,而我在实验中发现如果想要达到无精度损失要满足较小的卷积层稀疏度和较大的全连接层稀疏度,还要注意的是finetune时卷积层和全连接层需要分开,即先固定全连接层finetune卷积层,然后在估计卷积层finetune全连接层,这样导致算法finetune时间极长,虽然能达到压缩模型参数的目的,但是没有达到加速网络的效果。
然后我又实验了Dynamic network surgery,该算法简而言之是对Deep Compression的改进,其思想是在finetune的初始阶段不断的改变mask中的值,我的理解是Deep Compres