การปรับแต่ง Hyperparameter (ตัวอย่าง)
การปรับแต่ง Hyperparameter คือกระบวนการค้นหาค่าที่เหมาะสมสําหรับพารามิเตอร์ที่ไม่ได้เรียนรู้โดยแบบจําลองการเรียนรู้ของเครื่องในระหว่างการฝึกอบรม แต่ควรตั้งค่าโดยผู้ใช้ก่อนเริ่มกระบวนการฝึกอบรม พารามิเตอร์เหล่านี้มักจะเรียกว่า hyperparameters และตัวอย่างรวมถึงอัตราการเรียนรู้จํานวนเลเยอร์ที่ซ่อนอยู่ในเครือข่ายประสาทความแข็งแรงในการสม่ําเสมอและขนาดชุด
ประสิทธิภาพของแบบจําลองการเรียนรู้ของเครื่องอาจมีความอ่อนไหวสูงในการเลือก hyperparameters และชุด hyperparameters ที่เหมาะสมอาจแตกต่างกันอย่างมากขึ้นอยู่กับปัญหาและชุดข้อมูลเฉพาะ การปรับแต่ง Hyperparameter จึงเป็นขั้นตอนสําคัญในไปป์ไลน์การเรียนรู้ของเครื่องเนื่องจากอาจมีผลกระทบอย่างมากต่อความแม่นยําและประสิทธิภาพการทํางานทั่วไปของแบบจําลอง
ใน Fabric นักวิทยาศาสตร์ข้อมูลสามารถใช้ประโยชน์จาก FLAML
ไลบรารี Python น้ําหนักเบาสําหรับระบบอัตโนมัติที่มีประสิทธิภาพของการเรียนรู้ของเครื่องและการดําเนินงาน AI สําหรับข้อกําหนดการปรับแต่ง hyperparameter ของพวกเขา ภายในโน้ตบุ๊ค Fabric ผู้ใช้สามารถเรียกร้อง flaml.tune
ให้ทําการปรับแต่ง hyperparameter ประหยัดได้
สำคัญ
คุณลักษณะนี้อยู่ในตัวอย่าง
การปรับแต่งเวิร์กโฟลว์
มีสามขั้นตอนที่จําเป็นเพื่อใช้ flaml.tune
เพื่อทําให้งานการปรับแต่งพื้นฐานเสร็จสิ้น:
- ระบุวัตถุประสงค์การปรับแต่งตาม hyperparameters
- ระบุพื้นที่การค้นหาของ hyperparameters
- ระบุข้อจํากัดการปรับแต่ง รวมถึงข้อจํากัดบนงบประมาณทรัพยากรเพื่อทําการปรับแต่ง ข้อจํากัดในการกําหนดค่า หรือ/และข้อจํากัดบนเมตริกเฉพาะ (หรือหลายรายการ)
วัตถุประสงค์การปรับแต่ง
ขั้นตอนแรกคือการระบุวัตถุประสงค์การปรับแต่งของคุณ เมื่อต้องการทําเช่นนี้ ก่อนอื่นคุณควรระบุขั้นตอนการประเมินของคุณโดยคํานึงถึง 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 ของการทดลอง