Samplers

class optuna.samplers.BaseSampler[源代码]

Samplers 基类

Optuna结合了两种类型的 sampling 策略,称为 相对 sampling独立 sampling.

相对 sampling 同时确定多个参数的值,以便 sampling 算法可以使用参数之间的关系(例如,相关性)。相对 sampling 的目标参数是在一个相对搜索空间中描述的。该空间由 infer_relative_search_space() 决定。

独立 sampling 确定一个单独的参数,并且不考虑不同参数之间的关系。独立 sampling的目标参数不由相对搜索空间描述。

进一步来说,参数是按照以下步骤来采样得出的。在一个 trial 刚开始时,infer_relative_search_space() 会被调用以确定该 trial 的相对搜索空间。然后,sample_relative() 方法会被触发,用于从该搜索空间中对参数进行采样。在目标函数的执行过程中,sample_independent() 被用于对那些不属于相对搜索空间的参数进行采样。

下图描述了一个 trial 的生命周期和上述方法是如何在一个trial 内被触发的。

../_images/sampling-sequence.png

abstract infer_relative_search_space(study, trial)[源代码]

推断会用于目标 trial 的相对 sampling 的搜索空间。

该方法会恰好在 sample_relative() 之前被调用,而由该方法返回的搜索空间会被传入它。那些不包含在这个搜索空间中的参数将用 sample_independent() 来进行采样。

参数
  • study -- Target study object.

  • trial -- 目标 trial 对象,在修改该对象之前请先复制它。

返回

一个包含了参数名和参数分布的字典。

参见

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

reseed_rng()None[源代码]

重设 sampler 的随机数种子。

该方法由 Study 的实例来调用。而且,如果选项 ``n_jobs>1` 的话,它会被并行执行。在那种情况下,这个 sampler 实例会被复制,其中就报错了随机数生成器的状态,因此它们可能会产生同样的 suggestion 值。为了防止出现这个问题,该方法给每一个随机数生成器赋予一个不同的种子。

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

从给定的分布中采样。

只有当参数不属于 sample_relative() 时,该方法会被调用。该方法适用于那些不依赖参数关系的 sampling 算法,比如 随机 sampling 和TPE.

注解

当 sampler 采样新参数时,那些失败的 trial 会被内置的 sampler 忽略。因此,失败的 trial 对于 sampler 来说等价于 删除掉的trial.

参数
  • study -- Target study object.

  • trial -- 目标 trial 对象,在修改该对象之前请先复制它。

  • param_name -- 参数名

  • param_distribution -- 确定了 sampling 算法的先验和/或者 尺度的分布对象。

返回

A parameter value.

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

给定搜索空间中的 sample 参数。

该方法会在每个 trial 刚开始时被调用一次,也就是在目标函数执行之前被调用一次。该方法适用于对那些依赖于不同参数之间关系的算法,比如 Gaussian Process and CMA-ES.

注解

当 sampler 采样新参数时,那些失败的 trial 会被内置的 sampler 忽略。因此,失败的 trial 对于 sampler 来说等价于 删除掉的trial.

参数
  • study -- Target study object.

  • trial -- 目标 trial 对象,在修改该对象之前请先复制它。

  • search_space -- 由 infer_relative_search_space() 返回的 搜索空间。

返回

一个包含了参数名和参数分布的字典。

class optuna.samplers.GridSampler(search_space)[源代码]

使用网格搜索的 sampler.

在一个 study 中,利用 GridSampler, trial 会在给定的搜索空间内 suggest 所有可能的参数组合。

示例

import optuna

def objective(trial):
    x = trial.suggest_uniform('x', -100, 100)
    y = trial.suggest_int('y', -100, 100)
    return x ** 2 + y ** 2

search_space = {
    'x': [-50, 0, 50],
    'y': [-99, 0, 99]
}
study = optuna.create_study(sampler=optuna.samplers.GridSampler(search_space))
study.optimize(objective, n_trials=3*3)

注解

如果传进来的 search_space 中的所有可能参数组合都已经被评估过了, GridSampler 会抛出一个错误。请通过设置合适的 optimize() 的参数 n_trials 来避免那些不必要的 trial 在 优化过程中被执行。

注解

GridSampler 无所谓由 离散 suggestion 方法确定的参数量化,它只是从一个搜索空间中采样一个参数。比如,在下面的代码片段中, 是 -0.5 或者 0.5, 而不是一个整数点, 会被采样成 x 的值,

import optuna

def objective(trial):
    # The following suggest method specifies integer points between -5 and 5.
    x = trial.suggest_discrete_uniform('x', -5, 5, 1)
    return x ** 2

# Non-int points are specified in the grid.
search_space = {'x': [-0.5, 0.5]}
study = optuna.create_study(sampler=optuna.samplers.GridSampler(search_space))
study.optimize(objective, n_trials=2)
参数

search_space -- 一个键为参数名值为对应的待选参数的字典。

注解

在 v1.2.0 中被作为一个试验性特性引入。该接口可能在未来的版本中在没有提前通知的情况下被改变。

class optuna.samplers.RandomSampler(seed=None)[源代码]

使用随机 sampling 的sampler.

该 sampler 基于 独立 sampling,要看'独立 sampling' 的细节的话请参考 BaseSampler. '

示例

import optuna
from optuna.samplers import RandomSampler

def objective(trial):
    x = trial.suggest_uniform('x', -5, 5)
    return x**2

study = optuna.create_study(sampler=RandomSampler())
study.optimize(objective, n_trials=10)
Args:

随机数种子。

reseed_rng()None[源代码]

重设 sampler 的随机数种子。

该方法由 Study 的实例来调用。而且,如果选项 ``n_jobs>1` 的话,它会被并行执行。在那种情况下,这个 sampler 实例会被复制,其中就报错了随机数生成器的状态,因此它们可能会产生同样的 suggestion 值。为了防止出现这个问题,该方法给每一个随机数生成器赋予一个不同的种子。

