からっぽのしょこ

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

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

はじめに

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

 ニューラルネットワーク内部の計算について、数学的背景の解説や計算式の導出を行い、また実際の計算結果やグラフで確認していきます。

 この記事は、5.6.1項「Affineレイヤ」の内容です。1データに対するAffineレイヤを微分します。

【元の記事】

www.anarchive-beta.com

【他の記事一覧】

www.anarchive-beta.com

【この記事の内容】

1データ版Affineレイヤの逆伝播の導出

 重み付き和の計算を行うAffineレイヤ(全結合層)の微分(逆伝播)を導出します。この節では、簡単な例として1データの場合を考えます。次節では、複数データの場合を考えます。順伝播については「3.3-4:ニューラルネットワークの順伝播【ゼロつく1のノート(実装)】 - からっぽのしょこ」を参照してください。

・順伝播の確認

 逆伝播の前に、Affineレイヤの順伝播の計算を確認します。

 簡単な例として、Affineレイヤの順伝播の入力$\mathbf{x}$、重み$\mathbf{W}$、バイアス$\mathbf{b}$を次の形状として考えます。

$$ \mathbf{x} = \begin{pmatrix} x_{1,1} & x_{1,2} \end{pmatrix} ,\ \mathbf{W} = \begin{pmatrix} w_{1,1} & w_{1,2} & w_{1,3} \\ w_{2,1} & w_{2,2} & w_{2,3} \end{pmatrix} ,\ \mathbf{b} = \begin{pmatrix} b_1 & b_2 & b_3 \end{pmatrix} $$

 $\mathbf{x}$に関して、複数データの場合と対応するように、要素数が2のベクトルではなく$1 \times 2$の行列として扱うことにします。
 行列の積を計算するには、「前の行列の列数」と「後の行列の行数」が一致している必要があります(3.3.2項)。

 $\mathbf{x}$と$\mathbf{W}$の行列の積は、「前の行列の行数」と「後の行列の列数」の行列になります。

$$ \mathbf{x} \mathbf{W} = \begin{pmatrix} x_{1,1} w_{1,1} + x_{1,2} w_{2,1} & x_{1,1} w_{1,2} + x_{1,2} w_{2,2} & x_{1,1} w_{1,3} + x_{1,2} w_{2,3} \end{pmatrix} $$

 また、「計算結果の列数(後の行列の列数)」と「バイアス$\mathbf{b}$の要素数」も一致している必要があります。

 このとき、Affineレイヤの順伝播の出力(重み付き和)$\mathbf{y}$は

$$ \begin{aligned} \mathbf{y} &= \mathbf{x} \mathbf{W} + \mathbf{b} \\ &= \begin{pmatrix} x_{1,1} w_{1,1} + x_{1,2} w_{2,1} + b_1 & x_{1,1} w_{1,2} + x_{1,2} w_{2,2} + b_2 & x_{1,1} w_{1,3} + x_{1,2} w_{2,3} + b_3 \end{pmatrix} \\ &= \begin{pmatrix} y_{1,1} & y_{1,2} & y_{1,3} \end{pmatrix} \end{aligned} $$

となります。

 以上がAffineレイヤの順伝播の計算です(図5-24)。

・逆伝播の導出

 では、Affineレイヤの逆伝播の計算式を導出します。

 逆伝播では、順伝播の出力$\mathbf{y}$に関する損失$L$の勾配$\frac{\partial L}{\partial \mathbf{y}}$が次のレイヤから入力します。$\frac{\partial L}{\partial \mathbf{Y}}$は、$\mathbf{Y}$と同じ形状の行列になります。

