からっぽのしょこ

読んだら書く!書いたら読む!読書読読書読書♪同じ事は二度調べ(たく)ない

Affineレイヤの逆伝播【ゼロつく1のノート(数学)】

はじめに

 「機械学習・深層学習」学習初手『ゼロから作る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