我使用PYGMO软件包来解决一些令人讨厌的非线性最小化问题,并且对使用他们的模拟退火算法非常感兴趣,但是它有很多超参数我不是真的有任何好的直觉。其中包括:
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
是针对新解决方案的Metropolis接受标准。这意味着Ts
应该与成本函数中初始更改的预期大小相关,并且Tf
小到足以使得不再需要更改。
在Corana的论文中,列出了许多有意义的超参数:N_s
是更改步长之前的评估周期数,N_T
是之前步长变化的数量改变温度,r_T
是每次降低温度的因素。但是,我无法弄清楚这些与n_T_adj
,n_range_adj
,bin_size
和start_range
的pygmo参数之间的关系。
我真的很好奇是否有人可以解释如何使用pygmo的超参数,以及它们与Corana等人的原始论文有何关联?
答案 0 :(得分:0)
这里要回答我自己的问题。我爬进了实际的.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中,算法会自动计算温度变化因子,以便在迭代序列结束时达到Tf
:r_t=(Tf/Ts)**(1/n_T_adj)
。
我认为start_range
是这个变量的坏名字。算法中的步长是0
和start_range
之间的分数,它定义了每个变量的上限和下限之间的搜索区间的宽度。如果是stepsize=0.5
,width=0.5*(upper_bound-lower_bound)
。在每次迭代时,根据接受的函数调用次数调整步长。如果步长大于start_range
,则会将其重置为该值。我想我会称之为step_limit
。但是你去吧。