はじめに
『ゼロから作るDeep Learning 3』の初学者向け攻略ノートです。『ゼロつく3』の学習の補助となるように適宜解説を加えていきます。本と一緒に読んでください。
本で登場する数学的な内容をもう少し深堀りして解説していきます。
この記事は、主に42.3「線形回帰の実装」と43.1「DeZeroのlinear関数」を補足する内容です。
線形変換(Affine変換)の順伝播を確認して逆伝播を導出します。
【前ステップの内容】
www.anarchive-beta.com
【他の記事一覧】
www.anarchive-beta.com
【この記事の内容】
・線形変換の逆伝播の導出
線形変換(アフィン変換)の順伝播と逆伝播の計算を確認していきます。
・順伝播の確認
入力データを$\mathbf{x}$、重みパラメータを$\mathbf{W}$、バイアスパラメータを$\mathbf{b}$とします。また、入力データの次元数を$D$、出力データの次元数を$H$で表すと、$\mathbf{x}$は$(N \times D)$の行列、$\mathbf{W}$は$(D \times H)$の行列、$\mathbf{b}$は要素数$H$のベクトルです。
出力データを$\mathbf{y}$とすると、線形変換は次の式になります。
$$
\begin{aligned}
\mathbf{y}
&= \mathbf{x} \mathbf{W} + \mathbf{b}
\\
&= \begin{pmatrix}
x_{0,0} & x_{0,1} & \cdots & x_{0,D-1} \\
x_{1,0} & x_{1,1} & \cdots & x_{1,D-1} \\
\vdots & \vdots & \ddots & \vdots \\
x_{N-1,0} & x_{N-1,1} & \cdots & x_{N-1,D-1}
\end{pmatrix}
\begin{pmatrix}
w_{0,0} & w_{0,1} & \cdots & w_{0,H-1} \\
w_{1,0} & w_{1,1} & \cdots & w_{1,H-1} \\
\vdots & \vdots & \ddots & \vdots \\
w_{D-1,0} & w_{D-1,1} & \cdots & w_{D-1,H-1}
\end{pmatrix}
+ \begin{pmatrix}
b_0 & b_1 & \cdots & b_{H-1}
\end{pmatrix}
\\
&= \begin{pmatrix}
\sum_{d=0}^{D-1} x_{0,d} w_{d,0} + b_0 &
\sum_{d=0}^{D-1} x_{0,d} w_{d,1} + b_1 &
\cdots &
\sum_{d=0}^{D-1} x_{0,d} w_{d,H-1} + b_{H-1} \\
\sum_{d=0}^{D-1} x_{1,d} w_{d,0} + b_0 &
\sum_{d=0}^{D-1} x_{1,d} w_{d,1} + b_1 &
\cdots &
\sum_{d=0}^{D-1} x_{1,d} w_{d,H-1} + b_{H-1} \\
\vdots & \vdots & \ddots & \vdots \\
\sum_{d=0}^{D-1} x_{N-1,d} w_{d,0} + b_0 &
\sum_{d=0}^{D-1} x_{N-1,d} w_{d,1} + b_1 &
\cdots &
\sum_{d=0}^{D-1} x_{N-1,d} w_{d,H-1} + b_{H-1}
\end{pmatrix}
\\
&= \begin{pmatrix}
y_{0,0} & y_{0,1} & \cdots & y_{0,H-1} \\
y_{1,0} & y_{1,1} & \cdots & y_{1,H-1} \\
\vdots & \vdots & \ddots & \vdots \\
y_{N-1,0} & y_{N-1,1} & \cdots & y_{N-1,H-1}
\end{pmatrix}
\end{aligned}
$$
$(N \times D)$と$(D \times H)$の行列の積は、$(N \times H)$の行列になります。Pythonの仕様に合わせて0から数えています。
「$n$番目の出力データの$h$番目の項$y_{n,h}$」は
$$
y_{n,h}
= \sum_{d=0}^{D-1} x_{n,d} w_{d,h} + b_h
$$
で計算できるのが分かります。
・逆伝播の導出
各変数$\mathbf{x},\ \mathbf{W},\ \mathbf{b}$の勾配(微分)を求めていきます。ここでは、損失$L$として平均2乗誤差を想定していますが、この記事の内容には影響しません。
・入力の勾配
まずは、入力$\mathbf{x}$の勾配$\frac{\partial L}{\partial \mathbf{x}}$を導出します。
$\frac{\partial L}{\partial \mathbf{x}}$を求める前に、「$n$番目の入力の$d$番目の項$x_{n,d}$」に関する微分$\frac{\partial L}{\partial x_{n,d}}$を考えます。$x_{n,d}$は、「$n$番目の出力$\mathbf{y}_n = (y_{n,0}, y_{n,1}, \cdots, y_{n,H-1})$」の全ての項に影響(ブロードキャスト)しています。よって、$x_{n,d}$に関する$\mathbf{y}_n$の各項の微分の和で求めます。連鎖律を用いると、$\frac{\partial L}{\partial x_{n,d}}$は次の式で求められます。
$$
\frac{\partial L}{\partial x_{n,d}}
= \sum_{h=0}^{H-1}
\frac{\partial L}{\partial y_{n,h}}
\frac{\partial y_{n,h}}{\partial x_{n,d}}
$$
前の項$\frac{\partial L}{\partial y_{n,h}}$は、$y_{n,h}$に関する$L$の微分です。後の項$\frac{\partial y_{n,h}}{\partial x_{n,d}}$は、$x_{n,d}$に関する$y_{n,h}$の微分です。
後の項について、$y_{n,h}$に順伝播の式を代入して$x_{n,d}$に関して微分すると
$$
\begin{aligned}
\frac{\partial y_{n,h}}{\partial x_{n,d}}
&= \frac{\partial}{\partial x_{n,d}} \left\{
\sum_{d=0}^{D-1} x_{n,d} w_{d,h} + b_h
\right\}
\\
&= \frac{\partial}{\partial x_{n,d}} \Bigl\{
x_{n,0} w_{0,h} + \cdots + x_{n,d} w_{d,h} + \cdots + x_{n,D-1} w_{D-1,h} + b_h
\Bigr\}
\\
&= 0 + \cdots + w_{d,h} + \cdots + 0 + 0
\\
&= w_{d,h}
\end{aligned}
$$
$x_{n,d}$が関わらない項は0になり全て消えてしまうので、$w_{d,h}$だけが残ります。
よって、連鎖律の式に代入すると
$$
\frac{\partial L}{\partial x_{n,d}}
= \sum_{h=0}^{H-1}
\frac{\partial L}{\partial y_{n,h}}
w_{d,h}
$$
が得られます。
$\frac{\partial L}{\partial x_{n,d}}$の結果を用いて、$\frac{\partial L}{\partial \mathbf{x}}$を考えます。「$\mathbf{x}$の勾配$\frac{\partial L}{\partial \mathbf{x}}$」は$\mathbf{x}$と同じ形状になるので、次の成分を持つ$(N \times D)$の行列になります。
$$
\frac{\partial L}{\partial \mathbf{x}}
= \begin{pmatrix}
\frac{\partial L}{\partial x_{0,0}} &
\frac{\partial L}{\partial x_{0,1}} &
\cdots &
\frac{\partial L}{\partial x_{0,D-1}} \\
\frac{\partial L}{\partial x_{1,0}} &
\frac{\partial L}{\partial x_{1,1}} &
\cdots &
\frac{\partial L}{\partial x_{1,D-1}} \\
\vdots & \vdots & \ddots & \vdots \\
\frac{\partial L}{\partial x_{N-1,0}} &
\frac{\partial L}{\partial x_{N-1,1}} &
\cdots &
\frac{\partial L}{\partial x_{N-1,D-1}}
\end{pmatrix}
$$
各成分は$\frac{\partial L}{\partial x_{n,d}}$と同様に計算できるので、それぞれ置き換えます。
$$
\frac{\partial L}{\partial \mathbf{x}}
= \begin{pmatrix}
\sum_{h=0}^{H-1} \frac{\partial L}{\partial y_{0,h}} w_{0,h} &
\sum_{h=0}^{H-1} \frac{\partial L}{\partial y_{0,h}} w_{1,h} &
\cdots &
\sum_{h=0}^{H-1} \frac{\partial L}{\partial y_{0,h}} w_{D-1,h} \\
\sum_{h=0}^{H-1} \frac{\partial L}{\partial y_{1,h}} w_{0,h} &
\sum_{h=0}^{H-1} \frac{\partial L}{\partial y_{1,h}} w_{1,h} &
\cdots &
\sum_{h=0}^{H-1} \frac{\partial L}{\partial y_{1,h}} w_{D-1,h} \\
\vdots & \vdots & \ddots & \vdots \\
\sum_{h=0}^{H-1} \frac{\partial L}{\partial y_{N-1,h}} w_{0,h} &
\sum_{h=0}^{H-1} \frac{\partial L}{\partial y_{N-1,h}} w_{1,h} &
\cdots &
\sum_{h=0}^{H-1} \frac{\partial L}{\partial y_{N-1,h}} w_{D-1,h}
\end{pmatrix}
$$
この行列を行列の積の結果とみなすと、次のように分解できます。
$$
\frac{\partial L}{\partial \mathbf{x}}
= \begin{pmatrix}
\frac{\partial L}{\partial y_{0,0}} &
\frac{\partial L}{\partial y_{0,1}} &
\cdots &
\frac{\partial L}{\partial y_{0,H-1}} \\
\frac{\partial L}{\partial y_{1,0}} &
\frac{\partial L}{\partial y_{1,1}} &
\cdots &
\frac{\partial L}{\partial y_{1,H-1}} \\
\vdots & \vdots & \ddots & \vdots \\
\frac{\partial L}{\partial y_{N-1,0}} &
\frac{\partial L}{\partial y_{N-1,1}} &
\cdots &
\frac{\partial L}{\partial y_{N-1,H-1}}
\end{pmatrix}
\begin{pmatrix}
w_{0,0} & w_{1,0} & \cdots & w_{D-1,0} \\
w_{0,1} & w_{1,1} & \cdots & w_{D-1,1} \\
\vdots & \vdots & \ddots & \vdots \\
w_{0,H-1} & w_{1,H-1} & \cdots & w_{D-1,H-1}
\end{pmatrix}
$$
前の行列は$\mathbf{y}$に関する$L$の勾配、後の行列は$\mathbf{W}$の転置行列なので、それぞれ置き換えると
$$
\frac{\partial L}{\partial \mathbf{x}}
= \frac{\partial L}{\partial \mathbf{y}}
\mathbf{W}^{\top}
$$
が得られます。$\top$は転置を表す記号です。
$\frac{\partial L}{\partial \mathbf{y}}$は、出力$\mathbf{y}$の勾配です。線形変換の逆伝播の計算時には、逆伝播の入力として与えられています。詳しくは次の記事で扱います。
・重みの勾配
同様に、重み$\mathbf{W}$の勾配$\frac{\partial L}{\partial \mathbf{W}}$を導出ます。
こちらも先に、「$\mathbf{W}$の$d, h$成分$w_{d,h}$」に関する微分$\frac{\partial L}{\partial w_{d,h}}$を考えます。$w_{d,h}$は、「$\mathbf{y}$の$h$列の全ての項$(y_{0,h}, y_{1,h}, \cdots, y_{N-1,h})$」に影響(ブロードキャスト)しています。よって、$w_{d,h}$に関する$(y_{0,h}, y_{1,h}, \cdots, y_{N-1,h})$の各項の微分の和を求めます。連鎖律より、$\frac{\partial L}{\partial w_{d,h}}$は次の式で求められます。
$$
\frac{\partial L}{\partial w_{d,h}}
= \sum_{n=0}^{N-1}
\frac{\partial L}{\partial y_{n,h}}
\frac{\partial y_{n,h}}{\partial w_{d,h}}
$$
後の項$\frac{\partial y_{n,h}}{\partial w_{d,h}}$は、$w_{d,h}$に関する$y_{n,h}$の微分です。
$y_{n,h}$に順伝播の式を代入して、$w_{d,h}$に関して微分すると
$$
\begin{aligned}
\frac{\partial y_{n,h}}{\partial w_{d,h}}
&= \frac{\partial}{\partial w_{d,h}} \left\{
\sum_{d=0}^{D-1} x_{n,d} w_{d,h} + b_h
\right\}
\\
&= \frac{\partial}{\partial x_{n,d}} \Bigl\{
x_{n,0} w_{0,h} + \cdots + x_{n,d} w_{d,h} + \cdots + x_{n,D-1} w_{D-1,h} + b_h
\Bigr\}
\\
&= 0 + \cdots + x_{n,d} + \cdots + 0 + 0
\\
&= x_{n,d}
\end{aligned}
$$
$w_{d,h}$が関わる項だけが残ります。
よって、連鎖率の式に代入すると
$$
\frac{\partial L}{\partial w_{d,h}}
= \sum_{n=0}^{N-1}
\frac{\partial L}{\partial y_{n,h}}
x_{n,d}
$$
が得られます。
$\frac{\partial L}{\partial w_{d,h}}$の結果を用いて、$\frac{\partial L}{\partial \mathbf{W}}$を求めます。$\frac{\partial L}{\partial \mathbf{W}}$は$(D \times H)$の行列です。各成分は$\frac{\partial L}{\partial w_{d,h}}$と同様に計算できるので、それぞれ置き換えると
$$
\begin{aligned}
\frac{\partial L}{\partial \mathbf{W}}
&= \begin{pmatrix}
\frac{\partial L}{\partial w_{0,0}} &
\frac{\partial L}{\partial w_{0,1}} &
\cdots &
\frac{\partial L}{\partial w_{0,H-1}} \\
\frac{\partial L}{\partial w_{1,0}} &
\frac{\partial L}{\partial w_{1,1}} &
\cdots &
\frac{\partial L}{\partial w_{1,H-1}} \\
\vdots & \vdots & \ddots & \vdots \\
\frac{\partial L}{\partial w_{D-1,0}} &
\frac{\partial L}{\partial w_{D-1,1}} &
\cdots &
\frac{\partial L}{\partial w_{D-1,H-1}}
\end{pmatrix}
\\
&= \begin{pmatrix}
\sum_{n=0}^{N-1} x_{n,0} \frac{\partial L}{\partial y_{n,0}} &
\sum_{n=0}^{N-1} x_{n,0} \frac{\partial L}{\partial y_{n,1}} &
\cdots &
\sum_{n=0}^{N-1} x_{n,0} \frac{\partial L}{\partial y_{n,H-1}} \\
\sum_{n=0}^{N-1} x_{n,1} \frac{\partial L}{\partial y_{n,0}} &
\sum_{n=0}^{N-1} x_{n,1} \frac{\partial L}{\partial y_{n,1}} &
\cdots &
\sum_{n=0}^{N-1} x_{n,1} \frac{\partial L}{\partial y_{n,H-1}} \\
\vdots & \vdots & \ddots & \vdots \\
\sum_{n=0}^{N-1} x_{n,D-1} \frac{\partial L}{\partial y_{n,0}} &
\sum_{n=0}^{N-1} x_{n,D-1} \frac{\partial L}{\partial y_{n,1}} &
\cdots &
\sum_{n=0}^{N-1} x_{n,D-1} \frac{\partial L}{\partial y_{n,H-1}}
\end{pmatrix}
\\
&= \begin{pmatrix}
x_{0,0} & x_{1,0} & \cdots & x_{N-1,0} \\
x_{0,1} & x_{1,1} & \cdots & x_{N-1,1} \\
\vdots & \vdots & \ddots & \vdots \\
x_{0,D-1} & x_{1,D-1} & \cdots & x_{N-1,D-1}
\end{pmatrix}
\begin{pmatrix}
\frac{\partial L}{\partial y_{0,0}} &
\frac{\partial L}{\partial y_{0,1}} &
\cdots &
\frac{\partial L}{\partial y_{0,H-1}} \\
\frac{\partial L}{\partial y_{1,0}} &
\frac{\partial L}{\partial y_{1,1}} &
\cdots &
\frac{\partial L}{\partial y_{1,H-1}} \\
\vdots & \vdots & \ddots & \vdots \\
\frac{\partial L}{\partial y_{N-1,0}} &
\frac{\partial L}{\partial y_{N-1,1}} &
\cdots &
\frac{\partial L}{\partial y_{N-1,H-1}}
\end{pmatrix}
\\
&= \mathbf{x}^{\top}
\frac{\partial L}{\partial \mathbf{y}}
\end{aligned}
$$
と分解できます。$\mathbf{x}^{\top}$は$\mathbf{x}$の転置行列です。
・バイアスの勾配
最後に、バイアス$\mathbf{b}$の勾配$\frac{\partial L}{\partial \mathbf{b}}$を導出します。
「$\mathbf{b}$の$h$番目の項$b_h$」に関する微分$\frac{\partial L}{\partial b_h}$を求めます。$b_h$は、「$\mathbf{y}$の$h$列の全ての項$(y_{0,h}, y_{1,h}, \cdots, y_{N-1,h})$」に影響(ブロードキャスト)しています。よって、$b_h$に関する$(y_{0,h}, y_{1,h}, \cdots, y_{N-1,h})$の各項の微分の和を求めます。連鎖律より、$\frac{\partial L}{\partial b_h}$は次の式で求められます。
$$
\frac{\partial L}{\partial b_h}
= \sum_{n=0}^{N-1}
\frac{\partial L}{\partial y_{n,h}}
\frac{\partial y_{n,h}}{\partial b_h}
$$
後の項$\frac{\partial y_{n,h}}{\partial b_h}$は、$b_h$に関する$y_{n,h}$の微分です。
$y_{n,h}$に順伝播の式を代入して、$b_h$に関して微分すると
$$
\begin{aligned}
\frac{\partial y_{n,h}}{\partial b_h}
&= \frac{\partial}{\partial w_{d,h}} \left\{
\sum_{d=0}^{D-1} x_{n,d} w_{d,h} + b_h
\right\}
\\
&= 0 + 1
\\
&= 1
\end{aligned}
$$
$b_h$を微分した1だけが残ります。
よって、連鎖率の式に代入すると
$$
\frac{\partial L}{\partial b_h}
= \sum_{n=0}^{N-1}
\frac{\partial L}{\partial y_{n,h}}
$$
が得られます。
$\frac{\partial L}{\partial b_h}$の結果を用いて、$\frac{\partial L}{\partial \mathbf{b}}$を求めます。$\frac{\partial L}{\partial \mathbf{b}}$は要素数$H$のベクトルです。各成分は$\frac{\partial L}{\partial b_h}$と同様に計算できるので、それぞれ置き換えると
$$
\begin{aligned}
\frac{\partial L}{\partial \mathbf{b}}
&= \begin{pmatrix}
\frac{\partial L}{\partial b_0} &
\frac{\partial L}{\partial b_1} &
\cdots &
\frac{\partial L}{\partial b_{H-1}}
\end{pmatrix}
\\
&= \begin{pmatrix}
\sum_{n=0}^{N-1} \frac{\partial L}{\partial y_{n,0}} &
\sum_{n=0}^{N-1} \frac{\partial L}{\partial y_{n,1}} &
\cdots &
\sum_{n=0}^{N-1} \frac{\partial L}{\partial y_{n,H-1}}
\end{pmatrix}
\end{aligned}
$$
となります。
以上で「各変数の勾配$\frac{\partial L}{\partial \mathbf{x}},\ \frac{\partial L}{\partial \mathbf{W}},\ \frac{\partial L}{\partial \mathbf{b}}$」を求められました。それぞれの計算結果を見ると、「順伝播の入力$\mathbf{x},\ \mathbf{W},\ \mathbf{b}$」と「逆伝播の入力$\frac{\partial L}{\partial \mathbf{y}}$」から計算できるのが分かります。この結果を用いると中間変数を持たないため、自動微分そのままよりもメモリ効率の良い実装を行えます。
次は、損失$L$と$\mathbf{y}$の勾配$\frac{\partial L}{\partial \mathbf{y}}$について確認します。
参考文献
おわりに
1巻をやっていた時には行列の積の微分を導出できなかったんですよねぇ。その時は、ここまでは考えたけどうまくいかねぇって感じの記事を上げました。それとネタ被ってるけどバイアスを含めた版(ほぼ一緒)として一応書いとくかぁと思ったら、今回はサクッと導出できて嬉しい。展開も綺麗になったし1巻の記事も早く書き直さねば。
【次ステップの内容】
www.anarchive-beta.com