Статьи TensorFlow | Настройка гиперпараметров TensorFlow 2.x на основе HParams

TensorFlow

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

что такое гиперпараметры

Модели машинного обучения и глубокого обучения часто содержат тысячи параметров, некоторые из которых можно оптимизировать с помощью обучения модели и алгоритмов обратного распространения, таких как веса в модели (weights) и отклонение (bias) и так далее, мы называем параметры (parameters). Есть также некоторые параметры, которые нельзя оптимизировать с помощью обучения модели, например, скорость обучения (learning rate), скрытые слои в глубоких нейронных сетях (hidden layers) и нейроны скрытого слоя (hidden units) и так далее, мы называем гиперпараметры (hyper parameters).

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

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

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

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

В настоящее время наиболее часто используемые стратегии автоматической настройки гиперпараметров включают поиск по сетке (grid search) и случайный поиск (random search) Ждать.

поиск по сетке

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

  2. Например, модель имеет2гиперпараметры, каждый из которых имеет3значения-кандидаты, то все комбинации гиперпараметров имеют3*3=9виды, поиск по сетке будет пробовать все9Сгруппируйте гиперпараметры и выберите из них наилучшую комбинацию.

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

случайный поиск

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

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

Этапы настройки гиперпараметра HParams

TensorFlowпри условииHParamsПлагины, помогающие нам в настройке гиперпараметров,HParamsПлагин поддерживает как поиск по сетке, так и стратегии случайного поиска. Ниже сKerasМодельное обучение в качестве примера для ознакомления с использованиемHParamsДействия по настройке гиперпараметров.

определить гиперпараметры

  1. использоватьHParamИнициализация класса определяет все гиперпараметры и указывает диапазон гиперпараметров (Domain).DomainЕсть три типа, один дляIntIntervalпредставляет непрерывное целочисленное значение,DiscreteПредставляет дискретные значения, которые могут быть целыми числами, числами с плавающей запятой, строками и т. д.RealIntervalПредставляет последовательные значения с плавающей запятой.

  2. примерHP_DEEP_LAYERS = hp.HParam("deep_layers", hp.IntInterval(1, 3))гиперпараметры, представляющие последовательные целочисленные значения,1это минимальное значение,3максимальное значение, а диапазон значений[1, 3].

  3. примерHP_DEEP_LAYER_SIZE = hp.HParam("deep_layer_size", hp.Discrete([32, 64, 128]))Представляет гиперпараметр с дискретным значением, который может принимать список параметров (list) в любом элементе.

  4. примерHP_LEARNING_RATE = hp.HParam("learning_rate", hp.RealInterval(0.001, 0.1))Гиперпараметры, представляющие последовательные значения с плавающей запятой,0.001это минимальное значение,0.1максимальное значение, а диапазон значений[0.001, 0.1].

Определить показатели оценки

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

  2. примерhp.Metric("epoch_auc", group="validation", display_name="auc (val.)")Указывает, что используемый индекс оценкиepoch_auc. Индикатор должен бытьTensorboardЗаписанная функция обратного вызова или пользовательский скаляр (scalar), которые обычно хранятся в файлах журналов и будутHPARAMSПанель вызывается и отображается.

  3. MetricПервый параметр конструктораtagУказывает имя метрики, для использованияTensorboardПерезвони (callbacks) записанные метрики, названия которых обычноepoch_tagилиbatch_tag,какepoch_auc. Для пользовательских показателейtagтогдаtf.summary.scalar("test_auc", auc, step=1)Имя, установленное в , здесьtest_auc.

  4. MetricВторой параметр конструктораgroupУказывает путь хранения индикаторов, таких как обучающие индикаторы, хранящиеся вtrainкаталог, проверенные метрики хранятся вvalidationкаталог, пользовательские метрики могут быть сохранены вtestкаталог и т. д., подробности см. в образце программы.

  5. MetricТретий параметр конструктораdisplay_nameуказывает на то, что индикаторHPARAMSИмя, отображаемое на панели.

Настройка HPParams

  1. пройти черезhp.hparams_config(hparams=HPARAMS, metrics=METRICS)Выбираемые гиперпараметры и метрики, используемые для оценки, могут быть установлены по желанию.

  2. hparams_configМетод имеет два параметра, которые соответственно представляют все гиперпараметры-кандидаты.HParamСписок (list) и все показатели оценкиMetricСписок (list).

  3. Без этой глобальной настройкиHParamsПо умолчанию все записи в модели使用到的Гиперпараметры и выходные данные модели所有指标值И вHPARAMSотображается на панели.

