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 hyperparametrisäätövaatimuksiinsa hyödyntää FLAML
kevyttä Python-kirjastoa koneoppimisen ja tekoälytoimintojen tehokkaaseen automatisointiin. Fabric-muistikirjoissa käyttäjät voivat vaatia flaml.tune
taloudellista hyperparametrin säätöä.
Viritystyönkulku
Perussäätötehtävän suorittamiseen on suoritettava flaml.tune
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 evaluation_function
hyperparameterien suhteen. 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 x
ja y
hakutilan. 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, josta malliparametrit voidaan ottaa. 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"]),
}
Lisätietoja siitä, miten voit mukauttaa toimialueita hakutilassa, on hakutilojen mukauttamisen FLAML-ohjeissa.
Säätörajoitteet
Viimeisessä vaiheessa määritetään säätötehtävän rajoitteet. Yksi merkittävä ominaisuus flaml.tune
on se, että se pystyy viimeistelemään viritysprosessin vaaditun resurssirajoitteen puitteissa. Tätä voidaan käyttää resurssirajoitteita suhteessa kellonaikaan (sekunteina) argumentin avulla time_budget_s
tai argumenttia käyttävien num_samples
kokeiluversioiden määrän suhteen.
# 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 lisäsäädön asetusten osalta.
Kokoaminen
Kun olemme määrittäneet säätöehdot, voimme suorittaa virityskokeilun. Jos haluat seurata kokeilujakson tuloksia, voimme hyödyntää MLFlow-automaattista lokerisointia , joka tallentaa jokaisen suorituskerrasta 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 MLFlow-automaattianalyysipalveluiden dokumentaation avulla.
Rinnakkaista säätäminen Apache Sparkin kanssa
Toiminto flaml.tune
tukee sekä Apache Sparkin että yksisolmuisten oppijoiden virkistämistä. Kun säädät yksisolmuisten oppijoiden (esim. Scikit-Learn -oppijat), voit myös rinnakkaistaa säädön ja nopeuttaa säätöprosessiasi 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ä -argumenttia 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
Saat lisätietoja virityspolkujen rinnakkaistamisesta käymällä FLAML-dokumentaatiossa rinnakkaisten Spark-töiden kohdalla.
Tulosten visualisointi
- flaml.visualization
moduuli tarjoaa 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
objekti tai flaml.tune.tune.ExperimentAnalysis
objekti.
Voit käyttää muistikirjassa seuraavia funktioita:
plot_optimization_history
: Plot optimization history of all trials in the experiment.plot_feature_importance
: Korosta kunkin tietojoukon ominaisuuden tärkeys.plot_parallel_coordinate
: Piirtää suuriulotteiset parametrisuhteet kokeilussa.plot_contour
: Piirtää parametrisuhteen kiertotiekaavioksi kokeilussa.plot_edf
: Piirtää kokeilun tavoitearvon EDF (empiirinen jakaumafunktio).plot_timeline
: Piirtää kokeilun aikajanan.plot_slice
: Piirtää parametrisuhteen tutkimuksen osittajakaavioksi.plot_param_importance
: Piirtää kokeen hyperparametrin tärkeyden.