HParams ড্যাশবোর্ডের সাথে হাইপারপ্যারামিটার টিউনিং

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

যখন যন্ত্রচালিত মডেলগুলি নির্মাণ, আপনি বিভিন্ন চয়ন করতে হবে hyperparameters যেমন একটি স্তরে ঝরে পড়া হার বা লার্নিং হার যেমন। এই সিদ্ধান্তগুলি মডেল মেট্রিক্সকে প্রভাবিত করে, যেমন নির্ভুলতা। অতএব, মেশিন লার্নিং কর্মপ্রবাহের একটি গুরুত্বপূর্ণ পদক্ষেপ হল আপনার সমস্যার জন্য সর্বোত্তম হাইপারপ্যারামিটার সনাক্ত করা, যা প্রায়শই পরীক্ষা-নিরীক্ষার সাথে জড়িত। এই প্রক্রিয়াটি "Hyperparameter Optimization" বা "Hyperparameter Tuning" নামে পরিচিত।

TensorBoard-এ HParams ড্যাশবোর্ড সেরা পরীক্ষা বা হাইপারপ্যারামিটারের সবচেয়ে প্রতিশ্রুতিশীল সেট সনাক্তকরণের এই প্রক্রিয়াতে সাহায্য করার জন্য বেশ কিছু সরঞ্জাম সরবরাহ করে।

এই টিউটোরিয়ালটি নিম্নলিখিত পদক্ষেপগুলিতে ফোকাস করবে:

  1. পরীক্ষা সেটআপ এবং HParams সারাংশ
  2. অ্যাডাপ্ট টেনসরফ্লো হাইপারপ্যারামিটার এবং মেট্রিক্স লগ করতে চলে
  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 পরীক্ষার সারাংশ

মডেলে তিনটি হাইপারপ্যারামিটার নিয়ে পরীক্ষা করুন:

  1. প্রথম ঘন স্তরে এককের সংখ্যা
  2. ড্রপআউট স্তরে ঝরে পড়ার হার
  3. অপ্টিমাইজার

চেষ্টা করার জন্য মান তালিকা করুন, এবং টেনসরবোর্ডে একটি পরীক্ষা কনফিগারেশন লগ করুন। এই পদক্ষেপটি ঐচ্ছিক: আপনি 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. হাইপারপ্যারামিটার এবং মেট্রিক্স লগ করার জন্য টেনসরফ্লোকে অ্যাডাপ্ট করুন

মডেলটি বেশ সহজ হবে: তাদের মধ্যে একটি ড্রপআউট স্তর সহ দুটি ঘন স্তর। প্রশিক্ষণ কোডটি পরিচিত দেখাবে, যদিও হাইপারপ্যারামিটারগুলি আর হার্ডকোড করা নেই। পরিবর্তে, 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)

কেরাস মডেলকে প্রশিক্ষণ দেওয়ার সময়, আপনি সরাসরি এইগুলি লেখার পরিবর্তে কলব্যাকগুলি ব্যবহার করতে পারেন:

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 ড্যাশবোর্ডে বিভিন্ন দরকারী তথ্য সহ তিনটি ভিন্ন দৃষ্টিভঙ্গি রয়েছে:

  • ছক দেখুন রান তাদের 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 --logdir logs/hparam_demo

আপনি HParams ড্যাশবোর্ডে বিভিন্ন মতামত চেষ্টা করতে পারেন।

উদাহরণস্বরূপ, সমান্তরাল স্থানাঙ্ক দর্শনে গিয়ে এবং নির্ভুলতা অক্ষে ক্লিক করে এবং টেনে নিয়ে, আপনি সর্বোচ্চ নির্ভুলতার সাথে রান নির্বাচন করতে পারেন। যেহেতু এই রানগুলি অপ্টিমাইজার অক্ষের 'এডাম' এর মধ্য দিয়ে যায়, আপনি উপসংহারে আসতে পারেন যে 'এডাম' এই পরীক্ষাগুলিতে 'এসজিডি'-এর চেয়ে ভাল পারফর্ম করেছে।