optuna.samplers.QMCSampler

class optuna.samplers.QMCSampler(*, qmc_type='sobol', scramble=False, seed=None, independent_sampler=None, warn_asynchronous_seeding=True, warn_independent_sampling=True)[source]

生成低差异序列的拟蒙特卡罗采样器。

拟蒙特卡罗 (QMC) 序列的设计使其比标准随机序列具有更低的差异性。已知它们在超参数优化中的表现优于标准随机序列。

有关在超参数优化中使用 QMC 序列的更多信息,请参阅以下论文

我们使用 Scipy 中的 QMC 实现。有关 QMC 算法的详细信息,请参阅 scipy.stats.qmc 上的 Scipy API 参考。

注意

采样器的搜索空间由研究中先前的试验或此采样器采样的第一个试验决定。

如果研究中有先前的试验,QMCSampler 使用研究中首先创建的试验来推断其搜索空间。

否则(如果研究没有先前的试验),QMCSampler 使用其 independent_sampler 对第一个试验进行采样,然后在第二个试验中推断搜索空间。

如上所述,QMCSampler 的搜索空间由研究的第一个试验决定。一旦确定了搜索空间,之后就不能更改。

参数:
  • qmc_type (str) –

    要采样的 QMC 序列类型。必须是 “halton”“sobol” 之一。默认值为 “sobol”

    注意

    Sobol' 序列被设计成在样本数量为每个正整数 \(m\)\(n=2^m\) 时具有低差异性。当可以预先指定 QMCSampler 建议的试验数量时,建议将试验数量设置为二的幂。

  • scramble (bool) – 如果此选项为 True,则对 QMC 序列应用加扰(随机化)。

  • seed (int | None) –

    QMCSampler 的种子。此参数仅在 scrambleTrue 时使用。如果为 None,则种子会随机初始化。默认值为 None

    注意

    在并行和/或分布式优化中使用多个 QMCSampler 实例时,如果启用了 scrambling,则所有采样器必须共享相同的种子。否则,样本的低差异性将受到影响。

  • independent_sampler (BaseSampler | None) –

    用于独立采样的 BaseSampler 实例。研究的第一个试验以及不包含在相对搜索空间中的参数将由该采样器采样。

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

    另请参阅

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

  • warn_independent_sampling (bool) –

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

    请注意,研究中第一个试验的参数在大多数情况下是通过独立采样器进行采样的,因此在这种情况下不会发出警告消息。

  • warn_asynchronous_seeding (bool) –

    如果此选项为 True,则当对 QMC 序列应用加扰(随机化)且采样器的随机种子未手动设置时,会发出警告消息。

    注意

    在并行和/或分布式优化中,如果未手动设置种子,则会为不同 worker 的每个 QMCSampler 实例随机设置种子,这会导致优化中使用的多个采样器出现异步播种。

    另请参阅

    参见 QMCSampler 中的参数 seed

示例

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

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.QMCSampler()
study = optuna.create_study(sampler=sampler)
study.optimize(objective, n_trials=8)

注意

在 v3.0.0 中作为实验性功能添加。接口在较新版本中可能发生变化,恕不另行通知。参见 https://github.com/optuna/optuna/releases/tag/v3.0.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)[source]

试验后处理。

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

注意

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

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

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

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

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

返回类型:

None

before_trial(study, trial)[source]

试验预处理。

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

注意

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

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

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

返回类型:

None

infer_relative_search_space(study, trial)[source]

在目标试验中推断将用于相对采样的搜索空间。

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

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

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

返回:

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

返回类型:

dict[str, BaseDistribution]

另请参阅

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

reseed_rng()[source]

重新播种采样器的随机数生成器。

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

返回类型:

None

sample_independent(study, trial, param_name, param_distribution)[source]

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

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

注意

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

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

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

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

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

返回:

参数值。

返回类型:

Any

sample_relative(study, trial, search_space)[source]

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

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

注意

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

参数:
返回:

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

返回类型:

dict[str, Any]