Winograd Convolution 推導 - 從1D到2D
1D Winograd 卷積
1D Winograd算法已經有很多文章討論了,討論得都比較清楚,這里就不再贅述,僅列出結論。
輸入:四維信號
![]()
卷積核: 三維向量![]()
輸出: 二維信號![]()
則可表示為:
![]()
其中:
![]()
![]()
![]()
2D Winograd卷積
2D Winograd可以由1D Winograd外推得到,因此為解決2D Winograd問題,首先要重溫1D 卷積解決的問題。在此復述一遍:
假設一個卷積核尺寸為3的一維卷積,假設每次我們輸出2個卷積點,則我們形式化此問題:F(2, 3)。
因為輸出為2,卷積核大小為3,對應的輸入點數應該為4,則此問題表述為:
輸入:四維信號
![]()
卷積核: 三維向量![]()
因此,此卷積的矩陣乘形式應為:
![]()
請記住這個形式是Winograd算法解決的問題,后續2D算法將化歸為這個問題。
下面我們來定義2D 卷積問題,將1D卷積擴展一維:
假設一個卷積核尺寸為3x3的二維卷積,假設每次我們輸出2x2個卷積點,則我們形式化此問題:F(2x2, 3x3)。
因為輸出為2x2,卷積核大小為3x3,對應的輸入點數應該為4x4,則此問題表述為:
輸入:
卷積核:
因此,此卷積的 矩陣乘形式應為:![]()
![]()
從這個式子里,我們可以看到1D卷積的影子,這個影子在我們對矩陣作了分塊后會更加明顯。
再明顯一點,我們寫成分塊矩陣乘的形式:
至此,我們對2D卷積推導出了跟1D形式一致的公式,只不過1D中的標量在2D中變成了小矩陣或者向量。
實操粉
對實操粉而言,到這個形式為止,已經可以寫代碼了。
由1D Winograd可知,我們可以將該式改寫為Winograd形式, 如下:
其中:
注意,這四個M的計算又可以用一維的F(2, 3) Winograd來做,因此2D Winograd是個嵌套(nested)的算法。
理論粉
對一個有追求的理論粉來說,只是得到可以寫程序的遞歸表達肯定是不完美的,他們還是希望有一個最終的解析表達的。其實也很簡單,我們把上面的式子規整規整,使得輸出成為一個標准的2x2矩陣,有:
可以寫為:
依1D Winograd公式, 並結合各M的公式,有下式。
注意到像這些都是2維列向量,hadamard product和concat可以交換而不影響結果,因此:
至此證得。