Как гарантировать сходимость при обучении нейронно-дифференциального уравнения?
В настоящее время я прорабатываю упражнения семинара по SciML для языка Julia (https://tutorials.sciml.ai/html/exercises/01-workshop_exercises.html). В частности, я застрял на упражнении 6, часть 3, которое включает в себя обучение нейронной сети для аппроксимации системы уравнений.
function lotka_volterra(du,u,p,t)
x, y = u
α, β, δ, γ = p
du[1] = dx = α*x - β*x*y
du[2] = dy = -δ*y + γ*x*y
end
Цель состоит в том, чтобы заменить уравнение для du [2] нейронной сетью:
du[2] = NN(u, p)
где NN - нейронная сеть с параметрами
p
и входы
u
.
У меня есть набор образцов данных, которые сеть должна попытаться сопоставить. Функция потерь - это квадрат разницы между выходными данными сетевой модели и данными выборки.
Я определил свою сеть с помощью
NN = Chain(Dense(2,30), Dense(30, 1))
. я могу получить
Flux.train!
для запуска, но проблема в том, что иногда начальные параметры нейронной сети приводят к потерям порядка 10 ^ 20, и поэтому обучение никогда не сходится. Моя лучшая попытка снизила потери с примерно 2000 изначально до примерно 20, используя оптимизатор ADAM примерно за 1000 итераций, но, похоже, я не могу добиться большего.
Как я могу убедиться, что моя сеть постоянно обучается, и есть ли способ улучшить конвергенцию?
1 ответ
Как я могу убедиться, что моя сеть постоянно обучается, и есть ли способ улучшить конвергенцию?
См. Страницу часто задаваемых вопросов о методах улучшения сходимости. Короче говоря, метод одиночной съемки в большинстве статей по машинному обучению очень нестабилен и не работает с большинством практических задач, но есть множество методов, которые могут помочь. Один из лучших - это множественная съемка, которая оптимизирует только короткие серии (параллельно) по временному ряду.
Но обучение на небольшом интервале и увеличение интервала работают, также могут работать более стабильные оптимизаторы (BFGS). Вы также можете взвесить функцию потерь, чтобы более раннее время значило больше. Наконец, вы можете выполнить мини-группировку способом, аналогичным множественной съемке, то есть начать с точки данных и решать только до следующей (на самом деле, если вы действительно посмотрите на исходный код NumPy в нейронной бумаге ODE, они не выполняют алгоритм, как объяснено но вместо этого сделайте эту форму выборки, чтобы стабилизировать спиральное обучение ОДУ).