からっぽのしょこ

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

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

はじめに

 「機械学習・深層学習」学習初手『ゼロから作るDeep Learning』民のための数学攻略ノートです。『ゼロつく1』学習の補助となるように適宜解説を加えています。本と一緒に読んでください。

 NumPy関数を使って実装できてしまう計算について、数学的背景を1つずつ確認していきます。

 この記事は、主に5.6.2項「バッチ版Affineレイヤ」を補足するための内容になります。バッチデータに対するAffineレイヤ(重み付き信号とバイアスの和)の順伝播の確認と逆伝播(微分)を導出します。

【関連する記事】

www.anarchive-beta.com

【他の記事一覧】

www.anarchive-beta.com

【この記事の内容】

バッチ版Affineレイヤの逆伝播

 前項では簡単な例として、データ数が1の場合を考えました。この項では、複数のデータ(バッチデータ)を扱う場合を考えます。

・順伝播の確認

 Affineレイヤの順伝播、つまり重み付き和の計算は次の式でした。

$$ \mathbf{Y} = \mathbf{X} \mathbf{W} + \mathbf{B} $$

 行列の積の計算を行うので、入力$\mathbf{X}$と重み$\mathbf{W}$の形状が対応している必要があります(3.3.2項)。(勿論本来はただ計算するためではなく、各ピクセルデータと重みを対応させるために数が一致している必要があります。)

 ここでは(具体的な値で確認するため)1層のニューラルネットワークを想定します(が、複数の層の場合にも対応できるような説明も加えます(ので注意して読みとってください))。

 第1層の入力$\mathbf{X}$は、行数がバッチサイズ$N$、列数がピクセルデータ数$28^2$に対応するため、$N \times 784$の行列とします。
 これに対応する(第1層の)重み$\mathbf{W}$は、行数がピクセルデータ数、列数が隠れ層のニューロン数に対応するため、$ 784\times M$の行列になります。隠れ層のニューロン数は自由に決められるため$M$とします。最終層の重みであれば、行数は最終層の入力の列数、列数は0から9の数字の数10に対応します。この項では1層のニューラルネットワークを扱うため、重み$\mathbf{W}$は$784 \times 10$の行列とします。

$$ \mathbf{X} = \begin{pmatrix} x_{11} & x_{12} & \cdots & x_{1,784} \\ x_{21} & x_{22} & \cdots & x_{2,784} \\ \vdots & \vdots & \ddots & \vdots \\ x_{N1} & x_{N2} & \cdots & x_{N,784} \end{pmatrix} ,\ \mathbf{W} = \begin{pmatrix} w_{11} & w_{12} & \cdots & w_{1,10} \\ w_{21} & w_{22} & \cdots & w_{2,10} \\ \vdots & \vdots & \ddots & \vdots \\ w_{784,1} & w_{784,2} & \cdots & w_{784,10} \end{pmatrix} $$

 2つの行列の積は、「前の項の行数」と「後の項の列数」の行列となるのでした。よって$N \times 10$の行列になります。出力$\mathbf{Y}$もこの形になります。

 ここに加えるバイアス$\mathbf{B}$は、要素数が10の1次元配列とします。

$$ \mathbf{B} = (b_1, b_2, \cdots, b_{10}) $$

 本来は行列と1次元配列の和は計算できません。これは複数の画像データを1枚ずつ(forループのように)処理するとき、同じバイアス変数を使って計算することに対応します。つまり次のような行列との和を計算するイメージです。

$$ \mathbf{B} = \begin{pmatrix} b_1 & b_2 & \cdots & b_{10} \\ b_1 & b_2 & \cdots & b_{10} \\ \vdots & \vdots & \ddots & \vdots \\ b_1 & b_2 & \cdots & b_{10} \end{pmatrix} $$

 従って第1層のAffineレイヤの順伝播の出力(計算結果)$\mathbf{Y}$は

