0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

最急降下法を用いた最適値導出

Last updated at Posted at 2022-05-01

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()

output.png
微分すると
$$
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()

output.png
これで$x=-1$となり,最適解が求められた.


次に
初期値:-10,
ステップ幅:0.0015
試行回数:1000にすると
output.png
これだと$x=0$になり局所解につかっまってしまった.

3. 最後に

今回は1次元の問題を扱い,最急降下法を用いて最適値を導出した.
最急降下法は最適値を導出できる場合もあるが,局所解に陥る可能性がある.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?