Как гарантировать сходимость при обучении нейронно-дифференциального уравнения?

В настоящее время я прорабатываю упражнения семинара по 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, они не выполняют алгоритм, как объяснено но вместо этого сделайте эту форму выборки, чтобы стабилизировать спиральное обучение ОДУ).

Другие вопросы по тегам