AnyMath 文档

使用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)的目标值。 这里使用的初始化策略是一个非常简单的策略,但是基于准蒙特卡洛采样的方法通常应该更有效。