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

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดโน๊ตบุ๊ค

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

แดชบอร์ด 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 ทำงานเพื่อบันทึกไฮเปอร์พารามิเตอร์และเมตริก

โมเดลจะค่อนข้างง่าย: สองชั้นหนาแน่นโดยมีชั้นเลื่อนระหว่างพวกเขา รหัสการฝึกอบรมจะดูคุ้นเคย แม้ว่าพารามิเตอร์ไฮเปอร์พารามิเตอร์จะไม่ถูกฮาร์ดโค้ดอีกต่อไป แต่ hyperparameters มีไว้ใน 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:

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

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

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

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

หากต้องการสำรวจความสามารถของแดชบอร์ด HParams เพิ่มเติม ให้ดาวน์โหลดชุดบันทึกที่สร้างไว้ล่วงหน้าพร้อมการทดลองเพิ่มเติม:

 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' ในการทดสอบเหล่านี้