【论文阅读】韩松《Efficient Methods And Hardware For Deep Learning》节选《Learning both Weights and Connections 》

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013095718/article/details/82780891

Pruning Deep Neural Networks

本节内容主要来自NIPS 2015论文《Learning both Weights and Connections for Efficient Neural Networks》。

这部分主要介绍如何剪枝网络,及如何迭代训练已剪枝的网络以保证准确率。同时提供方法证明剪枝模型带来的加速和能源效率提升。
在这里插入图片描述

剪枝方法

  • 训练模型,training connectivity
  • 剪枝连接,pruning connections
  • 重训练保留的权重(补偿被剪枝的连接),retraining the remaining weights

后两步可以循环进行。步骤及算法如下
在这里插入图片描述
在这里插入图片描述

算法步骤:

  • Train Connectivity,正常的训练网络,但这一步不是学习最终的权重值,而是学习到哪些连接是重要的,重要程度就是权值的绝对值来衡量。if the absolute value is small, then we consider this weight unimportant
  • Prune Connections,剪枝权重绝对值小(设定一个阈值)的连接。这个阈值是一个关于压缩率和准确率的平衡值。The threshold is a hyper-parameter that depends on where one wants to fall on the trade-off curve between compression ratio and prediction accuracy。模型剪枝具体实现采用一种掩码的方式,小于阈值的权重的mask设为0,大于阈值的掩码设为1,这样权重张量和Mask tensor点乘就可以实现剪枝。
  • Retrain Weights,重新训练剪枝之后的稀疏连接网络。若不重新训练,直接采用剪枝之后的稀疏网络,准确率会大幅降低。
  • Iterative Pruning,循环迭代进行剪枝与重训练。
  • 学习率设置经验:训练连接开始LR1 > 重训练开始LR > 训练连接的最后阶段的学习率LR2。Because pruning moved the weights away from the original local minimum, the learning rate should be larger than at the end of the Train Connectivity phase
  • Dropout Rate设置经验: D r = D 0 C i r C i o D_r=D_0 \sqrt{\frac{C_{ir}}{C_{io}}} ,其中Dr 表示重训练阶段的dropout率,D0 表示开始训练的dropout率
  • 重训练阶段,权重值最好保持剪枝之后得到的权重值(Train Connectivity阶段得到的权重),而不是0初始化或者随机初始化,完全的从零开始学习。

以上介绍了剪枝的方法、学习率和失活率的设置。

剪枝对于硬件的效率提升

一方面,剪枝使得模型参数量和计算量更小,但同时它使得保留的计算规则性降低,这使得硬件的并行化更加困难。之后我们会讨论一种规则化的剪枝,使得模型稀疏的同时解决并行化问题。

**Load-Balance-Aware Pruning。**载入平衡的剪枝。剪枝首先带来的一个灾难是,非零权重(保留下来的)分布不均匀,计算的时候,硬件的处理单元(Processing Elements,PEs)执行的计算操作数目不同,那么执行更少计算量的PE就需要等待多计算量的PE完成计算。所以PE上的负载不均衡会造成真实性能和峰值性能的gap。而负载平衡的剪枝就是解决这个问题的,可以得到一个对硬件友好的稀疏网络。方法:对裁剪添加一个约束,所有被分配到每个PE上的子参数矩阵满足相同的稀疏度,这样各PE的工作负载相同,减少了空闲等待。
在这里插入图片描述

如上图所示,有4个计算单元PE,所以参数矩阵被分为4个子矩阵以便可以并行计算。上述两种方案虽然稀疏度相同,但是全局稀疏会造成负载不均衡,而子矩阵服从总的稀疏度可以满足在满足稀疏要求的同时实现硬件的负载均衡。上图中左图的计算时间需要5个cycles,PE1、PE2和PE3需要等PE0完成计算,而右图方案3个cycles就完成计算。

Pruning with Structure,结构化剪枝。剪枝的粒度是一个需要权衡的问题。上述的元素级的剪枝使得access/fetch操作不规则,相应就有按行剪枝、2D kernel剪枝、3D filter剪枝。

考虑剪枝之后的两个问题,1)硬件访问非零参数。2)记录非零参数索引。

细粒度的剪枝(individual element)使得权重的访问不规则(整体子矩阵间分布一致,但内部分布各异),同时对非零权重的索引需要按元素建立。而粗粒度的剪枝可以节约索引。但是粗粒度剪枝的问题是保持相同的准确率下需要牺牲压缩率,粒度粗了,压缩精度就下降了,但好处是粗粒度剪枝(如filter级)会使的剩下的模型保持dense,这样计算就是规则的,便于并行化。

至于存储大小问题是不定的,剪枝粒度细,则压缩率高,同时索引开销高,反之剪枝粒度粗,则压缩率低,但是索引开销小。

实验

框架采用Caffe,修改Caffe,增加Mask,可以使网络操作忽略被剪枝的参数。

模型:

  • Lenet-300-100 and Lenet-5 on MNIST
  • AlexNet, VGG-16, Inception-V1, SqueezeNet, ResNet-18 and ResNet-50 on ImageNet

结果:
在这里插入图片描述

Purning For MNIST

在这里插入图片描述
在这里插入图片描述

剪枝的同时会检测到视觉的注意力区域(被剪枝的都是不受关注的区域,如无意义的边角区域,保留的很多是图像的中央,MNIST数据集下)。
在这里插入图片描述

Pruning For ImageNet

用AlexNet和VGG-16网络在ImageNet ILSVRC-2012数据集上做了实验,在不影响准确率的前提下剪枝效果如下。
在这里插入图片描述

在这里插入图片描述

除了上述 卷积+全连接的网络,还在全卷积网络上进行了实验。实验证明全卷积网络依然可以在不损失准确率的情况很好的被剪枝,剪枝率都近似在70%(剩余30%左右的非零参数)

除此之外,还在RNNs和LSTMs上进行实验,结果依然有效,详情见论文。


以上为该论文第一部分,主要介绍剪枝方法即效果,但目前为止,该工作还很难利用CPG/GPU的并行处理能力。

猜你喜欢

转载自blog.csdn.net/u013095718/article/details/82780891
今日推荐