다음을 통해 공유


하이퍼 매개 변수 튜닝(미리 보기)

하이퍼 매개 변수 튜닝은 학습 중에 기계 학습 모델에서 학습하지 않고 학습 프로세스가 시작되기 전에 사용자가 설정한 매개 변수에 대한 최적 값을 찾는 프로세스입니다. 이러한 매개 변수는 일반적으로 하이퍼 매개 변수라고 하며, 예제에는 학습 속도, 신경망의 숨겨진 레이어 수, 정규화 강도 및 일괄 처리 크기가 포함됩니다.

기계 학습 모델의 성능은 하이퍼 매개 변수 선택에 매우 민감할 수 있으며, 최적의 하이퍼 매개 변수 집합은 특정 문제 및 데이터 세트에 따라 크게 달라질 수 있습니다. 따라서 하이퍼 매개 변수 튜닝은 모델의 정확도 및 일반화 성능에 상당한 영향을 미칠 수 있으므로 기계 학습 파이프라인에서 중요한 단계입니다.

패브릭에서 데이터 과학자는 하이퍼 매개 변수 튜닝 요구 사항에 맞게 기계 학습 및 AI 작업의 효율적인 자동화를 위해 간단한 Python 라이브러리를 활용할 FLAML수 있습니다. Fabric Notebook 내에서 사용자는 경제적인 하이퍼 매개 변수 튜닝을 호출 flaml.tune 할 수 있습니다.

Important

이 기능은 미리 보기로 제공됩니다.

튜닝 워크플로

기본 튜닝 작업을 완료하는 데 사용하는 flaml.tune 세 가지 필수 단계가 있습니다.

  1. 하이퍼 매개 변수와 관련하여 튜닝 목표를 지정합니다.
  2. 하이퍼 매개 변수의 검색 공간을 지정합니다.
  3. 튜닝을 수행할 리소스 예산에 대한 제약 조건, 구성에 대한 제약 조건 또는/및 (또는 여러) 특정 메트릭에 대한 제약 조건을 포함하여 튜닝 제약 조건을 지정합니다.

튜닝 목표

첫 번째 단계는 튜닝 목표를 지정하는 것입니다. 이렇게 하려면 먼저 사용자 정의 함수 evaluation_function의 하이퍼 매개 변수와 관련하여 평가 절차를 지정해야 합니다. 함수에는 하이퍼 매개 변수 구성이 입력으로 필요합니다. 단순히 스칼라에서 메트릭 값을 반환하거나 메트릭 이름 및 메트릭 값 쌍의 사전을 반환할 수 있습니다.

아래 예제에서는 명명 x 된 하이퍼 매개 변수 2개와 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"]}

검색 공간

다음으로 하이퍼 매개 변수의 검색 공간을 지정합니다. 검색 공간에서 하이퍼 매개 변수에 유효한 값을 지정하고 이러한 값을 샘플링하는 방법(예: 균일한 분포 또는 로그 균일 배포에서)을 지정해야 합니다. 아래 예제에서는 하이퍼 매개 변수 및 y에 대한 검색 공간을 제공할 수 있습니다x. 둘 다에 유효한 값은 [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을 사용하면 사용자가 특정 하이퍼 매개 변수에 대한 do기본 사용자 지정할 수 있습니다. 이를 통해 사용자는 샘플 매개 변수에 대한 형식유효한 범위를 지정할 수 있습니다. FLAML은 float, integer 및 범주의 하이퍼 매개 변수 형식을 지원합니다. 일반적으로 사용되는 do기본에 대한 아래 예제를 볼 수 있습니다.

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

검색 공간 내에서 do기본를 사용자 지정하는 방법에 대한 자세한 내용은 검색 공간 사용자 지정에 대한 FLAML 설명서를 참조하세요.

튜닝 제약 조건

마지막 단계는 튜닝 작업의 제약 조건을 지정하는 것입니다. 한 가지 주목할 만한 속성 flaml.tune 은 필요한 리소스 제약 조건 내에서 튜닝 프로세스를 완료할 수 있다는 것입니다. 이를 위해 사용자는 인수를 사용하여 벽시계 시간(초) 또는 인수를 사용하는 time_budget_snum_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

튜닝 내역을 병렬화하는 방법에 대한 자세한 내용은 병렬 Spark 작업에 대한 FLAML 설명서를 참조하세요.

결과 시각화

이 모듈은 flaml.visualization Plotly를 사용하여 최적화 프로세스를 그리기 위한 유틸리티 함수를 제공합니다. Plotly를 활용하여 사용자는 AutoML 실험 결과를 대화형으로 탐색할 수 있습니다. 이러한 그리기 함수를 사용하려면 최적화된 또는 flaml.tune.tune.ExperimentAnalysis 개체를 flaml.AutoML 입력으로 제공하기만 하면 됩니다.

Notebook 내에서 다음 함수를 사용할 수 있습니다.

  • plot_optimization_history: 실험의 모든 평가판에 대한 최적화 기록을 표시합니다.
  • plot_feature_importance: 데이터 세트의 각 기능에 대한 중요도를 표시합니다.
  • plot_parallel_coordinate: 실험에서 고차원 매개 변수 관계를 그립니다.
  • plot_contour: 매개 변수 관계를 실험의 윤곽선 플롯으로 그어 옵니다.
  • plot_edf: 실험의 목표값 EDF(경험적 분포 함수)를 그어 옵니다.
  • plot_timeline: 실험의 타임라인 그어 옵니다.
  • plot_slice: 매개 변수 관계를 스터디에서 조각 그림으로 그어 줍니다.
  • plot_param_importance: 실험의 하이퍼 매개 변수 중요도를 그어 줍니다.