1 前言
NCNN、NNPACK等流行的推理框架,均采用了Winograd快速卷积算法,该算法出自CVPR 2016的一篇文章:Fast Algorithms for Convolutional Neural Networks。
2 问题定义
2.1 一维卷积
将一维卷积定义为:
- m:Output Size
- r:Filter Size
则输入信号的长度为,输入信号每个位置至少参与1次乘法,所以乘法数量最少与输入信号长度相同,记为
2.2 二维卷积
将二维卷积定义为:
- :Output Size
- :Filter Size
则输入信号size为,乘法数量至少为
若直接按滑动窗口方式计算卷积,远大于最少乘法次数。
- 一维乘法数量:
- 二维乘法数量:
Winograd算法快在减少了乘法数量。
2.3 示例F(2, 3)
输入信号:
卷积核为:
卷积可写成矩阵形式:
常规的矩阵乘法,则需要6次乘法核4次加法,如下:
卷积运算中输入信号转换成的矩阵存在特殊性,有规律的分布这大量重复的元素,比如第一行和第二行的d1和d2,存在优化的可能。Winograd的做法如下
乍看上去,需要的运算次数分别为:
- 输入信号d上:4次加法(减法可看作加法)
- 卷积核g上:3次加法(g1+g2可中间结果可保留),2次乘法(除法)
- 输出m上:4次乘法,4次加法
实际上,在神经网络的推理阶段,卷积核上的元素是固定的,因此g上的运算可以提前算好,所以一共所需的运算次数为d与m上的运算次数之和,即4次乘法和8次加法。
与直接运算的6次乘法和4次加法相比,乘法次数减少,加法次数增加。在计算机中,乘法一般比加法慢,减少乘法次数,增加少量加法,可以提升速度。
3 1D Winograd
上一节中的计算过程写成矩阵形式如下:
其中,为element-wise multiplication(Hadamard product)
- g:卷积核
- d:输入信号
- G:Filter transform矩阵,尺寸
- :Input transform矩阵,尺寸
- :Output transform矩阵,尺寸
计算过程在逻辑上可分为4步:
- Input transform
- Filter transform
- Hadamard product
- Output transform
4 1D to 2D,F(2, 3) to F(2x2, 3x3)
其中,g为Filter,d为的image tile。