# 6.3
## 二維卷積的矩陣乘法
舉個例子,對一個單樣本、2通道、高$\times$寬=$3 \times 3$的樣本,以單個、2通道、$2 \times 2$的卷積核進行卷積。其中,兩個通道的樣本$\mathbf{X_0}$、$\mathbf{X_1}$分別是
$$
\mathbf{X_0}
= \begin{pmatrix}
1 & 2 & 3\\
4 & 5 & 6\\
7 & 8 & 9
\end{pmatrix},
\mathbf{X_1}
= \begin{pmatrix}
11 & 12 & 13\\
14 & 15 & 16\\
17 & 18 & 19
\end{pmatrix}
$$
兩通道的卷積核$\mathbf{K_0}$、$\mathbf{K_1}$分別是
$$
\mathbf{K_0}
= \begin{pmatrix}
1 & 2\\
3 & 4
\end{pmatrix},
\mathbf{K_1}
= \begin{pmatrix}
5 & 6\\
7 & 8
\end{pmatrix}
$$
可以看到,我們的樣本是一個(1,2,3,3)的四維張量,卷積核是一個(1,2,2,2)的四維張量。這時候我們可以做一個攤平的動作,把樣本張量攤成一個矩陣$\mathbf{X_{row}}$,把卷積核張量攤成一個矩陣$\mathbf{K_{col}}$
$$
\mathbf{X_{row}}
= \begin{pmatrix}
1 & 2 & 4 & 5 & 11 & 12 & 14 & 15\\
2 & 3 & 5 & 6 & 12 & 13 & 15 & 16\\
4 & 5 & 7 & 8 & 14 & 15 & 17 & 18\\
5 & 6 & 8 & 9 & 15 & 16 & 18 & 19
\end{pmatrix},
\mathbf{K_{col}}
= \begin{pmatrix}
1\\
2\\
3\\
4\\
5\\
6\\
7\\
8
\end{pmatrix}
$$
這時候我們得到卷積結果的攤平
$$
\mathbf{Z_{row}} = \mathbf{X_{row}}\mathbf{K_{col}} = \begin{pmatrix}
379 \\
418 \\
490 \\
526 \\
\end{pmatrix}
$$
因此卷積結果為
$$
\mathbf{Z} =
\begin{pmatrix}
379 & 418 \\
490 & 526
\end{pmatrix}
$$
我們可以做一下推廣,改成多樣本、多卷積核數目。
假設我們有樣本$\mathbf{X}$、卷積核$\mathbf{K}$,並輸出特徵圖$\mathbf{Z}$。
樣本$\mathbf{X}$:(樣本數,通道數,高,寬)=(N,C,H,W)的張量
卷積核$\mathbf{K}$:(卷積核數,通道數,高,寬)=(F,C,kH,kW)的張量
特徵圖$\mathbf{Z}$:(樣本數,單樣本生成特徵圖數量,高,寬)=(N,F,oH,oW)的張量
那只需要將原本的$\mathbf{X_{row}}$往下按照樣本數進行擴展,將原本的$\mathbf{K_{col}}$往右按照卷積核數進行擴展。
為了方便舉例,我們假設每個樣本都相同、每個卷積核都相同,設有2個樣本、3個卷積核,數值都和上面的舉例一樣。
$$
\mathbf{X_{row}}
= \begin{pmatrix}
1 & 2 & 3 & 5 & 11 & 12 & 14 & 15\\
2 & 3 & 5 & 6 & 12 & 13 & 15 & 16\\
4 & 5 & 7 & 8 & 14 & 15 & 17 & 18\\
5 & 6 & 8 & 9 & 15 & 16 & 18 & 19\\
1 & 2 & 3 & 5 & 11 & 12 & 14 & 15\\
2 & 3 & 5 & 6 & 12 & 13 & 15 & 16\\
4 & 5 & 7 & 8 & 14 & 15 & 17 & 18\\
5 & 6 & 8 & 9 & 15 & 16 & 18 & 19
\end{pmatrix},
\mathbf{K_{col}}
= \begin{pmatrix}
1&1&1\\
2&2&2\\
3&3&3\\
4&4&4\\
5&5&5\\
6&6&6\\
7&7&7\\
8&8&8
\end{pmatrix}
$$
$$
\mathbf{Z_{row}} = \mathbf{X_{row}}\mathbf{K_{col}} = \begin{pmatrix}
379&379&379 \\
418&418&418 \\
490&490&490 \\
526&526&526 \\
379&379&379 \\
418&418&418 \\
490&490&490 \\
526&526&526
\end{pmatrix}
$$
## 二維卷積反向求導的矩陣乘法
已知$\mathbf{Z} = conv(\mathbf{X},\mathbf{K}) + b$,其中$conv(\mathbf{X},\mathbf{K})$可以表示成$\mathbf{Z_{row}} = \mathbf{X_{row}}\mathbf{K_{col}}$。
那要計算反向求導時,就可以比照全連接層的反向求導
$$db = np.sum(\mathbf{dZ},axis=(0,2,3))$$
$$\mathbf{dX_{row}} = \mathbf{dZ_{row}}\mathbf{K^T_{col}}$$
$$\mathbf{dK_{col}} = \mathbf{X^T_{row}}\mathbf{dZ_{row}}$$
最後再進行攤平的逆過程,就可以得到$\mathbf{dX}$、$\mathbf{dK}$,但要注意的是$\mathbf{dX}$的逆攤平會有部分資料區塊重疊,這些重疊的梯度應該要相加起來。
以一維卷積舉例,
$$
\mathbf{dX_{row}} =
\begin{pmatrix}
1&2&3\\
4&5&6\\
7&8&9
\end{pmatrix}
$$
則
$$
\mathbf{dX} =
\begin{pmatrix}
1 & 2+4 & 3+5+7 & 6+8 & 9
\end{pmatrix}
$$
問題:
* 簡述二維捲積的矩陣乘法實現方法
* 為什麼在卷積神經網絡中要使用矩陣乘法來進行卷積操作?