使用 hydra 的 optuna 插件时,我可以从另一个配置文件导入搜索 space 吗?

When using the optuna plugin for hydra, can I import the search space from another config file?

我想对同一数据的多个时间序列预测模型进行超参数优化。我正在为 Hydra 使用 Optuna Sweeper 插件。不同的模型具有不同的超参数,因此具有不同的搜索 spaces。目前我的配置文件如下所示:

defaults:
  - datasets: data
  - models: Ets
  - override hydra/sweeper: optuna
  - override hydra/sweeper/sampler: tpe

hydra:
#  launcher:
#    n_jobs: 10
 run:
  dir: data/outputs/${now:%Y-%m-%d}/${user.user}/${now:%H-%M-%S}
 sweeper:
   sampler:
     seed: 123
   direction: minimize
   study_name: main_val
   storage: null
   n_trials: 2
   n_jobs: 4

   search_space: 

# Ets
    models.damped_trend:
      type: categorical
      choices:
      - 'True'
      - 'False'

  # Theta
    # models.method:
    #   type: categorical
    #   choices:
    #   - 'additive'
    #   - 'multiplicative' 

现在,当我使用 --multi运行 运行 main_val.py 文件时,我得到了 Ets 的最佳超参数。伟大的。但是当我想 运行 优化另一个模型时,在这个例子中的 Theta 中,我必须手动注释掉 Ets 的搜索 space 并取消注释 Theta 的搜索 space。实际上,每个模型都有更多的参数需要优化,我正在处理 10 个不同的模型。这使我的配置文件变得非常长且令人困惑,而且这个 commenting/uncommenting 东西既烦人又容易出错。

我想从另一个 yaml 文件中为每个模型导入搜索 space。这可能吗?

我尝试了以下方法:

defaults:
  - datasets: data
  - models: Ets
  - search_spaces: Ets
  - override hydra/sweeper: optuna
  - override hydra/sweeper/sampler: tpe

hydra:
#  launcher:
#    n_jobs: 10
 run:
  dir: data/outputs/${now:%Y-%m-%d}/${user.user}/${now:%H-%M-%S}
 sweeper:
   sampler:
     seed: 123
   direction: minimize
   study_name: main_val
   storage: null
   n_trials: 2
   n_jobs: 4

   search_space: search_spaces

文件 search_spaces/Ets.yaml 如下所示:

models.damped_trend:
  type: categorical
  choices:
  - 'True'
  - 'False'

但是我得到了错误:

Validation error while composing config:
    Cannot assign str to Dict[str, Any]
        full_key: hydra.sweeper.search_space
        object_type=OptunaSweeperConf

这里有两个选项:

  1. 使用 @package 指令
  2. 使用 variable interpolation

详细:

使用 @package 指令

@package 指令可用于将 Ets.yaml 放入 hydra.sweeper.search_space 包中:

defaults:
  - datasets: data
  - models: Ets
  - search_spaces@hydra.sweeper.search_space: Ets
  - override hydra/sweeper: optuna
  - override hydra/sweeper/sampler: tpe

hydra:
 run:
  dir: data/outputs/${now:%Y-%m-%d}/${user.user}/${now:%H-%M-%S}
 sweeper:
   sampler:
     seed: 123
   direction: minimize
   study_name: main_val
   storage: null
   n_trials: 2
   n_jobs: 4

使用变量插值:

字符串插值可用于创建从 hydra.sweeper.search_spaces 到 top-level search_spaces 配置的引用。

defaults:
  - datasets: data
  - models: Ets
  - search_spaces: Ets
  - override hydra/sweeper: optuna
  - override hydra/sweeper/sampler: tpe

hydra:
 run:
  dir: data/outputs/${now:%Y-%m-%d}/${user.user}/${now:%H-%M-%S}
 sweeper:
   sampler:
     seed: 123
   direction: minimize
   study_name: main_val
   storage: null
   n_trials: 2
   n_jobs: 4

   search_space: ${search_spaces}