optimによる関数最適化
前節で示した更新処理を反復することにより、勾配法に基づいた関数の最小化を行うことができる。
code:optim21.py
import torch as pt
import numpy as np
import matplotlib.pyplot as plt
import torch.optim as optim
def func(x):
return x**2 -2*x - 3
x0 = 2.0 # 初期値をint型で用意
alpha = 0.1 # 学習率
y_list = [] # 履歴の保存用
x = pt.tensor(x0, dtype=pt.float32, requires_grad=True)
optimizer = optim.SGD(x, lr=alpha)
for i in range(50):
optimizer.zero_grad() # (1)
y = func(x)
y.backward()
optimizer.step()
y_list.append(x.detach().numpy().copy()) # (2)
plt.plot(y_list)
plt.show()
(1) backwardメソッドのデフォルトの動作は、勾配の値をリーフが有する勾配に加算する。そのため、毎回のループ処理において勾配の値を0にする必要がある。
(2) 繰り返し計算の過程で得られたテンソルの履歴を残すための処理。時間の都合上、授業の範囲外とする。
/icons/hr.icon
※ ブラウザのバックボタンで戻る