「Deep Learning」って何?--Pythonでの実装(ニューラルネットワークの学習:勾配法)。
最適なパラメーターを勾配法を使って探索していきます。損失関数が最小値をとる時のパラメーターの値です。うまく勾配で方向を探り最も、できる限る小さい値を探していきます(勾配法)。
以下で説明されています。分かりやすいです!
ニューラルネットワークでは最小値を探すので、勾配降下法をとして考えていきます。
そして
ちょっと理解が追いついていないので参考に色々調べながら確認していきます。
ここで新しい言葉が出てきます。「学習率」と呼ばれるもの、1回の学習でどれだけ学習するか、どれだけパラメーターを更新するかを決めるもの。
それでは、勾配降下法の実装です。
def gradient_descent(f, init_x, lr=0.01, step_num=100):
x = init_x
for i in range(step_num):
grad = numerical_gradient(f, x)
x -= lr * grad
return x
引数の"f"は最適化したい関数、"init_x"は初期値、"lr"は学習率、"step_num"は勾配法による繰り返しの数とします。
関数の勾配はnumerical_gradient(f,x)で求め、その勾配に学習率を掛けた値で更新する処理をstep_numで指定された回数繰り返します。
実際に計算してみます。
まず関数。
def function_2(x):
return x[0]**2 + x[1]**2
初期値。
init_x = np.array([-3.0,4.0])
勾配(偏微分をベクトりでまとめたもの)の実装です。勾配降下法で使っているものです。
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
それでは、勾配降下法で実行します。
gradient_descent(function_2, init_x, lr=0.1, step_num=100)
array([-6.19392843e-21, 5.60497583e-21])
結果は、(-6e-21 ,5e-21)となっているのでほぼ(0,0)ですね。ここでは学習率を設定することが重要問題となるようです。学習率が大きすぎると、大きな値へと発散し、小さすぎると、更新されずに終わってしまいます。
この記事が気に入ったらサポートをしてみませんか?