$$ \begin{aligned} \mathbf{Y} &= \mathbf{X} \mathbf{W} + \mathbf{B} \\ &= \begin{pmatrix} \sum_{j=1}^{784} x_{1j} w_{j1} + b_1 & \sum_{j=1}^{784} x_{1j} w_{j2} + b_2 & \cdots & \sum_{j=1}^{784} x_{1j} w_{j,10} + b_{10} \\ \sum_{j=1}^{784} x_{2j} w_{j1} + b_1 & \sum_{j=1}^{784} x_{2,j} w_{j2} + b_2 & \cdots & \sum_{j=1}^{784} x_{2j} w_{j,10} + b_{10} \\ \vdots & \vdots & \ddots & \vdots \\ \sum_{j=1}^{784} x_{Nj} w_{j1} + b_1 & \sum_{j=1}^{784} x_{Nj} w_{j2} + b_2 & \cdots & \sum_{j=1}^{784} x_{Nj} w_{j,10} + b_{10} \end{pmatrix} \\ &= \begin{pmatrix} y_{11} & y_{12} & \cdots & y_{1,10} \\ y_{21} & y_{22} & \cdots & y_{2,10} \\ \vdots & \vdots & \ddots & \vdots \\ y_{N1} & y_{N2} & \cdots & y_{N,10} \end{pmatrix} \end{aligned} $$

となります。
 複数層の場合は、列数が$M$になります。またこの第1層の出力$\mathbf{Y}^{(1)}$を活性化関数で処理したものが、第2層の入力$\mathbf{X}^{(2)}$になります。活性化関数の計算では変数の形状は変わらないため、$\mathbf{X}^{(2)}$も$N \times M$の行列になります。

 この出力の$i,k$要素に注目すると、次の式になります。

$$ y_{ik} = \sum_{j=1}^{784} x_{ij} w_{jk} + b_k $$


 これがAffineレイヤの順伝播の計算になります。続いて逆伝播を導出します。

・逆伝播の導出

 最終層のAffineレイヤの出力$\mathbf{Y}$は、損失関数レイヤの入力となり、交差エントロピー誤差$L$として出力されるのでした。よって最終層のAffineレイヤには、$L$を$\mathbf{Y}$で微分した

$$ \frac{\partial L}{\partial \mathbf{Y}} = \begin{pmatrix} \frac{\partial L}{\partial y_{11}} & \frac{\partial L}{\partial y_{12}} & \cdots & \frac{\partial L}{\partial y_{1,10}} \\ \frac{\partial L}{\partial y_{21}} & \frac{\partial L}{\partial y_{22}} & \cdots & \frac{\partial L}{\partial y_{2,10}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial L}{\partial y_{N1}} & \frac{\partial L}{\partial y_{N2}} & \cdots & \frac{\partial L}{\partial y_{N,10}} \\ \end{pmatrix} $$

が伝播します。$L$はスカラ(1つの値)なので、$\frac{\partial L}{\partial \mathbf{Y}}$は$\mathbf{Y}$と同じ形状になります。

・入力$\mathbf{X}$の微分

 最終的な計算結果$L$に対する入力$\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}} $$

と各計算の微分に分解できます。

 このまま計算するのは面倒(新しい行列計算の概念が必要になる(そしてよく分かってない))なので、5.6.1項と同様に1要素ずつ考えることにします。

 まずは、1枚目の画像の1つ目のピクセルデータ$x_{11}$による$L$の微分を考えます。$\frac{\partial L}{\partial x_{11}}$は、連鎖率より

$$ \frac{\partial L}{\partial x_{11}} = \frac{\partial L}{\partial \mathbf{y}_{1 \cdot}} \frac{\partial \mathbf{y}_{1 \cdot}}{\partial x_{11}} $$

と分解できます。
 ここで、1枚目の画像データに対応する$\mathbf{Y}$の1行目の出力を$\mathbf{y}_{1 \cdot}$としています(これは私が勝手にしている表記です(覚えないで、そして適当な書き方があるのなら教えてください))。$\mathbf{y}_{1 \cdot}$は$1 \times 10$の行列です。各要素を詳しくみると

