Neural Ordinary Differential Equations (Neural ODEs)
Нейронные ОДУ заменяют последовательность слоёв обучаемой производной и решателем ОДУ. Как их обучают методом сопряжённых уравнений, где они подходят и как запустить код.
Нейронные обыкновенные дифференциальные уравнения (Neural ODE) — это нейронные сети, задающие непрерывное изменение скрытого состояния во времени вместо фиксированного набора слоёв. Небольшая сеть f учит производную dh/dt = f(h, t), а численный решатель ОДУ интегрирует эту производную от начального состояния до момента, для которого нужен результат. Рики Чен, Юлия Рубанова, Джесси Беттенкурт и Дэвид Дювано представили эту идею в статье 2018 года, получившей награду за лучшую статью на NeurIPS.
От остаточных блоков к непрерывной глубине#
Остаточная сеть обновляет состояние по формуле h(t + 1) = h(t) + f(h(t)); это в точности один шаг метода Эйлера для решения ОДУ с шагом 1. Neural ODE переходит к пределу с бесконечным числом бесконечно малых шагов и передаёт интегрирование решателю. Классическое численное ПО, например SciPy solve_ivp, решает тот же тип задачи с начальными условиями для уравнений, записанных вручную.
Это меняет смысл понятия «глубина». Адаптивные решатели семейства Рунге — Кутты, например метод Дормана — Принса, делают небольшие шаги там, где динамика быстро меняется, и большие — там, где она плавная. Стоимость прямого прохода определяется числом вычислений функции, необходимых решателю, и зависит от входных данных, выученной динамики и допуска на ошибку. Увеличение допуска при инференсе позволяет обменять точность на меньшую задержку инференса без переобучения.
Обучение методом сопряжённых переменных#
При обычном обратном распространении ошибки через решатель сохраняются все промежуточные состояния, поэтому расход памяти растёт вместе с количеством шагов решателя. Метод чувствительности сопряжённых переменных позволяет этого избежать: он решает обратное во времени второе ОДУ, переносящее градиент, и по пути пересчитывает состояния вместо их сохранения. Расход памяти не зависит от глубины, но для этого требуются дополнительные вычисления, а прямые и обратные траектории могут немного различаться из-за численных погрешностей.
Пакет torchdiffeq предоставляет дифференцируемые решатели для PyTorch: odeint для прямого обратного распространения ошибки и odeint_adjoint для сопряжённого метода:
import torch
from torch import nn
from torchdiffeq import odeint
torch.manual_seed(0)
# Сеть предсказывает производную dh/dt для двумерного скрытого состояния
dynamics = nn.Sequential(nn.Linear(2, 32), nn.Tanh(), nn.Linear(32, 2))
# Запрашиваем состояние в нерегулярные моменты времени, как при редких показаниях датчиков
initial_state = torch.tensor([[1.0, 0.0]])
times = torch.tensor([0.0, 0.3, 0.35, 1.1, 2.0])
trajectory = odeint(lambda t, h: dynamics(h), initial_state, times)
# Градиенты проходят через решатель к весам сети
loss = trajectory[-1].square().sum()
loss.backward()
print(trajectory.squeeze(1))
print(dynamics[0].weight.grad.norm())Траектория содержит состояние для каждого запрошенного момента времени: от близко расположенных значений 0.3 и 0.35 до большого промежутка перед 1.1; внутренние шаги решатель выбирает самостоятельно. Ненулевая норма градиента показывает, что функция потерь, вычисленная в конечный момент времени, обучает сеть через решатель. Замена odeint на odeint_adjoint переключает вычисление градиентов на режим с постоянным использованием памяти, если функция динамики является nn.Module, чтобы решатель мог найти её параметры.
Где применяют Neural ODE#
Наиболее очевидная область применения — временные ряды с нерегулярными интервалами измерений. Модели Latent ODE, представленные Рубановой и её коллегами в 2019 году, кодируют последовательность наблюдений в скрытое состояние и непрерывно изменяют его, поэтому медицинские записи или журналы датчиков с неравномерными интервалами можно моделировать, не приводя их к фиксированной сетке. Рекуррентная нейронная сеть обновляет состояние только на дискретных шагах и требует дополнительных механизмов для работы с пропущенными или нерегулярными временными метками — это одна из основных проблем анализа временных рядов.
Данные трекинга имеют такую же структуру. Режим Track в Ultralytics YOLO26 выдаёт положение каждого ID трека в каждом кадре, с пропусками при перекрытии объекта или сбое детекции. Трекер по умолчанию продолжает вести каждый потерянный трек в течение track_buffer кадров — по умолчанию 30 — с помощью фильтра Калмана, в котором модель движения с постоянной скоростью представляет собой фиксированное линейное ОДУ с одним шагом на кадр. Neural ODE, обученная на тех же положениях, сама учит движение как непрерывную траекторию, которую можно запросить между кадрами или на промежутке при отслеживании нескольких объектов.
Вторая важная область применения — генеративное моделирование. Непрерывные нормализующие потоки, разработанные в исходной статье о Neural ODE и расширенные в FFJORD, преобразуют простое распределение в сложное посредством интегрирования выученного векторного поля. Позднее сопоставление потоков значительно удешевило обучение таких моделей: векторное поле обучается напрямую, без решения ОДУ во время обучения. Генераторы изображений на основе выпрямленного потока, например Stable Diffusion 3, создают изображения путём интегрирования такого ОДУ, а диффузионные модели можно сэмплировать детерминированно, интегрируя их ОДУ потока вероятностей.
Ограничения и другие модели с непрерывным временем#
Траектории ОДУ не пересекаются, поэтому Neural ODE в размерности исходных данных не может представлять некоторые простые отображения. Расширенные Neural ODE, предложенные Эмильеном Дюпоном и его коллегами в 2019 году, решают эту проблему, добавляя к состоянию дополнительные измерения. Жёсткая динамика и растущее число вычислений функции во время обучения могут сделать Neural ODE медленнее сети с фиксированной глубиной.
Другие архитектуры используют динамику непрерывного времени и предлагают иные компромиссы. Жидкие нейронные сети — это рекуррентные ячейки, заданные ОДУ, постоянные времени которых зависят от входных данных. Модели пространства состояний, например S4 и Mamba, начинаются с линейной системы непрерывного времени x'(t) = Ax(t) + Bu(t) и дискретизируют её в рекуррентное представление, которое также можно вычислить как длинную свёртку или параллельное сканирование. Благодаря этому они быстро обрабатывают длинные последовательности, для которых общей Neural ODE нужен адаптивный решатель.










