「Deep Learning」って何?--Pythonでの実装(ニューラルネットワークの学習:微分)。
参考サイトです。
https://unisia-se.com/detail/48/
自分でも実際にColabで打ち込んで確認していきながらやっていきます。
損失関数を減少させて精度を高める必要があります。その方法として、微分してその方向を定めていきます(勾配法)。
まず微分の実装をしていきます。
def numerivcal_diff(f,x):
h =1e-4
return (f(x+h)-f(x-h))/(2*h)
そして簡単な関数を微分します(数値微分)。
関数は、y = 0.001x^2 +0.1xをPythonで実装すると、
def function_1(x):
return 0.01*x**2 + 0.1*x
この関数を微分します。まず x = 5
numerical_diff(function_1, 5)
出力は
0.1999999999990898
x = 10を計算。
numerical_diff(function_1,10)
出力は
0.2999999999986347
次に変数が2つある関数について考えていきます(偏微分)。
Pythonで実装します。
def function_2(x):
return x[0]**2+x[1]**2
ここで注意することは、変数が2つあることです。2つあるのでどちらの変数の微分かということを区別する必要があります。
それでは、
x[0]=3
x[1]=4
の微分を求めてみます。
一つずつ微分を求めます。
x[0]について微分をします。この時x[1]=4を固定して考えます。
def function_2(x0):
return x0**2+4.0**2.0
この式を微分します。
numerical_diff(function_2,3.0)
出力
6.00000000000378
x[1]について微分をします。この時x[0]=3を固定して考えます。
def function_2(x1):
return 3**2+x1**2.0
の式を微分します。
numerical_diff(function_2,4.0)
出力は
7.999999999999119
となります。
これをまとめて計算してみましょう。
両方の偏微分をまとめてベクトルとするものを勾配と言います。
実装です。
def function_2(x):
return x[0]**2+x[1]**2
def numerical_gradient(f, x):
h = 1e-4 # 0.0001
grad = np.zeros_like(x)
for idx in range(x.size):
tmp_val = x[idx]
x[idx] = float(tmp_val) + h
fxh1 = f(x) # f(x+h)
x[idx] = tmp_val - h
fxh2 = f(x) # f(x-h)
grad[idx] = (fxh1 - fxh2) / (2*h)
x[idx] = tmp_val # 値を元に戻す
return grad
計算してみましょう。
numerical_gradient(function_2, np.array([3.0,4.0]))
出力は
array([6., 8.])
点(3,4) の勾配は(6,8)ということです。
勾配は各地点において関数の値を最も減らす方向。が計算されました。この方向でパラメーターを動かしていくということですね。
この記事が気に入ったらサポートをしてみませんか?