$$ \begin{aligned} \mathbf{y}_{1 \cdot} &= \begin{pmatrix} y_{11} & y_{12} & \cdots & y_{1,10} \end{pmatrix} \\ &= \begin{pmatrix} \sum_{j=1}^{784} x_{1j} w_{j1} + b_1 & \sum_{j=1}^{784} x_{1j} w_{j2} + b_2 & \cdots & \sum_{j=1}^{784} x_{1j} w_{j,10} + b_{10} \end{pmatrix} \end{aligned} $$

どの要素も$x_{11}$を含んでいることが分かります。

 これを$x_{11}$で微分すると、各要素において$x_{11}$の係数になっている項(重み$w_{1k}$)だけが残るので

$$ \frac{\partial \mathbf{y}_{1 \cdot}}{\partial x_{11}} = \begin{pmatrix} w_{11} \\ w_{12} \\ \vdots \\ w_{1,10} \end{pmatrix} $$

となります。

 これを連鎖率の式に代入すると

$$ \begin{aligned} \frac{\partial L}{\partial x_{11}} &= \frac{\partial L}{\partial \mathbf{y}_{1 \cdot}} \frac{\partial \mathbf{y}_{1 \cdot}}{\partial x_{11}} \\ &= \begin{pmatrix} \frac{\partial L}{\partial y_{11}} & \frac{\partial L}{\partial y_{12}} & \cdots & \frac{\partial L}{\partial y_{1,10}} \end{pmatrix} \begin{pmatrix} w_{11} \\ w_{12} \\ \vdots \\ w_{1,10} \end{pmatrix} \\ &= \frac{\partial L}{\partial y_{11}} w_{11} + \frac{\partial L}{\partial y_{12}} w_{12} + \cdots + \frac{\partial L}{\partial y_{1,10}} w_{1,10} \\ &= \sum_{k=1}^{10} \frac{\partial L}{\partial y_{1k}} w_{1k} \end{aligned} $$

が求まります。$L$と$x_{11}$はスカラなので、その微分もスカラになります。

 1枚目の画像データ($\mathbf{X}$の1行目)を$\mathbf{x}_{1 \cdot} = (x_{11}, x_{12}, \cdots, x_{1,784})$として、(数学上の何かを無視して)他の要素についても同様に求めると、$\mathbf{x}_{1 \cdot}$による$L$微分は次のようになることが分かります。

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{x}_{1 \cdot}} &= \frac{\partial L}{\partial \mathbf{y}_{1 \cdot}} \frac{\partial \mathbf{y}_{1 \cdot}}{\partial \mathbf{x}_{1 \cdot}} \\ &= \begin{pmatrix} \sum_{k=1}^{10} \frac{\partial L}{\partial y_{1k}} w_{1k} & \sum_{k=1}^{10} \frac{\partial L}{\partial y_{1k}} w_{2k} & \cdots & \sum_{k=1}^{10} \frac{\partial L}{\partial y_{1k}} w_{784,k} \end{pmatrix} \end{aligned} $$

 スカラ$L$を$1 \times 784$の行列$\mathbf{x}_{1 \cdot}$で微分した結果は、同じ$1 \times 784$の行列となります。(スカラを(1次元配列を含む)行列で微分するとそのままの形状になるというルールを設定すると、行列をスカラで微分すると転置した形状になるという理解でいいと思います(全く逆になるというルールもあるらしい(?))。)

 これを更に、$\mathbf{X}$の全ての要素での微分について考えると(、行方向に次元が増えて)

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{X}} &= \frac{\partial L}{\partial \mathbf{Y}} \frac{\partial \mathbf{Y}}{\partial \mathbf{X}} \\ &= \begin{pmatrix} \sum_{k=1}^{10} \frac{\partial L}{\partial y_{1k}} w_{1,k} & \sum_{k=1}^{10} \frac{\partial L}{\partial y_{1k}} w_{2,k} & \cdots & \sum_{k=1}^{10} \frac{\partial L}{\partial y_{1k}} w_{784,k} \\ \sum_{k=1}^{10} \frac{\partial L}{\partial y_{2k}} w_{1,k} & \sum_{k=1}^{10} \frac{\partial L}{\partial y_{2k}} w_{2,k} & \cdots & \sum_{k=1}^{10} \frac{\partial L}{\partial y_{2k}} w_{784,k} \\ \vdots & \vdots & \ddots & \vdots \\ \sum_{k=1}^{10} \frac{\partial L}{\partial y_{Nk}} w_{1,k} & \sum_{k=1}^{10} \frac{\partial L}{\partial y_{Nk}} w_{2,k} & \cdots & \sum_{k=1}^{10} \frac{\partial L}{\partial y_{Nk}} w_{784,k} \end{pmatrix} \end{aligned} $$

