「ゼロから作るDeepLearning」で気づいたこと(その4)
5.5.2 Sigmoid レイヤについて
合成関数の微分を利用したほうが理解しやすかったのでメモしておきます。
Lを損失関数とする。
◎ステップ1
α(i) = 1+exp(-x) とすると、 y = 1/α(i)
∂L/∂α(i) = (∂L/∂y )(∂y/∂α(i))
∂y/∂α(i) = - 1/α(i)^2 = -(1/α(i))^2 = -y^2 だから
∂L/∂α(i) = -(∂L/∂y )y^2
◎ステップ2
α(i) = 1+exp(-x)
α(i-1) = exp(-x) と置くと、α(i) = 1+α(i-1)
よって、
∂L/∂α(i-1) = (∂L/∂α(i))(∂α(i)/∂α(i-1))
ステップ1より、∂L/∂α(i) = -(∂L/∂y )y^2
また、∂α(i)/∂α(i-1) = 1 なので
∂L/∂α(i-1) = -(∂L/∂y )y^2
◎ステップ3
α(i-2) = -x とすると、
α(i-1) = exp(α(i-2))
よって、
∂L/∂α(i-2) = (∂L/∂α(i-1))(∂α(i-1)/∂α(i-2))
ステップ2より ∂L/∂α(i-1) = -(∂L/∂y )y^2
また、∂α(i-1)/∂α(i-2) = exp(α(i-2)) = exp(-x) であるから、
∂L/∂α(i-2) = -(∂L/∂y )(y^2)(epx(-x))
◎ステップ4
∂L/∂x = (∂L/∂α(i-2))(∂α(i-2)/∂x)
ステップ3より ∂L/∂α(i-2) = -(∂L/∂y )(y^2)(epx(-x))
また、∂α(i-2)/∂x =-1 であるから、
∂L/∂x = (∂L/∂y )(y^2)(epx(-x))
※(∂L/∂y)(y^2)(exp(−x)) という値が順伝播の入力 x と出力 y だけから計算できる点が注目すべきところ
「ゼロから作るDeepLearning」で気づいたこと(その3)
4.3.2 数値微分の例
gradient_1d.pyの以下の関数について
def tangent_line(f, x):
d = numerical_diff(f, x)
print(d)
y = f(x) - d*x
return lambda t: d*t + y
y=f(x) - d*x
dは傾きなので、d*xは、接線のx=0つまりf(0)から座標xでのf(x)の差、つまりf(x)-f(0)がもとまる。よってf(x)-d*xはf(0)となり、f(0)は接線のx=0でのy座標の値、つまり切片となる。
「ゼロから作るDeepLearning」で気づいたこと(その2)
4.2.4 [バッチ対応版]交差エントロピー誤差の実装
cross_entropy_error(y, t)関数において
以下のくだりがある。
if y.ndim == 1:
t = t.reshape(1, t.size)
y = y.reshape(1, y.size)
yが1次元なのになぜこんなことをと思ったのですが、これはyを2次元にしているんですね。2次元だけど、もとは1次元だから行数は1。こんな当たり前に気付かなかった。
「ゼロから作るDeepLearning」で気づいたこと
3.6.3 バッチ処理
以下の計算過程をもう少し詳しく記述してみた。
ここで、 W1、W2、W3での行列の演算結果をそれぞれ、a1、a2、a3とすると、
a1 = X・W1 ⇒ 100(行)×50(列)
従って、
W1とW2の間の演算は
a2 = a1・W2 ⇒ 100(行)×100(列)
W2とW3の間の演算は
a3 = a2・W3 ⇒ 100(行)×10(列)
出力層Yへは活性化関数hを適用して
Y = h(a3) ⇒ 100(行)×10(列)
今日もロング散歩
土曜日なので今日もロング散歩。
在宅勤務で普段全く運動していないのでイッキに運動しているという感じです。
今日も和田堀公園へ。朝早くから野球やサッカー、そしてテニスをしている人達がいます。
楽しそうです。
また本日も野鳥を観測している方々がいらっしゃいました。いつも同じ場所にいるので、おそらく特定の木に生息している野鳥をねらっているのかと思います。
ウロチョロしながら今日も15キロぐらい道程を歩いたりジョギングしたりいたのですが、いつもよりも疲労感があります。
なんでだろう。おそらく武井壮さんが提唱していた「全力歩き」を取り入れたからだと思います。たかだか二、三十メートルの距離を全力で歩くことを4、5回行っただけなのに、疲労感が全く違います。
「全力歩き」は良いトレーニングになりそうです。