使用 Optuna 进行超参数优化

Python 中的深度强化学习

Timothée Carayol

Principal Machine Learning Engineer, Komment

什么是超参数

 

 

  • DRL 算法的超参数很多
  • 对性能影响很大
  • 搜索复杂度随超参数个数增长

 

示例
折扣率
PPO:裁剪 epsilon、熵奖励
经验回放:缓冲区大小、批大小
递减的 epsilon 贪心策略
固定 Q 目标:$\tau$
学习率
层数、每层节点数…
Python 中的深度强化学习

如何选择超参数取值

 

目标:平均累计回报

超参数搜索方法:

  • 人工试错
  • 网格搜索
  • 随机搜索
  • 专用算法

一台有数十个旋钮和刻度盘的巨型机械设备

Python 中的深度强化学习

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 中的深度强化学习

指定目标函数

 

在目标函数中:

  • 定义关注的超参数
  • 定义要优化的指标

超参数指定方式高度灵活:

  • 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 中的深度强化学习

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 中的深度强化学习

探索 study 结果

optuna.visualization.plot_param_importances(study)

一个条形图显示 x 和 y 的超参数重要性;y 为 0.71,x 为 0.29。

optuna.visualization.plot_contour(study)

一个等高线图,每个试验一个点。点集中在 x = 2、y = -3 附近。

Python 中的深度强化学习

Passons à la pratique !

Python 中的深度强化学习

Preparing Video For Download...