サムネがコーヒーの記事は書きかけです。

一次元の勾配降下法【機械学習】

局所最小値を求める

以下の関数について、エポック数100,学習レート0.01のパラメータを使用して、関数の局所最小値を求めてみます。

import numpy as np 
import matplotlib.pyplot as plt 
fig = plt.figure()

def ft(t:float)->float:
  return 4*t**2 - 3*t + 2
def deriv(t:float)->float:
  return 8*t - 3

t = np.linspace(-2,2,2001)

#Starting point
lc_min = np.random.choice(t,1)

# learning params
learning_rate = .01
epochs = 100

for i in range(epochs):
  grad = deriv(lc_min)
  lc_min-= learning_rate*grad


plt.plot(t,ft(t), t,deriv(t))
plt.plot(lc_min,deriv(lc_min),'ro')
plt.plot(lc_min,ft(lc_min),'ro')

plt.xlim(t[[0,-1]])
plt.grid()
plt.xlabel('t')
plt.ylabel('f(t)')
plt.legend(['f(t)','df','f(t) min'])
plt.title('Empirical local minimum: %s'%lc_min[0])
plt.show()

ここで、漸近していく様子を以下のように追跡すると、どのように収束していくかがわかります。

learning_rate = .01
epochs = 100

modelparams = np.zeros((epochs,2))
for i in range(epochs):
  grad = deriv(lc_min)
  lc_min-= learning_rate*grad
  modelparams[i,0] = lc_min
  modelparams[i,1] = grad



fig,ax = plt.subplots(1,2,figsize=(12,4))

for i in range(2):
  ax[i].plot(modelparams[:,i],'o-')
  ax[i].set_xlabel('Iteration')
  ax[i].set_title(f'Final estimated minimum: {lc_min[0]:.3f}')
plt.grid()
ax[0].set_ylabel('Local min')

ax[1].set_ylabel('Derivative')

fig.savefig("a.png",dpi = 500)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です