【機械学習】Optuna1.3.0以上での探索空間定義の種類


Preferred Networks社が開発しているオープンソースのハイパーパラメータ自動最適化フレームワークOptunaについての記事となります。

Optunaとは

公式サイト

ハイパーパラメータの値に関する試行錯誤を自動化し、優れた性能を発揮するハイパーパラメータの値を自動的に発見します。オープンソースの深層学習フレームワークChainerをはじめ、様々な機械学習ソフトウェアと一緒に使用することが可能です。

との触れ込みの便利ツールです。

2018年12月にβ版がリリースされ、2020年1月には正式版が公開されています。

ネット上からも周りの人からも、使いやすく性能もいいとかなり評判の良いライブラリです。

探索空間の定義について

Optunaでは公式のチュートリアルによると以下のような形で探索空間の定義を行います。

def objective(trial):
    # Categorical parameter
    optimizer = trial.suggest_categorical('optimizer', ['MomentumSGD', 'Adam'])

    # Int parameter
    num_layers = trial.suggest_int('num_layers', 1, 3)

    # Uniform parameter
    dropout_rate = trial.suggest_uniform('dropout_rate', 0.0, 1.0)

    # Loguniform parameter
    learning_rate = trial.suggest_loguniform('learning_rate', 1e-5, 1e-2)

    # Discrete-uniform parameter
    drop_path_rate = trial.suggest_discrete_uniform('drop_path_rate', 0.0, 1.0, 0.1)

ただ、この説明は少し古く、実際は以下の3つを使えば大丈夫です。。

  • いくつかの選択肢から選ぶ → trial.suggest_categorical(name, choices)
  • 整数値で最適化 → trial.suggest_int(name, low, high, step=1, log=False)
  • 小数値で最適化 → trial.suggest_float(name, low, high, step = None, log = False)

ドキュメント内のsuggest_floatの部分も見ると、

Suggest a value for the floating point parameter.

Note that this is a wrapper method for suggest_uniform()suggest_loguniform() and suggest_discrete_uniform().

New in version 1.3.0.

という記載があります。

3つあった関数のラッパー関数となっているので、もはや使う関数はこの3つだけでOKなのです。

Optunaを知らない人から見ても、この3種であればソースを見て何となく意味は分かるのではないかと思います。

1.3.0以上でないと対応していないので、出来るだけ最新にしてわかりやすいコードにしたいですね。