Winograd 快速卷积算法原理

Terry Winograd

Winograd [1]于1980 年提出了有限脉冲响应(finite impulse response,FIR)滤波的最小滤波算法最小滤波算法[2] 。该算法指出,由r 拍的FIR滤波器生成m 个输出,即,需要的最少乘法数量 。以F(2,3) 为例,最小滤波算法:


涉及到的乘法数量为 ,从6 次降低到了4 次。

2015 年,Winograd 最小滤波算法初次被应用在CNN 中[3],利用减少的乘法次数提升卷积算子性能。如果用矩阵的形式表示一维Winograd 最小滤波算法,则可以得到:

其中,g 为滤波器向量,d 为输入数据向量,Y 为输出数据向量,G 表示滤波器变换矩阵, 表示数据变换矩阵,表示矩阵的对应位相乘(Hadamard 积), 表示输出变换矩阵。

由此扩展到二维Winograd最小滤波算法可以得到:

其中,g为滤波器矩阵,d为输入输入数据块。通过嵌套一维最小滤波算法和 ,可以得到二维的最小滤波算法其中,为输出大小,为滤波器大小。二维最小滤波算法所需乘法数为 ,而原始卷积算法需要乘法数为。对于而言,乘法计算次数从36降低到了16,减少了55.6%。

将应用到卷积计算,对于二维卷积算子,需要先将卷积输入划分为相互重叠的大小为 的切片,切片之间有r-1的重叠部分。对于每个通道,可以分成个切片,然后通过对每个切片分别进行计算。

将每个切片标记为,对应第i个输入和第k个卷积核的卷积计算结果为:

Y_{i,k,\tilde{x},\tilde{y}} = \sum_{c=1}^{C} D_{i,c,\tilde{x},\tilde{y}}*G_{k,c} \\ = \sum_{c=1}^{C} A^T[U_{k,c}⊙V_{c,i,\tilde{x},\tilde{y}}]A \\ =A^T[\sum_{c=1}^{C} U_{k,c}⊙V_{c,i,\tilde{x},\tilde{y}}]A

其中:,。

Winograd卷积的伪代码
Winograd 卷积的四个阶段

根据二维最小滤波算法的矩阵形式,可以将Winograd卷积分为四个分离的阶段:输入变换(input transformation,ITrans)、卷积核变换(kernel transformation,KTrans)、对应位相乘(element-wise matrix multiplication,EWMM)和输出变换(output transformation,OTrans),如图1所示。


  1. Terry Winograd, Professor Emeritus of Computer Science, Stanford University https://hci.stanford.edu/winograd/ ↩

  2. WINOGRAD S. Arithmetic complexity of computations [M]. Philadelphia: SIAM, 1980. ↩

  3. LAVIN A, GRAY S. Fast algorithms for convolutional neural networks[C]//Proceedings of the 2016 IEEE Conferenceon Computer Vision and Pattern Recognition, Las Vegas, Jun 27-30, 2016. Washington: IEEE Computer Society, 2016:4013-4021. ↩

你可能感兴趣的:(Winograd 快速卷积算法原理)