本次介绍一种内存利用率高且速度较快的卷积计算方法。 来自ICML2017, 《MEC: Memory-efficient Convolution for Deep Neural Network》
1. 背景工作
目前的CNN模型中,全连接层往往在最后一层才会使用。 意思也就是说,网络的主体是由卷积层构成的。 因此,加快卷积层的计算对于整个网络的性能至关重要。
目前,卷积的计算大多采用间接计算的方式,主要有以下三种实现方式:
- im2col + GEMM。 caffe等很多框架中都使用了这种计算方式,原因是将问题转化为矩阵乘法后可以方便的使用很多矩阵运算库(如MKL、openblas、Eigen等)。
- FFT变换。 时域卷积等于频域相乘,因此可将问题转化为简单的乘法问题。
- Winograd。 这种不太熟悉,据说在GPU上效率更高。 NNPACK就是FFT和Winograd方法的结合。
上面三种方法执行效率都还不错,但对内存占用比较高,因为需要存储中间结果或者临时辅助变量。
本文的方法主要改进了im2col + GEMM的策略,目的主要是减少内存消耗的同时顺便提升点速度。由于同样可以利用目前成熟的矩阵运算库,因此算法的实现难度并不大。
下图分别是直接计算卷积以及im2col + GEMM的实现方式。 可见后者需要比较多的内存存储一个临时矩阵(用于保存im2col的结果