Hyper parameters tuning using comet.ml¶
Enchanter は comet.ml と PyTorch を高度に統合することを目的に開発されています。 ここでは、comet.mlが提供するハイパーパラメータチューニングをEnchanterと一緒に使う方法を紹介します。
comet.mlが提供するハイパーパラメータチューニング機能は細やかな設定とログ管理ができる一方、 辞書形式で設定を記述する必要があり、可読性が悪いという問題があります。 Enchanterでは、この設定を容易にするために Optunaスタイルのconfigジェネレータ enchanter.utils.comet.TunerConfigGenerator を提供しています。
from comet_ml import Optimizer
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_iris
import enchanter.tasks as tasks
import enchanter.addons as addons
import enchanter.addons.layers as layers
from enchanter.utils import comet
ライブラリの準備ができました、早速 TunerConfigGenerator を使ってconfigを生成しましょう。
config = comet.TunerConfigGenerator(
algorithm="bayes",
metric="train_avg_loss",
objective="minimize",
seed=0,
trials=5
)
config.suggest_categorical("activation", ["addons.mish", "torch.relu", "torch.sigmoid"])
ここでは、モデルに最適な活性化関数を探索することにします。.suggest_categorical() は変数の名前と探索対象を与えます。 comet.mlの仕様上、カテゴリカル変数の場合、探索対象は要素に文字列を持つリストを与える必要があります。
opt = Optimizer(config.generate())
作成したconfigは .generate() メソッドを使うことで簡単に comet.ml が求める辞書形式にする事が出来ます。 これで準備が整いました、早速探索を行ってみましょう。
for experiment in opt.get_experiments():
model = layers.MLP([4, 512, 128, 3], eval(experiment.get_parameter("activation")))
optimizer = optim.Adam(model.parameters())
runner = tasks.ClassificationRunner(
model, optimizer=optimizer, criterion=nn.CrossEntropyLoss(), experiment=experiment
)
x, y = load_iris(return_X_y=True)
x = x.astype("float32")
y = y.astype("int64")
runner.fit(x, y, epochs=1, batch_size=32)
runner.quite()
ここで注意が必要なのは、先ほどの .suggest_categorical() メソッドで指定した変数についてです。 comet.mlでは カテゴリカル変数は文字列として与えられ、文字列を返すという仕組みになっています。 Pythonの関数名を与えた場合、文字列として返されてしまうので、再度関数にするためには、 eval() を使う必要があります。