はじめに
ハイパラセッティング,沼ですよね.
Optunaとは,Pythonで機械学習をするときに使う自動ハイパラチューニングライブラリです.
ハイパラの探索空間を設定してあげると,いい感じに探索していい感じのハイパラを見つけてきてくれます.総当たりではないので,最適解ではないです.
この記事は,optunaの使い方の (自分用) 備忘録です.optuna解説記事はググれば多分出てきますが,いろんな解説があった方がいいでしょう.
昔は大学院生降下法(GSD: graduate student descent),つまり大学院生に手作業でハイパラを探索させる手法が一般的だったようですが,時代はoptunaです.
全体的な構造
pip install optuna
- objective関数を作り,最小化・最大化したいscoreを返す
- objectiveをoptunaに渡して最適化を実行すると,ハイパラが最適化されて帰ってくる
簡単ですね!
学習は当然遅いので,探索結果のハイパラはjsonにでもdumpしましょう.
# 適当コード
import optuna
def objective(trial):
# 任意のモデルに使用するパラメータと,その探索空間
lr = trial.suggest_loguniform('lr', 0.1, 0.001)
n_hidden = trial.suggest_int('n_hidden', 128, 256)
# 任意のモデル
model = Sample_model(lr, n_hidden)
# trainデータで学習し,validateデータで推論してスコアを返す.
# 学習方法自体はこの記事では解説しない.
score = train_step(model)
return score
# スコアを最小化するか最大化するかは選べる
study = optuna.create_study(direction='minimize')
# n_trialsは探索回数,増やせばより最適なハイパラが出る
study.optimize(objective, n_trials=100)
print(f'Best value: {study.best_value}')
print(f'Best param: {study.best_params}')
学習するための関数をtrain_step
としています.
ここで推論結果からスコアを計算して返しますが,精度以外にもAUCやF1,任意の評価指標を自由に設定できます.
ハイパラ探索空間の指定
リファレンス
https://optuna.readthedocs.io/en/stable/reference/generated/optuna.trial.Trial.html
色々指定できます.候補だけでなく範囲でも指定できるので,より最適なパラメータが見つかる……はず
suggest_categorical(name, [option1, option2])
: 選択肢から選ぶ.数字だけでなく,評価指標やモデルの選択にも使える
suggest_discrete_uniform(name, low, high, q)
: 離散値.偶数だけ探索,など
suggest_float(name, low, high, *[, step, log])
: 小数.uniformの方が人気?
suggest_int(name, low, high, *[, step, log])
: 整数.
suggest_loguniform(name, low, high)
: 連続値.対数として探索するので,learning_rate等に良い
suggest_uniform(name, low, high)
: 連続値.線形に探索