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ığı olan FLAML
kullanabilir. Fabric not defterleri içinde kullanıcılar ekonomik hiperparametre ayarlaması için flaml.tune
çağırabilir.
Önemli
Bu özellik önizlemesürümündedir.
İş akışını ayarlama
Temel ayarlama görevini tamamlamak için flaml.tune
kullanmanın üç temel adımı vardır:
- Hiper parametrelere göre ayarlama hedefini belirtin.
- Hiper parametrelerin arama alanını belirtin.
- 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 evaluation_function
kullanıcı tanımlı bir işlevdeki hiper parametrelere göre değerlendirme yordamınızı belirtmeniz gerekir. İşlev, giriş olarak bir hiper parametre yapılandırması gerektirir. Yalnızca skaler bir metrik değeri döndürebilir veya metrik adı ve metrik değer çiftlerinden oluşan bir sözlük döndürebilir.
Aşağıdaki örnekte, x
ve y
adlı 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, hiperparametreleriniz için geçerli değerler ve bu değerlerin nasıl örnekleneceği (örneğin, tekdüze dağılım veya logaritmik tekdüze dağılım) belirtilmelidir. Aşağıdaki örnekte, x
ve y
hiper parametreler iç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. Kullanıcıların türünde ve geçerli bir aralıkta örnek parametreler 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 belgeleriniziyaret edin.
Kısıtlamaları ayarlama
Son adım, ayarlama görevinin kısıtlamalarını belirtmektir.
flaml.tune
önemli bir özelliği, gerekli bir kaynak kısıtlaması içinde ayarlama işlemini tamamlayabilmesidir. Bunu yapmak için kullanıcı, time_budget_s
bağımsız değişkenini kullanarak duvar saati süresi (saniye) veya num_samples
bağımsız değişkenini kullanan 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çeneklerine yönelik FLAML belgeleriniziyaret edebilirsiniz.
Bir araya getirmek
Ayarlama ölçütlerimizi tanımladıktan sonra ayarlama denemesini yürütebiliriz. Denememizin sonuçlarını izlemek için, her bir çalıştırmanın ölçümlerini ve parametrelerini yakalamak amacıyla MLFlow otomatik günlükleme kullanabiliriz. 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ıştığında metrikler, 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
flaml.tune
işlevi, hem Apache Spark hem de tek düğüm üzerinde çalışan öğrenicilerin ayarlanmasını destekler. Buna ek olarak, tek düğümlü öğreniciler (Scikit-Learn öğrenenler gibi) üzerinde ayarlama yaparken, use_spark = True
ayarlayarak bu işlemi eşzamanlı hale getirip süreci hızlandırabilirsiniz. Spark kümeleri için FLAML varsayılan olarak yürütücü başına bir deneme başlatır.
n_concurrent_trials
bağımsız değişkenini kullanarak 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çinFLAML belgelerini ziyaret edebilirsiniz.
Sonuçları görselleştirme
flaml.visualization
modülü, 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 önemi çizin. -
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.
İlgili içerik
- SynapseML Spark LightGBM modelini ayarlama
- AutoML sonuçlarını görselleştirme