Optuna によるハイパーパラメータ最適化

Pythonで学ぶDeep Reinforcement Learning

Timothée Carayol

Principal Machine Learning Engineer, Komment

ハイパーパラメータとは

 

 

  • DRL アルゴリズムはハイパーパラメータが多い
  • 性能に大きく影響
  • 探索の複雑さはパラメータ数に比例して増加

 

割引率
PPO: クリッピング ε、エントロピー報酬
経験再生: バッファサイズ、バッチサイズ
減衰 ε-greedy スケジュール
固定 Q-ターゲット: $\tau$
学習率
層数、各層のノード数 など
Pythonで学ぶDeep Reinforcement Learning

ハイパーパラメータ値の選び方

 

目的: 平均累積報酬

ハイパーパラメータ探索手法:

  • 手動の試行錯誤
  • グリッドサーチ
  • ランダムサーチ
  • 専用アルゴリズム

多数のノブとダイヤルがある巨大な機械

Pythonで学ぶDeep Reinforcement Learning

Optuna のロゴ

 

Optuna のワークフロー:

  • 目的関数を定義
  • Optuna の study を作成
  • Optuna に試行を反復させる

 

 

import optuna

def objective(trial): ...
study = optuna.create_study()
study.optimize(objective, n_trials=100)
study.best_params
{'learning_rate': 0.001292481, 'batch_size': 8}
Pythonで学ぶDeep Reinforcement Learning

目的関数の定義

 

目的関数では:

  • 対象とするハイパーパラメータを定義
  • 最適化する指標を定義

ハイパーパラメータ指定は柔軟:

  • float
  • integer
  • categorical

 

def objective(trial: optuna.trial.Trial):

# Hyperparameters x and y between -10 and 10
x = trial.suggest_float('x', -10, 10) y = trial.suggest_float('y', -10, 10)
# Return the metric to minimize return (x - 2) ** 2 + 1.2 * (y + 3) ** 2
Pythonで学ぶDeep Reinforcement Learning

Optuna の study

 

  • sqlite を使って study を保存
  • 既定のサンプラー(TPE)で n_trials を実行
    • 最初はランダムに選択
    • その後、有望な領域に集中
  • n_trials を省略すると、中断まで実行
  • 後でデータベースから study を再読込可

 

import sqlite
study = optuna.create_study(
                 storage="sqlite:///DRL.db",
                 study_name="my_study")

study.optimize(objective, n_trials=100)
loaded_study = optuna.load_study(
                        study_name="my_study", 
                        storage="sqlite:///DRL.db")
Pythonで学ぶDeep Reinforcement Learning

結果の可視化と探索

optuna.visualization.plot_param_importances(study)

x と y のハイパーパラメータ重要度を示す棒グラフ。y が 0.71、x が 0.29。

optuna.visualization.plot_contour(study)

各試行につき 1 点の等高線図。点は x=2, y=-3 付近に集中。

Pythonで学ぶDeep Reinforcement Learning

Passons à la pratique !

Pythonで学ぶDeep Reinforcement Learning

Preparing Video For Download...