となります。

 この計算結果は、次のように分解できます。

$$ \begin{align} \frac{\partial L}{\partial \mathbf{X}} &= \begin{pmatrix} \frac{\partial L}{\partial y_{11}} & \frac{\partial L}{\partial y_{12}} & \cdots & \frac{\partial L}{\partial y_{1,10}} \\ \frac{\partial L}{\partial y_{21}} & \frac{\partial L}{\partial y_{22}} & \cdots & \frac{\partial L}{\partial y_{2,10}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial L}{\partial y_{N1}} & \frac{\partial L}{\partial y_{N2}} & \cdots & \frac{\partial L}{\partial y_{N,10}} \end{pmatrix} \begin{pmatrix} w_{11} & w_{21} & \cdots & w_{784,1} \\ w_{12} & w_{22} & \cdots & w_{784,2} \\ \vdots & \vdots & \ddots & \vdots \\ w_{1,10} & w_{2,10} & \cdots & w_{784,10} \end{pmatrix} \\ &= \frac{\partial L}{\partial \mathbf{Y}} \mathbf{W}^{\mathrm{T}} \tag{5.13.1} \end{align} $$

 ここで$\mathbf{W}^{\mathrm{T}}$は、$\mathbf{W}$の転置行列です。  計算結果は$N \times 10$の行数と$10 \times 784$の行列の積で求められるので、$\frac{\partial L}{\partial \mathbf{X}}$は$N \times 784$の行列になることが分かります。この形状は、$\mathbf{X}$を転置した形状と一致しますね。

・重み$\mathbf{W}$の微分

 続いて、$L$に対する入力$\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}} $$

と各計算の微分に分解できます。

 この計算についても先ほどと同様に、1要素ずつ考えることにします。

 まずは、重み$\mathbf{W}$の1行1列目の要素$w_{11}$による$L$の微分を考えます。$\frac{\partial L}{\partial w_{11}}$は、連鎖率より

$$ \frac{\partial L}{\partial w_{11}} = \frac{\partial L}{\partial \mathbf{y}_{\cdot 1}} \frac{\partial \mathbf{y}_{\cdot 1}}{\partial w_{11}} $$

と分解できます。
 ここで、重みの1列目に対応する$\mathbf{Y}$の1列目を$\mathbf{y}_{\cdot 1}$としています。$\mathbf{y}_{\cdot 1}$は$10 \times 1$の行列です。各要素を詳しくみると

$$ \mathbf{y}_{\cdot 1} = \begin{pmatrix} y_{11} \\ y_{12} \\ \vdots \\ y_{1,10} \end{pmatrix} = \begin{pmatrix} \sum_{j=1}^{784} x_{1j} w_{j1} + b_1 \\ \sum_{j=1}^{784} x_{2j} w_{j1} + b_1 \\ \vdots \\ \sum_{j=1}^{784} x_{Nj} w_{j1} + b_1 \end{pmatrix} $$

どの要素も$w_{11}$を含んでいることが分かります。

 これを$w_{11}$で微分すると、各要素において$w_{11}$の係数になっている項(入力$x_{i1}$)だけが残るので

