卷积

参数 含义
$N$ batch大小
$C$ 输入通道数量
$H$ 输入的高
$W$ 输入的宽
$K$ 输出通道数量
$R$ 卷积核高度
$S$ 卷积核宽度
$u$ 垂直步幅
$v$ 水平步幅
$pad_h$ padding的高度
$pad_w$ padding的宽度

输入矩阵$D \in \mathbb{R}^{NCHW}$, 卷积核$F \in \mathbb{R}^{KCRS}$. 输出矩阵$O \in \mathbb{R}^{NKPQ}$. 其中 $P = \lceil \frac{H-R+1+2pad_h}{u} \rceil$, $Q = \lceil \frac{W-S+1+2pad_w}{v} \rceil$.

把边缘零扩展的 $D$ 记作 $D_0$.

\[O[n, k, p, q] = \sum_{c=0}^{C-1} \sum_{r=0}^{R-1} \sum_{s=0}^{S-1} F[k, c, r, s] \cdot D_0[n, c, pu + R - r - 1 - pad_h, qv + S - s - 1 - pad_w]\]

矩阵乘法

\[C = AB\]

其中 $A \in \mathbb{R}^{mk}$, $B \in \mathbb{R}^{kn}$, $C \in \mathbb{R}^{mn}$.

\[C[i, j] = \sum_{g=0}^{k-1} A[i, g] \cdot B[g, j]\]

卷积到矩阵乘法

观察矩阵乘法定义中 $C[i, j]$ 的表达式, $C$ 和 $A$ 下标的公用部分是 $i$, $C$ 和 $B$ 下标的公用部分是 $j$, $A$ 和 $B$ 下标的公用部分是 $g$. 这三个变量互不相关. 我们可以自然地想到, 卷积的表达式中是否存在类似的公用部分呢?

  • $O$和$F$的公用部分是$k$,
  • $O$和$D$的公用部分是$n$, $p$, $q$,
  • $F$和$D$的公用部分是$c$, $r$, $s$.

其余都是常量. 这样, 我们找到了沟通卷积与矩阵乘法的桥梁. $k$ 相当于矩阵乘法中的 $i$, 三元组 $<n, p, q>$ 相当于矩阵乘法中的$j$, 三元组 $<c, r, s>$ 相当于矩阵乘法中的 $g$. 对$D$, $F$, $O$的元素进行重新排列:

\[O[k][n, p, q] = \sum_{<c, r, s>} F[k][c, r, s] \cdot D_0[c, pu + R - r - 1 - pad_h, qv + S - s - 1 - pad_w][n]\]

$O$和$F$ 已经变成了我们想要的形式, 而 $D$ 矩阵还需要进一步的处理. 观察 $O$ 和 $F$,

  • $O$的第一维是 $k$, 第二维是$<n, p, q>$, 相当于把每一个输出通道对应的 $N$ 个 batch 拍扁成一维数组, 共 $K$ 个一维数组
  • $F$的第一维也是 $k$, 第二位是 $<c, r, s>$, 如图所示, 相当于把每一个输出通道对应的 $C$ 个 $R \times S$ 的卷积核拍扁成一维数组 (图中的一行), 共 $K$ 个一维数组

$D$ 的第一维应当是 $<c, r, s>$, 第二维应当是 $<n, p, q>$, 大小应当是 $CRS \times NPQ$. 现在 $D$ 的大小是 $NCHW$, 因此需要对 $D$ 中的元素进行复制,重新排列.

由于 $F$ 的一行对应一个输出通道的 $C$ 个卷积核, 因此 $D$ 的一列对应的是一个感受野. 感受野有$C$个通道, 每个通道是 $R \times S$ 的矩阵, 这个感受野会被拍扁成 $D$ 的一列, 长度为 $C \times R \times S$. $O$ 的第二维是 $<n, p, q>$, 一行对应了一个输出通道, 这个通道里的每个元素都是左侧的一组卷积核 (一行) 与上方的一组感受野 (一列) 作点积运算得到的.

test

总结

把卷积核 $F$ 重构成一个 $K \times CRS$ 的矩阵 $F_m$. 把输入矩阵 $D$ 复制成一个 $CRS \times NPQ$ 的矩阵 $D_m$. 二者相乘, 得到 $K \times NPQ$ 的矩阵 $O_m$.