optuna.samplers.GPSampler

class optuna.samplers.GPSampler(*, seed=None, independent_sampler=None, n_startup_trials=10, deterministic_objective=False, constraints_func=None, warn_independent_sampling=True)[源代码]

基于高斯过程的贝叶斯优化采样器。

此采样器将高斯过程(GP)拟合到目标函数,并优化采集函数以建议下一个参数。

当前实现使用 Matern 核,其 nu=2.5(二阶可微),并对每个参数的长度尺度使用自动相关性确定(ARD)。核的超参数通过最大化给定过去试验的超参数的边际对数似然来获得。为防止过拟合,在核尺度和噪声方差上引入 Gamma 先验,并为逆平方长度尺度引入手工先验。

作为采集函数,我们使用

  • 单目标优化使用对数期望改善(logEI),

  • 多目标优化使用对数期望超体积改善(logEHVI),以及

  • 对于(黑盒不等式)约束优化,使用 logEI 和每个约束独立假设下的可行概率的对数之和。

有关这些采集函数的更多信息,请参阅以下论文:

请也查看我们的文章:

采集函数的优化通过以下方式进行:

  1. 收集过去试验的最佳参数,

  2. 使用拟蒙特卡罗(QMC)采样收集 n_preliminary_samples 个点,

  3. 从收集的点中选择最佳点,

  4. 使用轮盘赌选择从收集的点中选择 n_local_search - 2 个点,

  5. 为每个选定的点作为初始点执行局部搜索,以及

  6. 返回具有最佳采集函数值的点作为下一个参数。

请注意,对于非单目标优化设置的过程与上面描述的单目标版本略有不同,但为了简洁,我们省略了对其他设置的描述。

局部搜索通过重复以下步骤来迭代优化采集函数:

  1. 对连续参数使用 l-BFGS-B 进行梯度上升,以及

  2. 对每个离散参数独立进行线搜索或穷举搜索。

如果例程停止更新最佳参数集或达到最大迭代次数,则终止局部搜索。

我们使用线搜索而不是对连续优化结果进行四舍五入,因为 EI 通常在相邻网格之间会产生高值。

注意

此采样器需要 scipytorch。您可以使用 pip install scipy torch 安装这些依赖项。

参数:
  • seed (int | None) – 初始化内部随机数生成器的随机种子。默认为 None(随机选择一个种子)。

  • independent_sampler (BaseSampler | None) – 用于初始采样的采样器(用于前 n_startup_trials 次试验)和用于条件参数。默认为 None(使用具有相同 seed 的随机采样器)。

  • n_startup_trials (int) – 初始试验次数。默认为 10。

  • deterministic_objective (bool) – 目标函数是否是确定性的。如果为 True,采样器会将代理模型的噪声方差固定为最小值(略高于 0 以确保数值稳定性)。默认为 False。目前,如果 True,所有目标都将假定为确定性的。

  • constraints_func (Callable[[FrozenTrial], Sequence[float]] | None) –

    一个可选函数,用于计算目标约束。它必须接受一个 FrozenTrial 并返回约束。返回值必须是一个 float 序列。大于 0 的值表示约束被违反。等于或小于 0 的值被视为可行的。如果 constraints_func 为试验返回多个值,则仅当所有值都等于 0 或更小时,该试验才被视为可行。

    在每次成功的试验后都会评估 constraints_func。在试验失败或被剪枝时不会调用该函数,但这可能会在未来版本中更改。

  • warn_independent_sampling (bool) – 如果此设置为 True,则在使用独立采样器(意味着采样不使用 GP 模型)对参数值进行采样时会发出警告消息。请注意,研究中的第一次试验的参数总是通过独立采样器进行采样,因此在这种情况下不会发出警告消息。

注意

于 v3.6.0 添加为实验性功能。接口可能在新版本中更改,恕不另行通知。请参阅 https://github.com/optuna/optuna/releases/tag/v3.6.0

方法

after_trial(study, trial, state, values)

试验后处理。

before_trial(study, trial)

试验预处理。

infer_relative_search_space(study, trial)

为目标试验推断将使用的搜索空间。

reseed_rng()

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

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

为给定的分布采样一个参数。

sample_relative(study, trial, search_space)

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

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

试验后处理。

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

注意

于 v2.4.0 添加为实验性功能。接口可能在新版本中更改,恕不另行通知。请参阅 https://github.com/optuna/optuna/releases/tag/v2.4.0

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

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

  • state (TrialState) – 结果试验状态。

  • values (Sequence[float] | None) – 结果试验值。如果试验成功,则保证不为 None

返回类型:

before_trial(study, trial)[源代码]

试验预处理。

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

注意

于 v3.3.0 作为实验性功能添加。界面可能会在较新版本中更改,恕不另行通知。请参阅 https://github.com/optuna/optuna/releases/tag/v3.3.0

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

  • trial (FrozenTrial) – 目标试验对象。

返回类型:

infer_relative_search_space(study, trial)[源代码]

为目标试验推断将使用的搜索空间。

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

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

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

返回:

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

返回类型:

dict[str, BaseDistribution]

另请参阅

请参阅 intersection_search_space() 作为 infer_relative_search_space() 的实现。

reseed_rng()[源代码]

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

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

返回类型:

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

为给定的分布采样一个参数。

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

注意

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

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

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

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

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

返回:

参数值。

返回类型:

Any

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

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

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

注意

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

参数:
返回:

包含参数名称和值的字典。

返回类型:

dict[str, Any]