Документация Engee

OptimizationODE.jl

Страница в процессе перевода.

OptimizationODE.jl предоставляет методы оптимизации на основе ОДУ в виде плагина решателя для пакета Optimization.jl из SciML. Он инкапсулирует различные решатели ОДУ для выполнения градиентной оптимизации с использованием непрерывной динамики.

Установка

using Pkg
Pkg.add("OptimizationODE")

Использование

using OptimizationODE, Optimization, ADTypes, SciMLBase

function f(x, p)
    return sum(abs2, x)
end

function g!(g, x, p)
    @. g = 2 * x
end

x0 = [2.0, -3.0]
p = []

f_manual = OptimizationFunction(f, SciMLBase.NoAD(); grad = g!)
prob_manual = OptimizationProblem(f_manual, x0)

opt = ODEGradientDescent(dt=0.01)
sol = solve(prob_manual, opt; maxiters=50_000)

@show sol.u
@show sol.objective

Локальные градиентные оптимизаторы

Все предоставляемые оптимизаторы являются локальными градиентными оптимизаторами, которые решают задачи оптимизации путем интегрирования градиентных ОДУ до достижения сходимости:

  • ODEGradientDescent(dt=...) — выполняет базовый градиентный спуск с использованием явного метода Эйлера. Это простой и эффективный метод, подходящий для небольших или хорошо обусловленных задач.

  • RKChebyshevDescent() — использует решатель ROCK2, стабилизированный явный метод Рунге — Кутты, подходящий для жестких задач. Допускает шаги большего размера, сохраняя при этом устойчивость.

  • RKAccelerated() — использует метод Tsit5, решатель Рунге — Кутты 5-го порядка, который обеспечивает более быструю сходимость в случае гладких задач за счет повышения точности интегрирования.

  • HighOrderDescent() — применяет Vern7, явный метод Рунге — Кутты высокого (7-го) порядка для еще более точного интегрирования. Это может быть полезно для задач, требующих высокой точности.

Вы также можете определить пользовательский оптимизатор с помощью универсального конструктора ODEOptimizer(solver; dt=nothing), указав любой решатель ОДУ, поддерживаемый пакетом OrdinaryDiffEq.jl.

Оптимизаторы на основе ДАУ

Warn Оптимизаторы на основе ДАУ все еще находятся на стадии эксперимента и исследований. Используйте их с осторожностью.

Помимо оптимизаторов на основе ОДУ, OptimizationODE.jl предоставляет оптимизаторы для задач с ограничениями на основе дифференциально-алгебраических уравнений (ДАУ):

  • DAEMassMatrix() — использует решатель Rodas5P (из OrdinaryDiffEq.jl) для задач ДАУ с формулировкой матрицы масс.

  • DAEOptimizer(IDA()) — использует решатель IDA (из Sundials.jl) для задач ДАУ с поддержкой индексных переменных (требуется using Sundials).

Вы также можете определить пользовательский оптимизатор с помощью универсального конструктора ODEOptimizer(solver) или DAEOptimizer(solver), указав любой решатель ОДУ или ДАУ, поддерживаемый пакетом OrdinaryDiffEq.jl или Sundials.jl.

Сведения об интерфейсе

Всем оптимизаторам требуется информация о градиенте (либо получаемая посредством автоматического дифференцирования, либо указываемая в grad! вручную). Оптимизация производится путем интегрирования ОДУ, определяемого отрицательным градиентом, до достижения устойчивого состояния.