Настройка гиперпараметров для модели в Машинном обучении Azure (версия 1)

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

Важно!

Для использования некоторых команд Azure CLI, приведенных в этой статье, используйте расширение azure-cli-ml (версия 1) для Машинного обучения Azure. Поддержка расширения версии 1 будет прекращена 30 сентября 2025 г. Вы можете установить и использовать расширение версии 1 до этой даты.

Рекомендуется перейти на расширение ml (версия 2) до 30 сентября 2025 г. Дополнительные сведения о расширении версии 2 см. на странице расширения CLI для Azure ML и пакета SDK для Python версии 2.

Автоматизируйте эффективную настройку гиперпараметров, используя пакет HyperDrive Машинного обучения Azure (версия 1). Узнайте, как выполнить действия, необходимые для настройки гиперпараметров, с помощью пакета SDK для Машинного обучения Azure.

  1. определение пространства поиска параметров;
  2. Указание основной метрики для оптимизации
  3. Указание политики досрочного завершения для запусков с низкой производительностью
  4. Создание и назначение ресурсов
  5. Запуск эксперимента с использованием заданной конфигурации
  6. визуализация учебных запусков;
  7. Выбор наилучшей конфигурации для модели

Что такое настройка гиперпараметров?

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

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

Машинное обучение Azure позволяет автоматизировать настройку гиперпараметров и запускать эксперименты в параллельном режиме для эффективной оптимизации гиперпараметров.

Определение пространства поиска

Гиперпараметры настраиваются путем исследования диапазона значений, определенных для каждого из гиперпараметров.

Гиперпараметры могут быть дискретными или непрерывными и иметь распределение значений, описываемое выражением параметра.

Дискретные гиперпараметры

Дискретные гиперпараметры определяются как choice в дискретных значениях. choice может принимать следующие значения:

  • одно или несколько значений, разделенных запятыми;
  • объект range;
  • любой произвольный объект list.
    {
        "batch_size": choice(16, 32, 64, 128)
        "number_of_hidden_layers": choice(range(1,5))
    }

В этом случае batch_size принимает значение из списка [16, 32, 64, 128], а number_of_hidden_layers — из списка [1, 2, 3, 4].

Следующие расширенные дискретные гиперпараметры также могут быть заданы с использованием распределения.

  • quniform(low, high, q) — возвращает значение типа round(uniform(low, high) / q) * q.
  • qloguniform(low, high, q) — возвращает значение типа round(exp(uniform(low, high)) / q) * q.
  • qnormal(mu, sigma, q) — возвращает значение типа round(normal(mu, sigma) / q) * q.
  • qlognormal(mu, sigma, q) — возвращает значение типа round(exp(normal(mu, sigma)) / q) * q.

Непрерывные гиперпараметры

Непрерывные гиперпараметры определяются как распределение по непрерывному диапазону значений.

  • uniform(low, high) — возвращает значение, равномерно распределенное между верхней и нижней границами.
  • loguniform(low, high) — возвращает значение, полученное в соответствии с exp(uniform(low, high)), так что логарифм возвращаемого значения равномерно распределен.
  • normal(mu, sigma) — возвращает реальное значение, которое обычно распределяется со средним значением mu и стандартным отклонением sigma.
  • lognormal(mu, sigma) — возвращает значение, полученное в соответствии с exp(normal(mu, sigma)), так что логарифм возвращаемого значения нормально распределен.

Ниже приведен пример определения пространства параметров:

    {    
        "learning_rate": normal(10, 3),
        "keep_probability": uniform(0.05, 0.1)
    }

Этот код определяет пространство поиска с двумя параметрами: learning_rate и keep_probability. learning_rate имеет нормальное распределение со средним значением 10 и стандартным отклонением 3. keep_probability имеет равномерное распределение с минимальным значением 0,05 и максимальным значением 0,1.

Выборка пространства гиперпараметров

Укажите метод выборки параметров для использования в пространстве гиперпараметров. Машинное обучение Azure поддерживает следующие методы.

  • Случайная выборка
  • Решетчатая выборка
  • Байесовская выборка

Случайная выборка

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

При случайной выборке значения гиперпараметров выбираются случайным образом из определенного пространства поиска.

from azureml.train.hyperdrive import RandomParameterSampling
from azureml.train.hyperdrive import normal, uniform, choice
param_sampling = RandomParameterSampling( {
        "learning_rate": normal(10, 3),
        "keep_probability": uniform(0.05, 0.1),
        "batch_size": choice(16, 32, 64, 128)
    }
)

