Поделиться через


Настройка гиперпараметров (предварительная версия)

Настройка гиперпараметра — это процесс поиска оптимальных значений для параметров, которые не учатся моделью машинного обучения во время обучения, а скорее задаются пользователем перед началом процесса обучения. Эти параметры обычно называются гиперпараметрами, а примеры включают частоту обучения, количество скрытых слоев в нейронной сети, силу нормализации и размер пакета.

Производительность модели машинного обучения может быть очень чувствительной к выбору гиперпараметров, и оптимальный набор гиперпараметров может значительно отличаться в зависимости от конкретной проблемы и набора данных. Настройка гиперпараметра, таким образом, является критическим шагом в конвейере машинного обучения, так как она может оказать значительное влияние на точность модели и производительность обобщения.

В Fabric специалисты по обработке и анализу данных могут использовать FLAMLупрощенную библиотеку Python для эффективной автоматизации операций машинного обучения и искусственного интеллекта для требований к настройке гиперпараметров. В записных книжках Fabric пользователи могут вызывать flaml.tune экономичную настройку гиперпараметров.

Внимание

Эта функция доступна в предварительной версии.

Рабочий процесс настройки

Для завершения базовой задачи настройки необходимо выполнить flaml.tune три основных шага.

  1. Укажите цель настройки относительно гиперпараметров.
  2. Укажите пространство поиска гиперпараметров.
  3. Укажите ограничения настройки, включая ограничения бюджета ресурсов для настройки, ограничений конфигураций или ограничений для конкретных метрик (или нескольких).

Цель настройки

Первым шагом является указание цели настройки. Для этого сначала следует указать процедуру оценки относительно гиперпараметров в определяемой пользователем функции evaluation_function. Для функции требуется конфигурация гиперпараметров в качестве входных данных. Он может просто возвращать значение метрики в скалярном или возвращать словарь имен метрик и пар значений метрик.

В приведенном ниже примере мы можем определить функцию оценки в отношении 2 гиперпараметров с именем x и y.

import time

def evaluate_config(config: dict):
    """evaluate a hyperparameter configuration"""
    score = (config["x"] - 85000) ** 2 - config["x"] / config["y"]


    faked_evaluation_cost = config["x"] / 100000
    time.sleep(faked_evaluation_cost)
    # we can return a single float as a score on the input config:
    # return score
    # or, we can return a dictionary that maps metric name to metric value:
    return {"score": score, "evaluation_cost": faked_evaluation_cost, "constraint_metric": config["x"] * config["y"]}

Пространство поиска

Далее мы укажем пространство поиска гиперпараметров. В пространстве поиска необходимо указать допустимые значения для гиперпараметров и способ выборки этих значений (например, из единого распределения или единого распределения журнала). В приведенном ниже примере можно указать пространство поиска для гиперпараметров x и y. Допустимые значения для обоих являются целыми числами, начиная от [1, 100 000]. Эти гиперпараметры используются равномерно в указанных диапазонах.

from flaml import tune

# construct a search space for the hyperparameters x and y.
config_search_space = {
    "x": tune.lograndint(lower=1, upper=100000),
    "y": tune.randint(lower=1, upper=100000)
}

# provide the search space to tune.run
tune.run(..., config=config_search_space, ...)

С помощью FLAML пользователи могут настроить домен для определенного гиперпараметра. Это позволяет пользователям указывать тип и допустимый диапазон для выборки параметров. FLAML поддерживает следующие типы гиперпараметров: float, целочисленное и категориальное. Ниже приведен пример для часто используемых доменов:

config = {
    # Sample a float uniformly between -5.0 and -1.0
    "uniform": tune.uniform(-5, -1),

    # Sample a float uniformly between 3.2 and 5.4,
    # rounding to increments of 0.2
    "quniform": tune.quniform(3.2, 5.4, 0.2),

    # Sample a float uniformly between 0.0001 and 0.01, while
    # sampling in log space
    "loguniform": tune.loguniform(1e-4, 1e-2),

    # Sample a float uniformly between 0.0001 and 0.1, while
    # sampling in log space and rounding to increments of 0.00005
    "qloguniform": tune.qloguniform(1e-4, 1e-1, 5e-5),

    # Sample a random float from a normal distribution with
    # mean=10 and sd=2
    "randn": tune.randn(10, 2),

    # Sample a random float from a normal distribution with
    # mean=10 and sd=2, rounding to increments of 0.2
    "qrandn": tune.qrandn(10, 2, 0.2),

    # Sample a integer uniformly between -9 (inclusive) and 15 (exclusive)
    "randint": tune.randint(-9, 15),

    # Sample a random uniformly between -21 (inclusive) and 12 (inclusive (!))
    # rounding to increments of 3 (includes 12)
    "qrandint": tune.qrandint(-21, 12, 3),

    # Sample a integer uniformly between 1 (inclusive) and 10 (exclusive),
    # while sampling in log space
    "lograndint": tune.lograndint(1, 10),

    # Sample a integer uniformly between 2 (inclusive) and 10 (inclusive (!)),
    # while sampling in log space and rounding to increments of 2
    "qlograndint": tune.qlograndint(2, 10, 2),

    # Sample an option uniformly from the specified choices
    "choice": tune.choice(["a", "b", "c"]),
}

