optimによるテンソルの更新(スカラの場合)
前節では勾配を用いた関数の最小化問題を示した。勾配を求める方法については自動微分(スカラの場合)の頁で解説済みであるので、求めた勾配を用いてテンソルの値を更新するための方法を解説する。
簡略化のため、まずは最急降下法の各ステップにおいて行われる値の更新
$ x_{n+1} = x_{n} - \alpha f'(x_n)
に相当する処理を、PyTorch の optim モジュールが提供するSGD関数【torch】を用いて実装する例を示す。
スカラ型のテンソルを対象とした場合
code:optim1.py
import torch as pt
import torch.optim as optim
x0 = 1
alpha = 0.1 # (1):学習率
x = pt.tensor(x0, dtype=pt.float, requires_grad=True)
optimizer = optim.SGD(x, lr=alpha) # (2):SGDの生成、対象は変数x
y = x**2 - 4*x + 3
y.backward() # (3):自動微分
print('# 更新前 --------------')
print('x:', x)
print('x.grad:', x.grad)
optimizer.step() # (4):更新
print('# 更新後 --------------')
print('x:', x)
(2):SGD型のインスタンスを生成する。その際、更新の対象となるテンソルを保持するリストを第1引数で渡す。
(3):自動微分を行い、リーフであるxに勾配を格納する。
(4):stepメソッドにより更新処理を行う。行われる計算は
code:(参考).py
x <-- x - alpha * x.grad
であるので、テンソルxの値は
$ 1 - 0.1\times (-2) = 1.2
で更新される。
code:(結果).py
x: tensor(1., requires_grad=True) <--- 更新前
x.grad: tensor(-2.) <--- 勾配
x: tensor(1.2000, requires_grad=True) <--- 更新後
SGDの対象としたテンソルxが、それ自身が保持する勾配の値x.gradにより更新されたことが確認できる。
以上まとめると、
Pytorchは関数の極値を求めるためのオブジェクトを提供する、ここではSGDクラスを利用している。
SGDクラスは、勾配を有するテンソルを対象として、それがもつ勾配の値を用いて値を更新することができる。
/icons/hr.icon
※ ブラウザのバックボタンで戻る