$$ \frac{\partial L}{\partial \mathbf{y}} = \begin{pmatrix} \frac{\partial L}{\partial y_{1,1}} & \frac{\partial L}{\partial y_{1,2}} & \frac{\partial L}{\partial y_{1,3}} \end{pmatrix} $$

 出力の勾配(逆伝播の入力)$\frac{\partial L}{\partial \mathbf{y}}$を用いて、順伝播の入力$\mathbf{x}$とパラメータ$\mathbf{W},\ \mathbf{b}$それぞれに関する損失$L$の勾配$\frac{\partial L}{\partial \mathbf{x}},\ \frac{\partial L}{\partial \mathbf{W}},\ \frac{\partial L}{\partial \mathbf{b}}$を求めます(図5-25)。
 これまでのように、「逆伝播の入力$\frac{\partial L}{\partial \mathbf{y}}$」と「Affineレイヤの微分$\frac{\partial \mathbf{y}}{\partial \mathbf{x}},\ \frac{\partial \mathbf{y}}{\partial \mathbf{W}},\ \frac{\partial \mathbf{y}}{\partial \mathbf{b}}$」との積でも求められますが、より簡単に計算できるように計算式を導出します。

・バイアスの勾配

 まずは、バイアス$\mathbf{b}$に関する損失$L$の勾配$\frac{\partial L}{\partial \mathbf{b}}$を導出します。

 バイアスの勾配$\frac{\partial L}{\partial \mathbf{b}}$は、バイアス$\mathbf{b}$と同じ形状のベクトルになります。

$$ \frac{\partial L}{\partial \mathbf{b}} = \begin{pmatrix} \frac{\partial L}{\partial b_1} & \frac{\partial L}{\partial b_2} & \frac{\partial L}{\partial b_3} \end{pmatrix} $$


 $\frac{\partial L}{\partial \mathbf{b}}$の1つ目の要素$\frac{\partial L}{\partial b_1}$を考えます。$\frac{\partial L}{\partial b_1}$は、$\mathbf{b}$の1つ目の要素$b_1$に関する損失$L$の微分です。

 順伝播の出力に関して、$b_1$は$y_1$に影響しています。よって連鎖律より、次の微分の積で求められます。

$$ \frac{\partial L}{\partial b_1} = \frac{\partial L}{\partial y_{1,1}} \frac{\partial y_{1,1}}{\partial b_1} \tag{1} $$

 $\frac{\partial L}{\partial y_{1,1}}$は与えられている(次のレイヤで求めた)ので、$\frac{\partial y_{1,1}}{\partial b_1}$を求めます。

 $y_{1,1}$は次の式でした。

$$ y_{1,1} = x_{1,1} w_{1,1} + x_{1,2} w_{2,1} + b_1 $$

 $y_{1,1}$を$b_1$で微分すると

$$ \begin{aligned} \frac{\partial y_{1,1}}{\partial b_1} &= 0 + 0 + 1 \\ &= 1 \end{aligned} $$

$b_1$を$b_1$で微分した1だけが残ります。

 よって、連鎖律の式(1)に代入すると

$$ \begin{align} \frac{\partial L}{\partial b_1} &= \frac{\partial L}{\partial y_{1,1}} \frac{\partial y_{1,1}}{\partial b_1} \tag{1}\\ &= \frac{\partial L}{\partial y_{1,1}} * 1 \\ &= \frac{\partial L}{\partial y_{1,1}} \end{align} $$

となります。

 $\frac{\partial L}{\partial \mathbf{b}}$の他の項も同様に求められます。$b_2$に関する$L$の微分であれば、$b_2$は$y_{1,2}$に影響しているので

$$ \begin{aligned} \frac{\partial L}{\partial b_2} &= \frac{\partial L}{\partial y_{1,2}} \frac{\partial y_{1,2}}{\partial b_2} \\ &= \frac{\partial L}{\partial y_{1,2}} \frac{\partial}{\partial b_1} \Bigl( x_{1,1} w_{1,2} + x_{1,2} w_{2,2} + b_2 \Bigr) \\ &= \frac{\partial L}{\partial y_{1,2}} \Bigl( 0 + 0 + 1 \Bigr) \\ &= \frac{\partial L}{\partial y_{1,2}} \end{aligned} $$

