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

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.1F(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}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章