Pythonで勾配降下法 - 最適化について
なんだかわかりにくい。理解が足りないので整理します。
ある関数があってその極小値を知りたい。という場合に使う方法。
ある関数の底を知るためにはまずはある地点の勾配を知ることが必要になるのでその計算式が必要。勾配についてはその地点の微分をすれば良い。
必要なことその1 微分 numerical_gradient(f, x)
ある地点の勾配がわかったので勾配の低い方へ移動して行かないといけないので、次の地点に移動する割合を決めないといけない。
必要なことその2 学習率 ・・・・ 移動する割合。 lr
必要なものが揃ったので計算式です。"f"関数、"init_x"入力する値、"lr"学習率、"step_num"繰り返す数です。
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
最後の式
x -= lr * grad
で傾きとは反対方向に数字を減らしています。
グラフが最低の位置、ある求める関数の最小値を求めることができます。
この計算式は関数"f"の最小値を求めます。
この場合関数"f"は
def function_2(x):
return x[0]**2 + x[1]**2
初期値"init_x"を
init_x = np.array([-3.0,4.0])
として実行しています。
上記のものは2変数なので、もっとわかりやすく1変数を考えてみます。
参考になるサイトがありますのでご紹介。
早速サイト内で公開されているコードをColabでやってみると。
赤い点は軌跡を表現しています。
このグラフのように回数を重ねると極小値へ向かっているのがわかります。
まとめると、勾配法とはある関数があって、そのある位置(座標)の勾配(微分)を求め、その位置を学習率よって少しずつずらして最小値に近づける。という操作を決めた数繰り返すことによって必要な値を求めることができます。
ポイントはやはり微分法により傾きをもよめるところにあります。
この記事が気に入ったらサポートをしてみませんか?