となります。
 また、$b_3$に関する$L$の微分であれば、$b_3$は$y_{1,3}$に影響しているので

$$ \begin{aligned} \frac{\partial L}{\partial b_3} &= \frac{\partial L}{\partial y_{1,3}} \frac{\partial y_{1,3}}{\partial b_3} \\ &= \frac{\partial L}{\partial y_{1,3}} \frac{\partial}{\partial b_3} \Bigl( x_{1,1} w_{1,3} + x_{1,2} w_{2,3} + b_3 \Bigr) \\ &= \frac{\partial L}{\partial y_{1,3}} \Bigl( 0 + 0 + 1 \Bigr) \\ &= \frac{\partial L}{\partial y_{1,3}} \end {aligned} $$

となります。

 したがって、$\frac{\partial L}{\partial \mathbf{b}}$にそれぞれ代入すると

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{b}} &= \begin{pmatrix} \frac{\partial L}{\partial b_1} & \frac{\partial L}{\partial b_2} & \frac{\partial L}{\partial b_3} \end{pmatrix} \\ &= \begin{pmatrix} \frac{\partial L}{\partial y_{1,1}} & \frac{\partial L}{\partial y_{1,2}} & \frac{\partial L}{\partial y_{1,3}} \end{pmatrix} \\ &= \frac{\partial L}{\partial \mathbf{y}} \end{aligned} $$

が得られます。
 バイアスの勾配$\frac{\partial L}{\partial \mathbf{b}}$は、(1データの場合は)逆伝播の入力$\frac{\partial L}{\partial \mathbf{y}}$そのままの値と分かりました。

・入力の勾配

 次に、順伝播の入力$\mathbf{x}$に関する損失$L$の勾配$\frac{\partial L}{\partial \mathbf{x}}$を求めます。

 入力の勾配$\frac{\partial L}{\partial \mathbf{x}}$は、順伝播の入力$\mathbf{x}$と同じ形状の行列になります。

$$ \frac{\partial L}{\partial \mathbf{x}} = \begin{pmatrix} \frac{\partial L}{\partial x_{1,1}} & \frac{\partial L}{\partial x_{1,2}} \end{pmatrix} $$


 $\frac{\partial L}{\partial \mathbf{x}}$の1つ目の要素$\frac{\partial L}{\partial x_{1,1}}$を考えます。$\frac{\partial L}{\partial x_{1,1}}$は、$\mathbf{x}$の1つ目の要素$x_{1,1}$に関する損失$L$の微分です。

 $x_{1,1}$は、$\mathbf{y}$の全て($H$個)の要素に影響(分岐)しています。よって、連鎖律によって分解した「$H$個の微分の和」で求められます。

$$ \begin{align} \frac{\partial L}{\partial x_{1,1}} &= \frac{\partial L}{\partial y_{1,1}} \frac{\partial y_{1,1}}{\partial x_{1,1}} + \frac{\partial L}{\partial y_{1,2}} \frac{\partial y_{1,2}}{\partial x_{1,1}} + \frac{\partial L}{\partial y_{1,3}} \frac{\partial y_{1,3}}{\partial x_{1,1}} \tag{2}\\ &= \sum_{h=1}^3 \frac{\partial L}{\partial y_{1,h}} \frac{\partial y_{1,h}}{\partial x_{1,1}} \end{align} $$

 $\frac{\partial L}{\partial y_{1,h}}$は与えられているので、$\frac{\partial y_{1,h}}{\partial x_{1,1}}$を求めます。

 $y_{1,1}$を$x_{1,1}$で微分すると

$$ \begin{aligned} \frac{\partial y_{1,1}}{\partial x_{1,1}} &= \frac{\partial}{\partial x_{1,1}} \Bigl( x_{1,1} w_{1,1} + x_{1,2} w_{2,1} + b_1 \Bigr) \\ &= w_{1,1} + 0 + 0 \\ &= w_{1,1} \end{aligned} $$

