OptimizationODE.jl
|
Страница в процессе перевода. |
OptimizationODE.jl предоставляет методы оптимизации на основе ОДУ в виде плагина решателя для пакета Optimization.jl из SciML. Он инкапсулирует различные решатели ОДУ для выполнения градиентной оптимизации с использованием непрерывной динамики.
Использование
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! вручную). Оптимизация производится путем интегрирования ОДУ, определяемого отрицательным градиентом, до достижения устойчивого состояния.