概要
機械学習で学習に時間がかかるモデルを回すことになった。(具体的には約30分ぐらい)
以前は軽量なモデルで学習に時間がかからなかったために1日あれば、およそ200通りの学習ができた。
しかし、学習に時間のかかるモデルで200回も試行回数を行えば、4日〜5日かかってしまう。
いい案はないかとググったらOptuna
がハイパーパラメータの最適化に良いと書かれている。
また、Hydra
ですぐに使えそうだったので、試しに使ってみた。
環境
Python 3.6
hydra-core 1.0.3
事前知識
Optuna
上記は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 | 乱数生成のシード値 |