optuna.samplers.CmaEsSampler

class optuna.samplers.CmaEsSampler(x0=None, sigma0=None, n_startup_trials=1, independent_sampler=None, warn_independent_sampling=True, seed=None, *, consider_pruned_trials=False, restart_strategy=None, popsize=None, inc_popsize=2, use_separable_cma=False, with_margin=False, lr_adapt=False, source_trials=None)[源代码]

一个使用 cmaes 作为后端的采样器。

示例

使用 CmaEsSampler 优化一个简单的二次函数。

$ pip install cmaes
import optuna


def objective(trial):
    x = trial.suggest_float("x", -1, 1)
    y = trial.suggest_int("y", -1, 1)
    return x**2 + y


sampler = optuna.samplers.CmaEsSampler()
study = optuna.create_study(sampler=sampler)
study.optimize(objective, n_trials=20)

请注意,此采样器不支持 CategoricalDistribution。但是,支持带有 stepFloatDistribution(通过 suggest_float())和 IntDistribution(通过 suggest_int())。

如果您的搜索空间包含分类参数,我建议您改用 TPESampler。此外,在并行优化设置中还有性能提升空间。此采样器无法使用某些 trials 来更新多元正态分布的参数。

有关 CMA-ES 算法的更多信息,请参阅以下论文

另请参阅

您也可以使用 optuna_integration.PyCmaSampler,它是使用 cma 库作为后端的采样器。

参数:
  • x0 (dict[str, Any] | None) – CMA-ES 的初始参数值字典。默认情况下,使用每个分布的 lowhigh 的平均值。请注意,如果您指定了 restart_strategy 参数,则每次重启时 x0 都会在搜索空间域内均匀采样。

  • sigma0 (float | None) – CMA-ES 的初始标准差。默认情况下,sigma0 设置为 min_range / 6,其中 min_range 表示搜索空间中分布的最小范围。

  • seed (int | None) – CMA-ES 的随机种子。

  • n_startup_trials (int) – 在同一 study 中,直到给定数量的 trials 完成之前,使用独立采样而不是 CMA-ES 算法。

  • independent_sampler (BaseSampler | None) –

    用于独立采样的 BaseSampler 实例。不包含在相对搜索空间中的参数将由该采样器采样。CmaEsSampler 的搜索空间由 intersection_search_space() 确定。

    如果指定为 None,则默认使用 RandomSampler

    另请参阅

    optuna.samplers 模块提供了内置的独立采样器,例如 RandomSamplerTPESampler

  • warn_independent_sampling (bool) –

    如果为 True,则当使用独立采样器采样参数值时,会发出警告消息。

    请注意,study 中的第一个 trial 的参数总是通过独立采样器采样的,因此在这种情况下不会发出警告消息。

  • restart_strategy (str | None) –

    当 CMA-ES 优化收敛到局部最小值时的重启策略。如果给定 None,CMA-ES 将不会重启(默认)。如果给定 'ipop',CMA-ES 将以增加种群大小的方式重启。如果给定 'bipop',CMA-ES 将以增加或减少种群大小的方式重启。另请参阅 inc_popsize 参数。

    注意

    在 v2.1.0 中作为实验性功能添加。接口可能在较新版本中发生变化,恕不另行通知。详见 https://github.com/optuna/optuna/releases/tag/v2.1.0

  • popsize (int | None) – CMA-ES 的种群大小。当指定 restart_strategy = 'ipop'restart_strategy = 'bipop' 时,此参数用作初始种群大小。

  • inc_popsize (int) – 每次重启前增加种群大小的乘数。当指定 restart_strategy = 'ipop'restart_strategy = 'bipop' 时,此参数将使用。

  • consider_pruned_trials (bool) –

    如果为 True,则在采样时会考虑 PRUNED trials。

    注意

    在 v2.0.0 中作为实验性功能添加。接口可能在较新版本中发生变化,恕不另行通知。详见 https://github.com/optuna/optuna/releases/tag/v2.0.0

    注意

    当使用 MedianPruner 时,建议将此标记设置为 False。另一方面,当使用 HyperbandPruner 时,建议将此标记设置为 True。详情请参阅 基准测试结果

  • use_separable_cma (bool) –

    如果为 True,则协方差矩阵被约束为对角矩阵。为了降低模型复杂度,增加了协方差矩阵的学习率。因此,该算法在可分离函数上的性能优于 CMA-ES。

    注意

    在 v2.6.0 中作为实验性功能添加。接口可能在较新版本中发生变化,恕不另行通知。详见 https://github.com/optuna/optuna/releases/tag/v2.6.0

  • with_margin (bool) –

    如果为 True,则使用带 margin 的 CMA-ES。此算法可防止离散分布(带有 stepFloatDistributionIntDistribution)中的样本固定在单个点。目前,此选项不能与 use_separable_cma=True 一起使用。

    注意

    在 v3.1.0 中作为实验性功能添加。接口可能在较新版本中发生变化,恕不另行通知。详见 https://github.com/optuna/optuna/releases/tag/v3.1.0

  • lr_adapt (bool) –

    如果为 True,则使用带学习率自适应的 CMA-ES。该算法旨在默认设置下很好地处理多模态和/或带噪声的问题。目前,此选项不能与 use_separable_cma=Truewith_margin=True 一起使用。

    注意

    在 v3.3.0 或更高版本中作为实验性功能添加。接口可能在较新版本中发生变化,恕不另行通知。详见 https://github.com/optuna/optuna/releases/tag/v3.3.0

  • source_trials (list[FrozenTrial] | None) –

    此选项用于 Warm Starting CMA-ES,这是一种通过初始化 CMA-ES 来转移类似 HPO 任务上的先验知识的方法。此方法从 source_trials 估计出有前景的分布,并生成多元高斯分布的参数。请注意,禁止同时使用 x0sigma0use_separable_cma 参数。

    注意

    在 v2.6.0 中作为实验性功能添加。接口可能在较新版本中发生变化,恕不另行通知。详见 https://github.com/optuna/optuna/releases/tag/v2.6.0

