一篇讲网络加速的论文,来自2017CVPR。
文章链接: 《More is Less: A More Complicated Network with Less Inference Complexitv》
Introduction
目前做神经网络加速的主要有这几个方面: 低秩分解,定点运算、矢量量化、稀疏表示、特殊的轻量级网络结构。
再介绍本文方法之前,需要了解一下常见的卷积是怎样实现的。以caffe中的卷积为例,首先通过im2col将输入展开重排成一个大矩阵,然后执行矩阵乘法。具体可参考知乎上的一个高票回答,图示很清楚,
https://www.zhihu.com/question/28385679?sort=created。
下面用公式说明一下:
假设输入 (Xin R^{Htimes Wtimes C}), 一共有 (T)个 (ktimes k times C)大小的卷积核,再假设卷积stride=1且存在padding,即保证输出 (V) 的大小与输入一致。
首先,通过im2col将输入展开重排成一个大矩阵 (hat Xin R^{HWtimes kkC}), 卷积核也被整理成了一个矩阵 (W in R^{kkCtimes T}), 于是输出 (Vin R^{Htimes Wtimes T}) 直接通过矩阵乘法计算:(V = hat X times W).
另一方面,我们通常使用ReLu来对进行激活处理: (hat V_{i,j,c} = max(V_{i,j,c},0)). 结合上面的卷积实现原理,我们可以看出如果激活后某个点的所有通道都为0,就相当于在矩阵乘法时可以直接省略 (hat X)的相应行。 遗憾的是,这有一点马后炮的感觉,因为我们计算完之后才知道是不是会得到0.
本文实现加速的核心就是:提前锁定哪些值将会为0,从而在矩阵乘法时直接避免相应运算。
Method
整体的实现如下图:
如上图,还是先假设输入 (Xin R^{Htimes Wtimes C}), 一共有 (T)个 (ktimes k times C)大小的卷积核,再假设卷积stride=1且存在padding,即保证输出 (V) 的大小与输入一致。
黑色部分表示原始结构的卷积,橘黄色部分表示新增的一个辅助层,该辅助层的卷积参数有两种选择,第一种是 (1times1 times Ctimes T),第二种是 (ktimes ktimes Ctimes 1),以第二种为例,其卷积输出为 (V^{‘} in R^{Htimes Wtimes 1})。
(V^{‘})由于经过ReLU和一些稀疏约束,因此只有一部分值不为0。因此,根据(V^{‘})我们可以控制计算原始卷积 (V)时,省略掉展开矩阵 (hat X) 的对应行,从而完成加速。
文章解释了为什么不使用第一种(1times1 times Ctimes T)来产生(V^{‘}),主要是因为这会导致没办法一次完成所有矩阵乘法。
从上面的解释来看,(V^{‘})的稀疏度决定了加速比。
为了让 (V^{‘}) 更稀疏,文章一方面使用了ReLU激活,同时也尝试对 (V^{‘})进行平滑的稀疏正则化(L_1L_2(x) = mu||x||+rho |x|), 但是发现很难优化。
后来作者发现BN+ReLU可以使得输出更稀疏:
Conclusion
文章将该方法称为low-cost collaborative layer (LCCL)。 Idea很赞,但是考虑到带来的训练难度,其产生的加速效果就不是很令人满意了。
文章在ResNet上进行了实验,下图是网络的基本模块:
,
下图是在ImageNet上的实验结果:
原文链接:https://blog.csdn.net/shuzfan/article/details/70172346
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/6922