开源寻参工具 Optuna

Optuna是特别为机器学习而设计的一个自动超参数优化软件框架。它具有命令式的、随运行而定义的用户API。用Optuna编写的代码具有高度的模块化,Optuna的用户可以动态地构造超参数的搜索空间。

参考

Akiba T, Sano S, Yanase T, et al. Optuna: A next-generation hyperparameter optimization framework[C]//Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2019: 2623-2631.

官网
官方文档

Optuna的使用

使用Optuna至少需要了解3个东西:Trail 对象,Study 对象和objective函数。

1. Trail 对象

一个trail实例是一个评估目标函数的过程。该实例被传递给一个目标函数,并提供了获取参数建议、管理状态、设置/获取用户自定义的trail属性的接口,以便Optuna用户可以通过这些接口定义自定义的目标函数。

对象方法如下:

方法 描述
report(value, step) Report an objective function value for a given step.
set_system_attr(key, value) 设置系统属性
set_user_attr(key, value) 设置用户属性
should_prune() 是否应被剪枝
suggest_categorical(name, choices) 为分类型参数建议一个值
suggest_discrete_uniform(name, low, high, q) 为离散型参数建议一个值
suggest_float(name, low, high, *, [step, log]) 为浮点型参数建议一个值
suggest_int(name, low, high, [step, log]) 为整型参数建议一个值
suggest_loguniform(name, low, high) 为对数域连续型参数建议一个值
suggest_uniform(name, low, high) 为连续型参数建议一个值

官方文档中有较详细的论述和用例,例如report和should_prune可以结合起来使用剪枝表现不好的trail,set_user_attr可用于保存模型的固定参数。

2. objective函数

objective函数需要用户自己编写,主要有下面三个要求:

  1. 以trail作为函数参数

  2. 定义超参数和寻参范围

  3. 返回模型目标函数值

一个简单的objective函数例子如下:

def objective(trial: optuna.trial.Trial):  # 以trail作为参数
    x = trial.suggest_uniform("x", 0, 10)  # 定义参数和寻参范围
    return x ** 2  # 返回模型目标函数值

3. Study对象

一个study相当于一个优化任务,即一组试验。这个对象提供接口来运行一个新的trail,访问其历史,设置/获取用户自定义的study本身的属性。

4. 如何使用

下面的代码展示了一个简单的使用Optuna优化超参数的例子,具体应用的核心在于根据自己的模型改写objective函数。

# 定义模型训练函数
def train(data, params):
    pass
    # 返回指标,如损失,精度等
    return loss 

# 定义objective函数
def objective(trial: optuna.trial.Trial):
    # 定义模型超参数及其范围
    params = {
        'n_layers_rnn': trial.suggest_int('n_layers_rnn', 1, 4),
        'n_units_rnn': trial.set_user_attr('n_units_rnn', 256),
        'activation': trial.suggest_categorical('activation', ['relu', 'tanh']),
        'dropout': trial.suggest_uniform('dropout', 0.1, 0.7),
        'lr': trial.suggest_loguniform('lr', 1e-6, 1e-2)
    }
    # 计算模型损失
    loss = train(data, params)
    # 返回损失
    return loss

# 创建优化任务
study = optuna.create_study(direction='minimize')
# 执行优化任务,设置运行100次trial
study.optimize(objective, n_trials=100)

# 最优结果
trial_ = study.best_trial
print(f'min loss: {trial_.value}')  # 输出最优结果的损失值
print(f'best params: {trial_.params}')  # 输出最优结果的模型超参数

你可能感兴趣的:(开源寻参工具 Optuna)