تحسين المعلمات الفائقة باستخدام Optuna
Optuna هي مكتبة Python مفتوحة المصدر لتحسين المعلمات الفائقة. يستخدم Optuna على نطاق واسع لضبط المعلمات الفائقة بكفاءة ومرونة. لاستخدامه عند تدريب نموذج، اتبع الخطوات التالية:
- تحديد دالة موضوعية لتدريب نموذج وتقييمه.
- قم بإنشاء دراسة Optuna لإدارة عملية التحسين.
- قم بتشغيل Optuna Optimization للبحث عن أفضل المعلمات الفائقة.
تعريف دالة موضوعية
يعمل Optuna عن طريق استدعاء دالة الهدف بشكل متكرر ترجع قيمة رقمية ليتم تصغيرها ، وهذا هو هدف التحسين. تحتاج إلى تغليف منطق التدريب والتقييم النموذجي الخاص بك في دالة:
- يقبل معلمة (عادة كائن
trial) تستخدم لاقتراح قيم المعلمات الفائقة. - تدريب نموذج باستخدام قيم المعلمات الفائقة المقترحة.
- تقييم النموذج استنادا إلى مقياس هدف للأداء التنبؤي.
- إرجاع قيمة رقمية تعكس مقياس الأداء، بحيث يؤدي تحسين أداء النموذج إلى تقليل قيمة الإرجاع.
على سبيل المثال ، تقوم الدالة التالية بتدريب نموذج التعلم الآلي باستخدام خوارزمية LogisticRegression من مكتبة Spark MLlib ، مع المعلمات الفائقة التي تقترحها Optuna:
def objective(trial):
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
data_df = get_training_data() # This is just an example!
splits = data_df.randomSplit([0.7, 0.3])
training_df = splits[0]
validation_df = splits[1]
# Suggest hyperparameters using Optuna's trial object
max_iter = trial.suggest_int('Iterations', 1, 10)
reg_param = trial.suggest_float('Regularization', 0.0, 1.0)
# Train a model using the suggested hyperparameters
lr = LogisticRegression(labelCol="label", featuresCol="features",
maxIter=max_iter,
regParam=reg_param)
model = lr.fit(training_df)
# Evaluate the model
predictions = model.transform(validation_df)
eval = MulticlassClassificationEvaluator(labelCol="label",
predictionCol="prediction",
metricName="accuracy")
accuracy = eval.evaluate(predictions)
# Optuna minimizes the objective, so return negative accuracy
return -accuracy
في هذا المثال، المعلمة التجريبية هي كائن Optuna يستخدم لاقتراح قيم للمعلمات الفائقة للتكراراتوالتنظيم الفائق. يتم تعيين هذه القيم لمعلمات maxIter و regParam لخوارزمية الانحدار اللوجستي. تقوم الوظيفة بتقييم دقة النموذج المدرب وإرجاع قيمته السالبة ، بحيث تقوم Optuna بزيادة الدقة عن طريق تقليل القيمة التي تم إرجاعها.
تحديد مساحة البحث hyperparameter
في كل مرة يتم فيها استدعاء الدالة الموضوعية، فإنها تتطلب معلمة تحتوي على قيم المعلمة الفائقة لتجربتها. لاستكشاف مجموعات قيم مختلفة، تحتاج إلى تحديد مساحة بحث ل Optuna لأخذ عينات منها أثناء كل إصدار تجريبي.
يوفر Optuna طرقا على trial الكائن لاقتراح قيم لكل معلمة فائقة ، بما في ذلك:
-
trial.suggest_int(name, low, high)يقترح قيمة عدد صحيح بينlowوhigh(شامل.): -
trial.suggest_float(name, low, high)يقترح قيمة فاصلة عائمة بينlowوhigh. -
trial.suggest_categorical(name, choices)يقترح قيمة من قائمة الخيارات الفئوية.:
تلميح
للحصول على القائمة الكاملة لطرق الاقتراح، راجع وثائق Optuna.
في المثال السابق، يتم تعريف مساحة البحث مباشرة في الدالة objective باستخدام الكائن trial :
def objective(trial):
max_iter = trial.suggest_int('Iterations', 1, 10)
reg_param = trial.suggest_float('Regularization', 0.0, 1.0)
# ... rest of the function ...
يسمح هذا النهج ل Optuna بأخذ عينات ديناميكية من قيم المعلمات الفائقة لكل تجربة ، مما يجعل مساحة البحث مرنة وسهلة التعديل.
تحديد خوارزمية البحث
يستخدم Optuna جهاز أخذ العينات لتحديد قيم المعلمات الفائقة من مساحة البحث وتحسين دالة الهدف. أداة أخذ العينات الأكثر استخداما هي مقدر Parzen (TPE) الهيكلي للشجرة ، وهي خوارزمية تحسين بايز تحدد بشكل تكيفي إعدادات المعلمة الفائقة الجديدة بناء على النتائج السابقة.
يمكنك تحديد جهاز أخذ العينات عند إنشاء دراسة Optuna. على سبيل المثال، لاستخدام جهاز أخذ العينات TPE:
import optuna
sampler = optuna.samplers.TPESampler()
study = optuna.create_study(direction="minimize", sampler=sampler)
يدعم Optuna أيضا عينات أخرى ، مثل البحث optuna.samplers.RandomSamplerالعشوائي . بالنسبة لمعظم حالات الاستخدام، يوصى باستخدام جهاز أخذ عينات TPE الافتراضي.
قم بتشغيل تحسين Optuna
أخيرا ، لتنفيذ التحسين ، استخدم طريقة study.optimize ، والتي تستدعي بشكل متكرر دالة الهدف باستخدام مجموعات المعلمات الفائقة من مساحة البحث بناء على خوارزمية البحث. الهدف هو تقليل القيمة التي ترجعها وظيفة الهدف (وبالتالي تحسين أداء النموذج).
يستخدم المثال التالي التعليمات البرمجية الأسلوب study.optimize لاستدعاء دالة الهدف المحددة مسبقا. يتم تقييم الدالة حتى 100 مرة قبل أن ترجع الدراسة مجموعة قيمة المعلمات الأفضل أداء التي تم العثور عليها.
study.optimize(objective, n_trials=100)
print("Best param values: ", study.best_params)
يبدو الإخراج من التعليمات البرمجية السابقة مشابها للمثال التالي.
Best param values: {'Iterations': 6, 'Regularization': 0.5461699702338606}