最適化関数によるテンソルの更新(1)
勾配属性を与えたテンソル $ x を生成しました。
$ x = \left( \begin{array}{cc} 1 & 1 \\ 1 & 1 \\ \end{array} \right)
ここでは勾配$ x_{grad}を直接代入しています。
$ x_{grad} = \left( \begin{array}{cc} 0.1 & 0.2 \\ 0.3 & 0.4 \\ \end{array} \right)
code:sgd1.py
import torch as pt
import torch.optim as optim
x = pt.tensor(1, 1], [1, 1, dtype=pt.float, requires_grad=True)
x.grad = pt.tensor(0.1, 0.2], [0.3, 0.4, dtype=pt.float)
print('# Before')
print('x:\n', x)
print('xの勾配:\n',x.grad)
最適化器のインスタンスを生成します。
アルゴリズムは確率的最急降下法(SGD)、対象は勾配を持つテンソルを指定し、ここでは上で生成したxを与えます。
ここでは分かり易さのため、学習率 lr = 1 としています。
code:(続き).py
lr = 1
optimizer = optim.SGD(x, lr=lr)
最適化器の step メソッドを呼び出すと、SGDの計算を1ステップだけ実行します。
code:(続き).py
optimizer.step()
その結果、次の計算が行われ、$ xの値が更新されます。
$ x \leftarrow x - lr \times x_{grad}
code:(続き).py
print('# After')
print('x:', x)
ここではoptimモジュールの説明のために、SGDアルゴリズムの繰り返し計算で行われる1ステップのみを示しました。実際には、学習率はもっと小さい値が用いられ、また、繰り返し計算は十分な回数実行されることにより、目的関数の最小化を行います。
/icons/hr.icon
※ ブラウザのバックボタンで戻る