Aracılığıyla paylaş


Hiper parametre ayarlama (önizleme)

Hiper parametre ayarlama, eğitim sırasında makine öğrenmesi modeli tarafından öğrenilmeyen, eğitim süreci başlamadan önce kullanıcı tarafından ayarlanan parametreler için en uygun değerleri bulma işlemidir. Bu parametreler genellikle hiper parametreler olarak adlandırılır ve örnek olarak öğrenme hızı, sinir ağındaki gizli katmanların sayısı, normalleştirme gücü ve toplu iş boyutu verilebilir.

Bir makine öğrenmesi modelinin performansı, hiper parametre seçimine karşı son derece hassas olabilir ve en uygun hiper parametre kümesi belirli bir soruna ve veri kümesine bağlı olarak büyük ölçüde farklılık gösterebilir. Bu nedenle hiper parametre ayarlama, modelin doğruluğu ve genelleştirme performansı üzerinde önemli bir etkiye sahip olabileceğinden makine öğrenmesi işlem hattında kritik bir adımdır.

Doku'da veri bilimciler, hiper parametre ayarlama gereksinimleri için makine öğrenmesi ve yapay zeka işlemlerini verimli bir şekilde otomasyona yönelik basit bir Python kitaplığından yararlanabilir FLAML. Doku not defterleri içinde kullanıcılar ekonomik hiper parametre ayarlaması için çağrı flaml.tune yapabilir.

Önemli

Bu özellik önizleme aşamasındadır.

İş akışını ayarlama

Temel bir ayarlama görevini tamamlamak için kullanılacak flaml.tune üç temel adım vardır:

  1. Hiper parametrelere göre ayarlama hedefini belirtin.
  2. Hiper parametrelerin arama alanını belirtin.
  3. Ayarlamayı yapmak için kaynak bütçesinde kısıtlamalar, yapılandırmalardaki kısıtlamalar veya/ve belirli bir ölçümde (veya birden çok) sınırlamalar dahil olmak üzere ayarlama kısıtlamalarını belirtin.

Ayarlama hedefi

İlk adım, ayarlama hedefinizi belirtmektir. Bunu yapmak için, önce kullanıcı tanımlı işlevindeki evaluation_functionhiper parametrelere göre değerlendirme yordamınızı belirtmeniz gerekir. İşlev, giriş olarak bir hiper parametre yapılandırması gerektirir. Yalnızca skaler bir ölçüm değeri döndürebilir veya ölçüm adı ve ölçüm değer çiftleri sözlüğü döndürebilir.

Aşağıdaki örnekte ve yadlı x 2 hiper parametreye göre bir değerlendirme işlevi tanımlayabiliriz.

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"]}

Arama alanı

Ardından hiper parametrelerin arama alanını belirteceğiz. Arama alanında hiper parametreleriniz ve bu değerlerin nasıl örnekleneceğini (örneğin, tekdüzen dağıtım veya günlük tekdüzen dağılımı) için geçerli değerler belirtmeniz gerekir. Aşağıdaki örnekte hiper parametreler x ve yiçin arama alanı sağlayabiliriz. Her ikisi için de geçerli değerler [1, 100.000] arasında değişen tamsayılardır. Bu hiper parametreler belirtilen aralıklarda tekdüzen olarak örneklenir.

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 ile kullanıcılar etki alanını belirli bir hiper parametre için özelleştirebilir. Bu, kullanıcıların parametreleri örneklemek için bir tür ve geçerli bir aralık belirtmesine olanak tanır. FLAML şu hiper parametre türlerini destekler: float, integer ve categorical. Yaygın olarak kullanılan etki alanları için aşağıdaki örneği görebilirsiniz:

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"]),
}

Arama alanınızdaki etki alanlarını nasıl özelleştirebileceğiniz hakkında daha fazla bilgi edinmek için arama alanlarını özelleştirmeye ilişkin FLAML belgelerini ziyaret edin.

Kısıtlamaları ayarlama

