ML创新点

通用型

基本上都是即插即用的万金油

Winograd卷积

通过数学变换大幅减少卷积计算量

在传统的卷积优化中 可以使用FFT, 但是FFT在针对于大的卷积核时才有明显优势,而且限制比较多.

对于现在的小卷积核 Winograd算法的优势便很明显

Winograd算法基于国剩余定理 将空间域的卷积变换到Winograd域计算

Winograd的符号是 \(F(m,n)\) 代表输出m个点 卷积核大小n

Winograd乘法计算次数为: m + n - 1

普通卷积乘法计算次数为: m * n

注意: Winograd在FP32下表现很好 在其他量化下可能导致量化精度降低很多很多

注意: 插值点的选用非常重要

流程

计算F(m,r)的变换矩阵

  1. 确定插值点: 插值点是构建变换矩阵的核心数学坐标 决定了变换矩阵 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