Ρύθμιση υπερπαραμετέρου (προεπισκόπηση)
Η ρύθμιση υπερπαραμέτρου είναι η διαδικασία εύρεσης των βέλτιστων τιμών για τις παραμέτρους που δεν μαθαίνουν από το μοντέλο εκμάθησης μηχανής κατά τη διάρκεια της εκπαίδευσης, αλλά μάλλον ορίζονται από τον χρήστη προτού ξεκινήσει η διαδικασία εκπαίδευσης. Αυτές οι παράμετροι αναφέρονται συνήθως ως υπερπαραμέτρους και παραδείγματα περιλαμβάνουν τον ρυθμό εκμάθησης, τον αριθμό των κρυφών επιπέδων σε ένα νευρωνικό δίκτυο, την ισχύ κανονικοποίησης και το μέγεθος της δέσμης.
Οι επιδόσεις ενός μοντέλου εκμάθησης μηχανής μπορεί να είναι ιδιαίτερα ευαίσθητες στην επιλογή των υπερπαραμετών και το βέλτιστο σύνολο υπερπαραμετών μπορεί να διαφέρει σημαντικά ανάλογα με το συγκεκριμένο πρόβλημα και το σύνολο δεδομένων. Επομένως, η ρύθμιση του υπερπαραμετρικού είναι ένα κρίσιμο βήμα στη διοχέτευση εκμάθησης μηχανής, καθώς μπορεί να έχει σημαντικό αντίκτυπο στην ακρίβεια και τις επιδόσεις γενίκευσης του μοντέλου.
Στο Fabric, οι επιστήμονες δεδομένων μπορούν να αξιοποιήσουν FLAML
το , μια ελαφριά βιβλιοθήκη Python για αποδοτική αυτοματοποίηση της εκμάθησης μηχανής και των λειτουργιών AI, για τις απαιτήσεις ρύθμισης των υπερπαραμετών. Στα σημειωματάρια Fabric, οι χρήστες μπορούν να καλούν flaml.tune
για ρύθμιση οικονομικού υπερπαραμετέρου.
Σημαντικό
Αυτή η δυνατότητα είναι σε προεπισκόπηση.
Ρύθμιση ροής εργασιών
Υπάρχουν τρία βασικά βήματα που πρέπει να χρησιμοποιήσετε flaml.tune
για να ολοκληρώσετε μια βασική εργασία ρύθμισης:
- Καθορίστε το στόχο ρύθμισης σε σχέση με τους υπερπαραμετήρες.
- Καθορίστε ένα διάστημα αναζήτησης των υπερπαραμετών.
- Καθορίστε περιορισμούς ρύθμισης, συμπεριλαμβανομένων των περιορισμών στον προϋπολογισμό πόρων για να εκτελέσετε τη ρύθμιση, τους περιορισμούς στις ρυθμίσεις παραμέτρων ή/και τους περιορισμούς σε ένα (ή περισσότερα) συγκεκριμένα μετρικά.
Στόχος ρύθμισης
Το πρώτο βήμα είναι να καθορίσετε τον στόχο ρύθμισης. Για να το κάνετε αυτό, θα πρέπει πρώτα να καθορίσετε τη διαδικασία αξιολόγησής σας αναφορικά με τους υπερπαραμετρητές σε μια συνάρτηση evaluation_function
που ορίζεται από τον χρήστη . Η συνάρτηση απαιτεί μια ρύθμιση παραμέτρων υπερπαραμετέρου ως είσοδο. Μπορεί απλώς να επιστρέψει μια τιμή μετρικού σε μια ανυσματική τιμή ή να επιστρέψει ένα λεξικό με ζεύγη ονόματος μετρικού και τιμής μετρικών.
Στο παρακάτω παράδειγμα, μπορούμε να ορίσουμε μια συνάρτηση αξιολόγησης σε σχέση με 2 υπερπαραμετρικούς που ονομάζονται x
και y
.
import time
def evaluate_config(config: dict):
"""evaluate a hyperparameter configuration"""
score = (config["x"] - 85000) ** 2 - config["x"] / config["y"]
faked_evaluation_cost = config["x"] / 100000
time.sleep(faked_evaluation_cost)
# we can return a single float as a score on the input config:
# return score
# or, we can return a dictionary that maps metric name to metric value:
return {"score": score, "evaluation_cost": faked_evaluation_cost, "constraint_metric": config["x"] * config["y"]}
Χώρος αναζήτησης
Στη συνέχεια, θα καθορίσουμε το χώρο αναζήτησης των υπερπαραμετών. Στο χώρο αναζήτησης, πρέπει να καθορίσετε έγκυρες τιμές για τους υπερπαραμετήρες σας και τον τρόπο δειγματοληψίας αυτών των τιμών (π.χ., από μια ομοιόμορφη κατανομή ή μια κατανομή ομοιόμορφη σε αρχείο καταγραφής). Στο παρακάτω παράδειγμα, μπορούμε να παρέχουμε τον χώρο αναζήτησης για τους υπερπαραμετρητές x
και y
. Οι έγκυρες τιμές και για τις δύο τιμές είναι ακέραιοι που κυμαίνονται από [1, 100.000]. Τα δείγματα αυτών των υπερπαραμετών γίνονται ομοιόμορφα στις καθορισμένες περιοχές.
from flaml import tune
# construct a search space for the hyperparameters x and y.
config_search_space = {
"x": tune.lograndint(lower=1, upper=100000),
"y": tune.randint(lower=1, upper=100000)
}
# provide the search space to tune.run
tune.run(..., config=config_search_space, ...)
Με το FLAML, οι χρήστες μπορούν να προσαρμόσουν τον τομέα για ένα συγκεκριμένο υπερπαράμετρο. Αυτό επιτρέπει στους χρήστες να καθορίσουν έναν τύπο και μια έγκυρη περιοχή για δείγματα παραμέτρων. Το FLAML υποστηρίζει τους ακόλουθους τύπους υπερπαραμετρικών: κινητής υποδιαστολής, ακέραιος και κατηγορικός. Μπορείτε να δείτε αυτό το παράδειγμα παρακάτω για τομείς που χρησιμοποιούνται συχνά:
config = {
# Sample a float uniformly between -5.0 and -1.0
"uniform": tune.uniform(-5, -1),
# Sample a float uniformly between 3.2 and 5.4,
# rounding to increments of 0.2
"quniform": tune.quniform(3.2, 5.4, 0.2),
# Sample a float uniformly between 0.0001 and 0.01, while
# sampling in log space
"loguniform": tune.loguniform(1e-4, 1e-2),
# Sample a float uniformly between 0.0001 and 0.1, while
# sampling in log space and rounding to increments of 0.00005
"qloguniform": tune.qloguniform(1e-4, 1e-1, 5e-5),
# Sample a random float from a normal distribution with
# mean=10 and sd=2
"randn": tune.randn(10, 2),
# Sample a random float from a normal distribution with
# mean=10 and sd=2, rounding to increments of 0.2
"qrandn": tune.qrandn(10, 2, 0.2),
# Sample a integer uniformly between -9 (inclusive) and 15 (exclusive)
"randint": tune.randint(-9, 15),
# Sample a random uniformly between -21 (inclusive) and 12 (inclusive (!))
# rounding to increments of 3 (includes 12)
"qrandint": tune.qrandint(-21, 12, 3),
# Sample a integer uniformly between 1 (inclusive) and 10 (exclusive),
# while sampling in log space
"lograndint": tune.lograndint(1, 10),
# Sample a integer uniformly between 2 (inclusive) and 10 (inclusive (!)),
# while sampling in log space and rounding to increments of 2
"qlograndint": tune.qlograndint(2, 10, 2),
# Sample an option uniformly from the specified choices
"choice": tune.choice(["a", "b", "c"]),
}
Για να μάθετε περισσότερα σχετικά με το πώς μπορείτε να προσαρμόσετε τομείς εντός του χώρου αναζήτησής σας, επισκεφθείτε την τεκμηρίωση FLAML για την προσαρμογή των χώρων αναζήτησης.
Περιορισμοί ρύθμισης
Το τελευταίο βήμα είναι να καθορίσετε περιορισμούς της εργασίας ρύθμισης. Μια αξιοσημείωτη ιδιότητα του flaml.tune
είναι ότι είναι σε θέση να ολοκληρώσει τη διαδικασία ρύθμισης εντός ενός απαιτούμενου περιορισμού πόρων. Για να το κάνει αυτό, ένας χρήστης μπορεί να παρέχει περιορισμούς πόρων όσον αφορά τον χρόνο ρολόι τοίχου (σε δευτερόλεπτα) χρησιμοποιώντας το time_budget_s
όρισμα ή όσον αφορά τον αριθμό των δοκιμαστικών δοκιμών που χρησιμοποιούν το num_samples
όρισμα.
# Set a resource constraint of 60 seconds wall-clock time for the tuning.
flaml.tune.run(..., time_budget_s=60, ...)
# Set a resource constraint of 100 trials for the tuning.
flaml.tune.run(..., num_samples=100, ...)
# Use at most 60 seconds and at most 100 trials for the tuning.
flaml.tune.run(..., time_budget_s=60, num_samples=100, ...)
Για να μάθετε περισσότερα σχετικά με τους περιορισμούς ρύθμισης παραμέτρων προσθηκών, μπορείτε να επισκεφθείτε την τεκμηρίωση του FLAML για σύνθετες επιλογές ρύθμισης.
Συνδυάστε το
Αφού ορίσουμε τα κριτήρια ρύθμισης, μπορούμε να εκτελέσουμε τη δοκιμή ρύθμισης. Για να παρακολουθούμε τα αποτελέσματα της δοκιμαστικής έκδοσης, μπορούμε να αξιοποιήσουμε την αυτόματη καταχώρηση MLFlow για να καταγράψουμε τα μετρικά και τις παραμέτρους για κάθε μία από αυτές τις εκτελέσεις. Αυτός ο κώδικας θα καταγράψει ολόκληρη τη δοκιμαστική ρύθμιση του υπερπαραμετήρα, επισημαίνοντας κάθε έναν από τους συνδυασμούς υπερπαραμετών που εξερευνήθηκαν από το FLAML.
import mlflow
mlflow.set_experiment("flaml_tune_experiment")
mlflow.autolog(exclusive=False)
with mlflow.start_run(nested=True, run_name="Child Run: "):
analysis = tune.run(
evaluate_config, # the function to evaluate a config
config=config_search_space, # the search space defined
metric="score",
mode="min", # the optimization mode, "min" or "max"
num_samples=-1, # the maximal number of configs to try, -1 means infinite
time_budget_s=10, # the time budget in seconds
)
Σημείωμα
Όταν είναι ενεργοποιημένη η αυτόματη καταγραφή ροής MLflow, τα μετρικά, οι παράμετροι και τα μοντέλα θα πρέπει να καταγράφονται αυτόματα καθώς εκτελείται το MLFlow. Ωστόσο, αυτό διαφέρει ανάλογα με το πλαίσιο. Τα μετρικά και οι παράμετροι για συγκεκριμένα μοντέλα ενδέχεται να μην καταγράφονται. Για παράδειγμα, δεν θα καταγράφονται μετρικά για τα μοντέλα XGBoost, LightGBM , Spark και SynapseML. Μπορείτε να μάθετε περισσότερα σχετικά με τα μετρικά και τις παραμέτρους που καταγράφονται από κάθε πλαίσιο, χρησιμοποιώντας την τεκμηρίωση αυτόματης καταχώρησης mlFlow.
Παράλληλη ρύθμιση με το Apache Spark
Η flaml.tune
λειτουργικότητα υποστηρίζει τη ρύθμιση τόσο του Apache Spark όσο και των μαθητών ενός κόμβου. Επιπλέον, όταν ρυθμίζετε μαθητές ενός κόμβου (π.χ. μαθητές Scikit-Learn), μπορείτε επίσης να παραλληλίσετε τη ρύθμιση για να επιταχύνετε τη διαδικασία ρύθμισης ορίζοντας use_spark = True
το . Για τα συμπλέγματα Spark, από προεπιλογή, το FLAML θα εκκινήσει μία δοκιμαστική έκδοση ανά εκτελέσιμο αρχείο. Μπορείτε επίσης να προσαρμόσετε τον αριθμό των ταυτόχρονων δοκιμών χρησιμοποιώντας το n_concurrent_trials
όρισμα.
analysis = tune.run(
evaluate_config, # the function to evaluate a config
config=config_search_space, # the search space defined
metric="score",
mode="min", # the optimization mode, "min" or "max"
num_samples=-1, # the maximal number of configs to try, -1 means infinite
time_budget_s=10, # the time budget in seconds
use_spark=True,
)
print(analysis.best_trial.last_result) # the best trial's result
print(analysis.best_config) # the best config
Για να μάθετε περισσότερα σχετικά με τον τρόπο παραλληλισμού των διαδρομών ρύθμισης, μπορείτε να επισκεφθείτε την τεκμηρίωση του FLAML για παράλληλες εργασίες Spark.
Απεικόνιση αποτελεσμάτων
Η flaml.visualization
λειτουργική μονάδα παρέχει βοηθητικές συναρτήσεις για σχεδίαση της διαδικασίας βελτιστοποίησης με χρήση της συνάρτησης Plotly. Αξιοποιώντας το Plotly, οι χρήστες μπορούν να εξερευνήσουν διαδραστικά τα αποτελέσματα του πειράματος AutoML. Για να χρησιμοποιήσετε αυτές τις συναρτήσεις σχεδίασης, απλώς καταχωρήστε το βελτιστοποιημένο flaml.AutoML
ή flaml.tune.tune.ExperimentAnalysis
το αντικείμενο σας ως δεδομένα εισόδου.
Μπορείτε να χρησιμοποιήσετε τις ακόλουθες συναρτήσεις στο σημειωματάριό σας:
plot_optimization_history
: Σχεδίαση ιστορικού βελτιστοποίησης για όλες τις δοκιμές στο πείραμα.plot_feature_importance
: Σχεδίαση σπουδαιότητας για κάθε δυνατότητα στο σύνολο δεδομένων.plot_parallel_coordinate
: Σχεδίαση των σχέσεων παραμέτρων υψηλής διάστασης στο πείραμα.plot_contour
: Σχεδιάστε τη σχέση παραμέτρου ως σχεδίαση περιγράμματος στο πείραμα.plot_edf
: Σχεδιάζει την αντικειμενική τιμή EDF (λειτουργία εμπειρικής κατανομής) του πειράματος.plot_timeline
: Σχεδίαση της λωρίδας χρόνου του πειράματος.plot_slice
: Σχεδίαση της σχέσης παραμέτρου ως σχεδίασης φέτας σε μια μελέτη.plot_param_importance
: Σχεδιάστε τη σημασία του υπερπαραμετέρου του πειράματος.