高级配置¶
定义参数空间¶
Optuna 支持五种类型的参数。
def objective(trial):
# Categorical parameter
optimizer = trial.suggest_categorical('optimizer', ['MomentumSGD', 'Adam'])
# Int parameter
num_layers = trial.suggest_int('num_layers', 1, 3)
# Uniform parameter
dropout_rate = trial.suggest_uniform('dropout_rate', 0.0, 1.0)
# Loguniform parameter
learning_rate = trial.suggest_loguniform('learning_rate', 1e-5, 1e-2)
# Discrete-uniform parameter
drop_path_rate = trial.suggest_discrete_uniform('drop_path_rate', 0.0, 1.0, 0.1)
...
分支 (Branches) 与 循环 (Loops)¶
根据不同的参数值,你可以选择使用分支或者循环。
def objective(trial):
classifier_name = trial.suggest_categorical('classifier', ['SVC', 'RandomForest'])
if classifier_name == 'SVC':
svc_c = trial.suggest_loguniform('svc_c', 1e-10, 1e10)
classifier_obj = sklearn.svm.SVC(C=svc_c)
else:
rf_max_depth = int(trial.suggest_loguniform('rf_max_depth', 2, 32))
classifier_obj = sklearn.ensemble.RandomForestClassifier(max_depth=rf_max_depth)
...
def create_model(trial):
n_layers = trial.suggest_int('n_layers', 1, 3)
layers = []
for i in range(n_layers):
n_units = int(trial.suggest_loguniform('n_units_l{}'.format(i), 4, 128))
layers.append(L.Linear(None, n_units))
layers.append(F.relu)
layers.append(L.Linear(None, 10))
return chainer.Sequential(*layers)
更多例子见 examples.
参数个数的注意事项¶
随着参数个数的增长,优化的难度约成指数增长。也就是说,当你增加参数的个数的时候,优化所需要的 trial 个数会呈指数增长。因此我们推荐不要增加不必要的参数。
Study.optimize 的参数¶
optimize()
(还有命令 optuna study optimize
) 有着数个有用的参数,比如``timeout``. 具体细节见 optimize()
的API参考资料。
供參考: 如果既没有给出 n_trials
也没有给出 timeout
参数的话,优化过程将一直持续下去,直到接收到一个诸如 Ctrl+C 或 SIGTERM 的终止信号。这在难以估算优化目标函数所需的计算成本的情况时是有用的。