Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

2 自己紹介 YUNZHUO WANG Preferred Networks, Inc. Engineer GitHub: @contramundum53 Twitter: @contramundum2 Optuna 開発者

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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回に数時間〜数日 ハイパーパラメータ最適化

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

6 ハイパーパラメータ最適化とは Trial iではこの値で試 そう learning_rate: 0.1 num_units: 30 … 完了! Accuracy: 0.6 Trial i 定式化: ブラックボックス関数 y = f(x) の最適化 精度など ハイパーパラメータの組 特徴: ● 目的関数y = f(x) の値の計算は高コスト ● 目的関数値の観測にはノイズが乗る ● 目的関数の微分は計算できない

Slide 7

Slide 7 text

7 ハイパーパラメータ最適化のアルゴリズム 考えられるアプローチ: ● 最適化履歴を利用しないもの ○ グリッドサーチ ○ ランダムサーチ ● 最適化履歴を利用するもの ○ ベイズ最適化 (Optunaのデフォルト) ○ 進化計算 Trial iではこの値で試 そう learning_rate: 0.1 num_units: 30 … 完了! Accuracy: 0.6 Trial i

Slide 8

Slide 8 text

8 ハイパーパラメータ最適化のアルゴリズム ランダムサーチ ベイズ最適化

Slide 9

Slide 9 text

9 例: ランダムサーチ v.s. ベイズ最適化 Gradient Boosting のデフォルト値 Better

Slide 10

Slide 10 text

10 例: ランダムサーチ v.s. ベイズ最適化 ランダムサーチ Better Gradient Boosting のデフォルト値

Slide 11

Slide 11 text

11 例: ランダムサーチ v.s. ベイズ最適化 ベイズ最適化 Better Gradient Boosting のデフォルト値 ランダムサーチ

Slide 12

Slide 12 text

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のデフォルトアルゴリズムとは違う

Slide 13

Slide 13 text

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に入る条件付き確率を計算し、それ が最も高いハイパラを試す 👍 点の順位しか見ず、安定して動く 👎 局所解、次元が高すぎると厳しい

Slide 14

Slide 14 text

14 参考: https://bayesoptbook.com/ 画像: https://en.wikipedia.org/wiki/Bayesian_optimization#/media/File:GpParBayesAnimationSmall.gif 👍 (ガウス過程のカーネルが適切なら) 少ない観測で効率よく最適化できる 👎 ガウス過程自身のハイパラに敏感 計算量が大きい、次元が高いと厳しい Optunaにある他のベイズ最適化: ガウス過程 (BoTorchSampler) 1. ガウス過程でモデル化、観測点を回帰 2. 期待改善量(Expected Improvement) を計算し、最も高いハイパラを試す

Slide 15

Slide 15 text

15 参考: https://arxiv.org/abs/1604.00772 👍 次元が高い or 評価回数が多く取れる 時に強い 点の順位しか見てなくて安定する 👎 局所解にはまる Optunaにある進化計算: CMA-ES (CmaEsSampler) 1. 正規分布に従って1世代分のハイパラ の集合を生成 2. その世代での目的関数の順位に応じ て、正規分布を更新

Slide 16

Slide 16 text

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)

Slide 17

Slide 17 text

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: 一連の最適化

Slide 18

Slide 18 text

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の使い方

Slide 19

Slide 19 text

19 一歩進んだ使い方 Visualization 分散並列最適化 枝刈り (早期終了)

Slide 20

Slide 20 text

20 一歩進んだ使い方 Visualization 分散並列最適化 枝刈り (早期終了)

Slide 21

Slide 21 text

21 分散並列最適化 Trial 1 Trial 2 Trial 3 Trial 4 Trial 5 Trial 6 並行して実行

Slide 22

Slide 22 text

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に名前 をつける

Slide 23

Slide 23 text

23 一歩進んだ使い方 Visualization 分散並列最適化 枝刈り (早期終了)

Slide 24

Slide 24 text

24 枝刈り (早期終了) ● 見込みの薄いTrialの訓練を途中で打ち切る ● 同じepoch消費量で、試せるパラメータの数が飛躍的に増大

Slide 25

Slide 25 text

25 枝刈り (早期終了) の効果 詳細は OptunaのベンチマークWiki 1budget=100step 同じstep消費量で、より速く より良いハイパーパラメータを 発見 Better 枝刈りなし 枝刈りあり

Slide 26

Slide 26 text

26 一歩進んだ使い方 Visualization 分散並列最適化 枝刈り (早期終了)

Slide 27

Slide 27 text

27 Visualization Optunaには豊富な可視化関数が用意されている 最適化後のstudyを利用するだけで、簡単に分析が可能

Slide 28

Slide 28 text

28 Optuna Dashboard Webインターフェイスから簡単 に可視化

Slide 29

Slide 29 text

29 Optunaの解説本が出ました! https://www.amazon.co.jp/Optunaによる ブラックボックス最適化-佐野-正太郎 /dp/4274230104 アルゴリズムの詳細などについても解説して いるので、興味あればぜひ!

Slide 30

Slide 30 text

30 日本語チュートリアル: bit.ly/optuna-mnist-tutorial $ pip install optuna

Slide 31

Slide 31 text

31