winograd算法在卷积中的应用

1 前言

NCNNNNPACK等流行的推理框架,均采用了Winograd快速卷积算法,该算法出自CVPR 2016的一篇文章:Fast Algorithms for Convolutional Neural Networks

2 问题定义

2.1 一维卷积

将一维卷积定义为:F\left ( m,r \right )

  • m:Output Size
  • r:Filter Size

则输入信号的长度为m+r-1,输入信号每个位置至少参与1次乘法,所以乘法数量最少与输入信号长度相同,记为

\mu\left ( F\left ( m,r \right ) \right ) =m+r-1

2.2 二维卷积

将二维卷积定义为:F\left ( m\times n,r\times s \right )

  • m\times n:Output Size
  • r\times s:Filter Size

则输入信号size为\left ( m+r-1 \right )\left ( n+s-1 \right ),乘法数量至少为\mu\left ( F\left ( m\times n,r\times s \right ) \right ) =\mu \left ( F\left ( m,r \right ) \right )\mu \left ( F\left ( n,s \right ) \right )=\left ( m+r-1 \right )\left ( n+s-1 \right )

若直接按滑动窗口方式计算卷积,远大于最少乘法次数。

  • 一维乘法数量:m\times r
  • 二维乘法数量:m\times n\times r\times s

Winograd算法快在减少了乘法数量。

2.3 示例F(2, 3)

输入信号:d=\begin{bmatrix} d_0 & d_1 & d_2 & d_3 \end{bmatrix}^T

卷积核为:g=\begin{bmatrix} g_0 & g_1 & g_2 \end{bmatrix}^T

卷积可写成矩阵形式:

F\left ( 2,3 \right )=\begin{bmatrix} d_0 & d_1 & d_2\\ d_1 & d_2 & d_3 \end{bmatrix}\begin{bmatrix} g_0\\ g_1\\ g_2 \end{bmatrix}=\begin{bmatrix} r_0\\ r_1 \end{bmatrix}

常规的矩阵乘法,则需要6次乘法核4次加法,如下:

r_0=\left ( d_0\times g_0 \right )+\left ( d_1\times g_1 \right )+\left ( d_2\times g_2 \right )

r_0=\left ( d_1\times g_0 \right )+\left ( d_2\times g_1 \right )+\left ( d_3\times g_2 \right )

卷积运算中输入信号转换成的矩阵存在特殊性,有规律的分布这大量重复的元素,比如第一行和第二行的d1和d2,存在优化的可能。Winograd的做法如下

F\left ( 2,3 \right )=\begin{bmatrix} d_0 & d_1 & d_2\\ d_1 & d_2 & d_3 \end{bmatrix}\begin{bmatrix} g_0\\ g_1\\ g_2 \end{bmatrix}=\begin{bmatrix} m_1+m_2+m_3\\ m_2-m_3-m_4 \end{bmatrix}

  • m_1=\left ( d_0-d_2 \right )g_0
  • m_2=\left ( d_1+d_2 \right )\left ( g_0+g_1+g_2 \right )/2
  • m_3=\left ( d_2-d_1 \right )\left ( g_0-g_1+g_2 \right )/2
  • m_4=\left ( d_1-d_3 \right )g_2

乍看上去,需要的运算次数分别为:

  • 输入信号d上:4次加法(减法可看作加法)
  • 卷积核g上:3次加法(g1+g2可中间结果可保留),2次乘法(除法)
  • 输出m上:4次乘法,4次加法

实际上,在神经网络的推理阶段,卷积核上的元素是固定的,因此g上的运算可以提前算好,所以一共所需的运算次数为d与m上的运算次数之和,即4次乘法和8次加法

与直接运算的6次乘法和4次加法相比,乘法次数减少,加法次数增加。在计算机中,乘法一般比加法慢,减少乘法次数,增加少量加法,可以提升速度。

3 1D Winograd

上一节中的计算过程写成矩阵形式如下:

Y=A^T\left [ \left ( Gg \right ) \right \odot \left ( B^Td \right )]

其中,\odot为element-wise multiplication(Hadamard product)

B^T=\begin{bmatrix} 1 & 0 & -1 & 0\\ 0 & 1 & 1 & 0\\ 0 & -1 & 1 & 0\\ 0 & 1 & 0 & -1 \end{bmatrix}

G=\begin{bmatrix} 1 & 0 & 0\\ 1/2& 1/2 & 1/2\\ 1/2 & -1/2 & 1/2\\ 0 & 0 & 1 \end{bmatrix}

A^T=\begin{bmatrix} 1 & 1 & 1 & 0\\ 0 & 1 & -1 & -1 \end{bmatrix}

g=\begin{bmatrix} g_0 & g_1 & g_2 \end{bmatrix}^T

d=\begin{bmatrix} d_0 & d_1 & d_2 & d_3 \end{bmatrix}^T

  • g:卷积核
  • d:输入信号
  • G:Filter transform矩阵,尺寸\left ( m+r-1 \right )\times r
  • B^T:Input transform矩阵,尺寸\left ( m+r-1 \right )\times \left ( m+r-1 \right )
  • A^T:Output transform矩阵,尺寸m\times \left ( m+r-1 \right )

计算过程在逻辑上可分为4步:

  • Input transform
  • Filter transform
  • Hadamard product
  • Output transform

4 1D to 2D,F(2, 3) to F(2x2, 3x3)

Y=A^T\left [ \left ( GgG^T \right )\odot \left ( B^TdB \right ) \right ]A

其中,g为r\times rFilter,d为\left ( m+r-1 \right )\times \left ( m+r-1 \right )的image tile。

待续 https://www.cnblogs.com/shine-lee/p/10906535.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值