Son adım, ayarlama görevinin kısıtlamalarını belirtmektir. değerinin flaml.tune önemli bir özelliği, gerekli bir kaynak kısıtlaması içinde ayarlama işlemini tamamlayabilmesidir. Bunu yapmak için kullanıcı, bağımsız değişkenini kullanarak duvar saati süresi (saniye) veya bağımsız değişkeni kullanan time_budget_snum_samples deneme sayısı açısından kaynak kısıtlamaları sağlayabilir.

# 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, ...)

Ek yapılandırma kısıtlamaları hakkında daha fazla bilgi edinmek için gelişmiş ayarlama seçenekleri için FLAML belgelerini ziyaret edebilirsiniz.

Bir araya getirmek

Ayarlama ölçütlerimizi tanımladıktan sonra ayarlama denemesini yürütebiliriz. Denememizin sonuçlarını izlemek için MLFlow otomatik dağıtımından yararlanarak bu çalıştırmaların her birine ait ölçümleri ve parametreleri yakalayabiliriz. Bu kod, FLAML tarafından keşfedilen hiper parametre bileşimlerinin her birini vurgulayarak hiper parametre ayarlama denemesinin tamamını yakalar.

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
    )

Not

MLflow otomatik kaydetme etkinleştirildiğinde, MLFlow çalışırken ölçümler, parametreler ve modeller otomatik olarak günlüğe kaydedilmelidir. Ancak, bu çerçeveye göre değişir. Belirli modeller için ölçümler ve parametreler günlüğe kaydedilmeyebilir. Örneğin, XGBoost , LightGBM, Spark ve SynapseML modelleri için hiçbir ölçüm günlüğe kaydedilmez. MLFlow otomatik kaydetme belgelerini kullanarak her çerçeveden hangi ölçümlerin ve parametrelerin yakalandığı hakkında daha fazla bilgi edinebilirsiniz.

Apache Spark ile paralel ayarlama

İşlev, flaml.tune hem Apache Spark hem de tek düğümlü öğrencilerin ayarlanmasını destekler. Buna ek olarak, tek düğümlü öğrenciler (örneğin Scikit-Learn öğrenenleri) ayarlarken, ayarlayarak use_spark = Trueayarlama işleminizi hızlandırmak için ayarlamayı paralel hale getirebilirsiniz. Spark kümeleri için FLAML varsayılan olarak yürütücü başına bir deneme başlatır. Bağımsız değişkenini kullanarak n_concurrent_trials eşzamanlı deneme sayısını da özelleştirebilirsiniz.


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

Ayarlama izlerinizi paralelleştirme hakkında daha fazla bilgi edinmek için paralel Spark işleri için FLAML belgelerini ziyaret edebilirsiniz.

Sonuçları görselleştirme

Modül, flaml.visualization Plotly kullanarak iyileştirme işlemini çizmeye yönelik yardımcı program işlevleri sağlar. Kullanıcılar Plotly'den yararlanarak AutoML deneme sonuçlarını etkileşimli olarak keşfedebilir. Bu çizim işlevlerini kullanmak için, iyileştirilmiş flaml.AutoML veya flaml.tune.tune.ExperimentAnalysis nesnenizi giriş olarak sağlamanız yeterlidir.

Not defterinizde aşağıdaki işlevleri kullanabilirsiniz:

  • plot_optimization_history: Denemedeki tüm denemelerin iyileştirme geçmişini çizin.
  • plot_feature_importance: Veri kümesindeki her özellik için çizim önemi.
  • plot_parallel_coordinate: Denemedeki yüksek boyutlu parametre ilişkilerini çizin.
  • plot_contour: Denemede parametre ilişkisini dağılım çizimi olarak çizin.
  • plot_edf: Denemenin EDF (ampirik dağılım işlevi) hedef değerini çizin.
  • plot_timeline: Denemenin zaman çizelgesini çizin.
  • plot_slice: Bir çalışmada parametre ilişkisini dilim çizimi olarak çizin.
  • plot_param_importance: Denemenin hiper parametre önemini çizin.