class optuna.samplers.TPESampler(consider_prior=True, prior_weight=1.0, consider_magic_clip=True, consider_endpoints=False, n_startup_trials=10, n_ei_candidates=24, gamma=<function default_gamma>, weights=<function default_weights>, seed=None)[源代码]

使用 TPE (Tree-structured Parzen Estimator) 算法的 sampler.

该 sampler 基于 独立 sampling,要看'独立 sampling' 的细节的话请参考 BaseSampler. '

在每一个 trial 中,对每一个参数, TPE将会拟合一个 Gaussian mixture 模型 (GM) l(x) 来设定最佳目标函数赌赢的参数值集合。而另一个 GMM g(x) 则会设置剩余的参数。它选择能最大化 l(x)/g(x) 的参数。

要查看 TPE 算法的细节的话,请参考这里:

示例

import optuna
from optuna.samplers import TPESampler

def objective(trial):
    x = trial.suggest_uniform('x', -10, 10)
    return x**2

study = optuna.create_study(sampler=TPESampler())
study.optimize(objective, n_trials=10)
参数
static hyperopt_parameters()[源代码]

返回 hypoeropt (v0.1.2) 的默认参数。

TPESampler 可以由该方法返回的参数值来进行实例化。

示例

hyperopt 的默认参数创建一个 TPESampler 实例。

import optuna
from optuna.samplers import TPESampler

def objective(trial):
    x = trial.suggest_uniform('x', -10, 10)
    return x**2

sampler = TPESampler(**TPESampler.hyperopt_parameters())
study = optuna.create_study(sampler=sampler)
study.optimize(objective, n_trials=10)
返回

包含 hyperopt 的默认参数的字典。

reseed_rng()None[源代码]

重设 sampler 的随机数种子。

