深度学习模型压缩加速

1、剪枝

(1)Deep Compression这篇文章(Stanford的Song Han)

如图 1所示,剪枝需要三个步骤,首先是训练一个普通的神经网络;然后我们选择一个阈值,将权重小于阈值的连接剪开,这样就得到一个稀疏连接的网络了(图 2);剪枝后网络性能肯定会下降一些,所以最后我们对这个稀疏网络进行再训练,将性能提上去。对AlexNet,剪枝可以减少9倍的参数,对VGG-16网络,剪枝能减少13倍参数数量。
深度学习模型压缩加速_第1张图片

(2)Pruning Filters for Efficient Convnets

作者提出了基于量级的裁剪方式,用weight值的大小来评判其重要性,对于一个filter,其中所有weight的绝对值求和,来作为该filter的评价指标,将一层中值低的filter裁掉,可以有效的降低模型的复杂度并且不会给模型的性能带来很大的损失,算法流程如下:
深度学习模型压缩加速_第2张图片

裁剪方式如下:
深度学习模型压缩加速_第3张图片

在裁剪的时候同样会考虑每一层对裁剪的敏感程度,作者会单独裁剪每一层来看裁剪后的准确率。对于裁剪较敏感的层,作者使用更小的裁剪力度,或者跳过这些层不进行裁剪。目前这种方法是实现起来较为简单的,并且也是非常有效的,它的思路非常简单,就是认为参数越小则越不重要。

2、网络结构优化

SqueezeNet网络的思路是从网络结构的设计入手,通过设计更小的卷积核来减少模型的参数个数。事实上,这些年来,不论是最早的Alexnet,还是最新的152层残差网络,基本上用的都是3*3大小的卷积核了,感觉已经没法再小了,再小就没有邻域卷积效果了,但SqueezeNet发现其实还可以再压一压。
SqueezeNet采用以下三个原则继续压缩网络:
1) 采用1*1的卷积核替换3*3的卷积核,当然不是全部替代,而是替换一部分,显然用1*1的卷积核替换3*3的卷积核;
2) 减小输入3*3卷积核图像的通道数量,比如某一个3*3卷积层输入图像是20个通道的,输出图像是n个通道,那么卷积核需要20*3*3*n个参数,现在如果我把这个输入图像先用1*1的卷积核变成5通道的,再送入3*3的卷积层,参数就能减少很多。
3) 尽量延后降采样操作(降采样包括pooling 和卷积时的stride),因为过早降采样实际上是丢掉了一些信息,后面的输出特征值会变小,通过延后stride、pooling来提高网络精度是何凯明、孙剑研究过的。
可以看出,前两个原则是为了尽可能减少网络参数,第三个原则是在限定的参数下,尽可能提高网络性能。具体而言,文章用一个称为“fire”的基础结构(图 7)去替换传统网络结构中的3*3卷积核,fire模块是一个两层结构,先是一层squeeze层由3个1*1的卷积核组成,然后是一个expand层,由4个1*1的卷积核和4个3*3的卷积核组成。Squeeze层卷积核数量比expand层少,正是为了将图像通道数变少,这样expand层即使有一些3*3的核,参数数量也不会很多,这是原则2的应用。
在不损失精度的情况下,文章将AlexNet原先240M的参数压缩到了4.8M,压缩了50倍,如果再用上Deep Compression的方法对权重值进行压缩,可以进一步压缩到0.47M,整整压缩510倍。
深度学习模型压缩加速_第4张图片

3、矩阵运算角度量化

定点是从矩阵运算角度进行量化。不同位数的数据对象运算速度不一样。例如,double类型和int联系运算速度不一样。
将浮点型数据转变成整型后进行计算,可以加快运算速度,极限情况比如二值化。

你可能感兴趣的:(CNN)