PyTorchで最急降下法による最適化
余談
Differentiable Programming(微分可能プログラミング)という捉え方がとても素晴らしいと個人的に思います. 詳しくは以下のブログを見てください.
最急降下法による最適化
機械学習フレームワークのPyTorchを使って単純に最急降下法で関数の最適化をする. 最適化する関数は10000000次元のsphere関数を使用する.
コード
# -*- coding: utf-8 -*- import torch import torch.nn as nn import torch.optim as optim # 評価関数 def _sphere(x): return torch.pow(x, 2).sum() class Model(nn.Module): def __init__(self, dim=100, func=None): super(Model, self).__init__() if func is None: func = _sphere self.func = func # 設計変数 self.x = nn.Parameter(torch.rand(dim)) def forward(self): return self.func(self.x) def vars(self): return self.x.detach().numpy() def objective(self): with torch.no_grad(): return self.func(self.x).numpy() # 次元は10000000次元 model = Model(dim=10000000) optimizer = optim.SGD(model.parameters(), lr=0.1) N = 100 print('初期の評価値', model.objective()) print('optimization...') for i in range(N): output = model() optimizer.zero_grad() loss = output loss.backward() optimizer.step() print('\rloss:', loss.item(), end='') print() print('評価値', model.objective())
実行結果
初期の評価値 3331740.8 optimization... loss: 2.1601908358880734e-13 評価値 1.382506e-13