文系経理の「ゼロから作るDeep Learning」
コチラの記事は「ゼロから作るDeep Learning」(オライリー 斎藤康毅著)に文系経理の私が取り組んだメモの一部です。
全体のメモ(まとめや愚痴?)はコチラ
勾配の話
2021.2.20
金曜の夜は夜更かし、飲み過ぎで、今日は寝坊。
コーヒーを飲みながら何かじっくり考えよう。
ということで、「ゼロから作るDeep Learning」4章「ニューラルネットワークの学習」の数字の動きを頭の中でイメージしてみた。
うまく数字がつながらない。エンジニアの人たちは本当に凄い😅
なんとか数字がつながったのでまとめてみた。
4.4 勾配
数値 \((a_0,a_1)\)
関数 \(f(x_0,x_1)=x^2_0+x^2_1\)
勾配 numerical_gradient(関数,数値)
数値微分で関数\(f(x_0,x_1)\)の偏微分を計算⇒ベクトルにまとめる
これはシンプル。
ニューラルネットワークになると複雑になる。
4.4.2 ニューラルネットワークに対する勾配
数値
数値① \((a_0,a_1)\)
重み数値 \(W= \begin{pmatrix}
w_{11} & w_{12}&w_{13} \\
w_{21} & w_{22}& w_{23}
\end{pmatrix} \)
数値② \((a_0,a_1)\begin{pmatrix}
w_{11} & w_{12}&w_{13} \\
w_{21} & w_{22}& w_{23}
\end{pmatrix}=(b_0,b_1,b_2)\)
数値③ \(softmax関数(数値②)=(c_0,c_1,c_2)\)
\(c_k=\frac{exp(b_k)}{\sum_{i=1}^{3}exp(b_i)}\)
数値t \((t_0,t_1,t_2)\) 正解ラベル
損失関数
\(f(数値①,数値t)\)
数値①⇒数値②⇒数値③
\(cross\; entropy\; error(数値③,数値t)\)
\(-\sum_{i=1}^{3}t_i \log{y_i}\)
勾配
numerical_gradient(損失関数(数値①,数値t),重み数値)
数値微分で損失関数の重みWの偏微分を計算⇒ベクトルにまとめる
計算例
数値①(0.6,0.9) 正解ラベル数値t(0,0,1)
数値②\((0.6w_{11}+0.9w_{21},0.6w_{12}+0.9w_{22},0.6w_{13}+0.9w_{23})=(b_0,b_1,b_2)\)
数値③\((c_0,c_1,c_2)\)
\(c_k=\frac{exp(b_k)}{\sum_{i=1}^{3}exp(b_i)}\)
\(cross\; entropy\; error\)に\((c_0,c_1,c_2)\)ではなく\((b_0,b_1,b_2)\)を渡すと、正解ラベル数値t(0,0,1)なので正解以外の\(b_0,b_1\)を動かしても損失関数は下がらない。すると、\(w_{13},w_{23}\)以外は偏微分がゼロになり更新されない。
活性化関数softmaxが入ると、\(w_{13},w_{23}\)以外も分母になることで\((c_0,c_1,c_2)\)の正解\(c_2\)を動かす。
\(cross\; entropy\; error(数値③,数値t)\)で損失関数の戻り値を唯一下げる正解\(c_2\)を動かすので、\(w_{13},w_{23}\)以外も偏微分がゼロにならない。
動かす方向
損失関数の戻り値を下げるには、正解\(c_2\)を大きくすればよい。
\(w_{13},w_{23}\)は大きくし、それ以外はsoftmax関数で分母となるので小さくすればよい。
偏微分でいうと、\(w_{13},w_{23}\)はマイナスで、それ以外はプラスだ。
同書の計算例
>>>print(dW)
[[0.21924763, 0.14356247, –0.36281009]
[0.32887144, 0.2153437, –0.54421514]]
一つの式の変数の微分は、ある値に対する接線の傾きになる。
重み変数Wの数値は、数値②、数値③、損失関数の数式で計算されている。
3つの式で計算される変数の微分について理解が混乱。
4.3.1「微分とは、ある瞬間の変化の量」なのだ。