$x_{1,1}$の係数である$w_{1,1}$だけが残ります。

 式(2)の他の項も同様に、$y_{1,2}$を$x_{1,1}$で微分すると

$$ \begin{aligned} \frac{\partial y_{1,2}}{\partial x_{1,1}} &= \frac{\partial}{\partial x_{1,1}} \Bigl( x_{1,1} w_{1,2} + x_{1,2} w_{2,2} + b_2 \Bigr) \\ &= w_{1,2} + 0 + 0 \\ &= w_{1,2} \end{aligned} $$

となり、また$y_{1,3}$を$x_{1,1}$で微分すると

$$ \begin{aligned} \frac{\partial y_{1,3}}{\partial x_{1,1}} &= \frac{\partial}{\partial x_{1,1}} \Bigl( x_{1,1} w_{1,3} + x_{1,2} w_{2,3} + b_3 \Bigr) \\ &= w_{1,3} + 0 + 0 \\ &= w_{1,3} \end{aligned} $$

となります。

 よって、式(2)にそれぞれ代入すると

$$ \begin{align} \frac{\partial L}{\partial x_{1,1}} &= \frac{\partial L}{\partial y_{1,1}} \frac{\partial y_{1,1}}{\partial x_{1,1}} + \frac{\partial L}{\partial y_{1,2}} \frac{\partial y_{1,2}}{\partial x_{1,1}} + \frac{\partial L}{\partial y_{1,3}} \frac{\partial y_{1,3}}{\partial x_{1,1}} \tag{1}\\ &= \frac{\partial L}{\partial y_{1,1}} w_{1,1} + \frac{\partial L}{\partial y_{1,2}} w_{1,2} + \frac{\partial L}{\partial y_{1,3}} w_{1,3} \\ &= \sum_{h=1}^3 \frac{\partial L}{\partial y_{1,h}} w_{1,h} \end{align} $$

となります。

 $\frac{\partial L}{\partial \mathbf{x}}$の2つ目の項$\frac{\partial L}{\partial x_{1,2}}$も同様に求められます。$x_{1,2}$に関する$L$の微分は、$x_{1,2}$も$\mathbf{y}$の全ての項に影響しているので

$$ \begin{aligned} \frac{\partial L}{\partial x_{1,2}} &= \frac{\partial L}{\partial y_{1,1}} \frac{\partial y_{1,1}}{\partial x_{1,2}} + \frac{\partial L}{\partial y_{1,2}} \frac{\partial y_{1,2}}{\partial x_{1,2}} + \frac{\partial L}{\partial y_{1,3}} \frac{\partial y_{1,3}}{\partial x_{1,2}} \\ &= \frac{\partial L}{\partial y_{1,1}} \frac{\partial}{\partial x_{1,2}} \Bigl( x_{1,1} w_{1,1} + x_{1,2} w_{2,1} + b_1 \Bigr) + \frac{\partial L}{\partial y_{1,2}} \frac{\partial}{\partial x_{1,2}} \Bigl( x_{1,1} w_{1,2} + x_{1,2} w_{2,2} + b_2 \Bigr) + \frac{\partial L}{\partial y_{1,3}} \frac{\partial}{\partial x_{1,2}} \Bigl( x_{1,1} w_{1,3} + x_{1,2} w_{2,3} + b_3 \Bigr) \\ &= \frac{\partial L}{\partial y_{1,1}} \Bigl( 0 + w_{2,1} + 0 \Bigr) + \frac{\partial L}{\partial y_{1,2}} \Bigl( 0 + w_{2,2} + 0 \Bigr) + \frac{\partial L}{\partial y_{1,3}} \Bigl( 0 + w_{2,3} + 0 \Bigr) \\ &= \frac{\partial L}{\partial y_{1,1}} w_{2,1} + \frac{\partial L}{\partial y_{1,2}} w_{2,2} + \frac{\partial L}{\partial y_{1,3}} w_{2,3} \\ &= \sum_{h=1}^3 \frac{\partial L}{\partial y_{1,h}} w_{2,h} \end{aligned} $$

