勾配法
勾配法とは、勾配を用いて関数の極値を探索するアルゴリズムの総称である。最も基本的なものに最急降下法がある。これは、
関数:$ f(x)
学習率:$ \alpha
初期値$ x_0
としたとき、次の繰り返し計算を行うことで関数の極値を求める。
$ x_{n+1} = x_n - \alpha f'(x_n)
この種のアルゴリズムは、ニューラルネットの学習における損失関数の最小化に利用されている。また、関数が極値をとるような最適なパラメータの組み合わせを探索する問題でもあることから、最適化と呼ぶこともある。
具体例:
/icons/hr.icon
問題:関数$ f(x) = x^2 - 3x + 2の極値を$ x_0 = 0から探索する。学習率は$ \alpha = 0.1とする。
https://scrapbox.io/files/65332ad0e7ac63001cff4dc3.svg
丸印が探索を開始するxの値、×印が期待する解が得られるxの値を表す。
/icons/hr.icon
解:$ f'(x) = 2x-3より、
STEP:n = 0
$ x_0 = 0より、
$ f'(x_0) = f'(0) = 2\times 0 - 3 = -3
$ x_1 = x_0 - \alpha f(x_0) = 0 - 0.1\times (-3) = 0.3
STEP:n = 1
$ x_1 = 0.3より、
$ f'(x_1) = f'(0.3) = 2\times 0.3 - 3 = -2.4
$ x_2 = x_1 - \alpha f'(x_1) = 0.3 - 0.1 \times (-2.4) = 0.54
STEP : n = 2
$ x_2 = 0.54より、
$ f'(x_2) = f'(0.54) = ... = -1.92
$ x_3 = x_2 - \alpha f'(x_2) = 0.52 - 0.1\times(-1.92) = 0.732
:
:
以上の計算を繰り返すことにより、$ x_n \approx 1.5に収束し、極値$ -0.25の近似値を得ることができる。プログラムを次に示す。
code:gd1.py
def fd(x):
return 2*x - 3
x = 0
alpha = 0.1
loopmax = 20
for n in range(loopmax):
x = x - alpha*fd(x)
print(n, ':', x)
print('Result: ', x**2 - 3*x + 2)
/icons/hr.icon
※ ブラウザのバックボタンで戻る