"ВведениеКогда мы создаем модель Keras и начинаем обучение, мы обычно указываем значения некоторых гиперпараметров (таких как скорость обучения) для управления процессом обучения, и значения этих гиперпараметров будут иметь большое влияние на результаты обучение модели, поэтому очень важным шагом в рабочем процессе машинного обучения является определение оптимального значения гиперпараметров модели, то есть настройка гиперпараметров. В TensorFlow мы можем легко выполнить этот процесс настройки с помощью плагина HParams.
что такое гиперпараметры
Модели машинного обучения и глубокого обучения часто содержат тысячи параметров, некоторые из которых можно оптимизировать с помощью обучения модели и алгоритмов обратного распространения, таких как веса в модели (weights
) и отклонение (bias
) и так далее, мы называем параметры (parameters
). Есть также некоторые параметры, которые нельзя оптимизировать с помощью обучения модели, например, скорость обучения (learning rate
), скрытые слои в глубоких нейронных сетях (hidden layers
) и нейроны скрытого слоя (hidden units
) и так далее, мы называем гиперпараметры (hyper parameters
).
Гиперпараметры используются для настройки процесса обучения всей модели, они являются лишь конфигурационными переменными и непосредственно в процессе обучения не участвуют, поэтому нужно постоянно корректировать и стараться, чтобы эффект модели был оптимальным. Следует отметить, что во время обучающей итерации параметры постоянно обновляются, а гиперпараметры остаются постоянными.
В общем, мы выберем оптимальную комбинацию гиперпараметров в соответствии с размером потерь модели на обучающем наборе и проверочном наборе, а также предопределенными показателями оценки и, наконец, применим этот набор гиперпараметров к формальному обучению и онлайн.Serving
Служить.
Стратегии настройки гиперпараметров
Как правило, в модели много гиперпараметров, и каждый гиперпараметр также будет иметь много значений-кандидатов, образуя большое пространство параметров.Если полагаться только на ручное тестирование поэлементно, затраты времени и энергии, несомненно, огромны, поэтому существует множество автоматических методы испытаний, предложен алгоритм настройки параметров.
В настоящее время наиболее часто используемые стратегии автоматической настройки гиперпараметров включают поиск по сетке (grid search
) и случайный поиск (random search
) Ждать.
поиск по сетке
-
Поиск по сетке означает проверку всех комбинаций гиперпараметров среди всех возможных значений гиперпараметров и выбор комбинации гиперпараметров, которая максимизирует эффект модели, в качестве окончательного решения.
-
Например, модель имеет
2
гиперпараметры, каждый из которых имеет3
значения-кандидаты, то все комбинации гиперпараметров имеют3*3=9
виды, поиск по сетке будет пробовать все9
Сгруппируйте гиперпараметры и выберите из них наилучшую комбинацию. -
Недостатком поиска по сетке является то, что количество оценок обучения модели экспоненциально увеличивается с количеством гиперпараметров и количеством кандидатов в гиперпараметры, что приводит к высокой вычислительной мощности и временным затратам, поэтому он не подходит для гиперпараметров. значений-кандидатов велики.
случайный поиск
-
Случайный поиск относится к выбору случайных комбинаций гиперпараметров для каждой попытки. Он может вручную устанавливать количество попыток, чтобы избежать обхода всего пространства гиперпараметров, тем самым снижая стоимость попыток.
-
По сравнению с поиском по сетке случайный поиск может более эффективно выполнять настройку гиперпараметров, но случайный поиск не может гарантировать возможность выбора оптимальных значений гиперпараметров, что является неопределенным.
Этапы настройки гиперпараметра HParams
TensorFlow
при условииHParams
Плагины, помогающие нам в настройке гиперпараметров,HParams
Плагин поддерживает как поиск по сетке, так и стратегии случайного поиска. Ниже сKeras
Модельное обучение в качестве примера для ознакомления с использованиемHParams
Действия по настройке гиперпараметров.
определить гиперпараметры
-
использовать
HParam
Инициализация класса определяет все гиперпараметры и указывает диапазон гиперпараметров (Domain
).Domain
Есть три типа, один дляIntInterval
представляет непрерывное целочисленное значение,Discrete
Представляет дискретные значения, которые могут быть целыми числами, числами с плавающей запятой, строками и т. д.RealInterval
Представляет последовательные значения с плавающей запятой. -
пример
HP_DEEP_LAYERS = hp.HParam("deep_layers", hp.IntInterval(1, 3))
гиперпараметры, представляющие последовательные целочисленные значения,1
это минимальное значение,3
максимальное значение, а диапазон значений[1, 3]
. -
пример
HP_DEEP_LAYER_SIZE = hp.HParam("deep_layer_size", hp.Discrete([32, 64, 128]))
Представляет гиперпараметр с дискретным значением, который может принимать список параметров (list
) в любом элементе. -
пример
HP_LEARNING_RATE = hp.HParam("learning_rate", hp.RealInterval(0.001, 0.1))
Гиперпараметры, представляющие последовательные значения с плавающей запятой,0.001
это минимальное значение,0.1
максимальное значение, а диапазон значений[0.001, 0.1]
.
Определить показатели оценки
-
использовать
Metric
Класс определяет оценочные метрики, которые мы будем использовать, а оптимальная комбинация гиперпараметров будет выбрана на основе этих метрик позже. -
пример
hp.Metric("epoch_auc", group="validation", display_name="auc (val.)")
Указывает, что используемый индекс оценкиepoch_auc
. Индикатор должен бытьTensorboard
Записанная функция обратного вызова или пользовательский скаляр (scalar
), которые обычно хранятся в файлах журналов и будутHPARAMS
Панель вызывается и отображается. -
Metric
Первый параметр конструктораtag
Указывает имя метрики, для использованияTensorboard
Перезвони (callbacks
) записанные метрики, названия которых обычноepoch_tag
илиbatch_tag
,какepoch_auc
. Для пользовательских показателейtag
тогдаtf.summary.scalar("test_auc", auc, step=1)
Имя, установленное в , здесьtest_auc
. -
Metric
Второй параметр конструктораgroup
Указывает путь хранения индикаторов, таких как обучающие индикаторы, хранящиеся вtrain
каталог, проверенные метрики хранятся вvalidation
каталог, пользовательские метрики могут быть сохранены вtest
каталог и т. д., подробности см. в образце программы. -
Metric
Третий параметр конструктораdisplay_name
указывает на то, что индикаторHPARAMS
Имя, отображаемое на панели.
Настройка HPParams
-
пройти через
hp.hparams_config(hparams=HPARAMS, metrics=METRICS)
Выбираемые гиперпараметры и метрики, используемые для оценки, могут быть установлены по желанию. -
hparams_config
Метод имеет два параметра, которые соответственно представляют все гиперпараметры-кандидаты.HParam
Список (list
) и все показатели оценкиMetric
Список (list
). -
Без этой глобальной настройки
HParams
По умолчанию все записи в модели使用到的
Гиперпараметры и выходные данные модели所有指标值
И вHPARAMS
отображается на панели.
Построить модель гиперпараметров
-
Обычно гиперпараметры определяются как словарь (
dict
) конструктору модели для завершения построения модели. -
Код конструктора модели выглядит так:
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
-
словарь гиперпараметров
key
как определено вышеHParam
объект,value
является значением примитивного типа данных. -
Процесс построения модели такой же, как и при построении общей модели, за исключением того, что исходные фиксированные параметры заменяются параметрами из словаря гиперпараметров.
value
ценность. Конечно, вы также можете предварительно определить настраиваемыйsubclass
модели, а затем передать гиперпараметры в модель, чтобы завершить построение модели более удобно.
обучение модели
-
Необходимо указать при обучении модели
fit
методcallback
параметры должны содержать не толькоTensorboard
функция обратного вызова, также необходимо включитьhp.KerasCallback
Перезвони. -
где первая функция обратного вызова используется для записи потери (
loss
) и индикатор (metrics
), вторая функция обратного вызова используется для записи комбинации гиперпараметров, используемой в этом обучении, и расчета окончательного значения убытка и значения индикатора. -
hp.KerasCallback(logdir, hparams)
Первым параметром является записьHParams
Директория журналов, второй параметр — это словарь гиперпараметров, такой же словарь, который передается в конструктор модели. -
Если несколько сеансов обучения выполняются с определенным набором гиперпараметров, то в конечном итоге
HPARAMS
Результаты, отображаемые на панели, представляют собой среднее значение результатов нескольких оценок.
Визуализируйте результаты настройки
-
если
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
-
в
0
и1
В каталоге хранится набор данных о результатах обучения и проверки гиперпараметров соответственно. -
Результаты обучения и валидации модели (включая
loss
а такжеmetrics
) Воляevents.out.tfevents
файл в видеTensorboard
В каталоге, указанном функцией обратного вызова, в этом примере это0
или1
в каталогеtrain
иvalidation
содержание. -
HParams
Записанный журнал будет сохранен в0
или1
в корневом каталогеevents.out.tfevents
в файле. -
запускать
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
) состоит из серии диаграмм рассеяния ассоциаций гиперпараметров и метрик, которые могут помочь выявить потенциальные связи между гиперпараметрами или между гиперпараметрами и метриками. Как показано ниже:
Меры предосторожности
-
RealInterval
Значение если из0
начать с числа с плавающей запятой0.
представление формы. -
Для каждого набора гиперпараметров требуется независимый процесс обучения, поэтому файлы журналов различных наборов обучения гиперпараметров следует записывать в разные каталоги.
-
При выполнении настройки гиперпараметров метод обучения модели
fit
серединаmetrics
Параметр должен быть задан как строковый или глобальный.Metric
объект. такTensorboard
записаноmetrics
Имена могут быть одинаковыми для нескольких сеансов обучения, напримерepoch_auc
, вместо появленияepoch_auc_1
,epoch_auc_2
эту ситуацию, так чтоHPARAMS
Панель можно получить нормальноmetrics
значение и отобразить его. -
При выполнении случайного поиска гиперпараметров в распределенном обучении необходимо указать генератор псевдослучайных чисел с начальным числом, чтобы каждый
worker
Случайные значения, выбранные узлами, согласованы, чтобы гарантировать, что распределенное обучение может проходить нормально.