Winograd卷积原理

Winograd算法通过减少FIR滤波器的计算量,为卷积操作提供加速。本文深入探讨了Winograd算法的原理,包括F(2,3)和F(2×2,3×3)的实现,以及与直接卷积的计算量对比。堆叠和嵌套两种实现方式在乘法次数和空间代价上的差异,展示了Winograd在深度学习卷积计算中的潜在优势和挑战。" 88026479,8374218,Apache服务在Mac与Windows上的启动指南,"['Apache', '服务器配置', 'Web开发', '操作系统', '网络服务']
摘要由CSDN通过智能技术生成

原文链接:Winograd卷积原理 | Hey~YaHei!

Winograd算法最早于1980年由Shmuel Winograd在《Arithmetic complexity of computations(1980)》中提出,主要用来减少FIR滤波器的计算量。
该算法类似FFT,将数据映射到另一个空间上,用加减运算代替部分乘法运算,在“加减运算速度远高于乘法运算”的前提下达到明显的加速效果(与FFT不同的是,Winograd将数据映射到一个实数空间而非复数空间)。
比如,
直接实现一个 m m m 输出、 r r r 参数的FIR滤波器 F ( m , r ) F(m,r) F(m,r),一共需要 m × r m \times r m×r 次乘法运算;
但使用Winograd算法,忽略变换过程的话,仅仅需要 m + r − 1 m + r - 1 m+r1 次乘法运算。

F ( 2 , 3 ) F(2,3) F(2,3)

如果直接计算 F ( 2 , 3 ) F(2,3) F(2,3)
F ( 2 , 3 ) = [ d 0 d 1 d 2 d 1 d 2 d 3 ] [ g 0 g 1 g 2 ] = [ d 0 g 0 + d 1 g 1 + d 2 g 2 d 1 g 0 + d 2 g 1 + d 3 g 2 ] F(2,3)=\left[\begin{array}{lll}{d_{0}} & {d_{1}} & {d_{2}} \\ {d_{1}} & {d_{2}} & {d_{3}}\end{array}\right]\left[\begin{array}{l}{g_{0}} \\ {g_{1}} \\ {g_{2}}\end{array}\right]=\left[\begin{array}{l}{d_0g_0+d_1g_1+d_2g_2} \\ {d_1g_0+d_2g_1+d_3g_2}\end{array}\right] F(2,3)=[d0d1d1d2d2d3]g0g1g2=[d0g0+d1g1+d2g2d1g0+d2g1+d3g2]
其中,
d 0 , d 1 , d 2 d_0, d_1, d_2 d0,d1,d2 d 1 , d 2 , d 3 d_1, d_2, d_3 d1,d2,d3为连续的两个输入序列;
g 0 , g 1 , g 2 g_0, g_1, g_2 g0,g1,g2为FIR的三个参数;
这个过程一共需要6次乘法,和4次加法

而Winograd算法指出, F ( 2 , 3 ) F(2,3) F(2,3) 可以这样计算
F ( 2 , 3 ) = [ d 0 d 1 d 2 d 1 d 2 d 3 ] [ g 0 g 1 g 2 ] = [ m 1 + m 2 + m 3 m 2 − m 3 − m 4 ] F(2,3)=\left[\begin{array}{lll}{d_{0}} & {d_{1}} & {d_{2}} \\ {d_{1}} & {d_{2}} & {d_{3}}\end{array}\right]\left[\begin{array}{l}{g_{0}} \\ {g_{1}} \\ {g_{2}}\end{array}\right]=\left[\begin{array}{l}{m_{1}+m_{2}+m_{3}} \\ {m_{2}-m_{3}-m_{4}}\end{array}\right] F(2,3)=[d0d1d1d2d2d3]g0g1g2=[m1+m2+m3m2m3m4]
其中,
m 1 = ( d 0 − d 2 ) g 0 m 2 = ( d 1 + d 2 ) g 0 + g 1 + g 2 2 m 4 = ( d 1 − d 3 ) g 2 m 3 = ( d 2 − d 1 ) g 0 − g 1 + g 2 2 \begin{array}{ll}{m_{1}=\left(d_{0}-d_{2}\right) g_{0}} & {m_{2}=\left(d_{1}+d_{2}\right) \frac{g_{0}+g_{1}+g_{2}}{2}} \\ {m_{4}=\left(d_{1}-d_{3}\right) g_{2}} & {m_{3}=\left(d_{2}-d_{1}\right) \frac{g_{0}-g_{1}+g_{2}}{2}}\end{array} m1=(d0d2)g0m4=(d1d3)g2m2=(d1+d2)2g0+g1+g2m3=(d2d1)2g0g1+g2

该用矩阵运算可以表示成:
Y = A T [ ( G g ) ⊙ ( B T d ) ] Y=A^{T}\left[(G g) \odot\left(B^{T} d\right)\right] Y=AT[(Gg)(BTd)]
其中, ⊙ \odot 表示点乘,而
B T = [ 1 0 − 1 0 0 1 1 0 0 − 1 1 0 0 1 0 − 1 ] , G = [ 1 0 0 1 2 1 2 1 2 1 2 − 1 2 1 2 0 0 1 ] , A T = [ 1 1 1 0 0 1 − 1 − 1 ] B^{T}=\left[\begin{array}{rrrr}{1} & {0} & {-1} & {0} \\ {0} & {1} & {1} & {0} \\ {0} & {-1} & {1} & {0} \\ {0} & {1} & {0} & {-1}\end{array}\right], G=\left[\begin{array}{rrr}{1} & {0} & {0} \\ {\frac{1}{2}} & {\frac{1}{2}} & {\frac{1}{2}} \\ {\frac{1}{2}} & {-\frac{1}{2}} & {\frac{1}{2}} \\ {0} & {0} & {1}\end{array}\right], A^{T}=\left[\begin{array}{rrrr}{1} & {1} & {1} & {0} \\ {0} & {1} & {-1} & {-1}\end{array}\right] BT=1000011111100001,G=121210021210021211,AT=[10111101]
g = [ g 0 g 1 g 2 ] T , d = [ d 0 d 1 d 2 d 3 ] T g=\left[\begin{array}{lll}{g_{0}} & {g_{1}} & {g_{2}}\end{array}\right]^{T}, d=\left[\begin{array}{llll}{d_{0}} & {d_{1}} & {d_{2}} & {d_{3}}\end{array}\right]^{T} g

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值