跳转到主要内容

全局、无导数和无参数(超参数)优化

项目描述

LIPO是一个用于导数和无参数全局优化的软件包,例如用于超参数调整。它基于dlib软件包,并提供对其优化例程的包装。

该算法优于随机搜索 - 有时差距可达10000倍。与需要“调整调整器”的贝叶斯优化相比,它通常更可取。性能与适度或良好调优的贝叶斯优化相当。

提供的实现具有在找到限制过于严格(即最优解过于接近其中一个)时自动扩大搜索空间的选择。

有关详细信息,请参阅LIPO算法实现

存在一篇关于dlib作者的优秀博客文章,描述了它是如何工作的。

安装

执行

pip安装lipo

用法

from lipo import GlobalOptimizer

def function(x, y, z):
    zdict = {"a": 1, "b": 2}
    return -((x - 1.23) ** 6) + -((y - 0.3) ** 4) * zdict[z]

pre_eval_x = dict(x=2.3, y=13, z="b")
evaluations = [(pre_eval_x, function(**pre_eval_x))]

search = GlobalOptimizer(
    function,
    lower_bounds={"x": -10.0, "y": -10},
    upper_bounds={"x": 10.0, "y": -3},
    categories={"z": ["a", "b"]},
    evaluations=evaluations,
    maximize=True,
)

num_function_calls = 1000
search.run(num_function_calls)

如果需要,优化器将自动扩展搜索边界。

此外,该软件包提供scikit-learn接口的实现,用于超参数搜索。

from lipo import LIPOSearchCV

search = LIPOSearchCV(
    estimator,
    param_space={"param_1": [0.1, 100], "param_2": ["category_1", "category_2"]},
    n_iter=100
)
search.fit(X, y)
print(search.best_params_)

与其他框架的比较

有关基准测试,请参阅benchmark目录中的notebook。

scikit-optimize

这是一个贝叶斯框架。

+ 选择良好的先验可以略微加快速度并获得非常好的结果

- 如果选择了错误的先验,调整可能需要很长时间

- 它不是参数-free - 可能会陷入局部最优,这意味着可能需要调整调整器

- 当 LIPO 接近最小值时,使用二次近似可以更快地收敛

- 搜索空间的探索不是系统的,即结果可能因运行而异

Optuna

+ 它并行化非常好

+ 它可以提前停止训练。这非常有用,例如对于神经网络,可以加快调整速度

+ 选择良好的先验可以略微加快速度并获得非常好的结果

- 如果选择了错误的先验,调整可能需要很长时间

- 它不是无参数的,即可能需要对调优器进行一些调整(尽管默认设置相当不错)

- 当 LIPO 接近最小值时,使用二次近似可以更快地收敛

- 搜索空间的探索不是系统的,即结果可能因运行而异

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面