はじめに
『ゼロから作るDeep Learning 3』の初学者向け攻略ノートです。『ゼロつく3』の学習の補助となるように適宜解説を加えていきます。本と一緒に読んでください。
本で登場する数学的な内容をもう少し深堀りして解説していきます。
この記事は、主に42.2「線形回帰の理論」と42.4「DeZeroのmean_squared_error関数」を補足する内容です。
平均二乗誤差の順伝播を確認して逆伝播を導出します。
【前ステップの内容】
www.anarchive-beta.com
【他の記事一覧】
www.anarchive-beta.com
【この記事の内容】
・平均2乗誤差の逆伝播の導出
平均2乗誤差の順伝播と逆伝播の計算を確認していきます。
・順伝播の確認
データ数を$N$として、実際の値を$\mathbf{y} = (y_0, y_1, \cdots, y_{N-1})$、予測値を$\hat{\mathbf{y}} = (\hat{y}_0, \hat{y}_1, \cdots, \hat{y}_{N-1})$とします。Pythonの仕様に合わせて0から数えています。
平均2乗誤差は、次の式で定義されます。($\mathbf{y}$が行列の場合はどうなるの?交差エントロピー誤差のように2次元方向にも平均をとればいいの?軽く調べても見付けられなかった。)
$$
L = \frac{1}{N}
\sum_{n=0}^{N-1}
(f(x_n) - y_n)^2
\tag{42.1}
$$
ここでは、パラメータの推定値$\hat{\mathbf{W}},\ \hat{\mathbf{b}}$を用いた線形変換
$$
\begin{aligned}
\hat{y}_n
&= f(x_n)
\\
&= \mathbf{x}_n \hat{\mathbf{w}} + \hat{\mathbf{b}}
\end{aligned}
$$
により予測値$\hat{y}$を求めることを想定していますが、この記事の内容には影響しません。線形変換については「ステップ42:線形変換の逆伝播の導出【ゼロつく3のノート(数学)】 - からっぽのしょこ」を参照してください。
定義式(42.1)の関数$f(x_n)$を予測値$\hat{y}$に置き換えると
$$
L = \frac{1}{N}
\sum_{b=0}^{N-1}
(\hat{y}_n - y_n)^2
$$
「予測値$\hat{y}_n$と実際の値$y_n$の差」を2乗した平均を求めているのが分かります。(2乗するのは、$N$個分の誤差を足し合わせる際に、プラスとマイナスが打ち消し合うことで誤差を小さく評価してしてしまうのを防ぐためです。)
・逆伝播の導出
各変数$\hat{\mathbf{y}},\ \mathbf{y}$の勾配(微分)を求めていきます。
・予測値の勾配
まずは、予測値$\hat{\mathbf{y}}$の勾配$\frac{\partial L}{\partial \hat{\mathbf{y}}}$を導出します。
$\frac{\partial L}{\partial \hat{\mathbf{y}}}$を求める前に、「$n$番目の項$\hat{y}_n$」に関する微分$\frac{\partial L}{\partial \hat{y}_n}$を考えます。連鎖律(合成関数の微分)より、次の式で求められるのが分かります。($\tilde{y}_n = \hat{y}_n - y_n$と置き換えると分かりやすくなるかもしれません。)
$$
\frac{\partial L}{\partial \hat{y}_n}
= \frac{\partial L}{\partial (\hat{y}_n - y_n)}
\frac{\partial (\hat{y}_n - y_n)}{\partial \hat{y}_n}
$$
前の項は、$L$を定義式に置き替えて$(\hat{y}_n - y_n)$で微分すると
$$
\begin{aligned}
\frac{\partial L}{\partial (\hat{y}_n - y_n)}
&= \frac{\partial}{\partial (\hat{y}_n - y_n)} \left\{
\frac{1}{N}
\sum_{n=1}^{N-1}
(\hat{y}_n - y_n)^2
\right\}
\\
&= \frac{1}{N}
\frac{\partial}{\partial (\hat{y}_n - y_n)} \Bigl\{
(\hat{y}_0 - y_0)^2
+ \cdots
+ (\hat{y}_n - y_n)^2
+ \cdots
+ (\hat{y}_{N-1} - y_{N-1})^2
\Bigr\}
\\
&= \frac{1}{N} \Bigl\{
0 + \cdots + 2 (\hat{y}_n - y_n) + \cdots + 0
\Bigr\}
\\
&= \frac{2}{N}
(\hat{y}_n - y_n)
\end{aligned}
$$
$n$番目の項以外は0になり消えてしまいます。また、後の項は
$$
\frac{\partial}{\partial \hat{y}_n} (\hat{y}_n - y_n)
= 1 - 0
= 1
$$
となります。
よって、それぞれ連鎖律の式に代入すると
$$
\frac{\partial L}{\partial \hat{y}_n}
= \frac{2}{N}
(\hat{y}_n - y_n)
$$
が得られます。
$\frac{\partial L}{\partial \hat{y}_n}$の結果を用いて、$\frac{\partial L}{\partial \hat{\mathbf{y}}}$を考えます。「$\mathbf{y}$の勾配$\frac{\partial L}{\partial \hat{\mathbf{y}}}$」は$\hat{\mathbf{y}}$と同じ形状になるので、要素数$N$のベクトルになります。
$$
\frac{\partial L}{\partial \hat{\mathbf{y}}}
= \begin{pmatrix}
\frac{\partial L}{\partial \hat{y}_0} &
\frac{\partial L}{\partial \hat{y}_1} &
\cdots &
\frac{\partial L}{\partial \hat{y}_{N-1}}
\end{pmatrix}
$$
各要素は$\frac{\partial L}{\partial \hat{y}_n}$と同様に計算できるので、それぞれ置き換えます。
$$
\frac{\partial L}{\partial \hat{\mathbf{y}}}
= \begin{pmatrix}
\frac{2}{N} (\hat{y}_0 - y_0) &
\frac{2}{N} (\hat{y}_1 - y_1) &
\cdots &
\frac{2}{N} (\hat{y}_{N-1} - y_{N-1})
\end{pmatrix}
$$
このベクトルは、スカラの積とベクトル同士の引き算に分解できるので
$$
\begin{aligned}
\frac{\partial L}{\partial \hat{\mathbf{y}}}
&= \frac{2}{N} \Bigl\{
\begin{pmatrix}
\hat{y}_0 & \hat{y}_1 & \cdots & \hat{y}_{N-1}
\end{pmatrix}
- \begin{pmatrix}
y_0 & y_1 & \cdots & y_{N-1}
\end{pmatrix}
\Bigr\}
\\
&= \frac{2}{N} \Bigl(
\hat{\mathbf{y}} - \mathbf{y}
\Bigr)
\end{aligned}
$$
が得られます。
・実際の値の勾配
同様に、実際の値$\mathbf{y}$の勾配$\frac{\partial L}{\partial \mathbf{y}}$を導出します。
こちらも先に、「$n$番目の項$y_n$」に関する微分$\frac{\partial L}{\partial y_n}$を考えます。連鎖律より、次の式で求められるのが分かります。
$$
\frac{\partial L}{\partial y_n}
= \frac{\partial L}{\partial (\hat{y}_n - y_n)}
\frac{\partial (\hat{y}_n - y_n)}{\partial y_n}
$$
前の項は、予測値のときと同じです。後の項は
$$
\frac{\partial}{\partial y_n} (\hat{y}_n - y_n)
= 0 - 1
= - 1
$$
となります。
よって、それぞれ連鎖律の式に代入すると
$$
\frac{\partial L}{\partial y_n}
= - \frac{2}{N}
(\hat{y}_n - y_n)
$$
が得られます。
$\frac{\partial L}{\partial y_n}$の結果を用いて、$\frac{\partial L}{\partial \mathbf{y}}$を考えます。「$\mathbf{y}$の勾配$\frac{\partial L}{\partial \mathbf{y}}$」は$\mathbf{y}$と同じ形状になるので、要素数$N$のベクトルになります。
$$
\frac{\partial L}{\partial \mathbf{y}}
= \begin{pmatrix}
\frac{\partial L}{\partial y_0} &
\frac{\partial L}{\partial y_1} &
\cdots &
\frac{\partial L}{\partial y_{N-1}}
\end{pmatrix}
$$
各要素は$\frac{\partial L}{\partial y_n}$と同様に計算できるので、それぞれ置き換えると
$$
\begin{aligned}
\frac{\partial L}{\partial \mathbf{y}}
&= \begin{pmatrix}
- \frac{2}{N} (\hat{y}_0 - y_0) &
- \frac{2}{N} (\hat{y}_1 - y_1) &
\cdots &
- \frac{2}{N} \hat{y}_{N-1} - y_{N-1})
\end{pmatrix}
\\
&= - \frac{2}{N} \Bigl\{
\begin{pmatrix}
\hat{y}_0 & \hat{y}_1 & \cdots & \hat{y}_{N-1}
\end{pmatrix}
- \begin{pmatrix}
y_0 & y_1 & \cdots & y_{N-1}
\end{pmatrix}
\Bigr\}
\\
&= - \frac{2}{N} \Bigl(
\hat{\mathbf{y}} - \mathbf{y}
\Bigr)
\end{aligned}
$$
と分解できます。また、$\frac{\partial L}{\partial \hat{\mathbf{y}}} = - \frac{\partial L}{\partial \mathbf{y}}$であることが分かります。
以上で「各変数の勾配$\frac{\partial L}{\partial \mathbf{\hat{y}}},\ \frac{\partial L}{\partial \mathbf{y}}$」を求められました。それぞれの計算結果を見ると、「順伝播の入力$\mathbf{\hat{y}},\ \mathbf{y}$」とデータ数$N$から計算できるのが分かります。この結果を用いると中間変数を持たないため、自動微分そのままよりもメモリ効率の良い実装を行えます。
次は、線形変換と平均2乗誤差のクラスを使って線形回帰を行います。
参考文献
おわりに
順調順調。
【次ステップの内容】
www.anarchive-beta.com