Настройка гиперпараметров с помощью панели инструментов HParams

Посмотреть на TensorFlow.org Запускаем в Google Colab Посмотреть исходный код на GitHub Скачать блокнот

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

Панель управления HParams в TensorBoard предоставляет несколько инструментов, помогающих в этом процессе определения лучшего эксперимента или наиболее многообещающих наборов гиперпараметров.

В этом руководстве основное внимание уделяется следующим шагам:

  1. Настройка эксперимента и сводка HParams
  2. Запускается Adapt TensorFlow для регистрации гиперпараметров и показателей.
  3. Запускайте запуски и регистрируйте их все в одном родительском каталоге.
  4. Визуализируйте результаты на панели инструментов HParams TensorBoard

Начните с установки TF 2.0 и загрузки расширения для ноутбука TensorBoard:

# Load the TensorBoard notebook extension
%load_ext tensorboard
# Clear any logs from previous runs
rm -rf ./logs/

Импортируйте TensorFlow и плагин TensorBoard HParams:

import tensorflow as tf
from tensorboard.plugins.hparams import api as hp

Скачать FashionMNIST набор данных и его масштаб:

fashion_mnist = tf.keras.datasets.fashion_mnist

(x_train, y_train),(x_test, y_test) = fashion_mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step

1. Схема эксперимента и сводка эксперимента HParams.

Поэкспериментируйте с тремя гиперпараметрами в модели:

  1. Количество единиц в первом плотном слое
  2. Показатель отсева в отсеве слоя
  3. Оптимизатор

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

HP_NUM_UNITS = hp.HParam('num_units', hp.Discrete([16, 32]))
HP_DROPOUT = hp.HParam('dropout', hp.RealInterval(0.1, 0.2))
HP_OPTIMIZER = hp.HParam('optimizer', hp.Discrete(['adam', 'sgd']))

METRIC_ACCURACY = 'accuracy'

with tf.summary.create_file_writer('logs/hparam_tuning').as_default():
  hp.hparams_config(
    hparams=[HP_NUM_UNITS, HP_DROPOUT, HP_OPTIMIZER],
    metrics=[hp.Metric(METRIC_ACCURACY, display_name='Accuracy')],
  )

Если вы решили пропустить этот шаг, вы можете использовать строковый литерал , где вы бы в противном случае использовать HParam значение: например, hparams['dropout'] вместо hparams[HP_DROPOUT] .

2. Адаптируйте запуски TensorFlow для регистрации гиперпараметров и показателей.

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

def train_test_model(hparams):
  model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(hparams[HP_NUM_UNITS], activation=tf.nn.relu),
    tf.keras.layers.Dropout(hparams[HP_DROPOUT]),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax),
  ])
  model.compile(
      optimizer=hparams[HP_OPTIMIZER],
      loss='sparse_categorical_crossentropy',
      metrics=['accuracy'],
  )

  model.fit(x_train, y_train, epochs=1) # Run with 1 epoch to speed things up for demo purposes
  _, accuracy = model.evaluate(x_test, y_test)
  return accuracy

Для каждого прогона регистрируйте сводку hparams с гиперпараметрами и окончательной точностью:

def run(run_dir, hparams):
  with tf.summary.create_file_writer(run_dir).as_default():
    hp.hparams(hparams)  # record the values used in this trial
    accuracy = train_test_model(hparams)
    tf.summary.scalar(METRIC_ACCURACY, accuracy, step=1)

При обучении моделей Keras вы можете использовать обратные вызовы вместо того, чтобы писать их напрямую:

model.fit(
    ...,
    callbacks=[
        tf.keras.callbacks.TensorBoard(logdir),  # log metrics
        hp.KerasCallback(logdir, hparams),  # log hparams
    ],
)

3. Запустите запуски и зарегистрируйте их все в одном родительском каталоге.

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

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

Проведите несколько экспериментов, которые займут несколько минут:

session_num = 0

for num_units in HP_NUM_UNITS.domain.values:
  for dropout_rate in (HP_DROPOUT.domain.min_value, HP_DROPOUT.domain.max_value):
    for optimizer in HP_OPTIMIZER.domain.values:
      hparams = {
          HP_NUM_UNITS: num_units,
          HP_DROPOUT: dropout_rate,
          HP_OPTIMIZER: optimizer,
      }
      run_name = "run-%d" % session_num
      print('--- Starting trial: %s' % run_name)
      print({h.name: hparams[h] for h in hparams})
      run('logs/hparam_tuning/' + run_name, hparams)
      session_num += 1
