דף זה תורגם על ידי Cloud Translation API.
Switch to English

כוונון היפר-פרמטר עם לוח המחוונים של HParams

צפה ב TensorFlow.org הפעל ב- Google Colab צפה במקור ב- GitHub

בבניית מודלים של למידת מכונה, עליכם לבחור יתר פרמטרים שונים, כמו למשל הנשירה בשכבה או קצב הלמידה. החלטות אלה משפיעות על מדדי המודל, כמו דיוק. לפיכך, צעד חשוב בזרימת העבודה של למידת מכונה הוא זיהוי הפרפרמטרים הטובים ביותר לבעיה שלך, הכרוכה לעתים קרובות בניסויים. תהליך זה ידוע בשם "אופטימיזציה של היפר-פרמטרים" או "כוונון היפר-פרמטר".

לוח המחוונים של HParams ב- TensorBoard מספק כמה כלים שיעזרו בתהליך זה לזהות את הניסוי הטוב ביותר או את קבוצות ההיפר פרמטרים המבטיחות ביותר.

מדריך זה יתמקד בשלבים הבאים:

  1. הגדרת ניסוי וסיכום HParams
  2. התאמת TensorFlow פועלת לביצוע פרמטרים היפר ומדדים
  3. התחל פועל ורשום את כולם תחת ספריית אב אחת
  4. דמיינו את התוצאות בלוח המחוונים של HP TamsorBoard של 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

ניסוי עם שלושה פרפרמטרים במודל:

  1. מספר היחידות בשכבה הראשונה הצפופה
  2. שיעור הנשירה בשכבת הנשירה
  3. מיטוב

רשמו את הערכים שיש לנסות, ורשמו תצורת ניסוי ל- TensorBoard. שלב זה הוא אופציונלי: אתה יכול לספק מידע על התחום כדי לאפשר סינון מדויק יותר של פרפרמטר בממשק המשתמש, ותוכל לקבוע אילו ערכים צריכים להיות מוצגים.

 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 מחרוזת בכל מקום שתשתמש אחרת בערך HParam : למשל, hparams['dropout'] במקום hparams[HP_DROPOUT] .

2. התאמת 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 / metric בתצוגת הטבלה
  • מספר קבוצות ההפעלה שיוצגו (שימושי לביצוע כאשר ישנם ניסויים רבים)

לוח המחוונים של HParams כולל שלוש תצוגות שונות, עם מידע שימושי שונה:

  • תצוגת הטבלה מציגה את הריצות, את הפרפרמטר שלהם ואת הערכים שלהם.
  • תצוגת הקואורדינטות המקבילה מציגה כל ריצה כקו העובר דרך ציר עבור כל היפר-קבר ומדד. לחץ וגרור את העכבר על ציר כלשהו כדי לסמן אזור שיבליט רק את הריצות העוברות בו. זה יכול להיות שימושי לזיהוי אילו קבוצות של יתר פרמטרים חשובים ביותר. ניתן להזמין מחדש את הצירים עצמם על ידי גרירתם.
  • תצוגת עלילת הפיזור מציגה עלילות שמשוות בין כל hyperparameter / מדד לכל מדד. זה יכול לעזור בזיהוי מתאם. לחץ וגרור כדי לבחור אזור בעלילה ספציפית ולהדגיש את ההפעלות הללו על פני החלקות האחרות.

ניתן ללחוץ על שורת טבלה, קו קואורדינטות מקביל ושוק עלילת פיזור כדי לראות עלילת המדדים כפונקציה של שלבי אימונים לאותו מפגש (אם כי בהדרכה זו משתמשים רק בצעד אחד לכל הפעלה).

כדי לחקור עוד יותר את היכולות של לוח המחוונים של 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' בניסויים אלה.