一篇讲网络加速的论文,来自2017CVPR。
文章链接: 《More is Less: A More Complicated Network with Less Inference Complexitv》
Introduction
目前做神经网络加速的主要有这几个方面: 低秩分解,定点运算、矢量量化、稀疏表示、特殊的轻量级网络结构。
再介绍本文方法之前,需要了解一下常见的卷积是怎样实现的。以caffe中的卷积为例,首先通过im2col将输入展开重排成一个大矩阵,然后执行矩阵乘法。具体可参考知乎上的一个高票回答,图示很清楚,
https://www.zhihu.com/question/28385679?sort=created。
下面用公式说明一下:
假设输入 \(X\in R^{H\times W\times C}\), 一共有 \(T\)个 \(k\times k \times C\)大小的卷积核,再假设卷积stride=1且存在padding,即保证输出 \(V\) 的大小与输入一致。
首先,通过im2col将输入展开重排成一个大矩阵 \(\hat X\in R^{HW\times kkC}\), 卷积核也被整理成了一个矩阵 \(W \in R^{kkC\times T}\), 于是输出 \(V\in R^{H\times W\times T}\) 直接通过矩阵乘法计算:\(V = \hat X \times W\).
另一方面,我们通常使用ReLu来对进行激活处理: \(\hat V_{i,j,c} = max(V_{i,j,c},0)\). 结合上面的卷积实现原理,我们可以看出如果激活后某个点的所有通道都为0,就相当于在矩阵乘法时可以直接省略 \(\hat X\)的相应行。 遗憾的是,这有一点马后炮的感觉,因为我们计算完之后才知道是不是会得到0.
本文实现加速的核心就是:提前锁定哪些值将会为0,从而在矩阵乘法时直接避免相应运算。
Method
整体的实现如下图:
如上图,还是先假设输入 \(X\in R^{H\times W\times C}\), 一共有 \(T\)个 \(k\times k \times C\)大小的卷积核,再假设卷积stride=1且存在padding,即保证输出 \(V\) 的大小与输入一致。
黑色部分表示原始结构的卷积,橘黄色部分表示新增的一个辅助层,该辅助层的卷积参数有两种选择,第一种是 \(1\times1 \times C\times T\),第二种是 \(k\times k\times C\times 1\),以第二种为例,其卷积输出为 \(V^{‘} \in R^{H\times W\times 1}\)。
\(V^{‘}\)由于经过ReLU和一些稀疏约束,因此只有一部分值不为0。因此,根据\(V^{‘}\)我们可以控制计算原始卷积 \(V\)时,省略掉展开矩阵 \(\hat X\) 的对应行,从而完成加速。
文章解释了为什么不使用第一种\(1\times1 \times C\times 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上的实验结果: