이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

HParams 대시 보드를 사용한 하이퍼 파라미터 튜닝

TensorFlow.org에서보기 Google Colab에서 실행 GitHub에서 소스보기

기계 학습 모델을 구축 할 때는 레이어의 드롭 아웃 률 또는 학습률과 같은 다양한 하이퍼 파라미터 를 선택해야합니다. 이러한 결정은 정확도와 같은 모델 메트릭에 영향을줍니다. 따라서 머신 러닝 워크 플로에서 중요한 단계는 문제에 가장 적합한 하이퍼 파라미터를 식별하는 것입니다. 여기에는 종종 실험이 포함됩니다. 이 프로세스를 "하이퍼 파라미터 최적화"또는 "하이퍼 파라미터 튜닝"이라고합니다.

TensorBoard의 HParams 대시 보드는 최상의 실험 또는 가장 유망한 하이퍼 파라미터 세트를 식별하는이 프로세스에 도움이되는 몇 가지 도구를 제공합니다.

이 학습서는 다음 단계에 중점을 둡니다.

  1. 실험 설정 및 HParams 요약
  2. 하이퍼 파라미터 및 메트릭을 기록하기 위해 TensorFlow 실행 실행
  3. 실행을 시작하고 하나의 상위 디렉토리에 모두 기록하십시오.
  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[HP_DROPOUT] 대신 hparams['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 대시 보드에는 다양한 유용한 정보가 포함 된 세 가지보기가 있습니다.

  • 테이블보기 에는 런, 하이퍼 파라미터 및 메트릭이 나열됩니다.
  • Parallel Coordinates 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 대시 보드에서 다른보기를 시도 할 수 있습니다.

예를 들어, 평행 좌표보기로 이동하여 정확도 축을 클릭하고 끌어서 정확도가 가장 높은 런을 선택할 수 있습니다. 이러한 실행이 옵티 마이저 축에서 '아담'을 통과함에 따라이 실험에서 '아담'이 'sgd'보다 더 나은 것으로 결론을 내릴 수 있습니다.