方法

after_trial(study, trial, state, values)

Trial 后处理。

before_trial(study, trial)

Trial 预处理。

infer_relative_search_space(study, trial)

推断目标 trial 中相对采样将使用的搜索空间。

reseed_rng()

重新设置采样器的随机数生成器种子。

sample_independent(study, trial, param_name, ...)

为给定分布采样参数。

sample_relative(study, trial, search_space)

在给定搜索空间中采样参数。

after_trial(study, trial, state, values)[源代码]

Trial 后处理。

此方法在目标函数返回后、trial 完成并存储其状态之前调用。

注意

在 v2.4.0 中作为实验性功能添加。接口可能在较新版本中发生变化,恕不另行通知。详见 https://github.com/optuna/optuna/releases/tag/v2.4.0

参数:
  • study (Study) – 目标 study 对象。

  • trial (FrozenTrial) – 目标 trial 对象。修改此对象前请先复制。

  • state (TrialState) – 最终的 trial 状态。

  • values (Sequence[float] | None) – 最终的 trial 值。如果 trial 成功,则保证不为 None

返回类型:

None

before_trial(study, trial)[源代码]

Trial 预处理。

此方法在调用目标函数之前以及 trial 实例化之后调用。更准确地说,此方法在 trial 初始化期间调用,就在调用 infer_relative_search_space() 之前。换句话说,它负责在推断搜索空间之前应进行的预处理。

注意

在 v3.3.0 中作为实验性功能添加。接口可能在较新版本中发生变化,恕不另行通知。详见 https://github.com/optuna/optuna/releases/tag/v3.3.0

参数:
  • study (Study) – 目标 study 对象。

  • study (Study) – 目标 study 对象。

返回类型:

None

trial (FrozenTrial) – 目标 trial 对象。

推断目标 trial 中相对采样将使用的搜索空间。

infer_relative_search_space(study, trial)[源代码]

参数:
  • study (Study) – 目标 study 对象。

  • trial (FrozenTrial) – 目标 trial 对象。修改此对象前请先复制。

此方法在调用 sample_relative() 方法之前调用,此方法返回的搜索空间将传递给它。不包含在搜索空间中的参数将使用 sample_independent() 方法采样。

返回:

返回类型:

包含参数名称和参数分布的字典。

另请参阅

dict[str, BaseDistribution]

请参考 intersection_search_space() 作为 infer_relative_search_space() 的一个实现。

reseed_rng()[源代码]

重新设置采样器的随机数生成器种子。

返回类型:

None

如果使用选项 n_jobs>1 并行执行 trials,则此方法由 Study 实例调用。在这种情况下,采样器实例将被复制,包括随机数生成器的状态,并且它们可能会建议相同的值。为防止此问题,此方法为每个随机数生成器分配不同的种子。

为给定分布采样参数。

sample_independent(study, trial, param_name, param_distribution)[源代码]

注意

此方法仅为 sample_relative() 方法返回的搜索空间中不包含的参数调用。此方法适用于不使用参数之间关系的采样算法,例如随机采样和 TPE。

参数:
  • study (Study) – 目标 study 对象。

  • trial (FrozenTrial) – 目标 trial 对象。修改此对象前请先复制。

  • 任何内置采样器在采样新参数时都会忽略失败的 trials。因此,从采样器的角度来看,失败的 trials 被视为已删除。

  • study (Study) – 目标 study 对象。

此方法在调用 sample_relative() 方法之前调用,此方法返回的搜索空间将传递给它。不包含在搜索空间中的参数将使用 sample_independent() 方法采样。

trial (FrozenTrial) – 目标 trial 对象。

返回类型:

param_name (str) – 被采样参数的名称。

param_distribution (BaseDistribution) – 指定采样算法先验和/或尺度的分布对象。

在给定搜索空间中采样参数。

参数值。

注意

此方法仅为 sample_relative() 方法返回的搜索空间中不包含的参数调用。此方法适用于不使用参数之间关系的采样算法,例如随机采样和 TPE。

参数:
  • study (Study) – 目标 study 对象。

  • trial (FrozenTrial) – 目标 trial 对象。修改此对象前请先复制。

  • Any

此方法在调用 sample_relative() 方法之前调用,此方法返回的搜索空间将传递给它。不包含在搜索空间中的参数将使用 sample_independent() 方法采样。

sample_relative(study, trial, search_space)[源代码]

返回类型:

此方法在每个 trial 开始时调用一次,即在评估目标函数之前。此方法适用于使用参数之间关系的采样算法,例如高斯过程和 CMA-ES。