Penyetelan Hyperparameter dengan Dasbor HParams

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Ketika membangun belajar mesin model, Anda perlu memilih berbagai hyperparameters , seperti angka putus sekolah di lapisan atau tingkat pembelajaran. Keputusan ini memengaruhi metrik model, seperti akurasi. Oleh karena itu, langkah penting dalam alur kerja pembelajaran mesin adalah mengidentifikasi hyperparameter terbaik untuk masalah Anda, yang sering kali melibatkan eksperimen. Proses ini dikenal sebagai "Optimasi Hyperparameter" atau "Penyetelan Hyperparameter".

Dasbor HParams di TensorBoard menyediakan beberapa alat untuk membantu proses mengidentifikasi eksperimen terbaik atau kumpulan hyperparameter yang paling menjanjikan ini.

Tutorial ini akan fokus pada langkah-langkah berikut:

  1. Penyiapan eksperimen dan ringkasan HParams
  2. Menyesuaikan proses TensorFlow untuk mencatat hyperparameter dan metrik
  3. Mulai jalankan dan catat semuanya di bawah satu direktori induk
  4. Visualisasikan hasilnya di dasbor HParams TensorBoard

Mulailah dengan menginstal TF 2.0 dan memuat ekstensi notebook TensorBoard:

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

Impor TensorFlow dan plugin TensorBoard HParams:

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

Download FashionMNIST dataset dan skala itu:

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. Pengaturan percobaan dan ringkasan percobaan HParams

Percobaan dengan tiga hyperparameter dalam model:

  1. Jumlah unit di lapisan padat pertama
  2. Tingkat putus sekolah di lapisan putus sekolah
  3. Pengoptimal

Cantumkan nilai untuk dicoba, dan buat log konfigurasi eksperimen ke TensorBoard. Langkah ini opsional: Anda dapat memberikan informasi domain untuk mengaktifkan pemfilteran hiperparameter yang lebih tepat di UI, dan Anda dapat menentukan metrik mana yang harus ditampilkan.

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')],
  )

Jika Anda memilih untuk melewatkan langkah ini, Anda dapat menggunakan literal string yang mana pun Anda sebaliknya akan menggunakan HParam nilai: misalnya, hparams['dropout'] bukan hparams[HP_DROPOUT] .

2. Menyesuaikan proses TensorFlow untuk mencatat hyperparameter dan metrik

Modelnya akan sangat sederhana: dua lapisan padat dengan lapisan putus-putus di antaranya. Kode pelatihan akan terlihat familier, meskipun hyperparameters tidak lagi di-hardcode. Sebaliknya, hyperparameters disediakan dalam hparams kamus dan digunakan di seluruh fungsi pelatihan:

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

Untuk setiap proses, catat ringkasan hparams dengan hyperparameters dan akurasi akhir:

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)

Saat melatih model Keras, Anda dapat menggunakan callback alih-alih menulis ini secara langsung:

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

3. Mulai jalankan dan catat semuanya di bawah satu direktori induk

Sekarang Anda dapat mencoba beberapa eksperimen, melatih masing-masing eksperimen dengan kumpulan hyperparameter yang berbeda.

Untuk mempermudah, gunakan pencarian kisi: coba semua kombinasi parameter diskrit dan hanya batas bawah dan atas dari parameter bernilai nyata. Untuk skenario yang lebih kompleks, mungkin lebih efektif untuk memilih setiap nilai hyperparameter secara acak (ini disebut pencarian acak). Ada metode yang lebih canggih yang dapat digunakan.

Jalankan beberapa eksperimen, yang akan memakan waktu beberapa menit:

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. Visualisasikan hasilnya di plugin HParams TensorBoard

Dasbor HParams sekarang dapat dibuka. Mulai TensorBoard dan klik "HParams" di bagian atas.

%tensorboard --logdir logs/hparam_tuning

Panel kiri dasbor menyediakan kemampuan pemfilteran yang aktif di semua tampilan di dasbor HParams:

  • Filter hyperparameter/metrik mana yang ditampilkan di dasbor
  • Filter nilai hyperparameter/metrik mana yang ditampilkan di dasbor
  • Filter status berjalan (berjalan, sukses, ...)
  • Urutkan berdasarkan hyperparameter/metrik dalam tampilan tabel
  • Jumlah grup sesi yang akan ditampilkan (berguna untuk performa saat ada banyak eksperimen)

Dasbor HParams memiliki tiga tampilan berbeda, dengan berbagai informasi berguna:

  • The Table View daftar berjalan, hyperparameters mereka, dan metrik mereka.
  • Paralel Koordinat View menunjukkan masing-masing berjalan sebagai garis akan melalui sumbu untuk setiap hyperparemeter dan metrik. Klik dan seret mouse pada sumbu mana pun untuk menandai wilayah yang hanya akan menyorot lintasan yang melewatinya. Ini dapat berguna untuk mengidentifikasi kelompok hyperparameter mana yang paling penting. Sumbu itu sendiri dapat diatur ulang dengan menyeretnya.
  • The Scatter Plot View menunjukkan plot membandingkan setiap hyperparameter / metrik dengan setiap metrik. Ini dapat membantu mengidentifikasi korelasi. Klik dan seret untuk memilih wilayah dalam plot tertentu dan sorot sesi tersebut di seluruh plot lainnya.

Baris tabel, garis koordinat paralel, dan pasar plot sebar dapat diklik untuk melihat plot metrik sebagai fungsi dari langkah-langkah pelatihan untuk sesi tersebut (walaupun dalam tutorial ini hanya satu langkah yang digunakan untuk setiap proses).

Untuk menjelajahi lebih lanjut kemampuan dasbor HParams, unduh satu set log yang dibuat sebelumnya dengan lebih banyak eksperimen:

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

Lihat log ini di TensorBoard:

%tensorboard --logdir logs/hparam_demo

Anda dapat mencoba tampilan berbeda di dasbor HParams.

Misalnya, dengan membuka tampilan koordinat paralel dan mengklik serta menyeret sumbu akurasi, Anda dapat memilih lintasan dengan akurasi tertinggi. Saat proses ini melewati 'adam' di sumbu pengoptimal, Anda dapat menyimpulkan bahwa 'adam' berkinerja lebih baik daripada 'sgd' pada eksperimen ini.