我正在尝试最小化一个简单的嘈杂功能:
function(x,prec=10){x^2+rnorm(1)/(prec)}
在这里我认为重要的是,噪声是独立的,即重复评估同一点将使您更接近真实(无噪声)值。优化器可以利用这一点。 Bu我不确定如何。
我在R中使用mlrMBO
进行优化,但是无法获得良好的结果。下面的代码估计最小值为0.032,增加iters
似乎根本无法改善结果。
library(mlrMBO)
f1<-function(x,prec=10){x^2+rnorm(1)/(prec)}
obj.fun = makeSingleObjectiveFunction(name = "noisy_parable", fn = f1, par.set = makeNumericParamSet("x", 1, -3, 3), noisy = TRUE)
ctrl = makeMBOControl(final.method = "best.predicted", final.evals = 1)
ctrl = setMBOControlInfill(ctrl, crit = crit.eqi)
ctrl = setMBOControlTermination(ctrl, iters = 10)
configureMlr(on.learner.warning = "quiet", show.learner.output = FALSE)
set.seed(1)
res = mbo(obj.fun, control = ctrl, show.info = FALSE)
print(res$x)
我的直觉是增加iter
可以继续将结果改进到任意准确的结果:逻辑是,随着我们越来越接近最优,优化器可以利用优化的独立性。通过重复评估相同/相似的点来提高准确性。
我认为这是一个相当通用的设置(具有独立噪声的嘈杂优化),因此我认为优化器将内置此属性,并且可以通过调整参数进行控制。如果不是这种情况,是否可以使用mlrBMO
来实现?
背景:在我的实际应用中,对该功能的评估非常昂贵(> 2秒的噪声大约等于上面的示例),因此我将从噪点函数的开始中学到很多东西,然后在接近最佳值时才提高精度(通过重复评估相同的点)。
我自己在这里询问并回答了一个框架更广泛的相关问题(对这种问题有什么好的算法?):https://math.stackexchange.com/questions/3376670/efficient-algorithm-to-search-minimum-of-function-with-noise/3397309#3397309