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。但是,支持带有
step
的FloatDistribution
(通过suggest_float()
)和IntDistribution
(通过suggest_int()
)。如果您的搜索空间包含分类参数,我建议您改用
TPESampler
。此外,在并行优化设置中还有性能提升空间。此采样器无法使用某些 trials 来更新多元正态分布的参数。有关 CMA-ES 算法的更多信息,请参阅以下论文
另请参阅
您也可以使用 optuna_integration.PyCmaSampler,它是使用 cma 库作为后端的采样器。
- 参数:
x0 (dict[str, Any] | None) – CMA-ES 的初始参数值字典。默认情况下,使用每个分布的
low
和high
的平均值。请注意,如果您指定了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
模块提供了内置的独立采样器,例如RandomSampler
和TPESampler
。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。此算法可防止离散分布(带有step
的FloatDistribution
和IntDistribution
)中的样本固定在单个点。目前,此选项不能与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=True
或with_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
估计出有前景的分布,并生成多元高斯分布的参数。请注意,禁止同时使用x0
、sigma0
或use_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 中相对采样将使用的搜索空间。
重新设置采样器的随机数生成器种子。
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。
- trial (FrozenTrial) – 目标 trial 对象。
推断目标 trial 中相对采样将使用的搜索空间。
infer_relative_search_space(study, trial)[源代码]
- 参数:
study (Study) – 目标 study 对象。
trial (FrozenTrial) – 目标 trial 对象。修改此对象前请先复制。
- 此方法在调用
sample_relative()
方法之前调用,此方法返回的搜索空间将传递给它。不包含在搜索空间中的参数将使用sample_independent()
方法采样。 返回:
- 返回类型:
包含参数名称和参数分布的字典。
-
请参考
intersection_search_space()
作为infer_relative_search_space()
的一个实现。 -
重新设置采样器的随机数生成器种子。
- 返回类型:
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_distribution (BaseDistribution) – 指定采样算法先验和/或尺度的分布对象。
在给定搜索空间中采样参数。
参数值。
注意
此方法仅为
sample_relative()
方法返回的搜索空间中不包含的参数调用。此方法适用于不使用参数之间关系的采样算法,例如随机采样和 TPE。- 参数:
study (Study) – 目标 study 对象。
trial (FrozenTrial) – 目标 trial 对象。修改此对象前请先复制。
Any
- 此方法在调用
sample_relative()
方法之前调用,此方法返回的搜索空间将传递给它。不包含在搜索空间中的参数将使用sample_independent()
方法采样。 - 返回类型:
此方法在每个 trial 开始时调用一次,即在评估目标函数之前。此方法适用于使用参数之间关系的采样算法,例如高斯过程和 CMA-ES。