Построить модель гиперпараметров

  1. Обычно гиперпараметры определяются как словарь (dict) конструктору модели для завершения построения модели.

  2. Код конструктора модели выглядит так:

    def model_fn(hparams):
        model = keras.models.Sequential()
    
        for _ in range(hparams[HP_DEEP_LAYERS]):
            model.add(
                keras.layers.Dense(
                    units=hparams[HP_DEEP_LAYER_SIZE],
                    activation="relu",
                    use_bias=True,
                ))
        model.add(keras.layers.Dense(units=1, activation="sigmoid"))
        model.compile(
            optimizer=tf.keras.optimizers.Adam(
                learning_rate=hparams[HP_LEARNING_RATE]),
            loss=tf.keras.losses.BinaryCrossentropy(),
            metrics=["AUC"],
        )
    
        return model
    
  3. словарь гиперпараметровkeyкак определено вышеHParamобъект,valueявляется значением примитивного типа данных.

  4. Процесс построения модели такой же, как и при построении общей модели, за исключением того, что исходные фиксированные параметры заменяются параметрами из словаря гиперпараметров.valueценность. Конечно, вы также можете предварительно определить настраиваемыйsubclassмодели, а затем передать гиперпараметры в модель, чтобы завершить построение модели более удобно.

обучение модели

  1. Необходимо указать при обучении моделиfitметодcallbackпараметры должны содержать не толькоTensorboardфункция обратного вызова, также необходимо включитьhp.KerasCallbackПерезвони.

  2. где первая функция обратного вызова используется для записи потери (loss) и индикатор (metrics), вторая функция обратного вызова используется для записи комбинации гиперпараметров, используемой в этом обучении, и расчета окончательного значения убытка и значения индикатора.

  3. hp.KerasCallback(logdir, hparams)Первым параметром является записьHParamsДиректория журналов, второй параметр — это словарь гиперпараметров, такой же словарь, который передается в конструктор модели.

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

Визуализируйте результаты настройки

  1. если2Выбор вторичного гиперпараметра, его корневой каталог журналаmlpСтруктура выглядит следующим образом:

    mlp
    ├── 0
    │   ├── events.out.tfevents.1589257272.alexander.4918.34.v2
    │   ├── test
    │   │   └── events.out.tfevents.1589257274.alexander.4918.2418.v2
    │   ├── train
    │   │   └── events.out.tfevents.1589257272.alexander.4918.95.v2
    │   └── validation
    │       └── events.out.tfevents.1589257273.alexander.4918.1622.v2
    ├── 1
    │   ├── events.out.tfevents.1589257274.alexander.4918.2575.v2
    │   ├── test
    │   │   └── events.out.tfevents.1589257275.alexander.4918.4958.v2
    │   ├── train
    │   │   └── events.out.tfevents.1589257274.alexander.4918.2636.v2
    │   └── validation
    │       └── events.out.tfevents.1589257274.alexander.4918.4162.v2
    └── events.out.tfevents.1589257272.alexander.4918.5.v2
    
  2. в0и1В каталоге хранится набор данных о результатах обучения и проверки гиперпараметров соответственно.

  3. Результаты обучения и валидации модели (включаяlossа такжеmetrics) Воляevents.out.tfeventsфайл в видеTensorboardВ каталоге, указанном функцией обратного вызова, в этом примере это0или1в каталогеtrainиvalidationсодержание.

  4. HParamsЗаписанный журнал будет сохранен в0или1в корневом каталогеevents.out.tfeventsв файле.

  5. запускатьTensorboardи указать егоlogdirПараметрыmlp, затем выберитеHPARAMSВы можете увидеть результаты визуальной настройки параметров в панели.

Полный пример настройки гиперпараметров

Пример поиска по сетке

Поиск по сетке должен пройти через все комбинации гиперпараметров, поэтому на этом этапе инициализацииHParamПо возможности следует использовать объекты гиперпараметров.DiscreteТип домена для удобного обхода данных. КонечноIntIntervalиRealIntervalДанные типа домена также можно пройти, указав размер шага.

