调优搜索算法 (tune.search)#
Tune 的搜索算法是围绕开源优化库的封装,用于高效的超参数选择。每个库都有特定的定义搜索空间的方式 - 请参阅它们的文档以获取更多详细信息。在大多数情况下,Tune 会自动将传递给 Tuner
的搜索空间转换为库的格式。
你可以如下利用这些搜索算法:
from ray import train, tune
from ray.train import RunConfig
from ray.tune.search.optuna import OptunaSearch
def train_fn(config):
# This objective function is just for demonstration purposes
train.report({"loss": config["param"]})
tuner = tune.Tuner(
train_fn,
tune_config=tune.TuneConfig(
search_alg=OptunaSearch(),
num_samples=100,
metric="loss",
mode="min",
),
param_space={"param": tune.uniform(0, 1)},
)
results = tuner.fit()
保存和恢复 Tune 搜索算法#
某些搜索算法实现了 保存/恢复
功能,允许在多次调优运行的结果上重复使用已拟合的搜索器。
search_alg = HyperOptSearch()
tuner_1 = tune.Tuner(
train_fn,
tune_config=tune.TuneConfig(search_alg=search_alg)
)
results_1 = tuner_1.fit()
search_alg.save("./my-checkpoint.pkl")
# Restore the saved state onto another search algorithm,
# in a new tuning script
search_alg2 = HyperOptSearch()
search_alg2.restore("./my-checkpoint.pkl")
tuner_2 = tune.Tuner(
train_fn,
tune_config=tune.TuneConfig(search_alg=search_alg2)
)
results_2 = tuner_2.fit()
Tune 在调优期间会自动将搜索器状态保存在当前实验文件夹中。请查看输出日志中的 Result logdir: ...
以获取此位置。
请注意,如果你有两个使用相同实验文件夹的 Tune 运行,之前的检查点状态将被覆盖。你可以通过确保 RunConfig(name=...)
设置为唯一标识符来避免这种情况:
search_alg = HyperOptSearch()
tuner_1 = tune.Tuner(
train_fn,
tune_config=tune.TuneConfig(
num_samples=5,
search_alg=search_alg,
),
run_config=RunConfig(
name="my-experiment-1",
storage_path="~/my_results",
)
)
results = tuner_1.fit()
search_alg2 = HyperOptSearch()
search_alg2.restore_from_dir(
os.path.join("~/my_results", "my-experiment-1")
)
随机搜索和网格搜索 (tune.search.basic_variant.BasicVariantGenerator)#
默认且最基本的方式来进行超参数搜索是通过随机搜索和网格搜索。Ray Tune 通过 BasicVariantGenerator
类来实现这一点,该类根据搜索空间定义生成试验变体。
如果没有向 Tuner
传递搜索算法,默认使用 BasicVariantGenerator
。
使用 Tune 的变体生成来解析变量。 |
Ax (tune.search.ax.AxSearch)#
使用 Ax 优化超参数。 |
贝叶斯优化 (tune.search.bayesopt.BayesOptSearch)#
使用 fmfn/BayesianOptimization 优化超参数。 |
BOHB (tune.search.bohb.TuneBOHB)#
BOHB (贝叶斯优化超带) 是一种既终止不良试验又使用贝叶斯优化来改进超参数搜索的算法。它可以从 HpBandSter 库 中获得。
重要的是,BOHB 旨在与特定的调度器类配对:HyperBandForBOHB。
为了使用这个搜索算法,你需要安装 HpBandSter
和 ConfigSpace
:
$ pip install hpbandster ConfigSpace
更多详情请参见 BOHB 论文。
BOHB 建议组件。 |
HEBO (tune.search.hebo.HEBOSearch)#
使用 HEBO(异方差进化贝叶斯优化)来优化超参数。 |
HyperOpt (tune.search.hyperopt.HyperOptSearch)#
一个围绕 HyperOpt 的包装器,用于提供试验建议。 |
Nevergrad (tune.search.nevergrad.NevergradSearch)#
使用 Nevergrad 优化超参数。 |
Optuna (tune.search.optuna.OptunaSearch)#
一个围绕 Optuna 的包装器,用于提供试验建议。 |
ZOOpt (tune.search.zoopt.ZOOptSearch)#
一个围绕 ZOOpt 的包装器,用于提供试验建议。 |
重复评估 (tune.search.Repeater)#
使用 ray.tune.search.Repeater
来平均多个相同超参数配置的评估结果。这在评估训练过程具有高方差的情况下非常有用(例如,在强化学习中)。
默认情况下,Repeater
会接收一个 repeat
参数和一个 search_alg
。search_alg
会建议新的配置进行尝试,Repeater
将运行 repeat
次该配置的试验。然后,它将从每次重复试验的最终结果中平均 search_alg.metric
。
警告
建议不要在 TrialScheduler 中使用 Repeater
。提前终止可能会对报告的平均指标产生负面影响。
一个用于重复相同参数试验的包装算法。 |
并发限制器 (tune.search.ConcurrencyLimiter)#
使用 ray.tune.search.ConcurrencyLimiter
来限制使用搜索算法时的并发量。这在给定的优化算法并行化效果不佳时非常有用(例如朴素贝叶斯优化)。
用于限制并发试验数量的包装算法。 |
自定义搜索算法 (tune.search.Searcher)#
如果你有兴趣实现或贡献一个新的搜索算法,请提供以下接口:
用于包装建议算法的抽象类。 |
查询算法以检索下一组参数。 |
|
将状态保存到此搜索算法的路径。 |
|
恢复此搜索算法的状态 |
|
训练期间结果的通知(可选)。 |
|
试用完成的通知。 |
如果参与贡献,请确保添加测试用例并在下面描述的函数中添加条目。
垫片实例化 (tune.create_searcher)#
还有一个shim函数,它根据提供的字符串构建搜索算法。如果你想要使用的搜索算法经常变化(例如,通过CLI选项或配置文件指定搜索算法),这可能会很有用。
基于给定的字符串实例化一个搜索算法。 |