Gradient-Free-Optimizers Python中现代优化方法的集合

2021-02-28 22:30:21

无梯度优化器提供了一组易于使用的优化技术,其目标函数只需要任意分数即可最大化。这使得无梯度方法能够解决各种优化问题,其中包括:

Gradient-Free-Optimizers是Hyperactive的优化后端(在v3.0.0和更高版本中),但它本身也可以用作更精简的优化工具包。

您可以优化可以在python函数中定义的任何内容。例如一个简单的抛物线函数:

这就是算法在目标函数中搜索最大值所需的所有信息:

无梯度优化器不仅提供元启发式优化方法,而且还提供基于顺序模型的优化器(如贝叶斯优化),从而为昂贵的对象功能(如深度学习模型)提供了良好的效果。

即使对于非常简单的抛物线函数,使用随机搜索进行优化时,优化时间也大约是整个迭代时间的60%。这表明(尽管具有所有功能)无梯度优化器具有高效的优化后端,而没有任何不必要的速度降低。

默认情况下,Gradient-Free-Optimizers将在评估目标函数之前在内存字典中查找当前位置。

如果位置不在字典中,则将评估目标函数,并将位置和分数保存在字典中。

如果某个位置已经保存在字典中,则Gradient-Free-Optimizers只会从中提取分数,而不是评估目标函数。这避免了重新评估计算上昂贵的目标函数(机器学习或深度学习),因此节省了时间。

Gradient-Free-Optimizers经过2500行测试代码中的400多次测试,得到了广泛的测试。这包括对以下各项的测试:

每个优化算法必须执行高于特定阈值(对于选定的目标功能)才能包括在内。表现不佳的算法会被重做或取消。

Gradient-Free-Optimizers支持多种优化算法,这会使选择正确的算法成为一项繁琐的工作。本节中的gif图像直观地表示了不同的优化算法如何探索搜索空间以及如何利用收集到的有关搜索空间的信息来获取凸和非凸目标函数。

爬山评估在epsilon环境中n个邻居的得分,并向最佳邻居前进。

排斥爬坡爬坡迭代+如果找不到更好的邻居,则将ε增加一倍。

模拟的退火山爬坡迭代+接受随着时间的流逝而逐渐降低的概率(过渡概率),移至较差的位置。

随机重新开始爬山n次迭代后,爬山+移动到随机位置。

粒子群优化n个粒子的粒子相互吸引并朝着最佳粒子移动。

Parzen估计量树内核密度估计量适合于好的和坏的探索位置,并预测有前途的新位置。

决策树优化程序决策树的组合适合搜索的职位并预测有希望的新职位。

从gradient_free_optimizers中将numpy导入为np导入RandomSearchOptimizer def parabola_function(para):loss = para [" x"] * para [" x"] return-loss search_space = {" x& #34;:np。 arange(-10,10,0.1)} opt = RandomSearchOptimizer(search_space)opt。搜索(parabola_function,n_iter = 100000)

从gradient_free_optimizers中将numpy导入为np导入RandomSearchOptimizer def ackley_function(pos_new):x = pos_new [" x1"] y = pos_new [" x2"] a1 =-20 * np。 exp(-0.2 * np。sqrt(0.5 *(x * x + y * y)))a2 =-np。 exp(0.5 *(np。cos(2 * np。pi * x)+ np。cos(2 * np。pi * y)))score = a1 + a2 + 20 return-score search_space = {" x1& #34;:np。 arange(-100,101,0.1)," x2&#34 ;: np。 opt(arange(-100,101,0.1),} opt = RandomSearchOptimizer(search_space)opt。搜索(ackley_function,n_iter = 30000)

从sklearn将numpy导入为np。 model_selection从sklearn导入cross_val_score。集成从sklearn导入GradientBoostingClassifier。数据集从gradient_free_optimizers导入load_wine导入HillClimbingOptimizer data = load_wine()X,y = data。数据,数据。目标def模型(para):gbc = GradientBoostingClassifier(n_estimators = para [" n_estimators"],max_depth = para [" max_depth"],min_samples_split = para [" min_samples_split&#34 ;],min_samples_leaf = para [" min_samples_leaf"],)得分= cross_val_score(gbc,X,y,cv = 3)返回得分。 mean()search_space = {" n_estimators":np。 arange(20,120,1)," max_depth&#34 ;: np。 arange(2,12,1)," min_samples_split&#34 ;: np。 arange(2,12,1)," min_samples_leaf&#34 ;: np。 arange(1,12,1),} opt = HillClimbingOptimizer(search_space)opt。搜索(模型,n_iter = 50)

将search_space传递给优化器类以定义空间,优化算法可以为给定目标函数搜索最佳参数。

初始化字典自动确定将在前n次迭代中评估的参数数量(n是Initialize中值的总和)。 initialize关键字如下:

初始化网格状图案中的位置。无法放置到网格中的位置是随机放置的。

初始化搜索空间顶点处的位置。无法放置到顶点的位置是随机放置的。

每个优化类都需要" search_space"作为输入参数。 (可选)"初始化"并且还可以传递优化程序特定的参数。您可以在《优化教程》中阅读有关每个优化策略及其参数的更多信息。

目标函数定义了优化问题。优化算法将通过从搜索空间中尝试不同的参数来尝试最大化目标函数返回的数值。

优化运行期间将执行的迭代次数。整个迭代包括优化步骤和评估步骤,优化步骤确定要评估的下一个参数,评估步骤将使用所选参数运行目标函数并返回得分。

直到优化停止的最大秒数。在每次完成迭代后将检查时间。

在优化停止之前的最高分数。每次完成迭代后将检查分数。

是否使用记忆功能。内存是一个字典,在优化运行期间会充满参数和分数。如果优化器遇到字典中已经存在的参数,则仅提取分数而不是重新评估目标函数(这可能需要很长时间)。

包含得分和参数信息的熊猫数据框将自动加载到内存字典中。

详细列表确定将在命令行中打印优化信息的哪一部分。

数据框,其中包含有关得分,每个参数的值以及评估和迭代时间的信息。每行显示一次优化迭代的信息。

在基于种群的优化器中改善对优化器参数的访问(例如,平行回火中模拟退火种群的退火速率)

Gradient-Free-Optimizers被创建为Hyperactive软件包的优化后端。因此,两个软件包中的算法完全相同,并且提供相同的结果,但是您仍然可以将Gradient-Free-Optimizers作为独立软件包使用。将Gradient-Free-Optimizers与Hyperactive分开具有多个优势:

更好地隔离Hyperactive中复杂的信息流。 GFO仅使用N维搜索空间中的位置和分数。每次迭代后,它仅返回新位置。

如果要探索我对这些优化技术的实现,请使用更小巧,更简洁的代码库。

@Misc {gfo2020,作者= {{Simon Blanke}},标题= {{Gradient-Free-Optimizers}:在数字搜索空间中使用局部,全局,基于种群和顺序技术进行简单可靠的优化。},出版方式= { \ url {https://github.com/SimonBlanke}},年份= {自2020年}}