Если тип домена объекта гиперпараметраIntIntervalиRealInterval, вы можете передать объектdomain.min_valueиdomain.max_valueСвойство получает минимальное и максимальное значения возможных значений гиперпараметра. еслиDiscreteтип, который может бытьdomain.valuesсвойство получает список всех значений-кандидатов для этого гиперпараметра (list).

Пример кода для поиска по сетке показан ниже (этапы поиска см.run_allфункция):

import os
import tensorflow as tf
from tensorflow import keras
from tensorboard.plugins.hparams import api as hp
from absl import app, flags
import shutil
import numpy as np

FLAGS = flags.FLAGS
flags.DEFINE_string("logdir", "mlp", "logs dir")

HP_DEEP_LAYERS = hp.HParam("deep_layers", hp.IntInterval(1, 3))
HP_DEEP_LAYER_SIZE = hp.HParam("deep_layer_size", hp.Discrete([32, 64, 128]))
HP_LEARNING_RATE = hp.HParam("learning_rate", hp.RealInterval(0.001, 0.1))

HPARAMS = [
    HP_DEEP_LAYERS,
    HP_DEEP_LAYER_SIZE,
    HP_LEARNING_RATE,
]

METRICS = [
    hp.Metric(
        "epoch_auc",
        group="validation",
        display_name="auc (val.)",
    ),
    hp.Metric(
        "epoch_loss",
        group="validation",
        display_name="loss (val.)",
    ),
    hp.Metric(
        "batch_auc",
        group="train",
        display_name="auc (train)",
    ),
    hp.Metric(
        "batch_loss",
        group="train",
        display_name="loss (train)",
    ),
    hp.Metric(
        "test_auc",
        group="test",
        display_name="auc (test)",
    ),
]

def model_fn(hparams):
    model = keras.models.Sequential()

    for _ in range(hparams[HP_DEEP_LAYERS]):
        model.add(
            keras.layers.Dense(
                units=hparams[HP_DEEP_LAYER_SIZE],
                activation="relu",
                use_bias=True,
            ))
    model.add(keras.layers.Dense(units=1, activation="sigmoid"))

    model.compile(
        optimizer=tf.keras.optimizers.Adam(
            learning_rate=hparams[HP_LEARNING_RATE]),
        loss=tf.keras.losses.BinaryCrossentropy(),
        metrics=["AUC"],
    )

    return model

def run(data, hparams, base_logdir, session_id):
    model = model_fn(hparams)
    logdir = os.path.join(base_logdir, session_id)

    tensorboard_callback = tf.keras.callbacks.TensorBoard(
        log_dir=logdir,
        update_freq=10,
        profile_batch=0,
    )
    hparams_callback = hp.KerasCallback(logdir, hparams)

    ((x_train, y_train), (x_val, y_val), (x_test, y_test)) = data

    model.fit(
        x=x_train,
        y=y_train,
        epochs=2,
        batch_size=128,
        validation_data=(x_val, y_val),
        callbacks=[tensorboard_callback, hparams_callback],
    )

    test_dir = os.path.join(logdir, "test")
    with tf.summary.create_file_writer(test_dir).as_default():
        _, auc = model.evaluate(x_test, y_test)
        tf.summary.scalar("test_auc", auc, step=1)

def prepare_data():
    x_train, y_train = (
        np.random.rand(6000, 32),
        np.random.randint(2, size=(6000, 1)),
    )

    x_val, y_val = (
        np.random.rand(1000, 32),
        np.random.randint(2, size=(1000, 1)),
    )

    x_test, y_test = (
        np.random.rand(1000, 32),
        np.random.randint(2, size=(1000, 1)),
    )

    return ((x_train, y_train), (x_val, y_val), (x_test, y_test))

