# ML创新点 ## 通用型 基本上都是**即插即用**的万金油 ### Winograd卷积 通过数学变换大幅减少卷积计算量 在传统的卷积优化中 可以使用FFT, 但是FFT在针对于大的卷积核时才有明显优势,而且限制比较多. 对于现在的小卷积核 Winograd算法的优势便很明显 Winograd算法基于**国剩余定理** 将空间域的卷积变换到Winograd域计算 Winograd的符号是 $F(m,n)$ 代表输出m个点 卷积核大小n Winograd乘法计算次数为: m + n - 1 普通卷积乘法计算次数为: m * n >注意: Winograd在FP32下表现很好 在其他量化下可能导致量化精度降低很多很多 >注意: 插值点的选用非常重要 #### 流程 计算F(m,r)的变换矩阵 0. 确定插值点: 插值点是构建变换矩阵的核心数学坐标 决定了变换矩阵 A B G的系数 由中国剩余定理 想确定一个n次多项式需要n+1个点 根据选定的插值点集合 构造一个 n*n的Vandermonde矩阵 1. 卷积核变换(G): 将原始卷积核转化为变换域的矩阵 2. 输入变换(B): 将输入矩阵转换为变换域的阵 3. 哈达玛积($\circ$): 在变换域中 两个矩阵左哈达玛乘积 4. 输出变换(A): 将点乘结果逆变换回空间域 $$ Output = A^T [(G g G^T) \cric (B^T dB)]A $$ 其中 - g: 卷积核 - d: 输入块 - G,B,A: 预先计算豪的变换矩阵(由插值点决定) #### 插值点选择 [Github](https://github.com/andravin/wincnn)