1. 初めに
最急降下法を使うためには,
最適化したい関数が微分可能であることが前提にある.
関数$f(x)$があるとすると,以下の更新式で最適値が求められる.
$$
x=x_{old}-af'(x)
$$
2. 1次元の関数に対する最急降下法
4次関数
$$
y=3x^4+4x^3+1
$$
がある.この関数を図にしたものを以下に示す。
a = np.array(range(-17,10))*0.1
b = 3*a**4 + 4*a**3 + 1
plt.plot(a,b)
plt.grid()
微分すると
$$
y'=12x^3+12x^2=12x^2(x+1)
$$
つまり,この関数の微分が0になる値はx=0,-1の時である.
これを最急降下法で求める.
初期値:10,
ステップ幅:0.001
試行回数:500とすると,
1回目の更新では
$x=10-0.001×12×10^2(10+1)=3.2$
2回目の更新では,
$x=3.2-0.001×12×3.2^2(3.2+1)=-2.9296...$
これを繰り返すことで最適値が求められる.
そのプログラムを以下に示す.
# 試行回数
try_num = 500
result = np.zeros(try_num)
# 初期値
x = 10
# ステップ幅
alpha = 0.001
for i in range(try_num):
y_ = 12*x**3 + 12*x**2
x = x - alpha*y_
result[i] = x
plt.plot(result)
plt.ylabel("x")
plt.xlabel("try")
plt.grid()
次に
初期値:-10,
ステップ幅:0.0015
試行回数:1000にすると
これだと$x=0$になり局所解につかっまってしまった.
3. 最後に
今回は1次元の問題を扱い,最急降下法を用いて最適値を導出した.
最急降下法は最適値を導出できる場合もあるが,局所解に陥る可能性がある.