跳到内容

局部和随机搜索

LocalAndSortedRandomSearch #

LocalAndSortedRandomSearch(
    configspace: ConfigurationSpace,
    acquisition_function: AbstractAcquisitionFunction
    | None = None,
    challengers: int = 5000,
    max_steps: int | None = None,
    n_steps_plateau_walk: int = 10,
    local_search_iterations: int = 10,
    seed: int = 0,
    uniform_configspace: ConfigurationSpace | None = None,
    prior_sampling_fraction: float | None = None,
)

基类: AbstractAcquisitionMaximizer

实现 SMAC 的默认采集函数优化。

该优化器根据采集函数对先前的最佳点执行局部搜索,使用采集函数对随机采样的配置进行排序。随机配置由 SMAC 主代码交错执行。

交错执行随机配置是为了规避优化过程开始时随机森林模型的恒定预测所带来的问题。

参数#

configspace : ConfigurationSpace uniform_configspace : ConfigurationSpace 用户定义的 ConfigurationSpace 的一个版本,其中所有参数都是均匀分布的(或在分类超参数的情况下,权重已被移除)。可以选择性地提供,并通过 prior_sampling_fraction 参数定义采样比例。 acquisition_function : AbstractAcquisitionFunction | None, 默认为 None challengers : int, 默认为 5000 挑战者数量。 max_steps: int | None, 默认为 None [LocalSearch] 局部搜索将执行的最大步数。 n_steps_plateau_walk: int, 默认为 10 [LocalSearch] 在平台步进期间,局部搜索终止前的步数。 local_search_iterations: int, 默认为 10 [Local Search] 局部搜索迭代次数。 prior_sampling_fraction: float, 默认为 0.5 从用户定义的 ConfigurationSpace 中提取的随机样本与均匀版本(需要定义 uniform_configspace)的比例。 seed : int, 默认为 0

源代码位于 smac/acquisition/maximizer/local_and_random_search.py
def __init__(
    self,
    configspace: ConfigurationSpace,
    acquisition_function: AbstractAcquisitionFunction | None = None,
    challengers: int = 5000,
    max_steps: int | None = None,
    n_steps_plateau_walk: int = 10,
    local_search_iterations: int = 10,
    seed: int = 0,
    uniform_configspace: ConfigurationSpace | None = None,
    prior_sampling_fraction: float | None = None,
) -> None:
    super().__init__(
        configspace,
        acquisition_function=acquisition_function,
        challengers=challengers,
        seed=seed,
    )

    if uniform_configspace is not None and prior_sampling_fraction is None:
        prior_sampling_fraction = 0.5
    if uniform_configspace is None and prior_sampling_fraction is not None:
        raise ValueError("If `prior_sampling_fraction` is given, `uniform_configspace` must be defined.")
    if uniform_configspace is not None and prior_sampling_fraction is not None:
        self._prior_random_search = RandomSearch(
            acquisition_function=acquisition_function,
            configspace=configspace,
            seed=seed,
        )

        self._uniform_random_search = RandomSearch(
            acquisition_function=acquisition_function,
            configspace=uniform_configspace,
            seed=seed,
        )
    else:
        self._random_search = RandomSearch(
            configspace=configspace,
            acquisition_function=acquisition_function,
            seed=seed,
        )

    self._local_search = LocalSearch(
        configspace=configspace,
        acquisition_function=acquisition_function,
        max_steps=max_steps,
        n_steps_plateau_walk=n_steps_plateau_walk,
        seed=seed,
    )

    self._local_search_iterations = local_search_iterations
    self._prior_sampling_fraction = prior_sampling_fraction
    self._uniform_configspace = uniform_configspace

acquisition_function property writable #

acquisition_function: AbstractAcquisitionFunction | None

返回使用的采集函数。

maximize #

maximize(
    previous_configs: list[Configuration],
    n_points: int | None = None,
    random_design: AbstractRandomDesign | None = None,
) -> Iterator[Configuration]

使用由子类实现的 _maximize 最大化采集函数。

参数#

previous_configs: list[Configuration] 先前评估的配置。 n_points: int, 默认为 None 要采样的点数和要返回的配置数量。如果未指定 n_points,则使用 self._challengers。语义取决于具体实现。 random_design: AbstractRandomDesign, 默认为 None 返回的 ChallengerList 的一部分,以便我们可以根据随机设计定义的方案交错随机配置。函数末尾会调用 random_design.next_iteration() 方法。

返回值#

challengers : Iterator[Configuration] 包含配置的可迭代对象。

源代码位于 smac/acquisition/maximizer/abstract_acquisition_maximizer.py
def maximize(
    self,
    previous_configs: list[Configuration],
    n_points: int | None = None,
    random_design: AbstractRandomDesign | None = None,
) -> Iterator[Configuration]:
    """Maximize acquisition function using `_maximize`, implemented by a subclass.

    Parameters
    ----------
    previous_configs: list[Configuration]
        Previous evaluated configurations.
    n_points: int, defaults to None
        Number of points to be sampled & number of configurations to be returned. If `n_points` is not specified,
        `self._challengers` is used. Semantics depend on concrete implementation.
    random_design: AbstractRandomDesign, defaults to None
        Part of the returned ChallengerList such that we can interleave random configurations
        by a scheme defined by the random design. The method `random_design.next_iteration()`
        is called at the end of this function.

    Returns
    -------
    challengers : Iterator[Configuration]
        An iterable consisting of configurations.
    """
    if n_points is None:
        n_points = self._challengers

    def next_configs_by_acquisition_value() -> list[Configuration]:
        assert n_points is not None
        # since maximize returns a tuple of acquisition value and configuration,
        # and we only need the configuration, we return the second element of the tuple
        # for each element in the list
        return [t[1] for t in self._maximize(previous_configs, n_points)]

    challengers = ChallengerList(
        self._configspace,
        next_configs_by_acquisition_value,
        random_design,
    )

    if random_design is not None:
        random_design.next_iteration()

    return challengers