$$ \frac{\partial \mathbf{y}_{\cdot 1}}{\partial w_{11}} = \begin{pmatrix} x_{11} & x_{21} & \cdots & x_{N1} \end{pmatrix} $$

となります。

 これを連鎖率の式に代入すると

$$ \begin{aligned} \frac{\partial L}{\partial w_{11}} &= \frac{\partial L}{\partial \mathbf{y}_{\cdot 1}} \frac{\partial \mathbf{y}_{\cdot 1}}{\partial w_{11}} \\ &= \begin{pmatrix} \frac{\partial L}{\partial y_{11}} \\ \frac{\partial L}{\partial y_{21}} \\ \vdots \\ \frac{\partial L}{\partial y_{N1}} \end{pmatrix} \begin{pmatrix} x_{11} & x_{21} & \cdots & x_{N1} \end{pmatrix} \\ &= \begin{pmatrix} \frac{\partial L}{\partial y_{11}} x_{11} & \frac{\partial L}{\partial y_{11}} x_{21} & \cdots & \frac{\partial L}{\partial y_{11}} x_{N1} \\ \frac{\partial L}{\partial y_{21}} x_{11} & \frac{\partial L}{\partial y_{21}} x_{21} & \cdots & \frac{\partial L}{\partial y_{21}} x_{N1} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial L}{\partial y_{N1}} x_{11} & \frac{\partial L}{\partial y_{N1}} x_{21} & \cdots & \frac{\partial L}{\partial y_{N1}} x_{N1} \end{pmatrix} \end{aligned} $$

???何とか2行目を転置するか、3行目の対角要素を取り出して下の計算に続けるための、数学上でもニューラルネットワーク上でものルールや方法はありませんか?

$$ \begin{aligned} \frac{\partial L}{\partial w_{11}} &= \frac{\partial L}{\partial y_{11}} x_{11} + \frac{\partial L}{\partial y_{21}} x_{21} + \cdots + \frac{\partial L}{\partial y_{N1}} x_{N1} \\ &= \sum_{i=1}^N \frac{\partial L}{\partial y_{i1}} x_{i1} \end{aligned} $$

$L$と$w_{11}$はスカラなので、その微分もスカラになって!

 重み$\mathbf{W}$の1行目を$\mathbf{w}_{1 \cdot} = (w_{11}, w_{12}, \cdots, w_{1,10})$として、他の要素についても同様に求めると、$\mathbf{w}_{1 \cdot}$による$L$微分は次のようになることが分かりたい。(ここからは、結果から逆算して始めに書いていたものです。)

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{w}_{1 \cdot}} &= \begin{pmatrix} \sum_{i=1}^N \frac{\partial L}{\partial y_{i1}} x_{i1} & \sum_{i=1}^N \frac{\partial L}{\partial y_{i2}} x_{i1} & \cdots & \sum_{i=1}^N \frac{\partial L}{\partial y_{i,10}} x_{i1} \end{pmatrix} \end{aligned} $$

 スカラ$L$を$1 \times 784$行列$\mathbf{w}_{1 \cdot}$で微分した結果は、同じ形状である$1 \times 784$の行列となります。

 これを更に、全ての要素$\mathbf{W}$での微分について考えると(、行方向に次元が増えて)

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{X}} &= \frac{\partial L}{\partial \mathbf{Y}} \frac{\partial \mathbf{Y}}{\partial \mathbf{X}} \\ &= \begin{pmatrix} \sum_{i=1}^N \frac{\partial L}{\partial y_{i1}} x_{i1} & \sum_{i=1}^N \frac{\partial L}{\partial y_{i2}} x_{i1} & \cdots & \sum_{i=1}^N \frac{\partial L}{\partial y_{i,10}} x_{i1} \\ \sum_{i=1}^N \frac{\partial L}{\partial y_{i1}} x_{i2} & \sum_{i=1}^N \frac{\partial L}{\partial y_{i2}} x_{i2} & \cdots & \sum_{i=1}^N \frac{\partial L}{\partial y_{i,10}} x_{i2} \\ \vdots & \vdots & \ddots & \vdots \\ \sum_{i=1}^N \frac{\partial L}{\partial y_{i1}} x_{i,784} & \sum_{i=1}^N \frac{\partial L}{\partial y_{i2}} x_{i,784} & \cdots & \sum_{i=1}^N\frac{\partial L}{\partial y_{i10}} x_{i,784} \end{pmatrix} \end{aligned} $$