--- Starting trial: run-0
{'num_units': 16, 'dropout': 0.1, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 62us/sample - loss: 0.6872 - accuracy: 0.7564
10000/10000 [==============================] - 0s 35us/sample - loss: 0.4806 - accuracy: 0.8321
--- Starting trial: run-1
{'num_units': 16, 'dropout': 0.1, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 54us/sample - loss: 0.9428 - accuracy: 0.6769
10000/10000 [==============================] - 0s 36us/sample - loss: 0.6519 - accuracy: 0.7770
--- Starting trial: run-2
{'num_units': 16, 'dropout': 0.2, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 60us/sample - loss: 0.8158 - accuracy: 0.7078
10000/10000 [==============================] - 0s 36us/sample - loss: 0.5309 - accuracy: 0.8154
--- Starting trial: run-3
{'num_units': 16, 'dropout': 0.2, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 50us/sample - loss: 1.1465 - accuracy: 0.6019
10000/10000 [==============================] - 0s 36us/sample - loss: 0.7007 - accuracy: 0.7683
--- Starting trial: run-4
{'num_units': 32, 'dropout': 0.1, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 65us/sample - loss: 0.6178 - accuracy: 0.7849
10000/10000 [==============================] - 0s 38us/sample - loss: 0.4645 - accuracy: 0.8395
--- Starting trial: run-5
{'num_units': 32, 'dropout': 0.1, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 55us/sample - loss: 0.8989 - accuracy: 0.6896
10000/10000 [==============================] - 0s 37us/sample - loss: 0.6335 - accuracy: 0.7853
--- Starting trial: run-6
{'num_units': 32, 'dropout': 0.2, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 64us/sample - loss: 0.6404 - accuracy: 0.7782
10000/10000 [==============================] - 0s 37us/sample - loss: 0.4802 - accuracy: 0.8265
--- Starting trial: run-7
{'num_units': 32, 'dropout': 0.2, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 54us/sample - loss: 0.9633 - accuracy: 0.6703
10000/10000 [==============================] - 0s 36us/sample - loss: 0.6516 - accuracy: 0.7755

4. Визуализируйте результаты в плагине TensorBoard HParams.

Теперь можно открыть панель управления HParams. Запустите TensorBoard и нажмите «HParams» вверху.

%tensorboard --logdir logs/hparam_tuning

Левая панель панели инструментов предоставляет возможности фильтрации, которые активны во всех представлениях панели мониторинга HParams:

  • Отфильтруйте, какие гиперпараметры / метрики отображаются на панели инструментов
  • Отфильтруйте, какие значения гиперпараметров / показателей отображаются на панели управления
  • Фильтр по статусу выполнения (выполняется, успешно, ...)
  • Сортировать по гиперпараметрам / метрике в виде таблицы
  • Количество групп сеансов для отображения (полезно для производительности при большом количестве экспериментов)

Панель управления HParams имеет три разных представления с различной полезной информацией:

  • Table View список трасс, их гиперпараметры, и их показатели.
  • Параллельная Координаты View показывает каждый прогон как линии , проходящей через ось для каждого hyperparemeter и метрики. Щелкните и перетащите мышь по любой оси, чтобы отметить область, которая будет выделять только проходы, которые проходят через нее. Это может быть полезно для определения наиболее важных групп гиперпараметров. Сами оси можно изменить, перетащив их.
  • Разброс земля вид показывает графики , сравнивающие каждый гиперпараметр / метрический с каждой метрикой. Это может помочь выявить корреляции. Щелкните и перетащите, чтобы выбрать регион на конкретном графике и выделить эти сеансы на других графиках.

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

Для дальнейшего изучения возможностей приборной панели HParams загрузите набор предварительно сгенерированных журналов с дополнительными экспериментами:

wget -q 'https://storage.googleapis.com/download.tensorflow.org/tensorboard/hparams_demo_logs.zip'
unzip -q hparams_demo_logs.zip -d logs/hparam_demo

Просмотрите эти журналы в TensorBoard:

%tensorboard --logdir logs/hparam_demo

Вы можете опробовать различные представления на панели инструментов HParams.

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