Настройка гиперпараметров (предварительная версия)
Настройка гиперпараметра — это процесс поиска оптимальных значений для параметров, которые не учатся моделью машинного обучения во время обучения, а скорее задаются пользователем перед началом процесса обучения. Эти параметры обычно называются гиперпараметрами, а примеры включают частоту обучения, количество скрытых слоев в нейронной сети, силу нормализации и размер пакета.
Производительность модели машинного обучения может быть очень чувствительной к выбору гиперпараметров, и оптимальный набор гиперпараметров может значительно отличаться в зависимости от конкретной проблемы и набора данных. Настройка гиперпараметра, таким образом, является критическим шагом в конвейере машинного обучения, так как она может оказать значительное влияние на точность модели и производительность обобщения.
В Fabric специалисты по обработке и анализу данных могут использовать FLAML
, упрощенную библиотеку Python для эффективной автоматизации операций машинного обучения и искусственного интеллекта для требований к настройке гиперпараметров. В записных книжках Fabric пользователи могут вызывать flaml.tune
для экономичной настройки гиперпараметров.
Важный
Эта функция доступна в предварительной версии.
Рабочий процесс настройки
Для завершения базовой задачи настройки необходимо выполнить три основных шага, чтобы использовать flaml.tune
:
- Укажите цель настройки относительно гиперпараметров.
- Укажите пространство поиска гиперпараметров.
- Укажите ограничения настройки, включая ограничения бюджета ресурсов для настройки, ограничений конфигураций или ограничений для конкретных метрик (или нескольких).
Цель настройки
Первым шагом является указание цели настройки. Для этого сначала следует указать процедуру оценки относительно гиперпараметров в определяемой пользователем функции 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
предоставляет служебные функции для построения графиков процесса оптимизации с использованием Plotly. Используя Plotly, пользователи могут интерактивно изучать результаты экспериментов 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
. Отображение важности гиперпараметра эксперимента.