def run_all(logdir):
    data = prepare_data()
    with tf.summary.create_file_writer(logdir).as_default():
        hp.hparams_config(hparams=HPARAMS, metrics=METRICS)

    session_index = 0
    for deep_layers in range(HP_DEEP_LAYERS.domain.min_value,
                             HP_DEEP_LAYERS.domain.max_value):
        for deep_layer_size in HP_DEEP_LAYER_SIZE.domain.values:
            for learning_rate in np.arange(HP_LEARNING_RATE.domain.min_value,
                                           HP_LEARNING_RATE.domain.max_value,
                                           0.01):
                hparams = {
                    HP_DEEP_LAYERS: deep_layers,
                    HP_DEEP_LAYER_SIZE: deep_layer_size,
                    HP_LEARNING_RATE: learning_rate,
                }
                session_id = str(session_index)
                session_index += 1
                print("--- Running training session %d" % (session_index))
                hparams_string = str(hparams)
                print(hparams_string)
                run(
                    data=data,
                    hparams=hparams,
                    base_logdir=logdir,
                    session_id=session_id,
                )

def main(argv):
    del argv  # Unused args
    logdir = FLAGS.logdir
    shutil.rmtree(logdir, ignore_errors=True)
    print("Saving output to %s." % logdir)
    run_all(logdir=logdir)
    print("Done. Output saved to %s." % logdir)

if __name__ == "__main__":
    app.run(main)

Пример случайного поиска

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

sample_uniformМетод также может получить файл с начальным числом (seed) генератор псевдослучайных чисел, напримерrandom.Random(seed), что очень важно в процессе настройки гиперпараметров распределенного обучения.Указав один и тот же генератор псевдослучайных чисел, всеworkerКомбинации гиперпараметров, полученные узлами, каждый раз согласуются, что обеспечивает нормальное выполнение распределенного обучения.

случайный поискrun_allЧасть кода показана ниже, другие части кода аналогичны поиску по сетке.

def run_all(logdir):
    data = prepare_data()
    with tf.summary.create_file_writer(logdir).as_default():
        hp.hparams_config(hparams=HPARAMS, metrics=METRICS)

    session_index = 0
    for _ in range(8):
        hparams = {h: h.domain.sample_uniform() for h in HPARAMS}
        hparams_string = str(hparams)
        session_id = str(session_index)
        session_index += 1
        print("--- Running training session %d" % (session_index))
        print(hparams_string)
        run(
            data=data,
            hparams=hparams,
            base_logdir=logdir,
            session_id=session_id,
        )

Панель HPPARAMS

запускатьTensorboard, вы можете увидеть вверху страницыHPARAMSвариант, щелкните этот параметр, чтобы увидетьHPARAMSпанель (Dashboard) вверх.

HPARAMSНа панели есть две панели, левая и правая, левая панель обеспечивает функцию фильтрации, а правая панель обеспечивает функцию визуализации результатов оценки, функции которых описаны ниже.

панель фильтров

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

选择显示某些超参数和指标

панель визуализации

Панель визуализации содержит три представления (view), каждый из которых содержит разную информацию.

вид таблицы (Table View) перечисляет все комбинации гиперпараметров и соответствующие значения каждого показателя в виде таблицы.Также можно нажатьShow Metricsпоказать индикатор какbatchилиepochизменить график тренда. Как показано ниже:

表格视图

Параллельный вид координат (Parallel Coordinates View) состоит из ряда вертикальных осей, представляющих гиперпараметры и метрики. Значение каждого гиперпараметра и соответствующее значение метрики соединены линией. Нажатие на любую строку выделит группу значений.Вы можете использовать мышь, чтобы отметить область на оси координат.В это время будут отображаться только значения в этой области, что очень важно для суждения, какая группа гиперпараметров важнее. Как показано ниже:

平行坐标视图

Представление точечной диаграммы (Scatter Plot View) состоит из серии диаграмм рассеяния ассоциаций гиперпараметров и метрик, которые могут помочь выявить потенциальные связи между гиперпараметрами или между гиперпараметрами и метриками. Как показано ниже:

散点图视图

Меры предосторожности

  1. RealIntervalЗначение если из0начать с числа с плавающей запятой0.представление формы.

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

  3. При выполнении настройки гиперпараметров метод обучения моделиfitсерединаmetricsПараметр должен быть задан как строковый или глобальный.Metricобъект. такTensorboardзаписаноmetricsИмена могут быть одинаковыми для нескольких сеансов обучения, напримерepoch_auc, вместо появленияepoch_auc_1,epoch_auc_2эту ситуацию, так чтоHPARAMSПанель можно получить нормальноmetricsзначение и отобразить его.

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

использованная литература

  1. Hyperparameter Tuning with the HParams Dashboard
  2. Hparams demo