Решетчатая выборка

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

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

from azureml.train.hyperdrive import GridParameterSampling
from azureml.train.hyperdrive import choice
param_sampling = GridParameterSampling( {
        "num_hidden_layers": choice(1, 2, 3),
        "batch_size": choice(16, 32)
    }
)

Байесовская выборка

Байесовская выборка строится на байесовском алгоритме оптимизации. Выборка делается на основе того, как работали предыдущие выборки, так что новые выборки улучшают первичную метрику.

Байесовская выборка рекомендуется при наличии достаточного бюджета для изучения пространства гиперпараметров. Для получения наилучших результатов рекомендуется, чтобы максимальное количество запусков было не меньше 20-кратного количества настраиваемых гиперпараметров.

Количество параллельных запусков влияет на эффективность процесса настройки. Меньшее количество параллельных запусков может приводить к лучшей сходимости выборки, так как меньшая степень параллелизма увеличивает число запусков, оптимизированных по результатам прошлых запусков.

Байесовская выборка поддерживает в пространстве поиска только распределения choice, uniform и quniform.

from azureml.train.hyperdrive import BayesianParameterSampling
from azureml.train.hyperdrive import uniform, choice
param_sampling = BayesianParameterSampling( {
        "learning_rate": uniform(0.05, 0.1),
        "batch_size": choice(16, 32, 64, 128)
    }
)

Настройка основной метрики

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

Укажите для основной метрики следующие атрибуты.

  • primary_metric_name: имя основной метрики должно точно соответствовать имени метрики, зарегистрированной сценарием обучения.
  • primary_metric_goal: это может быть PrimaryMetricGoal.MAXIMIZE или PrimaryMetricGoal.MINIMIZE. Это свойство определяет, что будет выполняться при оценке прогонов: максимизация или минимизация основной метрики.
primary_metric_name="accuracy",
primary_metric_goal=PrimaryMetricGoal.MAXIMIZE

Эта выборка увеличивает метрику "accuracy".

Ведение журнала метрик для настройки гиперпараметров

Сценарий обучения для вашей модели должен регистрировать основную метрику во время обучения модели, чтобы HyperDrive мог получать к ней доступ для настройки гиперпараметров.

Зарегистрируйте основную метрику в сценарии обучения, используя следующий фрагмент кода:

from azureml.core.run import Run
run_logger = Run.get_context()
run_logger.log("accuracy", float(val_accuracy))

Сценарий обучения вычисляет val_accuracy и регистрирует его как значение основной метрики "accuracy". Каждый раз при регистрации метрики значение метрики поступает на обработку в службу настройки гиперпараметров. Вы можете определить частоту создания отчетов.

Дополнительные сведения о значениях ведения журнала в запусках обучения модели см. в разделе "Включение ведения журнала в Машинное обучение Azure учебных запусков".

Настройка политики досрочного завершения

Автоматически завершайте запуски с низкой производительностью с помощью политики досрочного завершения. Досрочное завершение улучшает эффективность вычислений.

Чтобы определить, когда должна применяться политика, можно настроить следующие параметры.

  • evaluation_interval: частота применения политики. Каждый раз, когда сценарий обучения регистрирует основную метрику, это считается одним интервалом. Если для evaluation_interval задано значение 1, политика будет применяться каждый раз, когда сценарий обучения сообщает основную метрику. Если evaluation_interval имеет значение 2, политика будет применяться через раз. Если значение для evaluation_interval не указано, по умолчанию используется 1.
  • delay_evaluation: задерживает первую оценку политики для определенного количества интервалов. Это необязательный параметр, разрешающий запускать все конфигурации с минимальным количеством интервалов, что позволяет избежать преждевременного завершения обучающих запусков. Если этот параметр указан, политика применяет каждое кратное значение evaluation_interval, которое больше или равно delay_evaluation.

Машинное обучение Azure поддерживает следующие политики досрочного завершения.

Политика Bandit

Политика Bandit основывается на коэффициенте или величине резервирования и интервале оценки. Политика Bandit завершает запуски, когда основная метрика выходит за пределы указанного коэффициента или величины резервирования для наиболее успешного запуска.

Примечание.

Байесовская выборка не поддерживает досрочное завершение. При использовании байесовской выборки задайте early_termination_policy = None.

