Hyperparametrin säätö (esikatselu)
Hyperparametrin säätö on prosessi, jossa etsitään optimaaliset arvot parametreille, joita koneoppimismalli ei opi koulutuksen aikana vaan jotka käyttäjä on määrittänyt ennen harjoitusprosessin alkua. Näitä parametreja kutsutaan yleisesti hyperparametreiksi, ja esimerkkejä ovat oppimisnopeus, hermoverkon piilotettujen tasojen määrä, säännönmukaisoinnin vahvuus ja erän koko.
Koneoppimismallin suorituskyky voi olla hyvin herkkä hyperparametrien valinnalle, ja hyperparametrien optimaalinen joukko voi vaihdella suuresti tietyn ongelman ja tietojoukon mukaan. Hyperparametrin säätö on siis tärkeä vaihe koneoppimisputkessa, sillä sillä se voi vaikuttaa merkittävästi mallin tarkkuuteen ja yleistykseen.
Fabricissa datatieteilijät voivat hyperparametristisäästämisvaatimuksiinsa hyödyntää FLAML
, joka on kevyt Python-kirjasto koneoppimisen ja tekoälytoimintojen tehokkaaseen automatisointiin. Fabric-muistikirjoissa käyttäjät voivat kutsua flaml.tune
taloudellisen hyperparametrin virittämisen vuoksi.
Tärkeä
Tämä ominaisuus on esikatseluvaiheessa.
Viritystyönkulku
Perustason viritystehtävän suorittamiseen flaml.tune
on kolme tärkeää vaihetta:
- Määritä säätötavoite hyperparametrien osalta.
- Määritä hyperparametrien hakutila.
- Määritä säätörajoitteet, mukaan lukien säätörajoitukset resurssin budjetille, määritysten rajoitteet tai (tai useiden) tietyn mittarin tai useiden mittarien rajoitukset.
Viritystavoite
Ensimmäinen vaihe on viritystavoitteesi määrittäminen. Jotta voit tehdä tämän, sinun on ensin määritettävä arviointiprosessi käyttäjän määrittämän funktion hyperparametreiden suhteen evaluation_function
. Funktio edellyttää syötteeksi hyperparametrimääritystä. Se voi yksinkertaisesti palauttaa skalaariarvon tai palauttaa mittarin nimen ja mittausarvoparien sanaston.
Alla olevassa esimerkissä voimme määrittää arviointifunktion kahden hyperparametrin nimeltään x
ja 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"]}
Hakutila
Seuraavaksi määritetään hyperparametrien hakutila. Hakutilassa sinun on määritettävä hyperparametrien kelvolliset arvot ja se, miten näitä arvoja mallinnetaan (esimerkiksi yhtenäisestä jakaumasta tai log-uniform-jakaumasta). Alla olevassa esimerkissä voimme antaa hyperparametrien hakutilan x
ja y
. Molempien kelvolliset arvot ovat kokonaislukuja, joiden arvo on välillä [1, 100 000]. Näitä hyperparametreja otetaan näytteitä yhdenmukaisesti määritetyillä alueilla.
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:n avulla käyttäjät voivat mukauttaa toimialuetta tietyn hyperparametrin avulla. Näin käyttäjät voivat määrittää tyypin ja kelvollisen alueen, esimerkkiparametreja. FLAML tukee seuraavia hyperparametrityyppejä: liukuluku, kokonaisluku ja luokittainen. Alla olevassa esimerkissä on usein käytetyt toimialueet:
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"]),
}
Jos haluat lisätietoja siitä, miten voit mukauttaa toimialueita hakutilassasi, tutustu FLAML-dokumentaatiossa hakutilojen mukauttamisesta.
Säätörajoitteet
Viimeisessä vaiheessa määritetään säätötehtävän rajoitteet. yksi flaml.tune
merkittävä ominaisuus on se, että se pystyy viimeistelemään viritysprosessin vaaditun resurssirajoitteen puitteissa. Käyttäjä voi tehdä tämän asettamalla resurssirajoitteita kellonajan suhteen (sekunteina) käyttämällä time_budget_s
-argumenttia tai kokeiluversioiden määrän suhteen käyttämällä num_samples
-argumenttia.
# 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, ...)
Lisätietoja lisää määritysrajoituksista on FLAML-ohjeissa kehittyneiden säätöasetusten.
Kokoaminen
Kun olemme määrittäneet säätöehdot, voimme suorittaa virityskokeilun. Kokeiluversion tulosten seuraamista varten voimme hyödyntää MLFlow'n automaattista lokeroinnin, joiden avulla voit tallentaa jokaisen suorituskerrasta käytettävät mittarit ja parametrit. Tämä koodi sieppaa koko hyperparametrin säätökokeilun ja korostaa kaikki FLAML:n tutkimat hyperparametriyhdistelmät.
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
)
Muistiinpano
Kun MLflow-automaattianalyysi on käytössä, mittarit, parametrit ja mallit tulee kirjata automaattisesti, kun MLFlow suoritetaan. Tämä vaihtelee kuitenkin sovelluskehyksen mukaan. Tiettyjen mallien mittareita ja parametreja ei välttämättä kirjata. Esimerkiksi XGBoost-, LightGBM-, Spark- ja SynapseML-malleille ei kirjata mittareita. Saat lisätietoja siitä, mitä mittareita ja parametreja kustakin kehyksestä tallennetaan käyttämällä MLFlow'n automaattista lokerisointidokumentaatiota.
Rinnakkaista säätäminen Apache Sparkin kanssa
flaml.tune
-toiminto tukee sekä Apache Sparkin että yksisolmuisten oppijoiden virkistämistä. Kun säädät yksisolmuisia oppijoita (esimerkiksi Scikit-Learn oppijoita), voit myös rinnakkaistaa säädön ja nopeuttaa säätöprosessia määrittämällä use_spark = True
. Spark-klustereissa FLAML käynnistää oletusarvoisesti yhden kokeiluversion suoritettavaa tiedostoa kohden. Voit myös mukauttaa samanaikaisten kokeilujen määrää käyttämällä n_concurrent_trials
-argumenttia.
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
Saat lisätietoja virityspolkujen rinnakkaistamisesta käymällä FLAML -dokumentaatiossa rinnakkaisten Spark-työpaikkojen.
Tulosten visualisointi
flaml.visualization
-moduuli sisältää apuohjelmafunktioita optimointiprosessin piirtämiseen Plotlyn avulla. Plotlya hyödyntämällä käyttäjät voivat tarkastella automaattianalyysipalvelukokeilujen tuloksiaan vuorovaikutteisesti. Jos haluat käyttää näitä piirtofunktioita, anna syötteenä optimoitu flaml.AutoML
tai flaml.tune.tune.ExperimentAnalysis
objekti.
Voit käyttää muistikirjassa seuraavia funktioita:
-
plot_optimization_history
: Kaavion optimointihistoria kokeilujen kaikista kokeista. -
plot_feature_importance
: Korosta tärkeys kunkin tietojoukon ominaisuuden kohdalla. -
plot_parallel_coordinate
: Piirtää suuriulotteiset parametrisuhteet kokeilussa. -
plot_contour
: Piirtää parametrisuhde kiertotiekaavioksi kokeilussa. -
plot_edf
: Piirtää kokeilun objektiivisen arvon EDF:n (empiirinen jakaumafunktio). -
plot_timeline
: Piirtää kokeilun aikajanan. -
plot_slice
: Piirtää parametrisuhteen tutkimuksen osittajakaavioksi. -
plot_param_importance
: Piirtää kokeen hyperparametrin tärkeyden.