แชร์ผ่าน


การปรับแต่ง Hyperparameter (ตัวอย่าง)

การปรับแต่ง Hyperparameter คือกระบวนการค้นหาค่าที่เหมาะสมสําหรับพารามิเตอร์ที่ไม่ได้เรียนรู้โดยแบบจําลองการเรียนรู้ของเครื่องในระหว่างการฝึกอบรม แต่ควรตั้งค่าโดยผู้ใช้ก่อนเริ่มกระบวนการฝึกอบรม พารามิเตอร์เหล่านี้มักจะเรียกว่า hyperparameters และตัวอย่างรวมถึงอัตราการเรียนรู้จํานวนเลเยอร์ที่ซ่อนอยู่ในเครือข่ายประสาทความแข็งแรงในการสม่ําเสมอและขนาดชุด

ประสิทธิภาพของแบบจําลองการเรียนรู้ของเครื่องอาจมีความอ่อนไหวสูงในการเลือก hyperparameters และชุด hyperparameters ที่เหมาะสมอาจแตกต่างกันอย่างมากขึ้นอยู่กับปัญหาและชุดข้อมูลเฉพาะ การปรับแต่ง Hyperparameter จึงเป็นขั้นตอนสําคัญในไปป์ไลน์การเรียนรู้ของเครื่องเนื่องจากอาจมีผลกระทบอย่างมากต่อความแม่นยําและประสิทธิภาพการทํางานทั่วไปของแบบจําลอง

ใน Fabric นักวิทยาศาสตร์ข้อมูลสามารถใช้ประโยชน์จาก FLAMLไลบรารี Python น้ําหนักเบาสําหรับระบบอัตโนมัติที่มีประสิทธิภาพของการเรียนรู้ของเครื่องและการดําเนินงาน AI สําหรับข้อกําหนดการปรับแต่ง hyperparameter ของพวกเขา ภายในโน้ตบุ๊ค Fabric ผู้ใช้สามารถเรียกร้อง flaml.tune ให้ทําการปรับแต่ง hyperparameter ประหยัดได้

สำคัญ

คุณลักษณะนี้อยู่ในตัวอย่าง

การปรับแต่งเวิร์กโฟลว์

มีสามขั้นตอนที่จําเป็นเพื่อใช้ flaml.tune เพื่อทําให้งานการปรับแต่งพื้นฐานเสร็จสิ้น:

  1. ระบุวัตถุประสงค์การปรับแต่งตาม hyperparameters
  2. ระบุพื้นที่การค้นหาของ hyperparameters
  3. ระบุข้อจํากัดการปรับแต่ง รวมถึงข้อจํากัดบนงบประมาณทรัพยากรเพื่อทําการปรับแต่ง ข้อจํากัดในการกําหนดค่า หรือ/และข้อจํากัดบนเมตริกเฉพาะ (หรือหลายรายการ)

วัตถุประสงค์การปรับแต่ง

ขั้นตอนแรกคือการระบุวัตถุประสงค์การปรับแต่งของคุณ เมื่อต้องการทําเช่นนี้ ก่อนอื่นคุณควรระบุขั้นตอนการประเมินของคุณโดยคํานึงถึง hyperparameters ในฟังก์ชัน evaluation_functionที่ผู้ใช้กําหนดเอง ฟังก์ชันต้องการการกําหนดค่า hyperparameter เป็นข้อมูลป้อนเข้า ซึ่งสามารถส่งกลับค่าเมตริกในสเกลาหรือส่งกลับพจนานุกรมของชื่อเมตริกและคู่ค่าเมตริก

ในตัวอย่างด้านล่าง เราสามารถกําหนดฟังก์ชันการประเมินผลตาม hyperparameters 2 ที่ชื่อว่า x และ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"]}

ค้นหาพื้นที่ว่าง

ถัดไปเราจะระบุพื้นที่การค้นหาของ hyperparameters ในพื้นที่การค้นหา คุณจําเป็นต้องระบุค่าที่ถูกต้องสําหรับ hyperparameters ของคุณและวิธีสุ่มค่าเหล่านี้ (เช่น จากการแจกแจงแบบสม่ําเสมอหรือการกระจายแบบลอการิทึมแบบตรรกะ) ในตัวอย่างด้านล่าง เราสามารถระบุพื้นที่การค้นหาสําหรับ hyperparameters x และ yได้ ค่าที่ถูกต้องสําหรับทั้งสองเป็นจํานวนเต็มตั้งแต่ [1, 100,000] hyperparameters เหล่านี้จะถูกสุ่มตัวอย่างอย่างสม่ําเสมอในช่วงที่ระบุ

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 ผู้ใช้สามารถปรับแต่งโดเมนสําหรับ hyperparameter เฉพาะได้ ซึ่งช่วยให้ผู้ใช้สามารถระบุชนิดและช่วงที่ถูกต้องสําหรับพารามิเตอร์ตัวอย่างได้ FLAML สนับสนุนชนิด hyperparameter ดังต่อไปนี้: เลขทศนิยม จํานวนเต็ม และแบบจัดกลุ่ม คุณสามารถดูตัวอย่างนี้ด้านล่างสําหรับโดเมนที่ใช้กันทั่วไป:

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 เพื่อจับภาพเมตริกและพารามิเตอร์สําหรับการเรียกใช้เหล่านี้แต่ละครั้ง รหัสนี้จะจับการทดลองใช้การปรับแต่ง hyperparameter ทั้งหมด โดยเน้นชุดค่าไฮเปอร์พารามิเตอร์แต่ละชุดที่สํารวจโดย 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

เมื่อต้องการเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการขนานกับเส้นทางการปรับแต่งของคุณ คุณสามารถไปที่ เอกสารประกอบ FLAML สําหรับงาน Spark แบบขนาน

แสดงภาพผลลัพธ์

โมดูล flaml.visualization มีฟังก์ชันอรรถประโยชน์สําหรับการลงจุดกระบวนการปรับให้เหมาะสมโดยใช้ Plotly ผู้ใช้สามารถสํารวจผลลัพธ์การทดลอง AutoML แบบโต้ตอบโดยใช้ประโยชน์จาก Plotly เพื่อใช้ฟังก์ชันการลงจุดเหล่านี้ เพียงแค่ใส่วัตถุหรือflaml.tune.tune.ExperimentAnalysisที่flaml.AutoMLปรับให้เหมาะสมเป็นข้อมูลป้อนเข้า

คุณสามารถใช้ฟังก์ชันต่อไปนี้ภายในสมุดบันทึกของคุณได้:

  • plot_optimization_history: ประวัติการปรับให้เหมาะสมลงจุดของการทดลองใช้ทั้งหมดในการทดลอง
  • plot_feature_importance: ความสําคัญในการลงจุดสําหรับแต่ละคุณลักษณะในชุดข้อมูล
  • plot_parallel_coordinate: ลงจุดความสัมพันธ์ของพารามิเตอร์หลายมิติในการทดสอบ
  • plot_contour: ลงจุดความสัมพันธ์ของพารามิเตอร์เป็นแผนภูมิรูปร่างในการทดสอบ
  • plot_edf: ลงจุดค่าวัตถุประสงค์ EDF (ฟังก์ชันการแจกแจงแบบ empirical) ของการทดสอบ
  • plot_timeline: ลงจุดเส้นเวลาของการทดสอบ
  • plot_slice: ลงจุดความสัมพันธ์ของพารามิเตอร์เป็นชิ้นพล็อตในการศึกษา
  • plot_param_importance: ลงจุดความสําคัญของ hyperparameter ของการทดลอง