使用EnsembleProblem进行多启动优化
|
该页面正在翻译中。 |
该 [医]合奏,合奏 在SciML中,作为在多个初始化集上运行问题的通用接口。 在优化的上下文中,这对于执行多启动优化是有用的。
这对于复杂的低维问题很有用。 我们再次在rosenbrock函数上演示这一点。
我们首先执行一个局部优化 OptimizationOptimJL.BFGS公司 和 最大值=5:
using Optimization, OptimizationOptimJL, Random
Random.seed!(100)
rosenbrock(x, p) = (p[1] - x[1])^2 + p[2] * (x[2] - x[1]^2)^2
x0 = zeros(2)
optf = OptimizationFunction(rosenbrock, Optimization.AutoForwardDiff())
prob = OptimizationProblem(optf, x0, [1.0, 100.0])
@time sol1 = Optimization.solve(prob, OptimizationOptimJL.BFGS(), maxiters = 5)
@show sol1.objective
0.25297018300077956
将此结果与具有4个随机初始点的多启动方法进行比较:
x0s = [x0, x0 .+ rand(2), x0 .+ rand(2), x0 .+ rand(2)]
function prob_func(prob, i, repeat)
remake(prob, u0 = x0s[i])
end
ensembleprob = Optimization.EnsembleProblem(prob; prob_func)
@time sol = Optimization.solve(ensembleprob, OptimizationOptimJL.BFGS(),
EnsembleThreads(), trajectories = 4, maxiters = 5)
@show findmin(i -> sol[i].objective, 1:4)[1]
0.006959083213016885
使用相同数量的迭代(5),我们通过使用多个初始点获得更低(1/100th)的目标值。 这里使用的初始化策略是一个非常简单的策略,但是基于准蒙特卡洛采样的方法通常应该更有效。