自動微分を用いた最適化の例
関数$ y(x) = x^2 - 2x - 3の最小値を求めよう。通常のやり方では、解析的に導関数を求めて$ dy/dx = 2x-2から
code:auto.py
import numpy as np
import matplotlib.pyplot as plt
def func(x):
return x**2 -2*x - 3
def funcd(x):
return 2*x - 2
x0 = 2.0 # 初期値をint型で用意
lr = 0.1
Y = [] # 履歴の保存用
X = []
x = x0
x_grad = 0
for i in range(50):
x_grad = funcd(x) # 関数funcd
Y.append(func(x))
X.append(x)
x = x - lr*x_grad # (2)
X = np.array(X) # (4)
Y = np.array(Y) # (4)
plt.plot(X, Y, '*', color='red')
xx = np.linspace(0.5, 2.5, 100)
yy = func(xx)
plt.plot(xx, yy)
plt.grid()
plt.show()
code:autograd.py
import torch as pt
import numpy as np
import matplotlib.pyplot as plt
def func(x):
return x**2 -2*x - 3
x0 = 2.0 # 初期値をint型で用意
lr = 0.1
Y = [] # 履歴の保存用
X = []
x = pt.tensor(x0, dtype=pt.float, requires_grad=True) # (1)
x.grad = pt.tensor(0, dtype=pt.float)
for i in range(50):
x.grad.zero_()
y = func(x)
y.backward()
Y.append(y.detach().numpy().copy())
X.append(x.detach().numpy().copy())
x.data = x.data - lr*x.grad # (2)
X = np.array(X) # (4)
Y = np.array(Y) # (4)
plt.plot(X, Y, '*', color='red')
xx = np.linspace(0.5, 2.5, 100)
yy = func(xx)
plt.plot(xx, yy)
plt.grid()
plt.show()
(1) リーフノードを設定、ここでx0はビルトイン型のintを与えている。
(2) は最急降下法で x の値を更新
(3)でxの値を取り出す、これはテンソル型なので配列に変換し、x0に代入する。
(4) は、リストオブジェクトの Y(1次元の配列を構成要素に持つ)から2次元の配列を生成している。
/icons/hr.icon
※ ブラウザのバックボタンで戻る