Winograd算法 原理

1.fast convolution

原理:用非耗时运算操作(如加法)替代耗时运算操作(如乘法)达到减少算法时间度的。

例子:通过复数乘法减少乘法时间复杂度

假设:

 \left ( a + bi \right ) * \left ( c + di \right ) = e + fi                     \begin{bmatrix} e\\ f \end{bmatrix} = \begin{bmatrix} c &-d \\ d& c \end{bmatrix} * \begin{bmatrix} a\\b \end{bmatrix}

将该乘法式表示为矩阵形式,其需要4个乘法和2个加法。将等式转变后变成3个乘法和5个加法

ac - bd = a(c-d) + d (a-b)

ad+bc = b(c+d) +d(a-b)

转变后的等式转变为矩阵形式,它的系数矩阵能够被分解为 2X3(C) , 3X3(H) 和 3X2(D) 的矩阵:

s = \begin{bmatrix} e\\f \end{bmatrix} =\begin{bmatrix} 1 &0 &1 \\ 0&1 &1 \end{bmatrix} * \begin{bmatrix} c-d & 0 &0 \\ 0& c+d &0 \\ 0&0 &d \end{bmatrix} *\begin{bmatrix} 1 &0 \\ 0&1 \\ 1 & -1 \end{bmatrix}*\begin{bmatrix} a\\ b \end{bmatrix}=C*H*D*x

2. 多项式乘法与卷积

多项式 h(x) 与 g(x) 相乘,假设 h(x) 与 g(x) 分别为:

 h(x) = h_{0} + h_{1} * x

扫描二维码关注公众号,回复: 3882908 查看本文章

g(x) = g_{0} + g_{1} * x

s(x) = h(x) * g(x) = h_{0} * g_{0} + (h_{0}*g_{1}+h_{1}*g_{0})*x + h_{1}*g_{1}*x^{2} = s_{0} + s_{1} * x + s_{2} * x^{2}

将多项式看做是以 讲多像是x^{0}x^{1}x^{2}... x^{n}为基的空间向量,该多项式乘积就可以写为矩阵卷积形式

\begin{bmatrix} s_{0}\\ s_{1} \\ s_{2} \end{bmatrix}= \begin{bmatrix} h_{0} &0 \\ h_{1} &h_{0} \\ 0& h_{1} \end{bmatrix} * \begin{bmatrix} g_{0}\\g_{1} \end{bmatrix}

示例:存在两个多项式

h(x) = 1 + x + x_{2} + x_{3}

g(x) = 1 + x_{1} + x_{2}

h(x) 与 g(x) 对应的空间向量为:

h=[1,1,1,1];  
g=[1,1,1];

h(x)*g(x) 得到的多项式的空间向量为上两向量的卷积:

1     2     3     3     2     1

h(x)*g(x) = 1 +2*x+3*x^{2}+3*x^{3}+2*x^{4} + x^{5}

3.Winograd Algorithms

对于一维卷积,当输出为m,卷积核长度为r时,需要乘法数量为:

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

将一维卷积扩展到二维,如果输出维mxn,卷积核维rxs,需要乘法数量为:

\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 )

3.1 F(2X2,3X3)

直接计算一维卷积F(2X3)需要2x3=6次乘法。

输入:[ d0, d1, d2, d3], 卷积核为 [g0,g1,g2],没有padding,步长为1,写成矩阵形式为:

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_{1} \right )g_{0}

m_{2}=\left ( d_{1}+d_{2} \right )\left ( g_{0}+g_{1}+g_{2}\right )\frac{1}{2}

m_{3}=\left ( d_{2}-d_{1} \right )\left ( g_{0}-g_{1}+g_{2}\right )\frac{1}{2}

m_{4}=\left ( d_{1}-d_{3} \right )g_{2}

这种计算方式需要2+3-1=4次乘法,4次加法,还有可以预计算的3次加法和2次乘法(卷积核默认为已知项)

将这种算法写成矩阵形式

Y=A^{T}\begin{bmatrix} \left ( \left ( Gg \right )\bigodot \left ( B^{T}d \right ) \right ) \end{bmatrix}

\bigodot表示点乘,对于F(2,3),以上矩阵分别为:

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\\ 0.5& 0.5 &0.5 \\ 0.5& -0.5 &0.5 \\ 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}

扩展为二维卷积的形式:

Y=A^{T}\begin{bmatrix} \begin{bmatrix} GgG^{T} \end{bmatrix} \bigodot \begin{bmatrix} B^{T}dB \end{bmatrix} \end{bmatrix}

 

猜你喜欢

转载自blog.csdn.net/koibiki/article/details/81125318
今日推荐