该方法由 Study 的实例来调用。而且,如果选项 ``n_jobs>1` 的话,它会被并行执行。在那种情况下,这个 sampler 实例会被复制,其中就报错了随机数生成器的状态,因此它们可能会产生同样的 suggestion 值。为了防止出现这个问题,该方法给每一个随机数生成器赋予一个不同的种子。

class optuna.samplers.CmaEsSampler(x0: Optional[Dict[str, Any]] = None, sigma0: Optional[float] = None, n_startup_trials: int = 1, independent_sampler: Optional[optuna.samplers._base.BaseSampler] = None, warn_independent_sampling: bool = True, seed: Optional[int] = None)[源代码]

使用 CMA-ES 算法的 sampler.

示例

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

import optuna

def objective(trial):
    x = trial.suggest_uniform('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)

请注意,此 sampler 不支持 CategoricalDistribution。如果您的搜索空间包含分类参数,作为代替,建议您使用 TPESampler. 此外,并行优化设置中还有性能改进空间。 这个 sampler 无法使用一些 trial 来更新多元正态分布的参数。

参见

你也可以使用 optuna.integration.CmaEsSampler, 它是一个用 cma 库作为后端的 sampler.

参数
  • x0 -- 一个包含了 CMA-ES 的初始参数的字典。在默认情况下,每个分布的 low and high 的平均数是被采用的。

  • sigma0 -- CMA-ES 的初始标准差。默认情况下, sigma0 会被设置成 min_range / 6, 而 min_range 代表着搜索空间中最小的分布范围。

  • seed -- CMA-ES 的随机数种子。

  • n_startup_trials -- 除非同一个 study 中指定个数的 trial 已经完成,否则将会采用独立 sampling 而不是 CMA-ES 算法。

  • independent_sampler -- 一个 BaseSampler 实例,它用于独立 sampling.那些并不包含在相对搜索空间中的参数是通过这个 sampler 来采样的。CmaEsSampler 的搜索空间 是通过 intersection_search_space() 来确定的。如果设置成 None 的话,RandomSampler 会作为默认 sampler 被使用。.. seealso:: optuna.samplers 模块提供了内置的独立 sampler, 比如 RandomSamplerTPESampler.

  • warn_independent_sampling -- 如果这是 True, 那么当一个参数的值是通过独立 sampler 来采样时,它会触发一个 warning 信息。注意,由于一个 study 中的第一个 trial 的参数总要通过独立 sampler 来采样,因此这种情况下 warning 信息不会被触发。

reseed_rng()None[源代码]

重设 sampler 的随机数种子。

该方法由 Study 的实例来调用。而且,如果选项 ``n_jobs>1` 的话,它会被并行执行。在那种情况下,这个 sampler 实例会被复制,其中就报错了随机数生成器的状态,因此它们可能会产生同样的 suggestion 值。为了防止出现这个问题,该方法给每一个随机数生成器赋予一个不同的种子。

class optuna.samplers.IntersectionSearchSpace[源代码]

A class to calculate the intersection search space of a BaseStudy.

交叉搜索空间包含着该 study 中目前已完成的 trial 中参数 suggestion 值的分布的交集。如果存在多个拥有同一个名字但是其分布不同的参数的话,那么它们都不会被纳入最终的搜索空间 (也就是说,带有动态范围的参数会被排除)。

注意,该类的实例只应用于一个 study。如果不同的 study 被传入 calculate() 的话,一个 ValueError 会被抛出。

calculate(study: optuna.study.BaseStudy, ordered_dict: bool = False) → Dict[str, optuna.distributions.BaseDistribution][源代码]

返回 BaseStudy 的交叉搜索空间。

参数
  • study -- 带有已完成的 trial 的 study.

  • ordered_dict -- 一个布尔选项,用于确定返回值的类型。如果设置成 False 的话,返回的对象会是一个 dict.如果设置成 True, 返回对象会是一个键(也就是参数)已排过序的 collections.OrderedDict.

返回

一个包含了参数名和参数分布的字典。

optuna.samplers.intersection_search_space(study: optuna.study.BaseStudy, ordered_dict: bool = False) → Dict[str, optuna.distributions.BaseDistribution][源代码]

返回 BaseStudy 的交叉搜索空间。

交叉搜索空间包含着该 study 中目前已完成的 trial 中参数 suggestion 值的分布的交集。如果存在多个拥有同一个名字但是其分布不同的参数的话,那么它们都不会被纳入最终的搜索空间 (也就是说,带有动态范围的参数会被排除)。

注解

IntersectionSearchSpace 能以更快的速度提供同样的功能。如果你想尽可能降低运行时间的话,可以考虑使用它。

参数
  • study -- 带有已完成的 trial 的 study.

  • ordered_dict -- 一个布尔选项,用于确定返回值的类型。如果设置成 False 的话,返回的对象会是一个 dict.如果设置成 True, 返回对象会是一个键(也就是参数)已排过序的 collections.OrderedDict.

返回

一个包含了参数名和参数分布的字典。