หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

การปรับแต่งพารามิเตอร์ Hyperparameter ด้วย HParams Dashboard

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub

เมื่อสร้างแบบจำลองการเรียนรู้ของเครื่องคุณต้องเลือก พารามิเตอร์ หลายตัวเช่นอัตราการออกกลางคันในชั้นหรืออัตราการเรียนรู้ การตัดสินใจเหล่านี้ส่งผลกระทบต่อตัวแบบตัวอย่างเช่นความแม่นยำ ดังนั้นขั้นตอนสำคัญในกระบวนการเรียนรู้ของเครื่องคือการระบุพารามิเตอร์ที่ดีที่สุดสำหรับปัญหาของคุณซึ่งมักเกี่ยวข้องกับการทดลอง กระบวนการนี้เรียกว่า "การเพิ่มประสิทธิภาพพารามิเตอร์ Hyperparameter" หรือ "การปรับพารามิเตอร์ Hyperparameter"

แดชบอร์ด HParams ใน TensorBoard มีเครื่องมือมากมายที่จะช่วยในกระบวนการระบุการทดสอบที่ดีที่สุดหรือชุดพารามิเตอร์ไฮเปอร์พารามิเตอร์ที่ดีที่สุด

บทช่วยสอนนี้จะเน้นที่ขั้นตอนต่อไปนี้:

  1. การตั้งค่าการทดสอบและสรุป HParams
  2. Adapt 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 ขั้นตอนนี้เป็นทางเลือก: คุณสามารถให้ข้อมูลโดเมนเพื่อเปิดใช้งานการกรองไฮเปอร์พารามิเตอร์ที่แม่นยำยิ่งขึ้นใน 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]

2. Adapt TensorFlow ทำงานเพื่อบันทึกไฮเปอร์พารามิเตอร์และตัวชี้วัด

แบบจำลองนั้นจะค่อนข้างง่าย: สองชั้นที่มีความหนาแน่นและมีชั้นกลางคัน รหัสการฝึกอบรมจะดูคุ้นเคยแม้ว่าพารามิเตอร์ไฮเปอร์จะไม่ถูกเข้ารหัสอีกต่อไป แต่จะมีการจัด hparams พจนานุกรม 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. แสดงผลลัพธ์ในปลั๊กอิน HParams ของ TensorBoard

สามารถเปิดแดชบอร์ด HParams ได้แล้ว เริ่ม TensorBoard และคลิกที่ "HParams" ที่ด้านบน

 %tensorboard --logdir logs/hparam_tuning
 

บานหน้าต่างด้านซ้ายของแดชบอร์ดมีความสามารถในการกรองที่ใช้งานได้ในทุกมุมมองในแดชบอร์ด HParams:

  • กรองว่าไฮเปอร์พารามิเตอร์ / ตัวชี้วัดใดที่จะแสดงในแดชบอร์ด
  • กรองว่าพารามิเตอร์ hyperparameter / metrics ใดที่จะแสดงในแดชบอร์ด
  • กรองสถานะการทำงาน (กำลังรันสำเร็จ / ... )
  • จัดเรียงตามพารามิเตอร์ / เมตริกในมุมมองตาราง
  • จำนวนกลุ่มเซสชันที่จะแสดง (มีประโยชน์สำหรับประสิทธิภาพเมื่อมีการทดสอบจำนวนมาก)

แผงควบคุม HParams มีมุมมองที่แตกต่างกันสามมุมมองพร้อมข้อมูลที่เป็นประโยชน์มากมาย:

  • มุมมองตาราง แสดงการวิ่ง, พารามิเตอร์ไฮเปอร์และตัวชี้วัด
  • มุมมองพิกัดขนาน แสดงการวิ่งแต่ละครั้งเป็นเส้นที่ผ่านแกนสำหรับแต่ละ hyperparemeter และตัวชี้วัด คลิกและลากเมาส์บนแกนใดก็ได้เพื่อทำเครื่องหมายภูมิภาคซึ่งจะเน้นเฉพาะการวิ่งที่วิ่งผ่าน สิ่งนี้จะมีประโยชน์สำหรับการระบุกลุ่มของพารามิเตอร์หลายตัวที่สำคัญที่สุด สามารถสั่งซื้อแกนเองได้อีกครั้งด้วยการลาก
  • มุมมอง Scatter Plot แสดงแผนการที่เปรียบเทียบแต่ละพารามิเตอร์ / ตัวชี้วัดเปรียบเทียบกับแต่ละตัวชี้วัด สิ่งนี้สามารถช่วยระบุความสัมพันธ์ คลิกและลากเพื่อเลือกพื้นที่ในพล็อตเฉพาะและเน้นเซสชันเหล่านั้นข้ามแปลงอื่น ๆ

คุณสามารถคลิกแถวตาราง, เส้นพิกัดขนานและตลาดจุดกระจายเพื่อดูพล็อตของเมตริกเป็นฟังก์ชันของขั้นตอนการฝึกอบรมสำหรับเซสชันนั้น (แม้ว่าในบทช่วยสอนนี้จะใช้เพียงหนึ่งขั้นตอนเท่านั้นสำหรับการทำงานแต่ละครั้ง)

ในการสำรวจความสามารถเพิ่มเติมของแผงควบคุม 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' ในการทดสอบเหล่านี้