今年夏天参与了一个我很喜欢的超参数框架 Optuna (Optuna - A hyperparameter optimization framework)的文档翻译工作。现在翻译已经基本完成(https://zh-cn.optuna.org),而 Optuna 更成熟的 2.0 版本最近也要发布了。于是我们决定写一个介绍,希望让更多的中文用户了解和使用这个框架,并且能参与到社区中间来。
Tensorflow 和 Pytorch 已经将实现深度学习模型变成一个 10 分钟不到的过程:声明模型,定义参数、优化器,载入训练数据,启动梯度下降。然后一个接着一个 epoch, 模型在测试集上的精度稳步提升... 但是等等,在现实中,训练一个模型从来不会这么顺利,你总会碰到各种各样的问题,比如:结果和paper上写的不一样(优化)
有些参数组合根本训练不出来,还把训练脚本搞崩溃了,你却不知道原因所在
训出来也不知道这个参数范围是否稳定(参数关系)
上面这些情况说明了超参数选择对于模型性能的重要性。于是为了调参,你开始手动往脚本里加内容:超参数优化不就是 for 循环里套 for 循环嘛,很简单。可很快,你又会其他碰到问题:有一台好机器,for 循环一次却只能执行一个模型,浪费性能
优化完的参数输出到了一个 txt,还得自己写解析来分析
for 循环里有些参数只是运气好,实际部署上去并不一样
总之你会碰到非常多问题,它们会浪费你的时间。而 Optuna 则是帮助你解决上面所有这些问题的一个工具,解放你的双手和时间,让你能更加专注于模型实现。它将定义一个超参数优化过程变得 非常简单,而且易于保存,方便分析,还支持无缝扩展。
Talk is cheap, show me the code. 我们将通过一个例子来展示 Optuna 的上述优点。
定义简单
一个极简的 optuna 的优化程序中只有三个最核心的概念,目标函数(objective),单次试验(trial),和研究(study). 其中 objective 负责定义待优化函数并指定参/超参数数范围,trial 对应着 objective 的单次执行,而 study 则负责管理优化,决定优化的方式,总试验的次数、试验结果的记录等功能。
假如要在 $x,y \in(-10,10)$ 的范围内找到 $f(x,y)=(x+y)^2$ 这个函数的最大值对应的 $x,y$,那我们只需要下面的代码:import optuna
def objective(trial):
x = trial.suggest_uniform('x', -10, 10)
y = trial.suggest_uniform('y', -10, 10)
retur