Note
Go to the end to download the full example code.
Pythonic な探索空間
ハイパーパラメータのサンプリングにおいて、Optuna は以下の機能を提供します:
optuna.trial.Trial.suggest_categorical()
カテゴリカルパラメータ用optuna.trial.Trial.suggest_int()
整数パラメータ用optuna.trial.Trial.suggest_float()
浮動小数点数パラメータ用
オプション引数として step
と log
を指定することで、整数および浮動小数点数パラメータを離散化または対数変換できます。
import optuna
def objective(trial):
# カテゴリカルパラメータ
optimizer = trial.suggest_categorical("optimizer", ["MomentumSGD", "Adam"])
# 整数パラメータ
num_layers = trial.suggest_int("num_layers", 1, 3)
# 整数パラメータ (対数変換)
num_channels = trial.suggest_int("num_channels", 32, 512, log=True)
# 整数パラメータ (離散化)
num_units = trial.suggest_int("num_units", 10, 100, step=5)
# 浮動小数点数パラメータ
dropout_rate = trial.suggest_float("dropout_rate", 0.0, 1.0)
# 浮動小数点数パラメータ (対数変換)
learning_rate = trial.suggest_float("learning_rate", 1e-5, 1e-2, log=True)
# 浮動小数点数パラメータ (離散化)
drop_path_rate = trial.suggest_float("drop_path_rate", 0.0, 1.0, step=0.1)
探索空間の定義
Optuna では、条件分岐やループなどの Python の構文を用いて探索空間を定義できます。
また、パラメータの値に応じて分岐やループを使用できます。
より多様な使い方については、examples を参照してください。
分岐:
import sklearn.ensemble
import sklearn.svm
def objective(trial):
classifier_name = trial.suggest_categorical("classifier", ["SVC", "RandomForest"])
if classifier_name == "SVC":
svc_c = trial.suggest_float("svc_c", 1e-10, 1e10, log=True)
classifier_obj = sklearn.svm.SVC(C=svc_c)
else:
rf_max_depth = trial.suggest_int("rf_max_depth", 2, 32, log=True)
classifier_obj = sklearn.ensemble.RandomForestClassifier(max_depth=rf_max_depth)
ループ:
import torch
import torch.nn as nn
def create_model(trial, in_size):
n_layers = trial.suggest_int("n_layers", 1, 3)
layers = []
for i in range(n_layers):
n_units = trial.suggest_int("n_units_l{}".format(i), 4, 128, log=True)
layers.append(nn.Linear(in_size, n_units))
layers.append(nn.ReLU())
in_size = n_units
layers.append(nn.Linear(in_size, 10))
return nn.Sequential(*layers)
パラメータ数についての注意点
最適化の難易度はパラメータ数に対しておよそ指数的に増加します。つまり、パラメータ数を増やすと必要な試行数が指数的に増加するため、重要でないパラメータは追加しないことが推奨されます。
Total running time of the script: (0 minutes 0.002 seconds)