使用矩阵计算卷积
GEMM算法
矩阵乘法运算(General Matrix Multiplication),形如:
C = A B , A ∈ R m × k , B ∈ R k × n , C ∈ R m × n C = AB, A\in \mathbb{R}^{m\times k},B\in \mathbb{R}^{k\times n},C\in \mathbb{R}^{m\times n} C=AB,A∈Rm×k,B∈Rk×n,C∈Rm×n
矩阵乘法的计算可以写成如下公式:
C m , n = ∑ k = 1 K A m , k B k , n ; m , n , k ∈ R C_{m,n}=\sum_{k=1}^{K}A_{m,k}B_{k,n};m,n,k\in \mathbb{R} Cm,n=k=1∑KAm,kBk,n;m,n,k∈R
矩阵的乘法操作可以写成如下图所示,

写成伪代码的形式为:
for i=1 to n
for j=1 to n
c[i][j]=0
for k=1 to n
c[i][j] = c[i][j]+a[i][k]*b[k][j]
从上面可以看到使用普通的矩阵乘法运算,其复杂度是 O ( n 3 ) O(n^3) O(n3),这个复杂度相对来说是很高的,当矩阵的维度很大时,运算量会显著增加。
矩阵运算作为基础运算,有大量的科学家对其进行研究,试图降低其运算复杂度。
以Strassen’s Matrix Multiplication Algorithm为例,其将矩阵乘法的运算复杂度降低到了 O ( n l o g 2 7 ) ≈ O ( n 2.81 ) O(n^{log 2^7})\approx O(n^{2.81}) O(nlog27)≈O(n2.81)。
这个算法是Strassen于1969年发布的论文《Gaussian Elimination is not Optimal.》中提出的,主要是通过矩阵块的操作,减少乘法运算的次数。
将矩阵写成矩阵块的形式:
A = ( A 11 A 12 A 21 A 22 ) , B = ( B 11 B 12 B 21 B 22 ) , C = ( C 11 C 12 C 21 C 22 ) A=\begin{pmatrix} A_{11} & A_{12} \\ A_{21} & A_{22} \end{pmatrix},B=\begin{pmatrix} B_{11} & B_{12} \\ B_{21} & B_{22} \end{pmatrix},C=\begin{pmatrix} C_{11} & C_{12} \\ C_{21} & C_{22} \end{pmatrix} A=(A11A21A12A22),B=(B11B21B12B22),C=(C11C21C

文章介绍了矩阵乘法的基础知识,包括GEMM算法和Strassen算法如何降低矩阵运算的复杂度。接着,讨论了卷积运算,提到了常规卷积的计算方式以及如何通过img2col方法将卷积转换为矩阵乘法,从而利用高效的矩阵运算库进行加速。实验表明,img2col方法在卷积运算中比直接计算更快。
最低0.47元/天 解锁文章
1408

被折叠的 条评论
为什么被折叠?



