HydraでOptunaを試す

概要

機械学習で学習に時間がかかるモデルを回すことになった。(具体的には約30分ぐらい)
以前は軽量なモデルで学習に時間がかからなかったために1日あれば、およそ200通りの学習ができた。
しかし、学習に時間のかかるモデルで200回も試行回数を行えば、4日〜5日かかってしまう。
いい案はないかとググったらOptunaがハイパーパラメータの最適化に良いと書かれている。
また、Hydraですぐに使えそうだったので、試しに使ってみた。

環境

Python 3.6
hydra-core 1.0.3

事前知識

Optuna

tech.preferred.jp

上記はOptunaを開発をしたPreferred Networkの社員さんのブログ。
詳しい説明は上記のブログに預けるとして、簡単にまとめると

  • 機械学習でハイパーパラメータの最適化を自動化してくれるフレームワーク

  • 学習の結果を確認しながら最適な方向にパラメータを調整してくれる

というもの

実行

手順

1.先にHydraで動かすためのOptunaのモジュールをインストール

pip install -U hydra-optuna-sweeper

2.Hydraの設定ファイル(yamlファイル)に

defaults:
    - hydra/sweeper: optuna

# 各種パラメータ
optimizer:
    learning_rate: 0.001
    epoch: 100
・・・

hydra:
    sweeper:
        optuna_config:
            n_trials: 40
            direction: maximize
            storage: null
            study_name: tpe
            n_jobs: 1
            seed: 123

を追記

3.Hydraを呼び出している関数に参考にしたい変数を返り値に指定

@hydra.main(config_path='conf', config_name='config')
def main(cfg : DictConfig):
    ・・・
    return acc  # ここではaccを参考にパラメータを最適化して欲しい

4.後は実行するときに

python train.py -m \
               'optimizer.epoch=range(100, 1000)` \
               'optimizer.learning_rate=choice(0.01,0.001)' \

などと指定すれば実行してくれる

詳細

Optunaで指定するパラメータの各種説明

変数名 説明
n_trials 試行回数
strage 結果の保存場所
確認したところSQLでしか保存できない?
direction 返り値を参考にどのように調整していくか
今回の場合、値が最大になるように調整される
n_jobs 並列処理を行うジョブ数
study_name 結果を保存する名前
seed 乱数生成のシード値

参考

speakerdeck.com

cyberagent.ai