となります。

 この計算結果は、次のように分解できます。

$$ \begin{align} \frac{\partial L}{\partial \mathbf{W}} &= \begin{pmatrix} x_{11} & x_{21} & \cdots & x_{N1} \\ x_{12} & x_{22} & \cdots & x_{N2} \\ \vdots & \vdots & \ddots & \vdots \\ x_{1,784} & x_{2,784} & \cdots & x_{N,784} \end{pmatrix} \begin{pmatrix} \frac{\partial L}{\partial y_{11}} & \frac{\partial L}{\partial y_{12}} & \cdots & \frac{\partial L}{\partial y_{1,10}} \\ \frac{\partial L}{\partial y_{21}} & \frac{\partial L}{\partial y_{22}} & \cdots & \frac{\partial L}{\partial y_{2,10}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial L}{\partial y_{N1}} & \frac{\partial L}{\partial y_{N2}} & \cdots & \frac{\partial L}{\partial y_{N,10}} \end{pmatrix} \\ &= \mathbf{X}^{\mathrm{T}} \frac{\partial L}{\partial \mathbf{Y}} \tag{5.13.1} \end{align} $$

 ここで$\mathbf{X}^{\mathrm{T}}$は、$\mathbf{X}$の転置行列であり、$784 \times N$の行列です。

・バイアス$\mathbf{B}$の微分

 最後に$\frac{\partial L}{\partial \mathbf{B}}$を考えます。

 バイアス$\mathbf{B}$は要素数が10の1次元配列で、各データ(画像1枚ごと)に加算するのでした。なので1データずつみていきましょう。

 これも連鎖率により分解して、各要素について詳しくみると

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{B}} &= \frac{\partial L}{\partial \mathbf{y}_{1 \cdot}} \frac{\partial \mathbf{y}_{1 \cdot}}{\partial \mathbf{B}} \\ &= \begin{pmatrix} \frac{\partial L}{\partial y_{11}} & \frac{\partial L}{\partial y_{12}} & \cdots & \frac{\partial L}{\partial y_{1,10}} \end{pmatrix} \begin{pmatrix} \frac{\partial y_{11}}{\partial b_1} & \frac{\partial y_{11}}{\partial b_2} & \cdots & \frac{\partial y_{11}}{\partial b_{10}} \\ \frac{\partial y_{12}}{\partial b_1} & \frac{\partial y_{12}}{\partial b_2} & \cdots & \frac{\partial y_{12}}{\partial b_{10}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_{1,10}}{\partial b_1} & \frac{\partial y_{1,10}}{\partial b_2} & \cdots & \frac{\partial y_{1,10}}{\partial b_{10}} \end{pmatrix} \end{aligned} $$

となります。ここでは1枚目の画像データに関する出力にのみ注目しています。後の項については、分母の配列はそのままの形状で行方向に複製し、分子の配列は転置した形状で列方向に複製しています(一応これまでのルールに沿って理解できるはずです(?))。

 試しに$\frac{\partial \mathbf{y}_{1 \cdot}}{\partial \mathbf{B}}$の1行1列目の要素を計算してみます。つまり$y_{11} = \sum_{j=1}^{784} x_{1j} w_{j1} + b_1$を$b_1$で微分すると

$$ \frac{\partial y_{11}}{\partial b_1} = 1 $$

となりますね。$b_2$だと

$$ \frac{\partial y_{11}}{\partial b_2} = 0 $$

