Оптимизация методом мультистарта с помощью EnsembleProblem
|
Страница в процессе перевода. |
EnsembleProblem в SciML служит общим интерфейсом для выполнения задачи с несколькими наборами начальных значений. Когда речь идет об оптимизации, это полезно для проведения оптимизации методом мультистарта.
Это может быть полезно для решения сложных задач низкой размерности. Продемонстрируем это и в данном случае на примере функции Розенброка.
Сначала выполним одну локальную оптимизацию с OptimizationOptimJL.BFGS и maxiters=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) получается гораздо меньшее (в 100 раз) целевое значение за счет использования нескольких начальных точек. Примененная здесь стратегия инициализации была довольно примитивной, но подходы, основанные на выборке методом квази-Монте-Карло, обычно бывают более эффективными.