はじめに
「機械学習・深層学習」学習初手『ゼロから作るDeep Learning』民のための数学攻略ノートです。『ゼロつく1』学習の補助となるように適宜解説を加えています。本と一緒に読んでください。
NumPy関数を使って実装できてしまう計算について、数学的背景を1つずつ確認していきます。
この記事は、主に5.6.1項「Affineレイヤ」を補足するための内容になります。Affineレイヤ(重み付き信号とバイアスの和)の順伝播の確認と逆伝播(微分)を導出します。
【関連する記事】
www.anarchive-beta.com
【他の記事一覧】
www.anarchive-beta.com
【この記事の内容】
Affineレイヤの逆伝播
・順伝播の確認
これまでは「重み付き和」や「重み付き信号とバイアスの総和」などと呼んできた計算を、ここからはAffineレイヤと呼ぶことにします。まずはそのAffineレイヤの順伝播(重み付き和の計算)の確認から始めます。
この項では簡単な例として、入力$\mathbf{X}$と重み$\mathbf{W}$を次の形状として考えます。
$$
\mathbf{X}
= \begin{pmatrix}
x_{11} & x_{12}
\end{pmatrix}
,\
\mathbf{W}
= \begin{pmatrix}
w_{11} & w_{12} & w_{13} \\
w_{21} & w_{22} & w_{23}
\end{pmatrix}
$$
後でデータ数を増やしても(一般化したときに)理解しやすいように、ここでは$\mathbf{X}$を(要素数が2の1次元配列ではなく)$1 \times 2$の行列として扱うことにします。
行列の積では、「前の変数の列数」と「後の変数の行数」が一致している必要がありました(3.3.2項)。この2つの変数の積は次のようになります。
$$
\mathbf{X} \mathbf{W}
= \begin{pmatrix}
x_{11} w_{11} + x_{12} w_{21} & x_{11} w_{12} + x_{12} w_{22} & x_{11} w_{13} + x_{12} w_{23}
\end{pmatrix}
$$
計算結果は「前の変数の行数」と「後の変数の列数」の形状の行列、つまり$1 \times 3$の行列になります。
ここに加えるバイアス$\mathbf{B}$も同じ形状である必要があります。
$$
\mathbf{B}
= \begin{pmatrix}
b_{11} & b_{12} & b_{13}
\end{pmatrix}
$$
これを入力と重みの積に加えると、Affineレイヤ(ニューラルネットワーク)の出力$\mathbf{Y}$となります。
$$
\begin{aligned}
\mathbf{Y}
&= \mathbf{X} \mathbf{W} + \mathbf{B}
\\
&= \begin{pmatrix}
x_{11} w_{11} + x_{12} w_{21} + b_{11} & x_{11} w_{12} + x_{12} w_{22} + b_{12} & x_{11} w_{13} + x_{12} w_{23} + b_{13}
\end{pmatrix}
\end{aligned}
$$
これがAffineレイヤの順伝播(重み付き信号とバイアスの和)の計算になります(図5-24)。
・逆伝播の導出
続いてAffineレイヤの逆伝播を考えます。
ニューラルネットワークの出力$\mathbf{Y}$は、損失関数の入力となるのでした。つまり損失関数レイヤの出力$L$を入力$\mathbf{Y}$で微分した値$\frac{\partial L}{\partial \mathbf{Y}}$が、Affineレイヤに伝播してきます。損失関数の計算結果$L$はスカラ(1つの値)になるので、$\frac{\partial L}{\partial \mathbf{Y}}$は$\mathbf{Y}$と同じ形状になります。
$$
\frac{\partial L}{\partial \mathbf{Y}}
= \begin{pmatrix}
\frac{\partial L}{y_{11}} & \frac{\partial L}{y_{12}} & \frac{\partial L}{y_{13}}
\end{pmatrix}
$$
このAffineレイヤの逆伝播の入力$\frac{\partial L}{\partial \mathbf{Y}}$と、Affineレイヤの順伝播の出力$\mathbf{Y}$を3つの変数$\mathbf{X},\ \mathbf{W},\ \mathbf{B}$それぞれで微分した$\frac{\partial \mathbf{Y}}{\partial \mathbf{X}},\ \frac{\partial \mathbf{Y}}{\partial \mathbf{W}},\ \frac{\partial \mathbf{Y}}{\partial \mathbf{B}}$との積$\frac{\partial L}{\partial \mathbf{Y}} \frac{\partial \mathbf{Y}}{\partial \mathbf{X}},\ \frac{\partial L}{\partial \mathbf{Y}} \frac{\partial \mathbf{Y}}{\partial \mathbf{W}},\ \frac{\partial L}{\partial \mathbf{Y}} \frac{\partial \mathbf{Y}}{\partial \mathbf{B}}$を求めます(図5-25)。
・バイアス$\mathbf{B}$の微分
まずは逆伝播の1つ目の計算について考えます。
$\frac{\partial L}{\partial \mathbf{B}}$は連鎖率より、次のように分解できます。
$$
\frac{\partial L}{\partial \mathbf{B}}
= \frac{\partial L}{\partial \mathbf{Y}}
\frac{\partial \mathbf{Y}}{\partial \mathbf{B}}
$$
$\frac{\partial L}{\partial \mathbf{Y}}$は、(逆伝播の)入力として与えられるものなので、$\frac{\partial \mathbf{Y}}{\partial \mathbf{B}}$を求めます。
加算レイヤの微分は1になるのでした。
$$
\frac{\partial \mathbf{Y}}{\partial \mathbf{B}}
= 1
$$
従って「+」ノードに伝播した$\frac{\partial L}{\partial \mathbf{Y}}$が、そのまま$\frac{\partial L}{\partial \mathbf{B}}$となります。
$$
\begin{aligned}
\frac{\partial L}{\partial \mathbf{B}}
&= \frac{\partial L}{\partial \mathbf{Y}} \frac{\partial \mathbf{Y}}{\partial \mathbf{B}}
\\
&= \frac{\partial L}{\partial \mathbf{Y}} * 1
\\
&= \frac{\partial L}{\partial \mathbf{Y}}
\end{aligned}
$$
「dot」ノードにもそのまま伝播するのですが、$\mathbf{Y}$を微分するイメージがしやすいように、以降もバイアスの要素を表記しておきます。
・入力$\mathbf{X}$の微分
次に、$\frac{\partial L}{\partial \mathbf{X}}$を考えます。これも連鎖率により、次のように個々の計算の微分に分解できます。
$$
\frac{\partial L}{\partial \mathbf{X}}
= \frac{\partial L}{\partial \mathbf{Y}}
\frac{\partial \mathbf{Y}}{\partial \mathbf{X}}
$$
この式の後の項、つまりAffineレイヤの出力$\mathbf{Y}$の入力$\mathbf{X}$による微分$\frac{\partial \mathbf{Y}}{\partial \mathbf{X}}$を求めます。
$\mathbf{Y}$の1つ目の要素$y_{11}$に注目します。
$$
y_{11}
= x_{11} w_{11} + x_{12} w_{21} + b_{11}
$$
これを$\mathbf{X}$の1つ目の要素$x_{11}$で微分すると
$$
\begin{aligned}
\frac{\partial y_{11}}{\partial x_{11}}
&= 1 * w_{11} + 0 + 0
\\
&= w_{11}
\end{aligned}
$$
となります。同様に
$$
y_{13}
= x_{11} w_{13} + x_{12} w_{23} + b_{13}
$$
を$x_{12}$で微分すると
$$
\frac{\partial y_{13}}{\partial x_{12}}
= w_{23}
$$
となります。
他の要素も同様に考えると
$$
\begin{aligned}
\frac{\partial \mathbf{Y}}{\partial \mathbf{X}}
&= \begin{pmatrix}
\frac{\partial y_{11}}{\partial x_{11}} & \frac{\partial y_{11}}{\partial x_{12}} \\
\frac{\partial y_{12}}{\partial x_{11}} & \frac{\partial y_{12}}{\partial x_{12}} \\
\frac{\partial y_{13}}{\partial x_{11}} & \frac{\partial y_{13}}{\partial x_{12}}
\end{pmatrix}
\\
&= \begin{pmatrix}
w_{11} & w_{21} \\
w_{12} & w_{22} \\
w_{13} & w_{23}
\end{pmatrix}
= \mathbf{W}^{\mathrm{T}}
\end{aligned}
$$
となります(あれ?何か違和感が…)。
ここで$\mathbf{W}^{\mathrm{T}}$は、$\mathbf{W}$の転置行列を表します。また右肩の$\mathrm{T}$を転置記号と呼びます。転置とは、行列(やベクトル)の行と列を入れ替えることを言います。
例えば$\mathbf{W}$の2行1列目の要素$w_{21}$は、$\mathbf{W}^{\mathrm{T}}$では1行2列目の要素となります。行と列が入れ替わるとは、全ての要素で添字$i, j$が入れ替わるということです。これまで添字は行列内での位置を表していましたが、$\mathbf{W}^{\mathrm{T}}$は1行2列目の要素として「$w_{21}$の値」を持つという点に注意してください。
ところで何故転置行列になるのでしょう?(行列計算上の定義もあるのでしょうがよく分からなかったので)ここでは連鎖率の計算式から、次のように理解することにします。
$\frac{\partial L}{\partial \mathbf{Y}}$はこの項の最初に確認した形状であることから、$\frac{\partial \mathbf{Y}}{\partial \mathbf{X}}$はこの行列の積が成り立つ形状(3行の行列)である必要があります。よって連鎖率の式の要素は次のようになることが分かります。
$$
\begin{aligned}
\frac{\partial L}{\partial \mathbf{X}}
&= \frac{\partial L}{\partial \mathbf{Y}}
\frac{\partial \mathbf{Y}}{\partial \mathbf{X}}
\\
&= \begin{pmatrix}
\frac{\partial L}{y_{11}} & \frac{\partial L}{y_{12}} & \frac{\partial L}{y_{13}}
\end{pmatrix}
\begin{pmatrix}
\frac{\partial y_{11}}{\partial x_{11}} & \frac{\partial y_{11}}{\partial x_{12}} \\
\frac{\partial y_{12}}{\partial x_{11}} & \frac{\partial y_{12}}{\partial x_{12}} \\
\frac{\partial y_{13}}{\partial x_{11}} & \frac{\partial y_{13}}{\partial x_{12}}
\end{pmatrix}
\end{aligned}
$$
この式の計算結果は$1 \times 2$の行列になりますね。このことは、$\frac{\partial L}{\partial \mathbf{X}}$が$\mathbf{X}$と同じ形状になる必要があることからも分かります。
従って、先ほどの計算結果を代入すると
$$
\frac{\partial L}{\partial \mathbf{X}}
= \frac{\partial L}{\partial \mathbf{Y}}
\mathbf{W}^{\mathrm{T}}
\tag{5.13.1}
$$
が得られます。
・重み$\mathbf{W}$の微分
最後に、$\frac{\partial L}{\partial \mathbf{W}}$を考えます。これも連鎖率より
$$
\frac{\partial L}{\partial \mathbf{W}}
= \frac{\partial L}{\partial \mathbf{Y}}
\frac{\partial \mathbf{Y}}{\partial \mathbf{W}}
$$
と分解できますね。これまでと同様に$\frac{\partial \mathbf{Y}}{\partial \mathbf{W}}$を求めます。
$\mathbf{Y}$の1つ目の要素
$$
y_{11}
= x_{11} w_{11} + x_{12} w_{21} + b_{11}
$$
を、$\mathbf{W}$の1つ目の要素$w_{11}$で微分すると
$$
\frac{\partial y_{11}}{\partial w_{11}}
= x_{11}
$$
となります。しかし
$$
y_{12}
= x_{11} w_{12} + x_{12} w_{22} + b_{12}
$$
を、$w_{11}$で微分すると
$$
\frac{\partial y_{12}}{\partial w_{11}}
= 0
$$
となります。$y_{13}$についても同様なので、$\mathbf{Y}$を$w_{11}$で微分した結果は
$$
\frac{\partial \mathbf{Y}}{\partial w_{11}}
= \begin{pmatrix}
\frac{\partial y_{11}}{\partial w_{11}} \\
\frac{\partial y_{12}}{\partial w_{11}} \\
\frac{\partial y_{13}}{\partial w_{11}}
\end{pmatrix}
= \begin{pmatrix}
x_{11} \\
0 \\
0
\end{pmatrix}
$$
となります。
このことから、$L$に対する$w_{11}$の微分は
$$
\begin{aligned}
\frac{\partial L}{\partial w_{11}}
&= \frac{\partial L}{\partial \mathbf{Y}}
\frac{\partial \mathbf{Y}}{\partial w_{11}}
\\
&= \begin{pmatrix}
\frac{\partial L}{\partial y_{11}} & \frac{\partial L}{\partial y_{12}} & \frac{\partial L}{\partial y_{13}}
\end{pmatrix}
\begin{pmatrix}
x_{11} \\
0 \\
0
\end{pmatrix}
\\
&= \frac{\partial L}{\partial y_{11}} x_{11}
+ \frac{\partial L}{\partial y_{12}} * 0
+ \frac{\partial L}{\partial y_{13}} * 0
\\
&= \frac{\partial L}{\partial y_{11}} x_{11}
\end{aligned}
$$
となることが分かります。
$\mathbf{W}$の他の要素についても(数学上の何かをすっ飛ばして)同様に考えると
$$
\begin{aligned}
\frac{\partial L}{\partial \mathbf{W}}
&= \frac{\partial L}{\partial \mathbf{Y}}
\frac{\partial \mathbf{Y}}{\partial \mathbf{W}}
\\
&= \begin{pmatrix}
\frac{\partial L}{\partial y_{11}} x_{11} & \frac{\partial L}{\partial y_{12}} x_{11} & \frac{\partial L}{\partial y_{13}} x_{11} \\
\frac{\partial L}{\partial y_{21}} x_{12} & \frac{\partial L}{\partial y_{22}} x_{12} & \frac{\partial L}{\partial y_{23}} x_{12}
\end{pmatrix}
\end{aligned}
$$
となります。$\frac{\partial L}{\partial \mathbf{W}}$は$\mathbf{W}$と同じ$2 \times 3$の行列になっていますね。
この計算結果になることを保ちつつ、式を整理すると
$$
\begin{align}
\frac{\partial L}{\partial \mathbf{W}}
&= \begin{pmatrix}
x_{11} \\
x_{22}
\end{pmatrix}
\begin{pmatrix}
\frac{\partial L}{\partial y_{11}} & \frac{\partial L}{\partial y_{12}} & \frac{\partial L}{\partial y_{13}}
\end{pmatrix}
\\
&= \mathbf{X}^{\mathrm{T}}
\frac{\partial L}{\partial \mathbf{Y}}
\tag{5.13.2}
\end{align}
$$
が得られます。ここで$\mathbf{X}^{\mathrm{T}}$は、$\mathbf{X}$の転置行列です。
以上でニューラルネットワークの計算の3つの変数に関する微分(簡単な例Ver.)を確認できました。では次は、複数のデータを扱うとき(通常Ver.)の計算も導出してみましょう。
参考文献
- 斎藤康毅『ゼロから作るDeep Learning』オライリー・ジャパン,2016年.
おわりに
$n$回目の線形代数入門失敗、、、こんな解き方でいいのでしょうか?自信なんかありません。でもそれっぽい感じなので、これで納得することにしました。適切な書籍等あれば、教えて下さい。。。
【元の記事】
www.anarchive-beta.com