Укажите следующие параметры конфигурации.

  • slack_factor или slack_amount: резерв времени, допустимый в отношении обучающего прогона с самой высокой эффективностью. slack_factor задает допустимый резерв времени как коэффициент. slack_amount указывает допустимый резерв времени как абсолютную величину, а не коэффициент.

    Например, рассмотрим политику Bandit, применяемую с интервалом 10. Предположим, что наиболее эффективный запуск с интервалом 10 сообщил основную метрику 0,8 с целью ее максимизации. Если в политике задано значение slack_factor, равное 0,2, то все обучающие запуски, лучшая метрика которых в интервале 10 меньше 0,66 (0,8/(1+slack_factor)), будут завершены.

  • evaluation_interval (необязательно): частота применения политики.

  • delay_evaluation (необязательно): задерживает первую оценку политики для определенного количества интервалов.

from azureml.train.hyperdrive import BanditPolicy
early_termination_policy = BanditPolicy(slack_factor = 0.1, evaluation_interval=1, delay_evaluation=5)

В этом примере политика раннего завершения применяется в каждом интервале, когда указываются метрики, начиная с оценочного интервала 5. Любой прогон, лучшая метрика которого меньше (1/(1+0,1)) или соответствует 91 % от наилучшего прогона, будет завершен.

Политика медианной остановки

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

Она принимает следующие параметры конфигурации:

  • evaluation_interval: частота применения политики (необязательный параметр).
  • delay_evaluation: задерживает первую оценку политики для определенного количества интервалов (необязательный параметр).
from azureml.train.hyperdrive import MedianStoppingPolicy
early_termination_policy = MedianStoppingPolicy(evaluation_interval=1, delay_evaluation=5)

В этом примере политика раннего завершения применяется в каждом интервале, начиная с оценочного интервала 5. Запуск останавливается на интервале 5, если его лучшая основная метрика хуже, чем медиана средних показателей за интервалы 1:5 во всех обучающих прогонах.

Политика выбора усечения

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

Она принимает следующие параметры конфигурации:

  • truncation_percentage: процент прогонов с наименьшей эффективностью, которые будут завершены в каждом интервале оценки. Укажите целое число от 1 до 99.
  • evaluation_interval (необязательно): частота применения политики.
  • delay_evaluation (необязательно): задерживает первую оценку политики для определенного количества интервалов.
  • exclude_finished_jobs: указывает, следует ли исключать завершенные задания при применении политики.
from azureml.train.hyperdrive import TruncationSelectionPolicy
early_termination_policy = TruncationSelectionPolicy(evaluation_interval=1, truncation_percentage=20, delay_evaluation=5, exclude_finished_jobs=true)

В этом примере политика раннего завершения применяется в каждом интервале, начиная с оценочного интервала 5. Прогон завершается в интервале 5, если по эффективности в этом интервале он входит в число 20 % прогонов с наихудшей эффективностью в интервале 5 и исключены завершенные задания при применении политики.

Без политики завершения (по умолчанию)

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

policy=None

Выбор политики досрочного завершения

  • Если требуется консервативная политика, которая обеспечит экономию без прерывания запланированных заданий, рассмотрите политику медианной остановки со значениями evaluation_interval 1 и delay_evaluation 5. Это консервативные настройки, которые могут обеспечить экономию приблизительно 25–35 % без потерь по основной метрике (на основе наших оценочных данных).
  • Для более агрессивной экономии используйте политику Bandit с меньшим допустимым резервом времени или политику выбора усечения с большим процентом усечения.

Создание и назначение ресурсов

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

  • max_total_runs: максимальное количество обучающих запусков. Требуется целое число от 1 до 1000.
  • max_duration_minutes (необязательно): максимальная продолжительность эксперимента по настройке гиперпараметров в минутах. Выполняется после отмены этой длительности.

Примечание.

Если указаны одновременно параметры max_total_runs и max_duration_minutes, эксперимент по настройке гиперпараметров прекращается при достижении первого из двух пороговых значений.

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

  • max_concurrent_runs (необязательно): максимальное количество запусков, которые могут выполняться параллельно. Если значение не указано, все запуски запускаются параллельно. Значение должно быть целым числом от 1 до 100.

Примечание.

Количество параллельных прогонов зависит от ресурсов, доступных в заданном целевом объекте вычисления. Убедитесь, что целевой объект вычислений имеет доступные ресурсы для требуемого уровня параллелизма.

max_total_runs=20,
max_concurrent_runs=4

Этот код настраивает эксперимент по настройке гиперпараметров с максимальным числом в 20 запусков и одновременной проверкой не более 4 конфигураций.

