はじめに
「機械学習・深層学習」初学者のための『ゼロから作る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回目の線形代数入門失敗、、、こんな解き方でいいのでしょうか?自信なんかありません。でもそれっぽい感じなので、これで納得することにしました。適切な書籍等あれば、教えて下さい。。。
これで読める内容になったと思う。
【次節の内容】
www.anarchive-beta.com