となります。

 したがって、$\frac{\partial L}{\partial \mathbf{x}}$にそれぞれ代入すると

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{x}} &= \begin{pmatrix} \frac{\partial L}{\partial x_{1,1}} & \frac{\partial L}{\partial x_{1,2}} \end{pmatrix} \\ &= \begin{pmatrix} \sum_{h=1}^3 \frac{\partial L}{\partial y_{1,h}} w_{1,h} & \sum_{h=1}^3 \frac{\partial L}{\partial y_{1,h}} w_{2,h} \end{pmatrix} \end{aligned} $$

となります。
 これを行列の積の計算結果とみなすと、次の行列の積に分解できます。

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{x}} &= \begin{pmatrix} \frac{\partial L}{\partial y_{1,1}} & \frac{\partial L}{\partial y_{1,2}} & \frac{\partial L}{\partial y_{1,3}} \end{pmatrix} \begin{pmatrix} w_{1,1} & w_{2,1} \\ w_{1,2} & w_{2,2} \\ w_{1,3} & w_{2,3} \end{pmatrix} \\ &= \frac{\partial L}{\partial \mathbf{y}} \mathbf{W}^{\mathrm{T}} \end{aligned} $$

 ここで、$\mathbf{W}^{\mathrm{T}}$は$\mathbf{W}$の転置行列です。右肩の$\mathrm{T}$は、転置を表す記号で、転置記号と呼びます。
 入力の勾配$\frac{\partial L}{\partial \mathbf{x}}$は、逆伝播の入力$\frac{\partial L}{\partial \mathbf{y}}$と重み$\mathbf{W}$から求められるのが分かりました。

・重みの勾配

 最後に、重み$\mathbf{W}$に関する損失$L$の勾配$\frac{\partial L}{\partial \mathbf{W}}$を求めます。

 重みの勾配$\frac{\partial L}{\partial \mathbf{W}}$は、重み$\mathbf{W}$と同じ形状の行列になります。

$$ \frac{\partial L}{\partial \mathbf{W}} = \begin{pmatrix} \frac{\partial L}{\partial w_{1,1}} & \frac{\partial L}{\partial w_{1,2}} & \frac{\partial L}{\partial w_{1,3}} \\ \frac{\partial L}{\partial w_{2,1}} & \frac{\partial L}{\partial w_{2,2}} & \frac{\partial L}{\partial w_{2,3}} \end{pmatrix} $$


 $\frac{\partial L}{\partial \mathbf{W}}$の1行1列目の要素$\frac{\partial L}{\partial w_{1,1}}$を考えます。$\frac{\partial L}{\partial w_{1,1}}$は、$\mathbf{W}$の1行1列目の要素$w_{1,1}$に関する損失$L$の微分です。

 $w_{1,1}$は$y_{1,1}$に影響しています。よって連鎖律より、次の微分の積で求められます。

$$ \frac{\partial L}{\partial w_{1,1}} = \frac{\partial L}{\partial y_{1,1}} \frac{\partial y_{1,1}}{\partial w_{1,1}} \tag{3} $$

 $\frac{\partial L}{\partial y_{1,1}}$は与えられている(次のレイヤで求めた)ので、$\frac{\partial y_{1,1}}{\partial w_{1,1}}$を求めます。

 $y_{1,1}$を$w_{1,1}$で微分すると

$$ \begin{aligned} \frac{\partial y_{1,1}}{\partial w_{1,1}} &= \frac{\partial}{\partial w_{1,1}} \Bigl( x_{1,1} w_{1,1} + x_{1,2} w_{2,1} + b_{1,1} \Bigr) \\ &= x_{1,1} + 0 + 0 \\ &= x_{1,1} \end{aligned} $$