Конфигурация эксперимента по настройке гиперпараметров

Чтобы задать конфигурацию для эксперимента по настройке гиперпараметров, укажите следующее:

  • заданное пространство поиска гиперпараметров;
  • политику досрочного завершения;
  • основную метрику;
  • параметры выделения ресурсов;
  • сценарий ScriptRunConfig script_run_config.

ScriptRunConfig — это обучающий сценарий, который будет запускаться с гиперпараметрами в выборке. Он определяет ресурсы для каждого задания (в одном или нескольких узлах) и целевой объект вычислений, который нужно использовать.

Примечание.

Целевой объект вычислений, используемый в script_run_config, должен иметь достаточно ресурсов для соответствия вашему уровню параллелизма. Дополнительные сведения о ScriptRunConfig см. в разделе Настройка обучающих запусков.

Конфигурация эксперимента по настройке гиперпараметров:

from azureml.train.hyperdrive import HyperDriveConfig
from azureml.train.hyperdrive import RandomParameterSampling, BanditPolicy, uniform, PrimaryMetricGoal

param_sampling = RandomParameterSampling( {
        'learning_rate': uniform(0.0005, 0.005),
        'momentum': uniform(0.9, 0.99)
    }
)

early_termination_policy = BanditPolicy(slack_factor=0.15, evaluation_interval=1, delay_evaluation=10)

hd_config = HyperDriveConfig(run_config=script_run_config,
                             hyperparameter_sampling=param_sampling,
                             policy=early_termination_policy,
                             primary_metric_name="accuracy",
                             primary_metric_goal=PrimaryMetricGoal.MAXIMIZE,
                             max_total_runs=100,
                             max_concurrent_runs=4)

HyperDriveConfig задает параметры, передаваемые в объект ScriptRunConfig script_run_config. script_run_config, в свою очередь, передает параметры в сценарий обучения. Приведенный выше фрагмент кода взят из примера записной книжки Обучение, настройка гиперпараметров и развертывание с помощью PyTorch. В этом примере будут настраиваться параметры learning_rate и momentum. Досрочная остановка запусков будет определяться BanditPolicy, которая останавливает запуск, основная метрика которого выходит за пределы slack_factor (см. Справочник по классу BanditPolicy).

В следующем примере кода показано, как настраиваемые значения получать, анализировать и передавать в функцию fine_tune_model сценария обучения.

# from pytorch_train.py
def main():
    print("Torch version:", torch.__version__)

    # get command-line arguments
    parser = argparse.ArgumentParser()
    parser.add_argument('--num_epochs', type=int, default=25,
                        help='number of epochs to train')
    parser.add_argument('--output_dir', type=str, help='output directory')
    parser.add_argument('--learning_rate', type=float,
                        default=0.001, help='learning rate')
    parser.add_argument('--momentum', type=float, default=0.9, help='momentum')
    args = parser.parse_args()

    data_dir = download_data()
    print("data directory is: " + data_dir)
    model = fine_tune_model(args.num_epochs, data_dir,
                            args.learning_rate, args.momentum)
    os.makedirs(args.output_dir, exist_ok=True)
    torch.save(model, os.path.join(args.output_dir, 'model.pt'))

Важно!

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

Отправка эксперимента по настройке параметров

Завершив подготовку конфигурации для настройки гиперпараметров, отправьте этот эксперимент на выполнение:

from azureml.core.experiment import Experiment
experiment = Experiment(workspace, experiment_name)
hyperdrive_run = experiment.submit(hd_config)

Теплый запуск настройки гиперпараметров (необязательно)

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

Теплый запуск обрабатывается по-разному в зависимости от метода выборки.

  • Байесовская выборка: пробные версии из предыдущего запуска используются в качестве предварительных знаний для отбора новых выборок и улучшения основной метрики.
  • Случайная выборка или решетчатая выборка: досрочное завершение использует знания из предыдущих запусков для определения неэффективных запусков.

Укажите список родительских запусков, с которых вы хотите начать теплый запуск.

from azureml.train.hyperdrive import HyperDriveRun

warmstart_parent_1 = HyperDriveRun(experiment, "warmstart_parent_run_ID_1")
warmstart_parent_2 = HyperDriveRun(experiment, "warmstart_parent_run_ID_2")
warmstart_parents_to_resume_from = [warmstart_parent_1, warmstart_parent_2]

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

