다음을 통해 공유


하이퍼 매개 변수 튜닝(프리뷰)

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

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

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

Important

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

튜닝 워크플로

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

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

튜닝 목표

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

아래 예제에서는 xy(으)로 명명된 하이퍼 매개 변수 2개와 관련하여 평가 함수를 정의할 수 있습니다.

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

검색 공간

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

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

검색 공간 내에서 도메인을 사용자 지정하는 방법에 대한 자세한 내용은 검색 공간 사용자 지정에 대한 FLAML 문서를 참조하세요.

튜닝 제약 조건

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

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

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