Дополнительные сведения о настройке доменов в пространстве поиска см . в документации FLAML по настройке пространств поиска.

Ограничения настройки

Последний шаг — указать ограничения задачи настройки. Одним из важных flaml.tune свойств является то, что он может завершить процесс настройки в пределах требуемого ограничения ресурсов. Для этого пользователь может предоставить ограничения ресурсов с точки зрения времени настенных часов (в секундах), используя time_budget_s аргумент или с точки зрения количества пробных версий с помощью аргумента num_samples .

# Set a resource constraint of 60 seconds wall-clock time for the tuning.
flaml.tune.run(..., time_budget_s=60, ...)

# Set a resource constraint of 100 trials for the tuning.
flaml.tune.run(..., num_samples=100, ...)

# Use at most 60 seconds and at most 100 trials for the tuning.
flaml.tune.run(..., time_budget_s=60, num_samples=100, ...)

Дополнительные сведения о дополнительных ограничениях конфигурации см . в документации FLAML для дополнительных параметров настройки.

Подведем итог

Определив критерии настройки, мы можем выполнить пробную версию настройки. Чтобы отслеживать результаты пробной версии, мы можем использовать автологирование MLFlow для записи метрик и параметров для каждого из этих запусков. Этот код будет записывать всю пробную версию гиперпараметра, подчеркивая все сочетания гиперпараметров, которые были изучены FLAML.

import mlflow
mlflow.set_experiment("flaml_tune_experiment")
mlflow.autolog(exclusive=False)

with mlflow.start_run(nested=True, run_name="Child Run: "):
    analysis = tune.run(
        evaluate_config,  # the function to evaluate a config
        config=config_search_space,  # the search space defined
        metric="score",
        mode="min",  # the optimization mode, "min" or "max"
        num_samples=-1,  # the maximal number of configs to try, -1 means infinite
        time_budget_s=10,  # the time budget in seconds
    )

Примечание.

Если автологирование MLflow включено, метрики, параметры и модели должны автоматически записываться в журнал при запуске MLFlow. Однако это зависит от платформы. Метрики и параметры для конкретных моделей не могут быть зарегистрированы. Например, метрики не будут регистрироваться для моделей XGBoost, LightGBM, Spark и SynapseML. Дополнительные сведения о том, какие метрики и параметры записываются из каждой платформы, см. в документации по автологированию MLFlow.

Параллельная настройка с помощью Apache Spark

Эта flaml.tune функция поддерживает настройку как apache Spark, так и учащихся с одним узлом. Кроме того, при настройке учащихся с одним узлом (например, Scikit-Learn) можно также параллелизировать настройку, чтобы ускорить процесс настройки, задав параметр use_spark = True. Для кластеров Spark по умолчанию FLAML запустит одну пробную версию для каждого исполнителя. Вы также можете настроить количество одновременных пробных версий с помощью аргумента n_concurrent_trials .


analysis = tune.run(
    evaluate_config,  # the function to evaluate a config
    config=config_search_space,  # the search space defined
    metric="score",
    mode="min",  # the optimization mode, "min" or "max"
    num_samples=-1,  # the maximal number of configs to try, -1 means infinite
    time_budget_s=10,  # the time budget in seconds
    use_spark=True,
)
print(analysis.best_trial.last_result)  # the best trial's result
print(analysis.best_config)  # the best config

Дополнительные сведения о параллелизации трасс настройки см. в документации FLAML для параллельных заданий Spark.

Визуализация результатов

Модуль flaml.visualization предоставляет служебные функции для построения процесса оптимизации с помощью графики. Используя графики, пользователи могут интерактивно изучить результаты эксперимента AutoML. Чтобы использовать эти функции построения, просто предоставьте оптимизированный flaml.AutoML или flaml.tune.tune.ExperimentAnalysis объект в качестве входных данных.

В записной книжке можно использовать следующие функции:

  • plot_optimization_history: история оптимизации всех проб в эксперименте.
  • plot_feature_importance: график важности для каждой функции в наборе данных.
  • plot_parallel_coordinate: вычислительная схема связей параметров в эксперименте.
  • plot_contour: вычислить связь параметров как контурный график в эксперименте.
  • plot_edf: показано целевое значение EDF (эмпирическая функция распределения) эксперимента.
  • plot_timeline: настроите временная шкала эксперимента.
  • plot_slice: постройте связь параметров как график среза в исследовании.
  • plot_param_importance: настроите важность гиперпараметра эксперимента.