Optuna: 一个超参数优化框架¶
Optuna 是一个特别为机器学习设计的自动超参数优化软件框架。它具有命令式的,define-by-run 风格的 API。由于这种 API 的存在,用 Optuna 编写的代码模块化程度很高,Optuna 的用户因此也可以动态地构造超参数的搜索空间。
主要特点¶
Optuna 有如下现代化的功能:
-
只需少量依赖,简单安装完成后便可处理各种任务。
-
利用熟悉的python 语法,如 条件语句和循环来定义搜索空间。
-
采用了最先进的超参数采样和最有效的对无望 trial 进行剪枝的算法。
-
仅需少量甚至无需代码修改便可将 study 分布到数十甚至数百个 worker。
-
查询优化记录。
基本概念¶
我们以如下方式使用 study 和 trial 这两个术语:
Study: 基于目标函数的优化过程
Trial: 目标函数的单次执行过程
请参考下面的示例代码。一个 study 的目的是通过多次 trial (例如 n_trials=100
) 来找出最佳的超参数值集(比如选择 classifier
还是 svm_c
)。而 Optuna 旨在加速和自动化此类 study 优化过程。
import ...
# Define an objective function to be minimized.
def objective(trial):
# Invoke suggest methods of a Trial object to generate hyperparameters.
regressor_name = trial.suggest_categorical('classifier', ['SVR', 'RandomForest'])
if regressor_name == 'SVR':
svr_c = trial.suggest_loguniform('svr_c', 1e-10, 1e10)
regressor_obj = sklearn.svm.SVR(C=svr_c)
else:
rf_max_depth = trial.suggest_int('rf_max_depth', 2, 32)
regressor_obj = sklearn.ensemble.RandomForestRegressor(max_depth=rf_max_depth)
X, y = sklearn.datasets.load_boston(return_X_y=True)
X_train, X_val, y_train, y_val = sklearn.model_selection.train_test_split(X, y, random_state=0)
regressor_obj.fit(X_train, y_train)
y_pred = regressor_obj.predict(X_val)
error = sklearn.metrics.mean_squared_error(y_val, y_pred)
return error # An objective value linked with the Trial object.
study = optuna.create_study() # Create a new study.
study.optimize(objective, n_trials=100) # Invoke optimization of the objective function.
Communication¶
可在 GitHub Issues 报告bug、提feature request 和问问题。
可在 Gitter 与开发者互动.
可在 StackOverflow 提问。
贡献¶
欢迎大家对Optuna的一切贡献!但是在发送pull request时请遵从 contribution guide 的规范.
Reference¶
Takuya Akiba, Shotaro Sano, Toshihiko Yanase, Takeru Ohta, and Masanori Koyama. 2019. Optuna: A Next-generation Hyperparameter Optimization Framework. In KDD (arXiv).
目录
- 安装
- 教程
- API Reference
- 常见问题
- 某某库可以和 Optuna 配合使用吗?(某某是你常用的机器学习库)
- 如何定义带有额外参数的目标函数?
- 没有远程 RDB 的情况下可以使用 Optuna 吗?
- 如何保存和恢复 study?
- 如何禁用 Optuna 的日志信息?
- 如何在目标函数中保存训练好的机器学习模型?
- 如何获得可复现的优化结果?
- Trial 是如何处理抛出异常的?
- Trial 返回的 NaN 是如何处理的?
- 动态地改变搜索空间会导致怎样的结果?
- 如何在两块 GPU 上同时跑两个 trial?
- 如何对目标函数进行测试?
- How do I avoid running out of memory (OOM) when optimizing studies?