title: 超参数优化框架Optunasubtitle: 超参数优化框架Optuna
date: 2020-11-13
author: NSX
catalog: true
tags:
- Optuna
- 超参数优化
- 教程

超参数优化框架Optuna

本文介绍超参数优化框架Optuna,Optuna是一种自动超参优化框架,专为机器学习而设计。它具有命令式,按运行定义的用户API。使用Optuna编写的代码具有很高的模块性,Optuna的用户可以动态构建超参数的搜索空间。

它目前支持的部分库有(全部请参见官网):

  • XGBoost
  • LightGBM
  • Sklearn
  • Keras
  • TensorFlow
  • tf.keras
  • MXNet
  • PyTorch
  • FastAI

    安装

  1. pip install optuna

示例代码

添加两个函数define_modelobjective就能将Optuna框架零感地插入到我们现有的代码中去。

  1. import optuna
  2. from torch import optim, nn
  3. '''
  4. # 这个定义的model只是个示例,实际并没什么用
  5. class model(nn.Module):
  6. def __init__(self, input_size, output_size, hidden_size=200, dropout=p):
  7. super(model, self).__init__()
  8. self.embedding = nn.Embedding(num_embeddings=input_size,
  9. embedding_dim=hidden_size)
  10. self.linear = nn.Linear(in_features=hidden_size, out_features=output_size)
  11. self.dropout = nn.Dropout(dropout)
  12. def forward(self, x):
  13. x = self.dropout(self.embedding(x))
  14. outputs = self.linear(x)
  15. return outputs
  16. '''
  17. def define_model(trial):
  18. # 在100到200之间搜索hidden_size
  19. hidden_size = trial.suggest_int('hidden_size', 100, 200)
  20. # 在0.2到0.5之间搜索dropout rate
  21. p = trial.suggest_uniform('dropout', 0.2, 0.5)
  22. # 假设vocab_size, output_size都已经定义了
  23. m = model(input_size=vocab_size, output_size=output_size,
  24. hidden_size=hiddensize, dropout=p)
  25. return m
  26. def objective(trial):
  27. # 尝试不同的optimizer
  28. optimizer_name = trial.suggest_categorical('optimizer',
  29. ['Adam', 'RMSprop', 'SGD'])
  30. # 搜索学习率
  31. lr = trial.suggest_uniform('lr', 1e-5, 1e-1)
  32. m = define_model(trial)
  33. optimizer = getattr(optim, optimizer_name)(m.parameters(), lr=lr)
  34. # 这里省略了run函数,内部应该将数据喂给model训练,训练完成后在验证集上测试,计算并返回acc
  35. acc = run(m, optimizer=optimizer)
  36. return acc
  37. if __name__ == '__main__':
  38. # 创建一个学习实例,因为objective返回的评价指标是acc,因此目标是最大化,如果是loss就该是minimize
  39. study = optuna.create_study(direction='maximize')
  40. # n_trials代表搜索100种,n_jobs是并行搜索的个数,-1代表使用所有的cpu核心
  41. study.optimize(objective, n_trials=100, n_jobs=-1)
  42. print('Number of finished trials: ', len(study.trials))
  43. print('Best trial:')
  44. trial = study.best_trial
  45. print(' Value: ', trial.value)
  46. print(' Params: ')
  47. for key, value in trial.params.items():
  48. print(' {}: {}'.format(key, value))

这里只是简单地展示了一下如何在pytorch中使用optuna,以此来解放调参师的双手,更详细的使用请参见官方网站。

参考

https://tianhongzxy.top/2020/02/06/optuna/

https://optuna.readthedocs.io/zh_CN/latest/tutorial/10_key_features/002_configurations.html

https://github.com/optuna/optuna/tree/master/examples