$w_{1,1}$の係数である$x_{1,1}$だけが残ります。

 よって、式(3)に代入すると

$$ \begin{align} \frac{\partial L}{\partial w_{1,1}} &= \frac{\partial L}{\partial y_{1,1}} \frac{\partial y_{1,1}}{\partial w_{1,1}} \tag{3}\\ &= \frac{\partial L}{\partial y_{1,1}} x_{1,1} \end{align} $$

となります。

 $\frac{\partial L}{\partial \mathbf{W}}$の他の要素も同様に求められます。$w_{2,3}$に関する$L$の微分であれば、$w_{2,3}$は$y_{1,3}$に影響しているので

$$ \begin{aligned} \frac{\partial L}{\partial w_{2,3}} &= \frac{\partial L}{\partial y_{1,3}} \frac{\partial y_{1,3}}{\partial w_{2,3}} \\ &= \frac{\partial L}{\partial y_{1,3}} \frac{\partial}{\partial w_{2,3}} \Bigl( x_{1,1} w_{1,3} + x_{1,2} w_{2,3} + b_3 \Bigr) \\ &= \frac{\partial L}{\partial y_{1,3}} \Bigl( 0 + x_{1,2} + 0 \Bigr) \\ &= \frac{\partial L}{\partial y_{1,3}} x_{1,2} \end{aligned} $$

となります。

 したがって、$\frac{\partial L}{\partial \mathbf{W}}$にそれぞれ代入すると

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{W}} &= \begin{pmatrix} \frac{\partial L}{\partial w_{1,1}} & \frac{\partial L}{\partial w_{1,2}} & \frac{\partial L}{\partial w_{1,3}} \\ \frac{\partial L}{\partial w_{2,1}} & \frac{\partial L}{\partial w_{2,2}} & \frac{\partial L}{\partial w_{2,3}} \end{pmatrix} \\ &= \begin{pmatrix} \frac{\partial L}{\partial y_{1,1}} x_{1,1} & \frac{\partial L}{\partial y_{1,2}} x_{1,1} & \frac{\partial L}{\partial y_{1,3}} x_{1,1} \\ \frac{\partial L}{\partial y_{1,1}} x_{1,2} & \frac{\partial L}{\partial y_{1,2}} x_{1,2} & \frac{\partial L}{\partial y_{1,3}} x_{1,2} \end{pmatrix} \end{aligned} $$

となります。
 これを行列の積の計算結果とみなすと、次のベクトルの積に分解できます。

$$ \begin{align} \frac{\partial L}{\partial \mathbf{W}} &= \begin{pmatrix} x_{1,1} \\ x_{1,2} \end{pmatrix} \begin{pmatrix} \frac{\partial L}{\partial y_{1,1}} & \frac{\partial L}{\partial y_{1,2}} & \frac{\partial L}{\partial y_{1,3}} \end{pmatrix} \\ &= \mathbf{x}^{\mathrm{T}} \frac{\partial L}{\partial \mathbf{y}} \tag{5.13} \end{align} $$

 ここで、$\mathbf{x}^{\mathrm{T}}$は$\mathbf{X}$の転置行列です。横ベクトルを転置すると縦ベクトルになります。
 重みの勾配$\frac{\partial L}{\partial \mathbf{W}}$は、逆伝播の入力$\frac{\partial L}{\partial \mathbf{y}}$と順伝播の入力$\mathbf{x}$から求められるのが分かりました。

 以上で、1データを扱う場合のAffineレイヤで逆伝播の計算式を導出できました。次は、バッチデータを扱う場合の逆伝播の計算式を導出します。

参考文献

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

おわりに

 n回目の線形代数入門失敗、、、こんな解き方でいいのでしょうか?自信なんかありません。でもそれっぽい感じなので、これで納得することにしました。適切な書籍等あれば、教えて下さい。。。

  • 2021.10.09:加筆修正しました。

 これで読める内容になったと思う。

【次節の内容】

www.anarchive-beta.com