Punya pertanyaan? Terhubung dengan komunitas di Forum Kunjungan TensorFlow Forum

Penyetelan Hyperparameter dengan Dasbor HParams

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

Saat membuat model pembelajaran mesin, Anda perlu memilih berbagai hyperparameter , seperti tingkat putus sekolah di sebuah lapisan atau kecepatan pembelajaran. Keputusan ini memengaruhi metrik model, seperti akurasi. Oleh karena itu, langkah penting dalam alur kerja machine learning adalah mengidentifikasi hyperparameter terbaik untuk masalah Anda, yang sering kali melibatkan eksperimen. Proses ini dikenal sebagai "Hyperparameter Optimization" atau "Hyperparameter Tuning".

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. Pengaturan percobaan dan ringkasan HParams
  2. Adaptasi proses TensorFlow ke log hyperparameter dan metrik
  3. Mulai jalankan dan catat semuanya di bawah satu direktori induk
  4. Visualisasikan hasil 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

Unduh set data FashionMNIST dan skalakan :

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

Bereksperimen dengan tiga hyperparameter dalam model:

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

Buat daftar nilai yang akan dicoba, dan buat log konfigurasi eksperimen ke TensorBoard. Langkah ini opsional: Anda dapat memberikan informasi domain untuk mengaktifkan pemfilteran hyperparameter 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 melewati langkah ini, Anda dapat menggunakan literal string di mana pun Anda akan menggunakan nilai HParam : misalnya, hparams['dropout'] daripada hparams[HP_DROPOUT] .

2. Adaptasi proses TensorFlow ke log hyperparameter dan metrik

Modelnya akan sangat sederhana: dua lapisan padat dengan lapisan putus-putus di antara keduanya. Kode pelatihan akan terlihat familier, meskipun hyperparameter tidak lagi di-hardcode. Sebagai gantinya, hyperparameter disediakan dalam kamus hparams 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 hparam dengan hyperparameter 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 berjalan dan catat semuanya di bawah satu direktori induk

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

Untuk kesederhanaan, 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 maju 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 hasil 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 kinerja saat ada banyak eksperimen)

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

  • Tampilan Tabel mencantumkan proses, hyperparameternya, dan metriknya.
  • Tampilan Koordinat Paralel menunjukkan setiap proses sebagai garis yang melalui sumbu untuk setiap hyperparemeter dan metrik. Klik dan seret mouse pada sumbu mana pun untuk menandai wilayah yang hanya akan menyorot jalur yang melewatinya. Ini dapat berguna untuk mengidentifikasi grup hyperparameter mana yang paling penting. Sumbu itu sendiri dapat diatur ulang dengan menyeretnya.
  • Tampilan Scatter Plot menunjukkan plot yang membandingkan setiap hyperparameter / metrik dengan setiap metrik. Ini dapat membantu mengidentifikasi korelasi. Klik dan seret untuk memilih wilayah di plot tertentu dan menyorot sesi tersebut di plot lainnya.

Baris tabel, garis koordinat paralel, dan pasar scatter plot 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 mempelajari lebih lanjut kapabilitas 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 berbagai tampilan di dasbor HParams.

Misalnya, dengan membuka tampilan koordinat paralel dan mengklik serta menarik sumbu akurasi, Anda dapat memilih proses dengan akurasi tertinggi. Karena proses ini melewati 'adam' dalam sumbu pengoptimal, Anda dapat menyimpulkan bahwa 'adam' berkinerja lebih baik daripada 'sgd' pada percobaan ini.