Эта страница была переведа с помощью Cloud Translation API.
Switch to English

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

Посмотреть на TensorFlow.org Запустить в Google Colab Посмотреть источник на GitHub

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

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

Этот учебник будет сосредоточен на следующих шагах:

  1. Настройка эксперимента и сводка HParams
  2. Адаптируйте прогоны 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 имеет три разных представления с различной полезной информацией:

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

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

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

 %%bash
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'.