行列の和と積の誤差逆伝播法の証明

[ゼロから作るDeep Learning](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585)に行列の和と積の誤差逆伝播法の証明が書いていなかったため、Deep Learningという本（[英語版](https://www.deeplearningbook.org/)はネットで無料公開されています、邦訳版は[こちら](https://www.amazon.co.jp/%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92-Ian-Goodfellow/dp/4048930621)）を参考に、自分で証明を書いてみました。

#証明を読む前に
行列の微分というマニアックな分野になってくるので、行列の微分の定義および表記法（分子レイアウト記法と分母レイアウト記法など）を知るために、その名も[Matrix Differentiation](https://www.comp.nus.edu.sg/~cs5240/lecture/matrix-differentiation.pdf)という資料に一通り目を通しておいてください。僕もこれを読んで勉強しました。

**以下はすべて分母レイアウト記法です。**

#記法
太字の大文字$\boldsymbol{X}$は行列を表します。普通の太さの大文字$X$や普通の太さの小文字$x$はスカラーを表します。普通の太さの小文字に添字が付いたもの$x_{ij}$は対応する太字の大文字の行列$\boldsymbol{X}$の第$(i, j)$成分を表します。$R^{m \times n}$は$m \times n$の実数の行列の全体の集合を表します。

#証明のもととなる定理（拡張版連鎖律）
Deep Learning英語版のChapter 6のp203の式6.47がもととなりますが、以下の証明のために書き換えておきます。本ではテンソルですが、今回の証明では行列で十分ですし、一般のテンソルで考えるとややこしくなるので、ここでは行列に限定して議論します。

```math
z = f(\boldsymbol{Y})\\

\boldsymbol{Y} = g(\boldsymbol{X})\\

\frac{\partial z}{\partial \boldsymbol{X}} = 
\sum_{i, j} 
\frac{\partial y_{ij}}{\partial \boldsymbol{X}} 
\frac{\partial z}{\partial y_{ij}}
```

#行列の和の証明
損失関数の値を$L$とし、$L$は$\boldsymbol{Z}$の関数であるとします。$\boldsymbol{X}, \boldsymbol{Y}, \boldsymbol{Z} \in R^{m \times n}$であり、$\boldsymbol{Z} = \boldsymbol{X} + \boldsymbol{Y}$という関係があるとします。そして、$\frac{\partial L}{\partial \boldsymbol{Z}}$がわかっていて、$\frac{\partial L}{\partial \boldsymbol{X}}$と$\frac{\partial L}{\partial \boldsymbol{Y}}$を求めたいとします。このとき

```math
z_{ij} = x_{ij} + y_{ij}
```

この式の両辺を$\boldsymbol{X}$で微分して

```math
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} = 

\begin{pmatrix}
0 && \cdots && 0\\
\vdots && \ddots && \vdots\\
0 & \cdots & 1 & \cdots & 0\\
\vdots && \ddots && \vdots\\
0 && \cdots && 0
\end{pmatrix}
```

第$(i, j)$成分のみが1で他の成分はすべて0です。

さらに両辺に$\frac{\partial L}{\partial z_{ij}}$をかけて

```math
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} 
\frac{\partial L}{\partial z_{ij}} = 

\begin{pmatrix}
0 && \cdots && 0\\
\vdots && \ddots && \vdots\\
0 & \cdots & \frac{\partial L}{\partial z_{ij}} & \cdots & 0\\
\vdots && \ddots && \vdots\\
0 && \cdots && 0
\end{pmatrix}
```

これを$j$について和をとると

```math
\sum_{j=1}^n 
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} 
\frac{\partial L}{\partial z_{ij}} = 

\begin{pmatrix}
0 && \cdots && 0\\
\vdots && \ddots && \vdots\\
\frac{\partial L}{\partial z_{i1}} & 
\frac{\partial L}{\partial z_{i2}} & 
\frac{\partial L}{\partial z_{i3}} & 
\cdots & 
\frac{\partial L}{\partial z_{in}}\\
\vdots && \ddots && \vdots\\
0 && \cdots && 0
\end{pmatrix}
```

さらに$i$について和をとると

```math
\sum_{i=1}^l 
\sum_{j=1}^n 
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} 
\frac{\partial L}{\partial z_{ij}} = 

\begin{pmatrix}
\frac{\partial L}{\partial z_{11}} & 
\frac{\partial L}{\partial z_{12}} & 
\frac{\partial L}{\partial z_{13}} & 
\cdots & 
\frac{\partial L}{\partial z_{1n}}\\
\frac{\partial L}{\partial z_{21}} & 
\frac{\partial L}{\partial z_{22}} & 
\frac{\partial L}{\partial z_{23}} & 
\cdots & 
\frac{\partial L}{\partial z_{2n}}\\
\vdots && \ddots && \vdots\\
\frac{\partial L}{\partial z_{m1}} & 
\frac{\partial L}{\partial z_{m2}} & 
\frac{\partial L}{\partial z_{m3}} & 
\cdots & 
\frac{\partial L}{\partial z_{mn}}\\
\end{pmatrix} = 

\frac{\partial L}{\partial \boldsymbol{Z}}
```

ここで、上記の定理より

```math
\frac{\partial L}{\partial \boldsymbol{X}} = 

\sum_{i, j} 
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} 
\frac{\partial L}{\partial z_{ij}} = 

\sum_{i=1}^l 
\sum_{j=1}^n 
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} 
\frac{\partial L}{\partial z_{ij}}
```

したがって

```math
\frac{\partial L}{\partial \boldsymbol{X}} = 
\frac{\partial L}{\partial \boldsymbol{Z}}
```

同様にして

```math
\frac{\partial L}{\partial \boldsymbol{Y}} = 
\frac{\partial L}{\partial \boldsymbol{Z}}
```

#行列の積の証明
損失関数の値を$L$とし、$L$は$\boldsymbol{Z}$の関数であるとします。$\boldsymbol{X} \in R^{l \times m}, \boldsymbol{Y} \in R^{m \times n}, \boldsymbol{Z} \in R^{l \times n}$であり、$\boldsymbol{Z} = \boldsymbol{X} \boldsymbol{Y}$という関係があるとします。そして、$\frac{\partial L}{\partial \boldsymbol{Z}}$がわかっていて、$\frac{\partial L}{\partial \boldsymbol{X}}$と$\frac{\partial L}{\partial \boldsymbol{Y}}$を求めたいとします。このとき、[行列の積の定義](https://ja.wikipedia.org/wiki/%E8%A1%8C%E5%88%97%E3%81%AE%E4%B9%97%E6%B3%95)より

```math
z_{ij} = \sum_{k=1}^mx_{ik}y_{kj}
```
この式の両辺を$\boldsymbol{X}$で微分して

```math
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} = 

\begin{pmatrix}
0 && \cdots && 0\\
\vdots &&\ddots&& \vdots\\
y_{1j} & y_{2j} &y_{3j} & \cdots & y_{mj}\\
\vdots &&\ddots&& \vdots\\
0 && \cdots && 0
\end{pmatrix}
```

第$i$行が$\begin{matrix}y_{1j} & y_{2j} &y_{3j} & \cdots & y_{mj}\end{matrix}$であり、他の行はすべて0で埋まっている状態です。

さらに両辺に$\frac{\partial L}{\partial z_{ij}}$をかけて

```math
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} 
\frac{\partial L}{\partial z_{ij}} = 

\begin{pmatrix}
0 && \cdots && 0\\
\vdots &&\ddots&& \vdots\\
y_{1j} \frac{\partial L}{\partial z_{ij}} & 
y_{2j} \frac{\partial L}{\partial z_{ij}} & 
y_{3j} \frac{\partial L}{\partial z_{ij}} & 
\cdots & 
y_{mj} \frac{\partial L}{\partial z_{ij}}\\
\vdots &&\ddots&& \vdots\\
0 && \cdots && 0
\end{pmatrix}
```

これを$j$について和をとると

```math
\sum_{j=1}^n 
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} 
\frac{\partial L}{\partial z_{ij}} = 

\begin{pmatrix}
0 && \cdots && 0\\
\vdots &&\ddots&& \vdots\\
\sum_{j=1}^n y_{1j} \frac{\partial L}{\partial z_{ij}} & 
\sum_{j=1}^n y_{2j} \frac{\partial L}{\partial z_{ij}} & 
\sum_{j=1}^n y_{3j} \frac{\partial L}{\partial z_{ij}} & 
\cdots & 
\sum_{j=1}^n y_{mj} \frac{\partial L}{\partial z_{ij}}\\
\vdots &&\ddots&& \vdots\\
0 && \cdots && 0
\end{pmatrix}
```

さらに$i$について和をとると

```math
\sum_{i=1}^l 
\sum_{j=1}^n 
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} 
\frac{\partial L}{\partial z_{ij}} = 

\begin{pmatrix}
\sum_{j=1}^n y_{1j} \frac{\partial L}{\partial z_{1j}} & 
\sum_{j=1}^n y_{2j} \frac{\partial L}{\partial z_{1j}} & 
\sum_{j=1}^n y_{3j} \frac{\partial L}{\partial z_{1j}} & 
\cdots & 
\sum_{j=1}^n y_{mj} \frac{\partial L}{\partial z_{1j}}\\
\vdots &&\ddots&& \vdots\\
\sum_{j=1}^n y_{1j} \frac{\partial L}{\partial z_{lj}} & 
\sum_{j=1}^n y_{2j} \frac{\partial L}{\partial z_{lj}} & 
\sum_{j=1}^n y_{3j} \frac{\partial L}{\partial z_{lj}} & 
\cdots & 
\sum_{j=1}^n y_{mj} \frac{\partial L}{\partial z_{lj}}\\
\end{pmatrix}
```

ここで、上記の定理より

```math
\frac{\partial L}{\partial \boldsymbol{X}} = 

\sum_{i, j} 
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} 
\frac{\partial L}{\partial z_{ij}} = 

\sum_{i=1}^l 
\sum_{j=1}^n 
\frac{\partial z_{ij}}{\partial \boldsymbol{X}} 
\frac{\partial L}{\partial z_{ij}}
```

したがって

```math
\frac{\partial L}{\partial \boldsymbol{X}} = 

\begin{pmatrix}
\sum_{j=1}^n y_{1j} \frac{\partial L}{\partial z_{1j}} & 
\sum_{j=1}^n y_{2j} \frac{\partial L}{\partial z_{1j}} & 
\sum_{j=1}^n y_{3j} \frac{\partial L}{\partial z_{1j}} & 
\cdots & 
\sum_{j=1}^n y_{mj} \frac{\partial L}{\partial z_{1j}}\\
\vdots &&\ddots&& \vdots\\
\sum_{j=1}^n y_{1j} \frac{\partial L}{\partial z_{lj}} & 
\sum_{j=1}^n y_{2j} \frac{\partial L}{\partial z_{lj}} & 
\sum_{j=1}^n y_{3j} \frac{\partial L}{\partial z_{lj}} & 
\cdots & 
\sum_{j=1}^n y_{mj} \frac{\partial L}{\partial z_{lj}}\\
\end{pmatrix}
```

すなわち

```math
\frac{\partial L}{\partial x_{ij}} = 
\sum_{k=1}^n y_{jk} \frac{\partial L}{\partial z_{ik}} = 
\sum_{k=1}^n \frac{\partial L}{\partial z_{ik}} y_{jk}
```

ここで、$\boldsymbol{X} \in R^{l \times m}, \boldsymbol{Y} \in R^{m \times n}, \boldsymbol{Z} \in R^{l \times n}$であり、$\boldsymbol{Z} = \boldsymbol{X} \boldsymbol{Y}$であるとき、$
z_{ij} = \sum_{k=1}^mx_{ik}y_{kj}
$であることを思い出すと、$\boldsymbol{Y} \rightarrow \boldsymbol{Y}^T$で$y_{jk} \rightarrow y_{kj}$であることを利用して

```math
\frac{\partial L}{\partial \boldsymbol{X}} = 
\frac{\partial L}{\partial \boldsymbol{Z}} \boldsymbol{Y}^T
```

$\frac{\partial L}{\partial \boldsymbol{X}}$が求まったので、次に$\frac{\partial L}{\partial \boldsymbol{X}}$を求める。転置行列の性質（[参考](https://mathtrain.jp/transpose))を用いて、$\boldsymbol{Z} = \boldsymbol{X} \boldsymbol{Y}$の両辺を転置すると、$\boldsymbol{Z}^T = \boldsymbol{Y}^T \boldsymbol{X}^T$が導ける。よって、先の結果と転置行列の性質を用いて

```math
\frac{\partial L}{\partial \boldsymbol{Y}^T} = 
\frac{\partial L}{\partial \boldsymbol{Z}^T} \boldsymbol{X}
```

すなわち

```math
\left( \frac{\partial L}{\partial \boldsymbol{Y}} \right) ^ T = 
\left( \frac{\partial L}{\partial \boldsymbol{Z}} \right) ^ T \boldsymbol{X}
```

両辺を転置して

```math
\frac{\partial L}{\partial \boldsymbol{Y}} = 
\boldsymbol{X}^T \frac{\partial L}{\partial \boldsymbol{Z}}
```