Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Optunaの紹介 - 2023/07/05 W&B Launch-Optuna Webinar

Optunaの紹介 - 2023/07/05 W&B Launch-Optuna Webinar

Optunaの基本的な機能と使い方について説明します。
イベントサイト: https://wandb.connpass.com/event/288204/

Preferred Networks

July 06, 2023
Tweet

More Decks by Preferred Networks

Other Decks in Technology

Transcript

  1. 3 ハイパーパラメータ最適化 はじめにこの値で試 そう learning_rate: 0.1 num_units: 30 … 完了!

    Accuracy: 0.6 Trial 1 小さくしたらどうかな ? learning_rate: 0.01 num_units: 20 … 完了! Accuracy: 0.5 Trial 2 うーん、次は少し大き くして... learning_rate: 0.05 num_units: 50 … 完了! Accuracy: 0.8 Trial 3
  2. 4 はじめにこの値で試 そう learning_rate: 0.1 num_units: 30 … 完了! Accuracy:

    0.6 Trial 1 小さくしたらどうかな ? learning_rate: 0.01 num_units: 20 … 完了! Accuracy: 0.5 Trial 2 うーん、次は少し大き くして... learning_rate: 0.05 num_units: 50 … 完了! Accuracy: 0.8 Trial 3 オペレーションのコ スト 1回に数時間〜数日 ハイパーパラメータ最適化
  3. 5 ハイパーパラメータ最適化の自動化 はじめにこの値で試 そう learning_rate: 0.1 num_units: 30 … 完了!

    Accuracy: 0.6 Trial 1 小さくしたらどうかな ? learning_rate: 0.01 num_units: 20 … 完了! Accuracy: 0.5 Trial 2 うーん、次は少し大き くして... learning_rate: 0.05 num_units: 50 … 完了! Accuracy: 0.8 Trial 3
  4. 6 ハイパーパラメータ最適化とは Trial iではこの値で試 そう learning_rate: 0.1 num_units: 30 …

    完了! Accuracy: 0.6 Trial i 定式化: ブラックボックス関数 y = f(x) の最適化 精度など ハイパーパラメータの組 特徴: • 目的関数y = f(x) の値の計算は高コスト • 目的関数値の観測にはノイズが乗る • 目的関数の微分は計算できない
  5. 7 ハイパーパラメータ最適化のアルゴリズム 考えられるアプローチ: • 最適化履歴を利用しないもの ◦ グリッドサーチ ◦ ランダムサーチ •

    最適化履歴を利用するもの ◦ ベイズ最適化 (Optunaのデフォルト) ◦ 進化計算 Trial iではこの値で試 そう learning_rate: 0.1 num_units: 30 … 完了! Accuracy: 0.6 Trial i
  6. 12 ベイズ最適化とは 各ステップにおいて、 • 目的関数の確率モデルの更新 • 獲得関数が高い点を次に試す を繰り返す。 詳細は[Shahriari+ 2016]を参照

    [Shahriari+ 2016] Taking the Human Out of the Loop: A Review of bayesian Optimization, B. Shahriari and et al. Proceedings of the IEEE, 104(1):148-175, 2016 画像: https://en.wikipedia.org/wiki/Bayesian_optimization#/media/File:GpParBayesAnimationSmall.gif ※ Optunaのデフォルトアルゴリズムとは違う
  7. 13 Optunaのデフォルト: Tree-structured Parzen Estimator (TPESampler) 参考: Bergstra, J., Bardenet,

    R., Bengio, Y., & Kégl, B. (2011). Algorithms for hyper-parameter optimization. Advances in neural information processing systems, 24. 1. 過去に観測した点を上位γ%(low)とそ れ以外(high)に分ける 2. lowとhighについてそれぞれカーネル 密度推定(Parzen estimator)で確率分 布を推定する 3. lowに入る条件付き確率を計算し、それ が最も高いハイパラを試す 👍 点の順位しか見ず、安定して動く 👎 局所解、次元が高すぎると厳しい
  8. 14 参考: https://bayesoptbook.com/ 画像: https://en.wikipedia.org/wiki/Bayesian_optimization#/media/File:GpParBayesAnimationSmall.gif 👍 (ガウス過程のカーネルが適切なら) 少ない観測で効率よく最適化できる 👎 ガウス過程自身のハイパラに敏感

    計算量が大きい、次元が高いと厳しい Optunaにある他のベイズ最適化: ガウス過程 (BoTorchSampler) 1. ガウス過程でモデル化、観測点を回帰 2. 期待改善量(Expected Improvement) を計算し、最も高いハイパラを試す
  9. 15 参考: https://arxiv.org/abs/1604.00772 👍 次元が高い or 評価回数が多く取れる 時に強い 点の順位しか見てなくて安定する 👎

    局所解にはまる Optunaにある進化計算: CMA-ES (CmaEsSampler) 1. 正規分布に従って1世代分のハイパラ の集合を生成 2. その世代での目的関数の順位に応じ て、正規分布を更新
  10. 16 基本的な使い方: f(x) = x**2 を最小化したいなら... import optuna def objective(trial):

    x = trial.suggest_float("x", -100, 100) return x ** 2 study = optuna.create_study() study.optimize(objective, n_trials=100)
  11. 17 基本的な使い方: f(x) = x**2 を最小化したいなら... import optuna def objective(trial):

    x = trial.suggest_float("x", -100, 100) return x ** 2 study = optuna.create_study() study.optimize(objective, n_trials=100) Trial: 1回の評価 Study: 一連の最適化
  12. 18 実数値 [a, b] → Trial.suggest_float(“x”, a, b) • 対数変換した空間からサンプル:

    Trial.suggest_float(“x”, a, b, log=True) • q間隔で離散的にサンプル: Trial.suggest_float(“x”, a, b, step=q) 整数値 a, a+1, …, b → Trial.suggest_int(“x”, a, b) • 対数変換した空間からサンプル: Trial.suggest_int(“x”, a, b, log=True) • q間隔でサンプル: Trial.suggest_int(“x”, a, b, step=q) カテゴリカルな値 {a, b, c, d} → Trial.suggest_categorical(“x”, (a, b, c, d)) 基本的なTrialの使い方
  13. 22 分散並列最適化の方法 ファイルとStudy名を指定 各ワーカーでスクリプトを実行 study = create_study( storage=JournalStorage( JournalFileStorage( "./example.optuna"

    )), study_name="example_study", load_if_exists=True, ) study.optimize(objective, n_trials=100) $ python optimize.py & $ python optimize.py & ... Studyの実体を ファイルに置く Studyに名前 をつける
  14. 31