原文:
www.kdnuggets.com/2021/09/fast-automl-flaml-ray-tune.html
评论
FLAML是微软研究院推出的轻量级 Python 库,利用前沿算法以高效和经济的方式寻找准确的机器学习模型,这些算法旨在节省资源并易于并行化。FLAML 还可以利用Ray Tune进行分布式超参数调优,将这些 AutoML 方法扩展到集群中。
本博客重点介绍:
-
对经济高效 AutoML 方法的需求
-
经济高效的 AutoML 与 FLAML
-
如何用 Ray Tune 扩展 FLAML 的优化算法
众所周知,AutoML 是一项资源和时间消耗大的操作,因为它涉及通过试错找到性能良好的超参数配置。由于可能的配置值空间通常非常大,因此需要一种经济高效的 AutoML 方法来更有效地进行搜索。
AutoML 中超参数搜索的高资源和时间消耗归结为以下两个因素:
-
需要大量候选超参数配置(试验)来找到性能良好的配置
-
每个超参数的高‘评估’成本,因为评估涉及使用给定的训练数据训练和验证机器学习模型。
为了解决这两个因素,微软研究人员开发了FLAML(快速轻量级 AutoML)。
FLAML 是一个新发布的库,包含最先进的超参数优化算法。FLAML 利用搜索空间的结构,同时优化成本和模型性能。它包含微软研究院开发的两种新方法:
-
成本节俭优化(CFO)
-
BlendSearch
成本节俭优化(CFO)是一种以成本感知方式进行搜索过程的方法。搜索方法从低成本初始点开始,逐渐向高成本区域移动,同时优化给定的目标(如模型损失或准确率)。
Blendsearch 是 CFO 的扩展,结合了 CFO 的节俭性和贝叶斯优化的探索能力。像 CFO 一样,BlendSearch 需要一个低成本的初始点作为输入(如果存在),并从那里开始搜索。然而,与 CFO 不同的是,BlendSearch 不会等待局部搜索完全收敛后再尝试新的起始点。
FLAML 中的经济 HPO 方法灵感来源于两个关键见解:
-
许多机器学习算法有超参数会导致训练成本的大幅变化。例如,10 棵树的 XGBoost 模型比 1000 棵树的模型训练速度要快得多。
-
参数的“成本”通常是‘连续且一致的’——评估树=10 的成本低于评估树=100,而评估树=100 的成本又低于评估树=500。
这些见解一起提供了关于成本空间中超参数的有用结构信息。这些方法,即 CFO 和 BlendSearch,能够有效利用这些见解来减少沿途产生的成本,而不会影响到达最优解的收敛。
在最新的AutoML 基准中,FLAML能够在 62%以上的任务中,仅使用 10%的计算资源,实现与最先进 AutoML 解决方案相同或更好的性能。
FLAML 的性能归功于其经济优化方法。新的 HPO 方法(CFO、BlendSearch)利用搜索空间的结构来选择优化的搜索顺序,以兼顾良好的性能和低成本。这在预算限制下可以显著提高搜索效率。
图 1 显示了从 FLAML 和最先进的超参数调整库Optuna中获得的典型结果,用于调整 9 维超参数的 LightGBM。你可以看到 FLAML 在更短的时间内能够获得更好的解决方案。
图 1. 在classification dataset上调整 LightGBM 的验证损失(1-auc)曲线。线条和阴影区域显示了 10 次运行中验证损失的均值和标准差。该图中的结果是从使用 1 个 CPU 而不进行并行计算的实验中获得的(图像由作者提供)。
以下代码示例展示了如何用仅几行代码开始使用 FLAML(假设训练数据集已经提供并保存为X_train
、y_train
)。任务是在 60 秒的时间预算内调整 LightGBM 模型的超参数。
**from** flaml **import** AutoML
automl = AutoML()
automl.fit(X_train=X_train, y_train=y_train, time_budget=60, estimator_list=['lgbm'])
''' retrieve best model and best configuration found'''
print('Best ML model:', automl.model)
print('Best hyperparameter config:', automl.best_config)
在这个示例中,我们在 LightGBM 的默认搜索空间上进行搜索,该搜索空间已经在 FLAML 中提供。FLAML 提供了丰富的定制选项,涉及到关注的任务,例如学习器类、搜索空间、评估指标等。
现在我们使用一个示例来展示 CFO 在调整 XGBoost 的两个超参数(树的数量和叶子的数量)时的成本节约行为。
'''create an XGBoost learner class with a customized search space'''
**from** flaml.model **import** XGBoostSklearnEstimator
**from** flaml **import** tune
**class** **MyXGB**(XGBoostSklearnEstimator):
'''XGBoostSklearnEstimator with a customized search space'''
@classmethod
**def** **search_space**(cls, data_size, **params):
upper = min(2**15, int(data_size))
**return** {
'n_estimators': {
'domain': tune.lograndint(lower=4, upper=upper),
'low_cost_init_value': 4,
},
'max_leaves': {
'domain': tune.lograndint(lower=4, upper=upper),
'low_cost_init_value': 4,
},
}
'''Use CFO in FLAML to tune XGBoost'''
**from** flaml **import** AutoML
automl = AutoML()
automl.add_learner(learner_name='my_xgboost', learner_class=MyXGB)
automl.fit(X_train=X_train, y_train=y_train, time_budget=15, estimator_list=['my_xgboost'], hpo_method='cfo')
以下两个 GIF 分别展示了 CFO 在损失和评估成本(即评估时间)空间中的搜索轨迹。CFO 从一个低成本的初始点(通过low_cost_init_value
在搜索空间中指定)开始,并根据其随机化的局部搜索策略执行局部更新。采用这种策略,CFO 可以快速向低损失区域移动,显示出良好的收敛特性。此外,CFO 倾向于避免探索高成本区域,直到必要时才会进行。这种搜索策略通过一个可证明的收敛速率和期望的有界成本进一步得到支持。
图 2 展示了 CFO 在调整 XGBoost 的叶子数和树数时的表现。两个热力图显示了所有配置的损失和成本分布。黑点是 CFO 评估的点,黑点通过线连接表示评估时产生更好损失表现的点(图像由作者提供)。
BlendSearch 进一步将 CFO 使用的局部搜索策略与全局搜索结合。它利用 CFO 的节俭性和全局搜索方法(如贝叶斯优化)的空间探索能力。具体来说,BlendSearch 维护一个全局搜索模型,并根据全局模型提出的超参数配置逐渐创建局部搜索线程。它根据实时性能和成本优先考虑全局搜索线程和多个局部搜索线程。这可以进一步提高 CFO 在复杂搜索空间任务中的效率,例如包含多个不连续子空间的搜索空间。
图 3 展示了 FLAML 中经济型 HPO 方法(在此图中 CFO 标记为LS
)与用于调整具有 11 个超参数的 XGBoost 的贝叶斯优化(BO)方法的典型行为。
从图 3(a)中,我们观察到 BO 提出的配置的评估时间可能非常长。当总资源有限时,例如 1 个 cpu 小时(或更少),BO 无法给出令人满意的结果(图 3(b))。
FLAML 的 CFO(标记为 LS)和 BlendSearch 在快速找到良好配置方面具有明显优势:它们能够集中于评估时间较短的配置,同时导航于表现良好的配置,即低损失。
图 3. (a) 是不同方法提出的超参数配置的散点图,x 轴和 y 轴分别为评估时间和损失。超参数配置的评估时间是指在训练数据上训练机器学习模型并在验证数据集上验证其性能所花费的时间。损失是验证损失。 (b) 展示了不同方法在墙钟时间上的最佳损失。 (image source)
为了加速超参数优化,你可能需要并行化你的超参数搜索。例如,BlendSearch 能够在并行设置中良好运行:它利用多个搜索线程,这些线程可以独立执行而性能不会明显下降。这种理想的属性在现有优化算法(如贝叶斯优化)中并不总是成立。
为了实现并行化,FLAML 与 Ray Tune 集成。Ray Tune 是一个 Python 库,通过允许你利用最前沿的优化算法来加速超参数调优。Ray Tune 还允许你将超参数搜索从你的笔记本电脑扩展到集群,而无需更改代码。你可以在 FLAML 中使用 Ray Tune,或在 Ray Tune 中运行 FLAML 的超参数搜索方法以并行化你的搜索。以下代码示例展示了前一种用法,只需通过配置 n_concurrent_trials
参数即可实现。
'''Use BlendSearch for hyperparameter search, and Ray Tune for parallelizing concurrent trials (when n_concurrent_trials > 1) in FLAML to tune XGBoost'''
**from** flaml **import** AutoML
automl = AutoML()
automl.add_learner(learner_name='my_xgboost', learner_class=MyXGB)
automl.fit(X_train=X_train, y_train=y_train, time_budget=15, estimator_list=['my_xgboost'], hpo_method='bs', n_concurrent_trials=8)
Logo 来源 (XGBoost、FLAML、Ray Tune)
下面的代码展示了后者用法,即如何在 Ray Tune 中使用 BlendSearch 的端到端示例。
**from** ray **import** tune
**from** flaml **import** CFO, BlendSearch
**import** time
**def** **training_func**(config):
'''evaluate a hyperparameter configuration'''
# we use a toy example with 2 hyperparameters
metric = (round(config['x'])-85000)**2 - config['x']/config['y']
# usually the evaluation takes a non-neglible cost
# and the cost could be related to certain hyperparameters
# in this example, we assume it's proportional to x
time.sleep(config['x']/100000)
# use tune.report to report the metric to optimize
tune.report(metric=metric)
# provide the search space
search_space = {
'x': tune.lograndint(lower=1, upper=100000),
'y': tune.randint(lower=1, upper=100000)
}
# provide the low cost partial config
low_cost_partial_config={'x':1}
# set up BlendSearch
blendsearch = BlendSearch(
metric="metric", mode="min",
space=search_space,
low_cost_partial_config=low_cost_partial_config)
blendsearch.set_search_properties(config={"time_budget_s": 60})
analysis = tune.run(
training_func, # the function to evaluate a config
config=search_space,
metric='metric', # the name of the metric used for optimization
mode='min', # the optimization mode, 'min' or 'max'
num_samples=-1, # the maximal number of configs to try, -1 means infinite
time_budget_s=60, # the time budget in seconds
local_dir='logs/', # the local directory to store logs
search_alg=blendsearch # or cfo
)
print(analysis.best_trial.last_result) # the best trial's result
print(analysis.best_config) # the best config
其他关键的 Ray Tune 功能包括:
-
自动集成实验跟踪工具,如 Tensorboard 和 Weights/Biases
-
支持 GPU
-
提前停止
-
一个 scikit-learn API 以便轻松集成 XGBoost、LightGBM、Scikit-Learn 等。
我们进行了一项实验,以检查 BlendSearch 在高度并行化设置中与 Optuna(使用多变量 TPE 采样器)和随机搜索的对比。我们使用了来自 AutoML Benchmark 的 12 个数据集的子集。每次优化运行使用 16 个并行试验进行 20 分钟,采用 3 折交叉验证,使用 ROC-AUC(针对多类数据集的加权一对多)。这些运行重复三次,使用不同的随机种子。重现代码可以在 这里 找到。
图片由作者提供
BlendSearch 在 12 个数据集中的 6 个上实现了最佳交叉验证得分。此外,BlendSearch 相比随机搜索平均提高了 2.52%,而 Optuna 则为 1.96%。值得注意的是,BlendSearch 使用了单变量的 Optuna-TPE 作为全局搜索器——使用多变量 TPE 很可能进一步提高得分。
图片由作者提供
此外,由于其节省成本的方式,BlendSearch 平均在相同时间限制内评估的试验次数是其他搜索器的两倍。这表明,随着时间预算的增加,BlendSearch 与其他算法之间的差距将会扩大。
FLAML 是一个新发布的库,包含了 最先进的 超参数优化算法,利用搜索空间的结构同时优化成本和模型性能。FLAML 还可以利用 Ray Tune 进行分布式超参数调优,以在集群中扩展这些经济高效的 AutoML 方法。
有关 FLAML 的更多信息,请参见 GitHub 仓库 和 项目页面。如果你想及时了解 Ray 的一切,请考虑 关注 @raydistributed 的 Twitter 并 订阅新闻通讯。
原文。转载已获许可。
相关:
-
TPOT 机器学习管道优化
-
二分类自动机器学习
-
Hugging Face AutoNLP 概述及示例项目
1. Google 网络安全证书 - 快速进入网络安全职业生涯。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你所在组织的 IT