{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Neural Ordinary Differential Equations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Значительная доля процессов описывается дифференциальными уравнениями, это могут быть эволюция физической системы во времени, медицинское состояние пациента, фундаментальные характеристики фондового рынка и т.д. Данные о таких процессах последовательны и непрерывны по своей природе, в том смысле, что наблюдения - это просто проявления какого-то непрерывно изменяющегося состояния.\n", "\n", "Есть также и другой тип последовательных данных, это дискретные данные, например, данные NLP задач. Состояния в таких данных меняется дискретно: от одного символа или слова к другому.\n", "\n", "Сейчас оба типа таких последовательных данных обычно обрабатываются рекуррентными сетями, несмотря на то, что они отличны по своей природе, и похоже, требуют различных подходов.\n", "\n", "На последней *NIPS-конференции* была представлена одна очень интересная статья, которая может помочь решить эту проблему. Авторы предлагают очень интересный подход, который они назвали **Нейронные Обыкновенные Дифференциальные Уравнения (Neural ODE)**.\n", "\n", "Здесь я постарался воспроизвести и кратко изложить результаты этой статьи, чтобы сделать знакомство с *ее идеей чуть* более простым. Мне кажется, что эта новая архитектура вполне может найти место в стандартном инструментарии дата-сайентиста наряду со *сверхточными* и рекуррентными сетями." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Постановка проблемы\n", "\n", "Пусть есть процесс, который подчиняется некоторому неизвестному ОДУ и пусть есть несколько (зашумленных) наблюдений вдоль траектории процесса\n", "\n", "\n", "$$\n", "\\frac{dz}{dt} = f(z(t), t) \\tag{1}\n", "$$\n", "$$\n", "\\{(z_0, t_0),(z_1, t_1),...,(z_M, t_M)\\} - \\text{наблюдения}\n", "$$\n", "\n", "Как найти аппроксимацию $\\widehat{f}(z, t, \\theta)$ функции динамики $f(z, t)$?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сначала рассмотрим более простую задачу: есть только 2 наблюдения, в начале и в конце траектории, $(z_0, t_0), (z_1, t_1)$.\n", "Эволюция системы запускается из состояния $z_0, t_0$ на время $t_1 - t_0$ с какой-то параметризованной функцией динамики, используя любой метод эволюции систем ОДУ. После того, как система оказывается в новом состоянии $\\hat{z_1}, t_1$, оно сравнивается с состоянием $z_1$ и разница между ними минимизируется варьированием параметров $\\theta$ функции динамики.\n", "\n", "Или, более формально, рассмотрим минимизацию функции потерь $L(\\hat{z_1})$:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "L(z(t_1)) = L \\Big( z(t_0) + \\int_{t_0}^{t_1} f(z(t), t, \\theta)dt \\Big) = L \\big( \\text{ODESolve}(z(t_0), f, t_0, t_1, \\theta) \\big) \\tag{2}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
Картинка 1: Непрерывный *backpropagation* градиента требует решения аугментированного дифференциального уравнения назад во времени.
Стрелки представляют корректировку распространенных назад градиентов градиентами от наблюдений.
\n",
"Иллюстрация из оригинальной статьи
Картинка 1: Непрерывный *backpropagation* градиента требует решения аугментированного дифференциального уравнения назад во времени.
Стрелки представляют корректировку распространенных назад градиентов градиентами от наблюдений.
\n",
"Иллюстрация из оригинальной статьи