このページは Cloud Translation API によって翻訳されました。
Switch to English

HParamsダッシュボードを使用したハイパーパラメータ調整

TensorFlow.orgで見る Google Colabで実行 GitHubでソースを表示する

機械学習モデルを構築するときは、レイヤーのドロップアウト率や学習率など、さまざまなハイパーパラメーターを選択する必要があります。これらの決定は、精度などのモデルメトリックに影響します。したがって、機械学習ワークフローの重要なステップは、実験を伴うことが多い問題に最適なハイパーパラメーターを特定することです。このプロセスは、「ハイパーパラメータの最適化」または「ハイパーパラメータの調整」と呼ばれています。

TensorBoardのHParamsダッシュボードには、最適な実験または最も有望なハイパーパラメータのセットを特定するこのプロセスに役立ついくつかのツールが用意されています。

このチュートリアルでは、次の手順に焦点を当てます。

  1. 実験のセットアップとHParamsの概要
  2. Adapt TensorFlowは、ハイパーパラメーターとメトリックをログに記録するために実行されます
  3. 実行を開始し、すべてを1つの親ディレクトリの下に記録する
  4. TensorBoardのHParamsダッシュボードで結果を視覚化する

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実験の概要

モデル内の3つのハイパーパラメーターを試してみます。

  1. 最初の高密度層のユニット数
  2. ドロップアウトレイヤーのドロップアウト率
  3. オプティマイザ

試す値をリストし、実験構成をTensorBoardに記録します。この手順はオプションです。UIでハイパーパラメータのより正確なフィルタリングを可能にするドメイン情報を提供でき、表示するメトリックを指定できます。

 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] hparams['dropout'] hparams[HP_DROPOUT]です。

2. TensorFlowを実行して、ハイパーパラメータとメトリックをログに記録します

モデルは非常にシンプルになります。2つの密集したレイヤーの間にドロップアウトレイヤーがあります。ハイパーパラメータはハードコードされなくなったものの、トレーニングコードはおなじみのように見えます。代わりに、ハイパーhparamshparams辞書で提供され、トレーニング関数全体で使用されます。

 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.実行を開始し、すべて1つの親ディレクトリの下に記録します

これで、複数の実験を試し、それぞれを異なるハイパーパラメータのセットでトレーニングできます。

簡単にするために、グリッド検索を使用します。離散パラメーターのすべての組み合わせと、実数値パラメーターの下限と上限のみを試してください。より複雑なシナリオでは、各ハイパーパラメータ値をランダムに選択する方が効果的です(これはランダム検索と呼ばれます)。使用できるより高度な方法があります。

数分かかる実験をいくつか実行します。

 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ダッシュボードには3つの異なるビューがあり、さまざまな役立つ情報があります。

  • テーブルビューには、実行、ハイパーパラメーター、およびメトリックが一覧表示されます。
  • Parallel Coordinates Viewは、各ハイパーパメーターとメトリックの軸を通る線として各実行を表示します。任意の軸上でマウスをクリックしてドラッグし、通過するランのみを強調表示する領域をマークします。これは、どのグループのハイパーパラメータが最も重要かを識別するのに役立ちます。軸自体は、ドラッグすることで並べ替えることができます。
  • 散布図ビューには、各ハイパーパラメーター/メトリックを各メトリックと比較するプロットが表示されます。これは、相関関係を識別するのに役立ちます。クリックおよびドラッグして特定のプロットの領域を選択し、他のプロット全体でそれらのセッションを強調表示します。

テーブル行、平行座標線、および散布図市場をクリックすると、そのセッションのトレーニングステップの関数としてメトリックのプロットを表示できます(ただし、このチュートリアルでは、実行ごとに1つのステップのみが使用されます)。

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」よりもパフォーマンスが優れていると結論付けることができます。