Обучающий запуск должен использовать ту же конфигурацию гиперпараметров и подключить папки выходных данных. Сценарий обучения должен принимать аргумент resume-from, содержащий файлы контрольной точки или модели, с которых следует возобновить обучающий запуск. Вы можете возобновить отдельные обучающие запуски, используя следующий фрагмент кода:

from azureml.core.run import Run

resume_child_run_1 = Run(experiment, "resume_child_run_ID_1")
resume_child_run_2 = Run(experiment, "resume_child_run_ID_2")
child_runs_to_resume = [resume_child_run_1, resume_child_run_2]

Вы можете настроить эксперимент по настройке гиперпараметров для теплого запуска из предыдущего эксперимента или возобновить отдельные обучающие запуски обучения с помощью необязательных параметров resume_from и resume_child_runs в конфигурации:

from azureml.train.hyperdrive import HyperDriveConfig

hd_config = HyperDriveConfig(run_config=script_run_config,
                             hyperparameter_sampling=param_sampling,
                             policy=early_termination_policy,
                             resume_from=warmstart_parents_to_resume_from,
                             resume_child_runs=child_runs_to_resume,
                             primary_metric_name="accuracy",
                             primary_metric_goal=PrimaryMetricGoal.MAXIMIZE,
                             max_total_runs=100,
                             max_concurrent_runs=4)

Визуализация запусков настройки гиперпараметров

Вы можете визуализировать запуски настройки гиперпараметров в Студии машинного обучения Azure или использовать мини-приложение записной книжки.

Студия

Вы можете визуализировать все запуски настройки гиперпараметров в Студии машинного обучения Azure. Дополнительные сведения о просмотре эксперимента на портале см. в разделе Просмотр записей о выполнении в студии.

  • Диаграмма метрик. Эта визуализация отслеживает метрики, зарегистрированные для каждого дочернего запуска HyperDrive в течение времени настройки гиперпараметров. Каждая линия представляет собой дочерний запуск, и каждая точка измеряет значение первичной метрики в этой итерации среды выполнения.

    Hyperparameter tuning metrics chart

  • Диаграмма с параллельными координатами. Эта визуализация показывает корреляцию между производительностью основной метрики и значениями отдельных гиперпараметров. Диаграмма является интерактивной. Вы можете перемещать оси (щелкните метку оси и перетаскивайте) и выделять значения по одной оси (щелкните и перетащите по вертикали вдоль одной оси, чтобы выделить диапазон нужных значений). Диаграмма с параллельными координатами включает ось в правой части, которая отображает наилучшее значение метрики, соответствующее набору гиперпараметров, заданных для этого экземпляра выполнения. Эта ось предоставляется для проецирования условных обозначений градиента диаграммы на данные более удобочитаемым образом.

    Hyperparameter tuning parallel coordinates chart

  • Двумерная точечная диаграмма. Эта визуализация показывает корреляцию между любыми двумя отдельными гиперпараметрами, а также связанное с ними значение первичной метрики.

    Hyparameter tuning 2-dimensional scatter chart

  • Трехмерная точечная диаграмма. Эта визуализация аналогична двумерной, но на ней можно видеть три измерения корреляции гиперпараметров со значением первичной метрики. Вы также можете щелкнуть и перетащить, чтобы изменить ориентацию диаграммы для просмотра различных корреляций в трехмерном пространстве.

    Hyparameter tuning 3-dimensional scatter chart

Мини-приложение записной книжки

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

from azureml.widgets import RunDetails
RunDetails(hyperdrive_run).show()

Этот код отображает таблицу со сведениями об учебных запусках для каждой из конфигураций гиперпараметров.

Hyperparameter tuning table

Вы также можете визуализировать эффективность каждого прогона в ходе обучения.

Поиск наиболее эффективной модели

Когда все запуски для настройки гиперпараметров будут завершены, вы получите наилучшую конфигурацию и значения гиперпараметров:

best_run = hyperdrive_run.get_best_run_by_primary_metric()
best_run_metrics = best_run.get_metrics()
parameter_values = best_run.get_details()['runDefinition']['arguments']

print('Best Run Id: ', best_run.id)
print('\n Accuracy:', best_run_metrics['accuracy'])
print('\n learning rate:',parameter_values[3])
print('\n keep probability:',parameter_values[5])
print('\n batch size:',parameter_values[7])

Пример записной книжки

См. записные книжки train-hyperparameter-* в этой папке:

Узнайте, как запускать записные книжки, следуя указаниям из статьи Использование записных книжек Jupyter в Машинном обучении Azure.

Следующие шаги