Learning both Weights and Connections for Efficient Neural Networks
Abstract
目的:减少存储量和计算量,使网络更适合在移动设备上运行方法:简单地说是只学习重要的连接,修剪冗余的连接减少模型参数步骤:train,学习哪些连接是重要的 prune,剪去不重要的连接 retrain,finetune剩下的连接的参数 prune和retrain可以反复迭代进行结果:AlexNet减少模型参数量61million->6.7million,没有精度损失 VGG-16减少模型参数量138million->10.3million,没有精度损失
8-bit integer (vs 32-bit floating point) activations,用8位int型的activation代替32位float量化(Deep Compress论文中介绍的)和剪枝可以同时使用,以获得进一步收益Network in Network和GoogleNet模型中使用了global average pooling代替FC层来减少参数,但在使用ImageNet的参数时,需要另外增加一个线性层。(这是在网络结构方面寻求参数缩减)HashNet,和prune结合可能会得到更好的效果
Idea
首先训练整个网络,目的是找出哪些是重要的连接;接着设置一个threshold,pruning掉low-weight的连接(小于该threshold就remove),将密集的网络变成稀疏的网络;最后则是对余下来的params进行微调,如果不微调,那么对网络的性能会有很大的影响。 接下来介绍了很多技巧:
Regularization 采用不同的regularization会影响prune和retrain的效果:L1会将更多的param转换成接近0,这在prune之后retrain之前有很好的准确率,但是留下的param在retrain后效果不如L2;L2会获得更好的剪枝结果;Dropout Ratio Adjustment retrain时dropout ratio应该调小一点,文章中给了一个公式Local Pruning and Parameter Co-adaptation 在reTrain的过程中,重新训练pruning后保存下来的weights比训练再次初始化的weights更好。其次,为了克服vanish gradient problem的问题,作者只训练pruning后shallow layer保存下来的params。比如减fc后,就固定conv只retrain fc的部分,同理减conv后也一样。Iterative Pruning 其实就是反复的prune,反复找出不重要的连接然后pruning,重复prune-retrain-prune-retrain…的过程Pruning Neurons 一些0输入或者0输出的 neurons也被pruned
但是文章这部分里没有说明减去这些不重要的连接是怎么实现的以什么形式存储的,比如是不是说我有一个mask保留的连接处置1剪掉的置0这样;还有怎么保证retrain的时候只train保留connection的部分,这些connection就是连接上下feature的weights吧,如果用caffe实现如何只train保留的部分,是不是说被剪掉的部分loss不反传调整权重,但是只是这样的话模型大小并没有减少啊,那部分空间还在只是不做贡献了;其实最主要的是这个“剪掉prune”到底是以什么形式剪掉。。。不明白看图3的话是不是可以理解为我在训练完最终确定模型时候再统计,把mask都为0的weight去掉,同时会改变下一层的channel数,但是是不是虽然有的不连接每个filter的大小还是要保持一致?也就是会留下filter的某个channel全零?
Experiments
果然在caffe中添加了一个mask。剪枝阈值:a quality param * 一层参数的标准差。实验给出了对不同模型prune之后的参数缩减效果;证明了retrain和iterative prune and retrain的重要性(这是显然的);实验说直接在prune和retrain这两个阶段都使用L2,没必要分开L1 for prune L2 for retrain;给敏感的层设置比较小的threshold,靠近前面的conv层更为敏感;最后是将修剪过的层作为稀疏矩阵存储,其存储开销仅为原来的15.6%。存储相对索引而不是绝对索引,将FC层索引减少到5位存储,CONV层索引用8位存储。
核心:保留重要连接,iterative prune and retrain