More is Less: 卷积神经网络加速

来源:互联网 发布:网店源码 编辑:程序博客网 时间:2024/05/22 13:49

论文: More is Less: A More Complicated Network with Less Inference Complexity
pdf: https://arxiv.org/pdf/1703.08651.pdf (祖师爷颜水成老师的文章,在valse2017上专门介绍了这个工作,所以拿来学习一番)

论文motivation和贡献

卷积神经网络虽然效果越来越好,但是计算量很大,作者就想减少计算量,于是观察卷积神经网络的计算过程,发现在很多卷积层经过ReLU激活层后很多值都变成了0,那刚刚费很多时间计算的卷积操作很多都是没用的,于是作者就想能不能加一个层预测哪些位置的点经过ReLU后会变成0呢,这样卷积操作操作时就可以忽略这个位置的计算。于是论文就往这个方向进行研究:

  1. 在之前卷积的结构上加上一个LCCL(low-cost collaborative layer)加速卷积层
  2. 以往网络的加速都是低秩分解,定点运算、矢量量化、稀疏表示、特殊的轻量级网络结构等,而本文第一次用了一个新加的LCCL结构进行加速
  3. 通过LCCN(low-cost collaborative net)加速明显,而且精度不受影响

卷积计算的介绍

假设输入tensor是U(X, Y, C) 卷积核是W(k, k, C, T) 输出tensor是V(X, Y, C) , 计算公式如下:
这里写图片描述

如果直接按照这个公式一个一个相乘然后相加肯定十分慢的,所以大多数神经网络的框架都把这个操作转化为矩阵相乘GEMM(General matrix multiply)和矩阵向量相乘GEMV(generalized matrix-vector multiplication),比如caffe, 它就是转化为矩阵相乘后利用BLAS加速,可以看它具体的转换过程核心代码可看im2col.cpp,下面是图文并茂的介绍,更多的介绍参见: https://www.zhihu.com/question/28385679?sort=created
这里写图片描述

个人手写:
这里写图片描述

网络结构与细节

这里写图片描述

  1. 用k x k x C x 1的卷积核去预测哪些位置在ReLU后会是0,这样在计算卷积时就把它忽略掉。(注意最后一个维度是1,也就是说预测结果的channel是1,而V的channel是C,也就是说输出结果每个位置的预测值在所有通道是共享的,如果该位置预测为0,V所有通道对应位置都不用计算)
    所以如果预测某位置(a,b)为0,则依照我的手写图很明白地看出可以把U星矩阵(共X*Y行)省去第a*b行,因为如果(a,b)处预测为0,则V中第a* b行的所有C列都为0,而V的第a* b行的所有C列由U星矩阵第a*b行与W星相乘得到。
    U星矩阵(X * Y, k * k * C) 变为(S’, k * k * C), S’为预测结果V’中非0元素的个数

  2. 用1 x 1 x C x T的卷积核预测哪些位置在ReLU后会是0,这样在计算卷积时就把它忽略掉。这样的话,每个通道的0元素的位置是不同的,就不能直接忽略U星矩阵的某一行,这样两个矩阵的相乘就会拆成矩阵与向量的相乘,虽然计算量肯定会减少,但是GEMV性能会差而且还有数据拆分重建也会耗时,所以加速效果不是很理想,该论文暂时只研究k x k x C x 1的卷积核,1 x 1 x C x T的卷积核以后在做研究

  3. 由以上可知该结构的加速取决于预测结果V’的稀疏度,为了让 V‘ 更稀疏,文章一方面使用了ReLU激活,同时也尝试对 V‘进行平滑的稀疏正则化L1L2(x)=μ||x||+ρ|x|, 但是发现很难优化。后来作者发现BN+ReLU可以使得输出更稀疏:
    这里写图片描述

  4. 受Identity mappings in deep residual networks的启发,resnet中residual block所放的位置也会有不同效果,所以LCCL层BN和ReLU激活层的前后顺序也要研究一下
    这里写图片描述

“Bef” represents the case that the input tensor is from the flow before BN and ReLU activation. “Aft” represents the case that the input tensor is the same to the original convolutional layer after BN and ReLU activation.
During our experiments, we find that input tensors with the “Bef” strategy are quite diverse when compared with the corresponding convolutional layer due to different activations. In this strategy, the LCCL cannot accurately predict the zero cells for the original convolutional layer. So it is better to use the same input tensor as the original convolutional layer, i.e. the “Bef” strategy.
这里说作者说用Bef策略即在进入LCCL的是BNReLU层之前的tensor,而Aft是和原始卷积一样,输入LCCL的是BNReLU层后的tensor。而实验表明Bef策略由于不同的激活和对应的卷积对比时差异太大,并不能很好的预测0元素的位置,所以应该使用输入和原始卷积一样的tensor,即Bef策略,这里作者应该写错了,应该是Aft策略(已确认是笔误)

实验结果

这里写图片描述

思考

说实话这篇很好理解而且很好实现,大牛总是能发现一个很好的问题,然后去解决,insight真的很需要培养啊。

部分内容参考了 More is Less——卷积网络加速,表示感谢

1 0
原创粉丝点击