$b_2$の項を含まないので、0になりますね。

 他の項も同様に計算していくと

$$ \frac{\partial \mathbf{y}_{1 \cdot}}{\partial \mathbf{B}} = \begin{pmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{pmatrix} $$

となります。

 では$\frac{\partial L}{\partial \mathbf{B}}$の計算を進めると

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{B}} &= \frac{\partial L}{\partial \mathbf{y}_{1 \cdot}} \frac{\partial \mathbf{y}_{1 \cdot}}{\partial \mathbf{B}} \\ &= \begin{pmatrix} \frac{\partial L}{\partial y_{11}} & \frac{\partial L}{\partial y_{12}} & \cdots & \frac{\partial L}{\partial y_{1,10}} \end{pmatrix} \begin{pmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{pmatrix} \\ &= \begin{pmatrix} \frac{\partial L}{\partial y_{11}} & \frac{\partial L}{\partial y_{12}} & \cdots & \frac{\partial L}{\partial y_{1,10}} \end{pmatrix} \end{aligned} $$

となります。何度もやりましたがやはり加算ノードの逆伝播では何もしないということです!
 (ここで、行列の対角要素($i,i$要素(要は左上から右下まで対角線に並んでいる要素のこと))が1で、それ以外が0の行列を単位行列と呼びます。単位行列は、行列の積において($1 * x = x$の1のように)書けても影響しません(勿論積が成立するように、2つの行列の形が対応している必要があります)。また単位行列は、正方行列でないと(対角成分がないので)存在しません。正方行列とは、行数と列数が同じ行列のことです。例えば$\frac{\partial \mathbf{y}_{1 \cdot}}{\partial \mathbf{B}}$は、$N \times N$の行列なので正方行列です。どちらも線形代数という分野において基本的な知識ですが、この本を進めるにあたっては覚えていなくても問題ありません。)

 2枚目の画像に関する出力$\mathbf{y}_{2 \cdot}$についても同様に計算できます。

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{B}} &= \frac{\partial L}{\partial \mathbf{y}_{2 \cdot}} \frac{\partial \mathbf{y}_{2 \cdot}}{\partial \mathbf{B}} \\ &= \begin{pmatrix} \frac{\partial L}{\partial y_{21}} & \frac{\partial L}{\partial y_{22}} & \cdots & \frac{\partial L}{\partial y_{2,10}} \end{pmatrix} \end{aligned} $$


 ところでこれも$\frac{\partial L}{\partial \mathbf{B}}$ですね。

 N枚分のデータにバイアス$\mathbf{B}$を加えたので、$\frac{\partial L}{\partial \mathbf{B}}$もN枚分存在するわけです。従って、N枚分の和をとることで計算できます。

$$ \frac{\partial L}{\partial \mathbf{B}} = \begin{pmatrix} \sum_{i=1}^N \frac{\partial L}{\partial y_{i1}} & \sum_{i=1}^N \frac{\partial L}{\partial y_{i2}} & \cdots & \sum_{i=1}^N \frac{\partial L}{\partial y_{i,10}} \end{pmatrix} $$

 (これは数学上の定義ではないと思う(?))

 以上で、3変数の微分を確認できました!それでは【実装ノート】に戻って実装しましょう。

参考文献

  • 斎藤康毅『ゼロから作るDeep Learning』オライリー・ジャパン,2016年.

おわりに

 重みでの微分を導出できませんでした、、、行列を行列で偏微分したら4階テンソルなるものになるのですか?それを勉強すれば解けるのですか?正攻法での勉強を避けて、雰囲気で解いてたら1か月が経っていました。更新の期間が空いてしまったのは、前項も含めてAffineレイヤの逆伝播の導出に時間がかかった所為です(それ自体は別にいい(よくある))。あぁしかしなんちゃって読解を公開するのキツい。。

【元の記事】

www.anarchive-beta.com


 2020年8月4日は「こぶしファクトリー」リーダー広瀬彩海さん21歳のお誕生日!

 おめでとうございます。