我正在使用PYGMO软件包来解决一些讨厌的非线性最小化问题,并且对使用他们的simulated_annealing算法非常感兴趣,但是它有很多超参数,对于这些我真的没有什么好的直觉。其中包括:
Ts (float) – starting temperature Tf (float) – final temperature n_T_adj (int) – number of temperature adjustments in the annealing schedule n_range_adj (int) – number of adjustments of the search range performed at a constant temperature bin_size (int) – number of mutations that are used to compute the acceptance rate start_range (float) – starting range for mutating the decision vector
假设我有一个带有变量和搜索范围的4维几何注册(单应性)问题:
x1: [-10,10] (a shift in x) x2: [10,30] (a shift in y) x3: [-45,0] (rotation angle) x4: [0.5,2] (scaling/magnification factor)
并且随机(不好)选择值的成本函数是50。一个好的值应该在零左右。
我知道Ts和Tf是针对新解决方案的大都会验收标准的。这意味着Ts应该大约是成本函数中初始更改的预期大小,而Tf应该足够小,以至于不会有更多的更改。
在科拉纳的论文中,列出了许多有意义的超参数:N_s是在改变步长之前的评估周期数,N_T是在改变温度之前改变步长的次数,r_T是每次温度降低的因子。但是,我无法理解这些参数与pygmo的参数n_T_adj、n_range_adj、bin_size和start_range之间的关系。
我真的很好奇,是否有人可以解释pygmo的超参数是如何使用的,以及它们与Corana等人的原始论文有什么关系?
发布于 2018-01-20 01:37:22
我要在这里回答我自己的问题。我深入到实际的.cpp代码中,找到了答案。
在Corana的方法中,您可以选择您想要的退火的总迭代次数N。然后,最小化是一系列嵌套的循环,您可以在其中以用户定义的间隔改变步长、步长调整次数和温度值。在PAGMO中,他们更改了这一点,因此您可以显式指定您将执行这些操作的次数。这些是n_*参数和bin_size.,我认为bin_size在这里不是一个好名字,因为它实际上不是一个大小。它是通过bin范围所采取的步数,例如N=n_T_adj * n_range_adj * bin_range。我认为将其命名为n_bins或n_bins_adj更有意义。每次bin_size函数求值时,都会修改步长(限制见下文)。
在Corana的方法中,您指定乘法因子以在每次需要时降低温度;它可以在迭代用完之前达到最低温度,反之亦然。在PAGMO中,算法自动计算温度变化因子,以便您在迭代序列r_t=(Tf/Ts)**(1/n_T_adj)结束时到达Tf。
我认为start_range对于这个变量来说不是一个好名字。算法中的步长是0和start_range之间的分数,它定义了每个变量的上界和下界之间的搜索框的宽度。所以如果stepsize=0.5,width=0.5*(upper_bound-lower_bound)。在每次迭代中,都会根据接受的函数调用数来调整步长。如果步长大于start_range,则将其重置为该值。我想我会叫它step_limit。但这就对了。
https://stackoverflow.com/questions/48344081
复制相似问题